import tkinter as tk/nimport tkinter.messagebox as msgbox/nfrom tkinter import ttk/nfrom tkinter import filedialog/nfrom urllib import parse/nimport re/nimport threading/nimport webbrowser/nfrom you_get import common as you_get/nfrom selenium import webdriver/nfrom selenium.webdriver.common.by import By/nfrom selenium.webdriver.chrome.options import Options/nfrom selenium.webdriver.support.ui import WebDriverWait/nfrom selenium.webdriver.support import expected_conditions as EC/n/nclass VideoPlayerApp:/n def init(self, width=500, height=300):/n self.w = width/n self.h = height/n self.title = '视频播放器1.0'/n self.root = tk.Tk(className=self.title)/n self.url = tk.StringVar()/n self.v = tk.IntVar()/n self.v.set(1)/n self.port = 'https://jx.jsonplayer.com/player/?url='/n self.ip = ''/n self.download_directory = ''/n self.cancel_flag = False # Flag to indicate if the download should be canceled/n/n self.setup_ui()/n/n def setup_ui(self):/n # Main Frames/n frame_1 = tk.Frame(self.root)/n frame_2 = tk.Frame(self.root)/n download_frame = tk.Frame(self.root)/n/n frame_1.pack(pady=10)/n frame_2.pack(pady=10)/n download_frame.pack(pady=10)/n/n # Group Label/n group_label = tk.Label(frame_1, text='暂时只有一个视频播放通道:')/n group_label.grid(row=0, column=0, padx=10, pady=10)/n/n # Radiobutton/n tb = tk.Radiobutton(frame_1, text='唯一通道', variable=self.v, value=1)/n tb.grid(row=0, column=1)/n/n # Input Label and Entry/n label = tk.Label(frame_2, text='请输入视频链接:')/n entry = tk.Entry(frame_2, textvariable=self.url, highlightcolor='Fuchsia', highlightthickness=1, width=40)/n label.grid(row=0, column=0, padx=(10, 0))/n entry.grid(row=0, column=1)/n/n # Play Button/n play = tk.Button(frame_2, text='播放', font=('楷体', 12), fg='Purple', width=8, height=1, command=self.video_play)/n play.grid(row=0, column=2, padx=(10, 0))/n/n # Download Buttons and Progress Bar/n download_button = tk.Button(download_frame, text='下载视频(只支持b站)', font=('楷体', 12), fg='Green', width=20, height=1,/n command=self.download_video)/n clear_button = tk.Button(download_frame, text='清空输入', font=('楷体', 12), fg='Red', width=10, height=1,/n command=self.clear_input)/n choose_dir_button = tk.Button(download_frame, text='选择下载目录', font=('楷体', 12), fg='Blue', width=15, height=1,/n command=self.choose_download_directory)/n cancel_button = tk.Button(download_frame, text='取消下载', font=('楷体', 12), fg='Red', width=15, height=1,/n command=self.cancel_download)/n/n download_button.grid(row=0, column=0, padx=(10, 0))/n clear_button.grid(row=0, column=1, padx=10)/n choose_dir_button.grid(row=0, column=2, padx=10)/n cancel_button.grid(row=0, column=3, padx=10)/n/n # Status Label and Progress Bar/n self.status_label = tk.Label(self.root, text='', fg='blue')/n self.status_label.pack(pady=0)/n self.progress_bar = ttk.Progressbar(self.root, mode='indeterminate')/n self.progress_bar.pack(fill='x', padx=10, pady=5)/n/n def show_status_message(self, message):/n self.status_label.config(text=message)/n/n def clear_input(self):/n self.url.set('') # Clear the input field/n/n def choose_download_directory(self):/n self.download_directory = filedialog.askdirectory() # Open a file dialog to choose the download directory/n/n def cancel_download(self):/n self.cancel_flag = True/n/n def update_progress_bar(self, value):/n self.progress_bar[/'value/'] = value/n/n def video_play(self):/n url = self.url.get()/n if re.match(r'^https?:///w.+$', url):/n self.ip = parse.quote_plus(url)/n webbrowser.open(self.port + self.ip)/n else:/n msgbox.showerror(title='错误', message='视频链接地址无效,请重新输入!')/n/n def download_video(self):/n url = self.url.get()/n if re.match(r'^https?:///w.+$', url):/n self.ip = parse.quote_plus(url)/n download_thread = threading.Thread(target=self.download_video_thread)/n download_thread.start()/n self.show_status_message('开始下载视频...')/n else:/n msgbox.showerror(title='错误', message='视频链接地址无效,请重新输入!')/n/n def download_video_thread(self):/n try:/n options = Options()/n options.add_argument('--headless')/n options.add_argument('--no-sandbox')/n options.add_argument('--disable-dev-shm-usage')/n options.add_argument(/'--window-size=1920,1080/')/n options.add_argument(/n /'user-agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'/'')/n/n driver = webdriver.Chrome(options=options)/n driver.get(self.port + self.ip)/n wait = WebDriverWait(driver, 10)/n video_element = wait.until(/n EC.presence_of_element_located((By.XPATH, '//div[@class=/'yzmplayer-video-wrap/']//video')))/n src_url = video_element.get_attribute(/'src/')/n driver.quit()/n/n self.video_url = src_url/n video_url = self.video_url/n/n if not self.download_directory:/n msgbox.showerror(title='错误', message='请选择下载目录!')/n return/n/n self.update_progress_bar(0)/n self.cancel_flag = False/n/n # Start the download/n output_dir = self.download_directory/n video_info = you_get.any_download(video_url, output_dir=output_dir, merge=True, files='mp4')/n/n if video_info is not None:/n self.show_status_message('视频下载已完成!')/n else:/n self.show_status_message('下载视频出错,请重试。')/n/n except Exception as e:/n print(e)/n self.show_status_message('下载视频出错,请重试。')/n/n def loop(self):/n self.root.resizable(True, True)/n self.root.mainloop()/n/nif name == /'main/':/n app = VideoPlayerApp()/n app.loop()/n

视频播放器 - 在线播放和下载视频

原文地址: https://www.cveoy.top/t/topic/qBEr 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录