SHARE
    TWEET
    Najeebsk

    ADVANCE-SEARCH.pyw

    Aug 13th, 2024
    349
    0
    Never
    Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
    Python 12.73 KB | None | 0 0
    1. import os
    2. import subprocess
    3. import threading
    4. import time
    5. import re
    6. import tkinter as tk
    7. from tkinter import filedialog, messagebox, Scrollbar, Text, END
    8. from googleapiclient.discovery import build
    9. # YouTube API key
    10. YOUTUBE_API_KEY = 'AIzaSyCzS7PGThVFxD83UFbfU5DOSZBMTxNpEeA'
    11. class AdvancedFileSearchApp(tk.Tk):
    12. def __init__(self):
    13. super().__init__()
    14. self.title("Najeeb Advanced File Search with YouTube and Media Controls")
    15. self.geometry("900x700")
    16. self.configure(bg="#282C34")
    17. self.folder_path = None
    18. self.lines = []
    19. self.stop_event = threading.Event()
    20. self.create_widgets()
    21. def create_widgets(self):
    22. # Top Frame for main controls
    23. self.top_frame = tk.Frame(self, bg="#282C34")
    24. self.top_frame.pack(fill=tk.X, pady=10)
    25. # Drive Selector
    26. self.drive_var = tk.StringVar()
    27. self.drive_dropdown = tk.OptionMenu(self.top_frame, self.drive_var, *self.get_drives())
    28. self.drive_dropdown.config(width=10)
    29. self.drive_var.set(self.get_drives()[0] if self.get_drives() else "")
    30. self.drive_dropdown.pack(side=tk.LEFT, padx=5)
    31. # First Search Entry
    32. self.search_var = tk.StringVar()
    33. self.search_entry = tk.Entry(self.top_frame, textvariable=self.search_var, width=30)
    34. self.search_entry.pack(side=tk.LEFT, padx=5)
    35. # Search Button
    36. self.search_btn = tk.Button(self.top_frame, text="Search Text", command=self.search_files, bg='lightcoral', fg='black')
    37. self.search_btn.pack(side=tk.LEFT, padx=5)
    38. # Search Drive Button
    39. self.search_drive_btn = tk.Button(self.top_frame, text="Search Drive", command=self.search_drive, bg='lightgreen', fg='black')
    40. self.search_drive_btn.pack(side=tk.LEFT, padx=5)
    41. # YouTube Search Button
    42. self.youtube_search_btn = tk.Button(self.top_frame, text="Search YouTube", command=self.search_youtube, bg='lightyellow', fg='black')
    43. self.youtube_search_btn.pack(side=tk.LEFT, padx=5)
    44. # Play Button
    45. self.play_btn = tk.Button(self.top_frame, text="Play Selected", command=self.play_selected, bg='lightpink', fg='black')
    46. self.play_btn.pack(side=tk.LEFT, padx=5)
    47. # Capture Video Button
    48. self.capture_video_btn = tk.Button(self.top_frame, text="Capture Video", command=self.capture_video, bg='lightblue', fg='black')
    49. self.capture_video_btn.pack(side=tk.LEFT, padx=5)
    50. # Record Audio Button
    51. self.record_audio_btn = tk.Button(self.top_frame, text="Record Audio", command=self.record_audio, bg='lightgreen', fg='black')
    52. self.record_audio_btn.pack(side=tk.LEFT, padx=5)
    53. # Capture Screenshots Button
    54. self.capture_screenshots_btn = tk.Button(self.top_frame, text="Capture Screenshots", command=self.capture_screenshots, bg='lightcoral', fg='black')
    55. self.capture_screenshots_btn.pack(side=tk.LEFT, padx=5)
    56. # Second Line Frame for additional controls
    57. self.second_line_frame = tk.Frame(self, bg="#282C34")
    58. self.second_line_frame.pack(fill=tk.X, pady=10)
    59. # Select Folder Button
    60. self.select_folder_btn = tk.Button(self.second_line_frame, text="Select Folder", command=self.select_folder, bg='lightgreen', fg='black')
    61. self.select_folder_btn.pack(side=tk.LEFT, padx=5)
    62. # Second Search Entry
    63. self.search_var2 = tk.StringVar()
    64. self.search_entry2 = tk.Entry(self.second_line_frame, textvariable=self.search_var2, width=30)
    65. self.search_entry2.pack(side=tk.LEFT, padx=5)
    66. # Search Button
    67. self.search_btn = tk.Button(self.second_line_frame, text="Search Text All", command=self.search_files, bg='lightcoral', fg='black')
    68. self.search_btn.pack(side=tk.LEFT, padx=5)
    69. # Save List Button
    70. self.save_list_btn = tk.Button(self.second_line_frame, text="Save List", command=self.save_list, bg='lightblue', fg='black')
    71. self.save_list_btn.pack(side=tk.LEFT, padx=5)
    72. # Text widget with Scrollbars
    73. self.text_frame = tk.Frame(self, bg="#282C34")
    74. self.text_frame.pack(fill=tk.BOTH, expand=True)
    75. self.result_area = Text(self.text_frame, wrap=tk.NONE, bg='#1E2127', fg='#ABB2BF')
    76. self.result_area.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
    77. self.scrollbar_y = Scrollbar(self.text_frame, orient=tk.VERTICAL)
    78. self.scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)
    79. self.scrollbar_x = Scrollbar(self, orient=tk.HORIZONTAL)
    80. self.scrollbar_x.pack(fill=tk.X)
    81. self.result_area.config(yscrollcommand=self.scrollbar_y.set, xscrollcommand=self.scrollbar_x.set)
    82. self.scrollbar_y.config(command=self.result_area.yview)
    83. self.scrollbar_x.config(command=self.result_area.xview)
    84. def get_drives(self):
    85. """Return a list of all available drives on the system."""
    86. drives = []
    87. for drive in range(ord('A'), ord('Z')+1):
    88. drive_letter = f"{chr(drive)}:\\"
    89. if os.path.exists(drive_letter):
    90. drives.append(drive_letter)
    91. return drives
    92. def select_folder(self):
    93. self.folder_path = filedialog.askdirectory()
    94. if self.folder_path:
    95. messagebox.showinfo("Selected Folder", f"Selected folder: {self.folder_path}")
    96. def search_files(self):
    97. keyword1 = self.search_entry.get().strip()
    98. keyword2 = self.search_entry2.get().strip()
    99. if not self.folder_path:
    100. self.result_area.insert(END, "Please select a folder first.\n")
    101. return
    102. if not keyword1 and not keyword2:
    103. self.result_area.insert(END, "Please enter at least one keyword to search for.\n")
    104. return
    105. self.result_area.delete(1.0, END) # Clear the text field
    106. for root, dirs, files in os.walk(self.folder_path):
    107. for file in files:
    108. if file.endswith(('.txt', '.ls', '.ini', '.m3u', '.m3u8', '.py', '.pyw', '.ahk', '.bat', '.cmd', '.vbs', '.htm', '.html', '.au3', '.reg')):
    109. file_path = os.path.join(root, file)
    110. self.search_in_file(file_path, keyword1, keyword2)
    111. def search_in_file(self, file_path, keyword1, keyword2):
    112. try:
    113. with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
    114. lines = f.readlines()
    115. for i, line in enumerate(lines):
    116. if (keyword1.lower() in line.lower()) or (keyword2.lower() in line.lower()):
    117. self.result_area.insert(END, f"{file_path} - Line {i+1}: {line.strip()}\n")
    118. except Exception as e:
    119. self.result_area.insert(END, f"Error reading {file_path}: {str(e)}\n")
    120. def save_list(self):
    121. save_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text files", "*.txt")])
    122. if save_path:
    123. with open(save_path, "w", encoding="utf-8") as file:
    124. file.writelines(self.lines)
    125. messagebox.showinfo("Save List", f"List saved to {save_path}")
    126. def search(self, event=None):
    127. drive = self.drive_var.get()
    128. search_term = self.search_var.get().lower()
    129. self.result_area.delete(1.0, END)
    130. if not drive or not search_term:
    131. messagebox.showwarning("Warning", "Please select a drive and enter a search term.")
    132. return
    133. # Search for files
    134. for root, dirs, files in os.walk(drive):
    135. for file in files:
    136. if search_term in file.lower():
    137. self.result_area.insert(END, os.path.join(root, file) + "\n")
    138. def search_drive(self):
    139. self.search() # Reuse the search function for drive-specific searches
    140. def search_youtube(self):
    141. search_term = self.search_var.get().strip()
    142. if not search_term:
    143. messagebox.showwarning("Warning", "Please enter a search term.")
    144. return
    145. self.result_area.delete(1.0, END)
    146. youtube = build('youtube', 'v3', developerKey=YOUTUBE_API_KEY)
    147. request = youtube.search().list(
    148. q=search_term,
    149. part='snippet',
    150. type='video',
    151. maxResults=5
    152. )
    153. response = request.execute()
    154. self.video_urls = []
    155. for item in response['items']:
    156. video_title = item['snippet']['title']
    157. video_id = item['id']['videoId']
    158. video_url = f"https://www.youtube.com/watch?v={video_id}"
    159. self.result_area.insert(END, f"{video_title}\n{video_url}\n\n")
    160. self.video_urls.append(video_url)
    161. def play_selected(self):
    162. try:
    163. selected_text = self.result_area.get(tk.SEL_FIRST, tk.SEL_LAST).strip()
    164. if selected_text:
    165. potplayer_path = "C:\Program Files\DAUM\PotPlayer\PotPlayerMini.exe"
    166. if os.path.exists(potplayer_path):
    167. subprocess.Popen([potplayer_path, selected_text], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
    168. else:
    169. messagebox.showerror("Error", "PotPlayer not found at the specified path.")
    170. else:
    171. messagebox.showwarning("Warning", "No text selected to play.")
    172. except tk.TclError:
    173. messagebox.showwarning("Warning", "No text selected to play.")
    174. def capture_video(self):
    175. try:
    176. selected_text = self.result_area.get(tk.SEL_FIRST, tk.SEL_LAST).strip()
    177. url_match = re.search(r'(https?://\S+)', selected_text)
    178. if url_match:
    179. url = url_match.group(0)
    180. filename = filedialog.asksaveasfilename(defaultextension=".mp4", filetypes=[("MP4 files", "*.mp4")])
    181. if filename:
    182. command = ['ffmpeg', '-y', '-i', url, '-t', '00:03:55', '-c', 'copy', filename]
    183. threading.Thread(target=lambda: subprocess.run(command)).start()
    184. messagebox.showinfo("Capturing", f"Capturing 03:55 minutes of video to {filename}")
    185. else:
    186. messagebox.showerror("Error", "Selected text is not a valid URL.")
    187. except tk.TclError:
    188. messagebox.showerror("Error", "No text selected.")
    189. def record_audio(self):
    190. try:
    191. selected_text = self.result_area.get(tk.SEL_FIRST, tk.SEL_LAST).strip()
    192. url_match = re.search(r'(https?://\S+)', selected_text)
    193. if url_match:
    194. url = url_match.group(0)
    195. filename = filedialog.asksaveasfilename(defaultextension=".mp3", filetypes=[("MP3 files", "*.mp3")])
    196. if filename:
    197. command = ['ffmpeg', '-y', '-i', url, '-f', 'mp3', '-c:a', 'libmp3lame', filename]
    198. threading.Thread(target=lambda: subprocess.run(command)).start()
    199. messagebox.showinfo("Recording", f"Recording audio to {filename}")
    200. else:
    201. messagebox.showerror("Error", "Selected text is not a valid URL.")
    202. except tk.TclError:
    203. messagebox.showerror("Error", "No text selected.")
    204. def capture_screenshots(self):
    205. def take_screenshots(url, filename_base, interval, num_screenshots):
    206. for i in range(num_screenshots):
    207. if self.stop_event.is_set():
    208. break
    209. filename = f"{filename_base}_{i + 1}.png"
    210. command = ['ffmpeg', '-y', '-i', url, '-vframes', '1', filename]
    211. subprocess.run(command)
    212. time.sleep(interval)
    213. messagebox.showinfo("Capturing Screenshots", f"Captured {i + 1} screenshots every {interval} seconds to {filename_base}")
    214. try:
    215. selected_text = self.result_area.get(tk.SEL_FIRST, tk.SEL_LAST).strip()
    216. url_match = re.search(r'(https?://\S+)', selected_text)
    217. if url_match:
    218. url = url_match.group(0)
    219. filename_base = filedialog.asksaveasfilename(defaultextension=".png", filetypes=[("PNG files", "*.png")])
    220. if filename_base:
    221. self.stop_event.clear()
    222. interval = 2
    223. num_screenshots = 10
    224. threading.Thread(target=take_screenshots, args=(url, filename_base, interval, num_screenshots)).start()
    225. else:
    226. messagebox.showerror("Error", "Selected text is not a valid URL.")
    227. except tk.TclError:
    228. messagebox.showerror("Error", "No text selected.")
    229. def stop_screenshots_capture(self):
    230. self.stop_event.set()
    231. messagebox.showinfo("Screenshot Capture", "Stopping screenshot capture.")
    232. if __name__ == "__main__":
    233. app = AdvancedFileSearchApp()
    234. 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 によって変換されたページ (->オリジナル) /