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!

物联沃分享整理
物联沃-IOTWORD物联网 » Python制作视频解析全平台免费追剧神器

发表回复