SHARE
    TWEET
    Najeebsk

    IPTV-YT-POTPLAYER.pyw

    Aug 9th, 2024 (edited)
    421
    0
    Never
    Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
    Python 9.72 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 = 'AIzaSyCzS7PGThVFxD83UFbfU5DOSZBMTxNpEeA'
    10. class IPTVChannelPlayer(tk.Tk):
    11. def __init__(self):
    12. super().__init__()
    13. self.title("Najeeb Youtube IPTV Channel PotPlayer")
    14. self.geometry("800x600")
    15. # Initialize self.lines to an empty list and threading event for screenshots
    16. self.lines = []
    17. self.stop_event = threading.Event()
    18. self.create_widgets()
    19. def create_widgets(self):
    20. # Top Frame for Buttons
    21. self.top_frame = tk.Frame(self, bg='lightblue')
    22. self.top_frame.pack(fill=tk.X, pady=10)
    23. # File Selection Button
    24. self.select_file_btn = tk.Button(self.top_frame, text="Select File", command=self.load_file, bg='lightgreen', fg='black')
    25. self.select_file_btn.pack(side=tk.LEFT, padx=5)
    26. # Search Bar
    27. self.search_var = tk.StringVar()
    28. self.search_entry = tk.Entry(self.top_frame, textvariable=self.search_var, width=40)
    29. self.search_entry.pack(side=tk.LEFT, padx=5)
    30. # Search Button
    31. self.search_btn = tk.Button(self.top_frame, text="Search", command=self.search, bg='lightcoral', fg='black')
    32. self.search_btn.pack(side=tk.LEFT, padx=5)
    33. # YouTube Search Button
    34. self.youtube_search_btn = tk.Button(self.top_frame, text="Search YouTube", command=self.search_youtube, bg='lightyellow', fg='black')
    35. self.youtube_search_btn.pack(side=tk.LEFT, padx=5)
    36. # Play Button
    37. self.play_btn = tk.Button(self.top_frame, text="Play Selected", command=self.play_selected, bg='lightpink', fg='black')
    38. self.play_btn.pack(side=tk.LEFT, padx=5)
    39. # Capture Video Button
    40. self.capture_video_btn = tk.Button(self.top_frame, text="Capture Video", command=self.capture_video, bg='lightblue', fg='black')
    41. self.capture_video_btn.pack(side=tk.LEFT, padx=5)
    42. # Record Audio Button
    43. self.record_audio_btn = tk.Button(self.top_frame, text="Record Audio", command=self.record_audio, bg='lightgreen', fg='black')
    44. self.record_audio_btn.pack(side=tk.LEFT, padx=5)
    45. # Capture Screenshots Button
    46. self.capture_screenshots_btn = tk.Button(self.top_frame, text="Capture Screenshots", command=self.capture_screenshots, bg='lightcoral', fg='black')
    47. self.capture_screenshots_btn.pack(side=tk.LEFT, padx=5)
    48. # Stop Screenshots Capture Button
    49. self.stop_screenshots_btn = tk.Button(self.top_frame, text="Stop Capturing", command=self.stop_screenshots_capture, bg='lightgrey', fg='black')
    50. self.stop_screenshots_btn.pack(side=tk.LEFT, padx=5)
    51. # Text widget with Scrollbars
    52. self.text_frame = tk.Frame(self)
    53. self.text_frame.pack(fill=tk.BOTH, expand=True)
    54. self.result_area = Text(self.text_frame, wrap=tk.NONE, bg='white', fg='black')
    55. self.result_area.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
    56. self.scrollbar_y = Scrollbar(self.text_frame, orient=tk.VERTICAL)
    57. self.scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)
    58. self.scrollbar_x = Scrollbar(self, orient=tk.HORIZONTAL)
    59. self.scrollbar_x.pack(fill=tk.X)
    60. self.result_area.config(yscrollcommand=self.scrollbar_y.set, xscrollcommand=self.scrollbar_x.set)
    61. self.scrollbar_y.config(command=self.result_area.yview)
    62. self.scrollbar_x.config(command=self.result_area.xview)
    63. def load_file(self):
    64. self.file_path = filedialog.askopenfilename(filetypes=[("M3U, M3U8, TXT Files", "*.m3u *.m3u8 *.txt")])
    65. if not self.file_path:
    66. return
    67. self.result_area.delete(1.0, END)
    68. try:
    69. with open(self.file_path, "r", encoding="utf-8", errors="replace") as file:
    70. self.lines = file.readlines() # Load lines from the file
    71. for line in self.lines:
    72. self.result_area.insert(END, line)
    73. except UnicodeDecodeError:
    74. messagebox.showerror("Error", "Failed to load the file due to encoding issues.")
    75. def search(self, event=None):
    76. search_term = self.search_var.get().lower()
    77. self.result_area.delete(1.0, END)
    78. # Ensure self.lines is populated before searching
    79. if search_term and self.lines:
    80. for line in self.lines:
    81. if search_term in line.lower():
    82. self.result_area.insert(END, line.strip() + "\n")
    83. def search_youtube(self):
    84. search_term = self.search_var.get().strip()
    85. if not search_term:
    86. messagebox.showwarning("Warning", "Please enter a search term.")
    87. return
    88. # Clear the result area
    89. self.result_area.delete(1.0, END)
    90. youtube = build('youtube', 'v3', developerKey=YOUTUBE_API_KEY)
    91. request = youtube.search().list(
    92. q=search_term,
    93. part='snippet',
    94. type='video',
    95. maxResults=5
    96. )
    97. response = request.execute()
    98. self.video_urls = []
    99. for item in response['items']:
    100. video_title = item['snippet']['title']
    101. video_id = item['id']['videoId']
    102. video_url = f"https://www.youtube.com/watch?v={video_id}"
    103. self.result_area.insert(END, f"{video_title}\n{video_url}\n\n")
    104. self.video_urls.append(video_url)
    105. def play_selected(self):
    106. try:
    107. selected_text = self.result_area.get(tk.SEL_FIRST, tk.SEL_LAST).strip()
    108. if selected_text:
    109. potplayer_path = r"C:\Program Files\DAUM\PotPlayer\PotPlayerMini.exe"
    110. if os.path.exists(potplayer_path):
    111. subprocess.Popen([potplayer_path, selected_text], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
    112. else:
    113. messagebox.showerror("Error", "PotPlayer not found at the specified path.")
    114. else:
    115. messagebox.showwarning("Warning", "No text selected to play.")
    116. except tk.TclError:
    117. messagebox.showwarning("Warning", "No text selected to play.")
    118. def capture_video(self):
    119. try:
    120. selected_text = self.result_area.get(tk.SEL_FIRST, tk.SEL_LAST).strip()
    121. url_match = re.search(r'(https?://\S+)', selected_text)
    122. if url_match:
    123. url = url_match.group(0)
    124. filename = filedialog.asksaveasfilename(defaultextension=".mp4", filetypes=[("MP4 files", "*.mp4")])
    125. if filename:
    126. command = ['ffmpeg', '-y', '-i', url, '-t', '00:03:55', '-c', 'copy', filename]
    127. threading.Thread(target=lambda: subprocess.run(command)).start()
    128. messagebox.showinfo("Capturing", f"Capturing 03:55 minutes of video to {filename}")
    129. else:
    130. messagebox.showerror("Error", "Selected text is not a valid URL.")
    131. except tk.TclError:
    132. messagebox.showerror("Error", "No text selected.")
    133. def record_audio(self):
    134. try:
    135. selected_text = self.result_area.get(tk.SEL_FIRST, tk.SEL_LAST).strip()
    136. url_match = re.search(r'(https?://\S+)', selected_text)
    137. if url_match:
    138. url = url_match.group(0)
    139. filename = filedialog.asksaveasfilename(defaultextension=".mp3", filetypes=[("MP3 files", "*.mp3")])
    140. if filename:
    141. command = ['ffmpeg', '-y', '-i', url, '-f', 'mp3', '-c:a', 'libmp3lame', filename]
    142. threading.Thread(target=lambda: subprocess.run(command)).start()
    143. messagebox.showinfo("Recording", f"Recording audio to {filename}")
    144. else:
    145. messagebox.showerror("Error", "Selected text is not a valid URL.")
    146. except tk.TclError:
    147. messagebox.showerror("Error", "No text selected.")
    148. def capture_screenshots(self):
    149. def take_screenshots(url, filename_base, interval, num_screenshots):
    150. for i in range(num_screenshots):
    151. if self.stop_event.is_set():
    152. break
    153. filename = f"{filename_base}_{i + 1}.png"
    154. command = ['ffmpeg', '-y', '-i', url, '-vframes', '1', filename]
    155. subprocess.run(command)
    156. time.sleep(interval)
    157. messagebox.showinfo("Capturing Screenshots", f"Captured {i + 1} screenshots every {interval} seconds to {filename_base}")
    158. try:
    159. selected_text = self.result_area.get(tk.SEL_FIRST, tk.SEL_LAST).strip()
    160. url_match = re.search(r'(https?://\S+)', selected_text)
    161. if url_match:
    162. url = url_match.group(0)
    163. filename_base = filedialog.asksaveasfilename(defaultextension=".png", filetypes=[("PNG files", "*.png")])
    164. if filename_base:
    165. self.stop_event.clear() # Clear the stop event flag
    166. interval = 2 # Interval in seconds
    167. num_screenshots = 100 # Number of screenshots
    168. threading.Thread(target=take_screenshots, args=(url, filename_base, interval, num_screenshots)).start()
    169. else:
    170. messagebox.showerror("Error", "Selected text is not a valid URL.")
    171. except tk.TclError:
    172. messagebox.showerror("Error", "No text selected.")
    173. def stop_screenshots_capture(self):
    174. self.stop_event.set() # Set the stop event flag
    175. messagebox.showinfo("Screenshot Capture", "Stopping screenshot capture.")
    176. if __name__ == "__main__":
    177. app = IPTVChannelPlayer()
    178. 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 によって変換されたページ (->オリジナル) /