Python制作视频解析全平台免费追剧神器
import tkinter.messagebox as msgbox import tkinter as tk import webbrowser import re import urllib.parse # 定义APP类,代表整个视频解析器应用程序 class APP: def __init__(self, width=500, height=300): """ 类的构造函数,用于初始化应用程序的基本属性、界面组件以及相关变量。 参数: width: 应用程序窗口的宽度,默认值为500像素。 height: 应用程序窗口的高度,默认值为300像素。 """ # 记录窗口宽度 self.width = width # 记录窗口高度 self.height = height # 设置窗口标题 self.title = '视频解析器' # 创建Tkinter的根窗口对象,并设置窗口标题 self.root = tk.Tk(className=self.title) # 创建一个StringVar对象,用于存储用户输入的视频链接,方便与界面组件交互 self.url = tk.StringVar() # 创建一个IntVar对象,用于记录用户选择的解析通道,初始值设为1 self.v = tk.IntVar() self.v.set(1) # 创建三个Frame框架,用于在窗口中对不同的组件进行分组布局 frame_1 = tk.Frame(self.root) frame_2 = tk.Frame(self.root) frame_3 = tk.Frame(self.root) # 创建菜单栏对象 menu = tk.Menu(self.root) # 将菜单栏配置到根窗口上 self.root.config(menu=menu) # 创建一个名为'友情链接'的下拉菜单对象,设置tearoff为0表示不可分离(即不能独立显示为一个窗口) moviemenu = tk.Menu(menu, tearoff=0) # 将'友情链接'下拉菜单添加到菜单栏中 menu.add_cascade(label='友情链接', menu=moviemenu) # 定义一个包含多个视频网站链接的列表 websites = [ 'http://v.qq.com/', 'http://tv.sohu.com/', 'http://www.mgtv.com/', 'http://www.iqiyi.com/', 'http://www.bilibili.com/', 'http://www.youku.com/', 'http://www.le.com/', 'http://www.tudou.com/', 'http://www.acfun.tv/', 'http://www.bilibili.com/' ] # 遍历视频网站链接列表,为每个链接添加一个菜单项,点击菜单项时通过webbrowser模块打开对应的网站 for site in websites: moviemenu.add_command(command=lambda s=site: webbrowser.open(s)) # 创建一个标签组件,用于提示用户选择解析通道 group = tk.Label(frame_1, text='选择一个通道:', padx=10, pady=10) # 创建第一个单选按钮组件,对应解析通道一,绑定到self.v变量,值为1,设置宽度、高度等外观属性 tb1 = tk.Radiobutton(frame_1, text='通道一', variable=self.v, value=1, width=10, height=3) # 创建第二个单选按钮组件,对应解析通道二,绑定到self.v变量,值为2,设置宽度、高度等外观属性 tb2 = tk.Radiobutton(frame_1, text='通道二', variable=self.v, value=2, width=10, height=3) # 创建一个标签组件,用于提示用户输入视频链接 label1 = tk.Label(frame_2, text="请输入视频链接:") # 创建一个输入框组件,用于用户输入视频链接,绑定到self.url变量,设置高亮颜色、边框厚度和宽度等属性 entry = tk.Entry(frame_2, textvariable=self.url, highlightcolor='Fuchsia', highlightthickness=1, width=35) # 创建一个空白标签,用于在界面上占据一定空间,起到布局间隔作用 label2 = tk.Label(frame_2, text=" ") # 创建一个按钮组件,文本为'播放',设置字体、前景色、宽度、高度等外观属性,绑定点击事件处理函数self.video_play play = tk.Button(frame_2, text="播放", font=('楷体', 12), fg='Purple', width=2, height=1, command=self.video_play) # 创建一个空白标签,用于在界面上占据一定空间,起到布局间隔作用 label3 = tk.Label(frame_2, text=" ") # 创建一个标签组件,用于显示一些解释性的文字,设置前景色和字体属性,初始时未设置具体文本内容 label_explain = tk.Label(frame_3, fg='red', font=('楷体', 12)) # 创建一个标签组件,用于显示一些警告性的文字,设置前景色和字体属性,初始时未设置具体文本内容 label_warning = tk.Label(frame_3, fg='blue', font=('楷体', 12)) # 将三个框架添加到根窗口中,按照创建顺序依次排列布局 frame_1.pack() frame_2.pack() frame_3.pack() # 使用grid布局管理器将各个组件放置在对应的框架内,指定行和列的位置,实现具体的界面布局效果 group.grid(row=0, column=0) tb1.grid(row=0, column=1) tb2.grid(row=0, column=2) label1.grid(row=0, column=0) entry.grid(row=0, column=1) label2.grid(row=0, column=2) play.grid(row=0, column=3, ipadx=10, ipady=10) label3.grid(row=0, column=4) label_explain.grid(row=1, column=0) label_warning.grid(row=2, column=0) def video_play(self): """ 处理视频播放的方法,根据用户选择的解析通道和输入的视频链接,构造相应的解析请求URL,并在浏览器中打开进行视频播放。 如果输入的视频链接格式不正确,则弹出错误提示框。 """ # 通道一对应的解析网址前缀 port_1 = 'https://jx.m3u8.tv/jiexi/?url=' # 通道二对应的解析网址前缀 port_2 = 'https://www.ckplayer.vip/jiexi/?url=' # 使用正则表达式验证用户输入的视频链接是否符合常见的URL格式(以http或https开头) if re.match(r'^https?:/{2}\w.+$', self.url.get()): if self.v.get() == 1: # 获取用户输入的视频链接 ip = self.url.get() # 对视频链接进行URL编码,使其能正确地作为参数传递 ip = urllib.parse.quote_plus(ip) # 构造完整的解析请求URL,并通过webbrowser模块在浏览器中打开 webbrowser.open(port_1 + ip) elif self.v.get() == 2: ip = self.url.get() ip = urllib.parse.quote_plus(ip) # 构造通道二的完整解析请求URL,其中包含对视频链接的编码处理 get_url = 'http://www.vipjiexi.com/x2/tong.php?url=%s' % ip # 通过webbrowser模块在浏览器中打开构造好的解析请求URL webbrowser.open(get_url) else: # 如果视频链接格式验证不通过,弹出错误提示框,告知用户链接地址无效 msgbox.showerror(title='错误', message='视频链接地址无效,请重新输入!') def center(self): """ 将应用程序窗口居中显示在屏幕上的方法,通过获取屏幕尺寸并计算窗口的合适坐标位置来实现。 """ # 获取屏幕的宽度(以像素为单位) ws = self.root.winfo_screenwidth() # 获取屏幕的高度(以像素为单位) hs = self.root.winfo_screenheight() # 计算窗口在水平方向上的居中位置坐标 x = int((ws / 2) - (self.width / 2)) # 计算窗口在垂直方向上的居中位置坐标 y = int((hs / 2) - (self.height / 2)) # 设置窗口的大小和位置,使其居中显示在屏幕上 self.root.geometry(f'{self.width}x{self.height}+{x}+{y}') def loop(self): """ 启动应用程序主循环的方法,设置窗口不可调整大小,并调用center方法将窗口居中,然后启动Tkinter的主事件循环。 """ # 设置窗口在水平和垂直方向上都不可调整大小 self.root.resizable(False, False) # 调用center方法将窗口居中显示 self.center() # 启动Tkinter的主事件循环,使窗口能够响应用户的各种操作(如点击、输入等) self.root.mainloop() if __name__ == '__main__': # 创建APP类的实例,即启动视频解析器应用程序 app = APP() # 调用loop方法,进入应用程序的主循环,开始运行应用程序 app.loop()
作者:luky!