SHARE
    TWEET
    Najeebsk

    ADVANCE-SEARCH2.0.pyw

    Aug 13th, 2024 (edited)
    383
    0
    Never
    Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
    Python 13.95 KB | None | 0 0
    1. import os
    2. import subprocess
    3. import threading
    4. import re
    5. import tkinter as tk
    6. from tkinter import filedialog, messagebox, Scrollbar, Text, END
    7. from googleapiclient.discovery import build
    8. # Path to VLC executable
    9. VLC_PATH = r"C:\Program Files\VideoLAN\VLC\vlc.exe"
    10. # YouTube API key
    11. YOUTUBE_API_KEY = 'AIzaSyCzS7PGThVFxD83UFbfU5DOSZBMTxNpEeA'
    12. class AdvancedFileSearchApp(tk.Tk):
    13. def __init__(self):
    14. super().__init__()
    15. self.title("Najeeb Advanced File Search with YouTube and Media Controls")
    16. self.geometry("900x700")
    17. self.configure(bg="#282C34")
    18. self.folder_path = None
    19. self.lines = []
    20. self.stop_event = threading.Event()
    21. self.create_widgets()
    22. def create_widgets(self):
    23. # Top Frame for main controls
    24. self.top_frame = tk.Frame(self, bg="#282C34")
    25. self.top_frame.pack(fill=tk.X, pady=10)
    26. # Drive Selector
    27. self.drive_var = tk.StringVar()
    28. self.drive_dropdown = tk.OptionMenu(self.top_frame, self.drive_var, *self.get_drives())
    29. self.drive_dropdown.config(width=6, bg="#3E4451", fg="#ABB2BF", highlightbackground="#4B5263", highlightcolor="#4B5263")
    30. self.drive_var.set(self.get_drives()[0] if self.get_drives() else "")
    31. self.drive_dropdown.pack(side=tk.LEFT, padx=5)
    32. # Select Folder Button
    33. self.select_folder_btn = tk.Button(self.top_frame, text="Select Folder", command=self.select_folder, bg='lightgreen', fg='black')
    34. self.select_folder_btn.pack(side=tk.LEFT, padx=5)
    35. # First Search Entry
    36. self.search_var = tk.StringVar()
    37. self.search_entry = tk.Entry(self.top_frame, textvariable=self.search_var, width=24, bg="#3E4451", fg="#ABB2BF")
    38. self.search_entry.pack(side=tk.LEFT, padx=5)
    39. # Second Search Entry
    40. self.search_var2 = tk.StringVar()
    41. self.search_entry2 = tk.Entry(self.top_frame, textvariable=self.search_var2, width=24)
    42. self.search_entry2.pack(side=tk.LEFT, padx=5)
    43. # Search Text Button
    44. self.search_text_btn = tk.Button(self.top_frame, text="Search Text All", command=self.search_files, bg='lightcoral', fg='black')
    45. self.search_text_btn.pack(side=tk.LEFT, padx=5)
    46. # Search Word Button
    47. self.search_word_btn = tk.Button(self.top_frame, text="Search Word", command=self.search_files, bg='lightcoral', fg='black')
    48. self.search_word_btn.pack(side=tk.LEFT, padx=5)
    49. # Search Drive Button
    50. self.search_drive_btn = tk.Button(self.top_frame, text="Search Drive", command=self.search_drive, bg='lightgreen', fg='black')
    51. self.search_drive_btn.pack(side=tk.LEFT, padx=5)
    52. # YouTube Search Button
    53. self.youtube_search_btn = tk.Button(self.top_frame, text="Search YouTube", command=self.search_youtube, bg='lightyellow', fg='black')
    54. self.youtube_search_btn.pack(side=tk.LEFT, padx=5)
    55. # Second Line Frame for additional controls
    56. self.second_line_frame = tk.Frame(self, bg="#282C34")
    57. self.second_line_frame.pack(fill=tk.X, pady=10)
    58. # Capture Video Button
    59. self.capture_video_btn = tk.Button(self.second_line_frame, text="Capture Video", command=self.capture_video, bg='lightblue', fg='black')
    60. self.capture_video_btn.pack(side=tk.LEFT, padx=5)
    61. # Record Audio Button
    62. self.record_audio_btn = tk.Button(self.second_line_frame, text="Record Audio", command=self.record_audio, bg='lightgreen', fg='black')
    63. self.record_audio_btn.pack(side=tk.LEFT, padx=5)
    64. # Download Button
    65. self.download_btn = tk.Button(self.second_line_frame, text="Download Video", command=self.download_video, bg='lightgoldenrod', fg='black')
    66. self.download_btn.pack(side=tk.LEFT, padx=5)
    67. # Run button
    68. self.run_button = tk.Button(self.second_line_frame, text="Open Notepad", command=self.run_in_notepad, bg='#90EE90', fg='black')
    69. self.run_button.pack(side=tk.LEFT, padx=5)
    70. # CMD button
    71. self.cmd_button = tk.Button(self.second_line_frame, text="Run CMD", command=self.run_cmd, bg='#90EE90', fg='black')
    72. self.cmd_button.pack(side=tk.LEFT, padx=5)
    73. # Play PotPlayer Button
    74. self.play_btn = tk.Button(self.second_line_frame, text="Play Selected PotPlayer", command=self.play_selected, bg='lightpink', fg='black')
    75. self.play_btn.pack(side=tk.LEFT, padx=5)
    76. # Play VLC Player Button
    77. self.play_vlc_btn = tk.Button(self.second_line_frame, text="Play Selected VLC", command=self.play_selected_vlc, bg='lightpink', fg='black')
    78. self.play_vlc_btn.pack(side=tk.LEFT, padx=5)
    79. # Save List Button
    80. self.save_list_btn = tk.Button(self.second_line_frame, text="Save List", command=self.save_list, bg='lightblue', fg='black')
    81. self.save_list_btn.pack(side=tk.LEFT, padx=5)
    82. # Toggle button
    83. self.toggle_button = tk.Button(self.second_line_frame, text="Toggle Display", command=self.toggle_display, bg='#ffcc00', fg='black')
    84. self.toggle_button.pack(side=tk.LEFT, padx=5)
    85. # Text widget with Scrollbars
    86. self.text_frame = tk.Frame(self, bg="#282C34")
    87. self.text_frame.pack(fill=tk.BOTH, expand=True)
    88. self.result_area = Text(self.text_frame, wrap=tk.NONE, bg='#1E2127', fg='#ABB2BF')
    89. self.result_area.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
    90. self.scrollbar_y = Scrollbar(self.text_frame, orient=tk.VERTICAL)
    91. self.scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)
    92. self.scrollbar_x = Scrollbar(self, orient=tk.HORIZONTAL)
    93. self.scrollbar_x.pack(fill=tk.X)
    94. self.result_area.config(yscrollcommand=self.scrollbar_y.set, xscrollcommand=self.scrollbar_x.set)
    95. self.scrollbar_y.config(command=self.result_area.yview)
    96. self.scrollbar_x.config(command=self.result_area.xview)
    97. self.folder_path = ""
    98. self.show_full_info = False
    99. def get_drives(self):
    100. """Return a list of all available drives on the system."""
    101. drives = []
    102. for drive in range(ord('A'), ord('Z')+1):
    103. drive_letter = f"{chr(drive)}:\\"
    104. if os.path.exists(drive_letter):
    105. drives.append(drive_letter)
    106. return drives
    107. def select_folder(self):
    108. self.folder_path = filedialog.askdirectory()
    109. if self.folder_path:
    110. messagebox.showinfo("Selected Folder", f"Selected folder: {self.folder_path}")
    111. def search_files(self):
    112. keyword1 = self.search_entry.get().strip()
    113. keyword2 = self.search_entry2.get().strip()
    114. if not self.folder_path:
    115. self.result_area.insert(END, "Please select a folder first.\n")
    116. return
    117. if not keyword1 and not keyword2:
    118. self.result_area.insert(END, "Please enter at least one keyword to search for.\n")
    119. return
    120. self.result_area.delete(1.0, END) # Clear the text field
    121. for root, dirs, files in os.walk(self.folder_path):
    122. for file in files:
    123. if file.endswith(('.txt', '.ls', '.ini', '.m3u', '.m3u8', '.py', '.pyw', '.ahk', '.bat', '.cmd', '.vbs', '.htm', '.html', '.au3', '.reg')):
    124. file_path = os.path.join(root, file)
    125. self.search_in_file(file_path, keyword1, keyword2)
    126. def search_in_file(self, file_path, keyword1, keyword2):
    127. try:
    128. with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
    129. lines = f.readlines()
    130. for i, line in enumerate(lines):
    131. if (keyword1.lower() in line.lower()) or (keyword2.lower() in line.lower()):
    132. if self.show_full_info:
    133. self.result_area.insert(tk.END, f"{file_path} - Line {i+1}: {line}")
    134. else:
    135. self.result_area.insert(tk.END, f"{line.strip()}\n")
    136. except Exception as e:
    137. self.result_area.insert(tk.END, f"Error reading {file_path}: {str(e)}\n")
    138. def save_list(self):
    139. save_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text files", "*.txt")])
    140. if save_path:
    141. try:
    142. with open(save_path, 'w', encoding='utf-8') as f:
    143. f.write(self.result_area.get(1.0, END))
    144. messagebox.showinfo("Save Success", f"Results saved to {save_path}")
    145. except Exception as e:
    146. messagebox.showerror("Save Error", f"Could not save results: {str(e)}")
    147. def run_in_notepad(self):
    148. selected_text = self.result_area.get(tk.SEL_FIRST, tk.SEL_LAST)
    149. with open("temp_file.txt", "w", encoding='utf-8') as f:
    150. f.write(selected_text)
    151. os.startfile("temp_file.txt")
    152. def run_cmd(self):
    153. selected_text = self.result_area.get(tk.SEL_FIRST, tk.SEL_LAST)
    154. os.system(f'cmd /c "{selected_text}"')
    155. def toggle_display(self):
    156. self.show_full_info = not self.show_full_info
    157. state = "Full Info" if self.show_full_info else "Search Word Only"
    158. self.toggle_button.config(text=f"Toggle Display ({state})")
    159. self.result_area.delete(1.0, tk.END) # Clear the text field
    160. if self.folder_path and self.search_entry.get():
    161. self.search_files()
    162. def search_youtube(self):
    163. query = self.search_var.get()
    164. if not query:
    165. self.result_area.insert(END, "Please enter a query for YouTube search.\n")
    166. return
    167. youtube = build('youtube', 'v3', developerKey=YOUTUBE_API_KEY)
    168. request = youtube.search().list(q=query, part='snippet', type='video', maxResults=5)
    169. response = request.execute()
    170. self.result_area.delete(1.0, END)
    171. for item in response['items']:
    172. video_title = item['snippet']['title']
    173. video_url = f"https://www.youtube.com/watch?v={item['id']['videoId']}"
    174. self.result_area.insert(END, f"{video_title}\n{video_url}\n\n")
    175. def capture_video(self):
    176. # Implement video capture functionality
    177. try:
    178. selected_text = self.result_area.get(tk.SEL_FIRST, tk.SEL_LAST).strip()
    179. url_match = re.search(r'(https?://\S+)', selected_text)
    180. if url_match:
    181. url = url_match.group(0)
    182. filename = filedialog.asksaveasfilename(defaultextension=".mp4", filetypes=[("MP4 files", "*.mp4")])
    183. if filename:
    184. command = ['ffmpeg', '-y', '-i', url, '-t', '01:35:55', '-c', 'copy', filename]
    185. threading.Thread(target=lambda: subprocess.run(command)).start()
    186. messagebox.showinfo("Capturing", f"Capturing 03:55 minutes of video to {filename}")
    187. else:
    188. messagebox.showerror("Error", "Selected text is not a valid URL.")
    189. except tk.TclError:
    190. messagebox.showerror("Error", "No text selected.")
    191. def record_audio(self):
    192. # Implement audio recording functionality
    193. try:
    194. selected_text = self.result_area.get(tk.SEL_FIRST, tk.SEL_LAST).strip()
    195. url_match = re.search(r'(https?://\S+)', selected_text)
    196. if url_match:
    197. url = url_match.group(0)
    198. filename = filedialog.asksaveasfilename(defaultextension=".mp3", filetypes=[("MP3 files", "*.mp3")])
    199. if filename:
    200. command = ['ffmpeg', '-y', '-i', url, '-f', 'mp3', '-c:a', 'libmp3lame', filename]
    201. threading.Thread(target=lambda: subprocess.run(command)).start()
    202. messagebox.showinfo("Recording", f"Recording audio to {filename}")
    203. else:
    204. messagebox.showerror("Error", "Selected text is not a valid URL.")
    205. except tk.TclError:
    206. messagebox.showerror("Error", "No text selected.")
    207. def download_video(self):
    208. # Implement video download functionality
    209. #selected_quality = self.quality_var.get()
    210. selected_text = self.result_area.get(tk.SEL_FIRST, tk.SEL_LAST).strip()
    211. if not selected_text.startswith("http"):
    212. messagebox.showerror("Invalid Selection", "Please select a valid YouTube URL.")
    213. return
    214. download_command = f'youtube-dl -f "bestvideo[height<=360]+bestaudio/best" {selected_text} -o "%(title)s.%(ext)s"'
    215. subprocess.run(download_command, shell=True)
    216. messagebox.showinfo("Download Complete", "Video downloaded successfully.")
    217. def play_selected(self):
    218. selected_text = self.result_area.get(tk.SEL_FIRST, tk.SEL_LAST).strip()
    219. if selected_text:
    220. subprocess.Popen([r"C:\Program Files\DAUM\PotPlayer\PotPlayerMini.exe", selected_text])
    221. else:
    222. messagebox.showwarning("No Selection", "Please select a URL or file path to play.")
    223. def play_selected_vlc(self):
    224. selected_text = self.result_area.get(tk.SEL_FIRST, tk.SEL_LAST).strip()
    225. if selected_text:
    226. subprocess.Popen([VLC_PATH, selected_text])
    227. else:
    228. messagebox.showwarning("No Selection", "Please select a URL or file path to play.")
    229. def search(self, event=None):
    230. drive = self.drive_var.get()
    231. search_term = self.search_var.get().lower()
    232. self.result_area.delete(1.0, END)
    233. if not drive or not search_term:
    234. messagebox.showwarning("Warning", "Please select a drive and enter a search term.")
    235. return
    236. # Search for files
    237. for root, dirs, files in os.walk(drive):
    238. for file in files:
    239. if search_term in file.lower():
    240. self.result_area.insert(END, os.path.join(root, file) + "\n")
    241. def search_drive(self):
    242. self.search() # Reuse the search function for drive-specific searches
    243. if __name__ == "__main__":
    244. app = AdvancedFileSearchApp()
    245. app.mainloop()
    Advertisement
    Add Comment
    Please, Sign In to add comment
    Public Pastes
    We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
    Not a member of Pastebin yet?
    Sign Up, it unlocks many cool features!

    AltStyle によって変換されたページ (->オリジナル) /