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!