AbdulMolin 发表于 2025-3-9 10:00:56

最新2025年易语言实现MPV自改线程池M3U8下载器源码(2025)

       这版下载器是将MPV播放器和线程池下载M3U8结合在一起,方便先查看M3U8源是否可观看然后下载,还是需要用到ffmpeg.exe。如果线程池解析不出,可直接用ffmpeg下载,那需要用到33M以上的ffmpeg,你可以从网上下载,我资源里只传了11M的ffmpeg,因为目前我用线程池和11M的已经够用了。我封装依赖的模块,为了美化另用了皮肤模块,相关源码和成品在云盘里了。

.版本 2
.支持库 edroptarget
.支持库 iext
.支持库 internet
.支持库 EThread

.程序集 窗口程序集_启动窗口
.程序集变量 线程池, 线程池自改版
.程序集变量 临时目录, 文本型
.程序集变量 已下载数, 整数型, , , 必须在窗口或全局变量里,保证进度条工作
.程序集变量 mpv, mpv播放器

.子程序 __启动窗口_创建完毕

mpv.创建 (图片框1.取窗口句柄 ())
拖放对象1.注册拖放控件 (图片框1.取窗口句柄 ())
加载皮肤 (20)
时钟1.时钟周期 = 1

.子程序 _时钟1_周期事件

' 标签6.标题 = 到文本 (四舍五入 (mpv.取位置 () ÷ mpv.取长度 (), 2) × 100) + “%”
标签6.标题 = 时间格式化 (到文本 (四舍五入 (mpv.取位置 (), 2))) + “/” + 时间格式化 (到文本 (四舍五入 (mpv.取长度 (), 2)))
' 标签2.标题 = 格式化文本 (“%d%% / 100%%”, mpv.取百分比位置 ())
进度条.位置 = mpv.取百分比位置 ()

.子程序 _按钮_暂停_被单击

mpv.暂停 ()

.子程序 _按钮_播放_被单击

mpv.播放 ()
mpv.是否循环播放 (真)

.子程序 _hk条_音量_位置被改变

mpv.置音量 (hk条_音量.位置)

.子程序 _按钮_打开_被单击

.如果真 (通用对话框1.打开 ())
    mpv.打开 (通用对话框1.文件名)
    mpv.是否循环播放 (真)
.如果真结束


.子程序 _按钮_打开2_被单击

.如果 (编辑框2.内容 = “”)
    信息框 (“请将URL填入m3u8源框内”, 0, , )
    返回 ()
.否则
    mpv.打开 (编辑框2.内容)
    mpv.是否循环播放 (真)

.如果结束


.子程序 __启动窗口_尺寸被改变

.如果 (_启动窗口.位置 = 3)
    图片框1.移动 (0, 2, 取用户区宽度 (), 取用户区高度 () × 0.95)
    进度条.移动 (280, 取用户区高度 () × 0.97, 取用户区宽度 () × 0.4, 15)
    hk条_音量.移动 (取用户区宽度 () × 0.9, 取用户区高度 () × 0.97, 90, 20)
    按钮_打开.移动 (取用户区宽度 () × 0.6, 取用户区高度 () × 0.97, 64, 25)
    按钮_播放.移动 (取用户区宽度 () × 0.75, 取用户区高度 () × 0.97, 64, 25)
    按钮_暂停.移动 (取用户区宽度 () × 0.7, 取用户区高度 () × 0.97, 64, 25)
    按钮_打开2.移动 (取用户区宽度 () × 0.65, 取用户区高度 () × 0.97, 64, 25)
    按钮_停止.移动 (取用户区宽度 () × 0.8, 取用户区高度 () × 0.97, 64, 25)
    标签6.移动 (19, 取用户区高度 () × 0.965, 153, 25)
.否则
    图片框1.移动 (0, 1, 344, 260)
    进度条.移动 (160, 270, 124, 15)
    hk条_音量.移动 (285, 267, 65, 20)
    按钮_打开.移动 (9, 296, 64, 25)
    按钮_播放.移动 (201, 296, 64, 25)
    按钮_暂停.移动 (137, 296, 64, 25)
    按钮_打开2.移动 (73, 296, 64, 25)
    标签6.移动 (6, 266, 153, 20)
    按钮_停止.移动 (265, 296, 64, 25)
.如果结束


.子程序 _按钮_停止_被单击

mpv.打开 (“”)
时钟1.时钟周期 = 1

.子程序 _拖放对象1_得到文件
.参数 接收到的文件路径, 文本型

mpv.打开 (接收到的文件路径)
mpv.是否循环播放 (真)

.子程序 执行下载
.局部变量 线程ID, 整数型

线程池.启动 (到整数 (编辑框_线程数.内容), &下载, )
.计次循环首 (超级列表框1.取表项数 (), 线程ID)
    线程池.加入工作 (线程ID)
.计次循环尾 ()


.子程序 下载
.参数 总行数, 整数型
.局部变量 切片源, 文本型

切片源 = 超级列表框1.取标题 (总行数 - 1, 1)
写到文件 (临时目录 + “\” + 网页_取网址文件名 (切片源), HTTP读文件 (切片源))
超级列表框1.置标题 (总行数 - 1, 2, “已下载”)
已下载数 = 已下载数 + 1

进度条1.位置 = 到整数 (已下载数 ÷ 超级列表框1.取表项数 () × 100)
标签2.标题 = 到文本 (进度条1.位置) + “%”
.如果真 (标签2.标题 = “100%”)
    线程池.关闭 (到整数 (编辑框_线程数.内容))
    下载子程序 ()
.如果真结束



.子程序 下载子程序

标签2.标题 = “下载完成,正在转换”
.如果 (文件是否存在 (取运行目录 () + “\ffmpeg.exe”) = 假)
    信息框 (“请将ffmpeg.exe放在本程序目录中”, 0, , )
    返回 ()
.否则
    系统_取DOS执行结果 (取运行目录 () + “\ffmpeg -allowed_extensions ALL -i” + 临时目录 + “\index.m3u8 -c copy” + 取运行目录 () + “\” + 编辑框_文件名.内容 + “.mp4”)
    .如果真 (文件是否存在 (取运行目录 () + “\” + 编辑框_文件名.内容 + “.mp4”) = 真)
      删除目录 (临时目录)
      标签2.标题 = “下载完成,源已删除”
      进度条1.位置 = 0
      超级列表框1.全部删除 ()
    .如果真结束

.如果结束


.子程序 _按钮_解析_被单击

临时目录 = 取运行目录 () + “\” + 编辑框_文件名.内容
.如果 (编辑框2.内容 ≠ “” 且 编辑框_文件名.内容 ≠ “”)
    .如果 (文件是否存在 (取运行目录 () + “\” + 编辑框_文件名.内容 + “.mp4”) = 假)
      创建目录 (临时目录)
    .否则
      信息框 (“文件已存在或文件名重复,请重命名”, 0, , )
      返回 ()
    .如果结束

.否则
    信息框 (“下载链接或保存名没有填,请检查”, 0, , )
    返回 ()
.如果结束

启动线程 (&解析, , )


.子程序 解析, , , 分析出ts数组下载流
.局部变量 m3u8, 文本型, , , m3u8源
.局部变量 路径, 文本型, , , 保存文件本地路径
.局部变量 地址源, 文本型, , , 分析开始地址**
.局部变量 新地址, 文本型, , , 得到二次地址**
.局部变量 域名头, 文本型, , , 链接头部**
.局部变量 域名中, 文本型, , , 链接中部**
.局部变量 域名尾, 文本型, , , 链接尾部**
.局部变量 key正则, 正则表达式类, , , 匹配取引号中间key
.局部变量 本地key, 文本型, , , 下载到本地的key
.局部变量 key替换, 文本型, , , 替换key文件中的网址为本地
.局部变量 计数, 整数型, , , 记录次数的变量
.局部变量 key文件, 文本型, , , 解密文件
.局部变量 域名, 文本型, , , 流名前附加域名**
.局部变量 二次源, 文本型, , , 分析二次地址返回文本**
.局部变量 ts列表, 文本型, , "0", 分析得到下载列表**
.局部变量 解析流名, 文本型, , , 分解出单条ts**
.局部变量 计次, 整数型, , , 循环变量**
.局部变量 待换数组, 文本型, , "0", m3u8本地组
.局部变量 用作替换数组, 文本型, , "0", m3u8本地组
.局部变量 表项行, 整数型, , , 列表第几行


路径 = 子文本替换 (临时目录, “\”, “/”, , , 真)
m3u8 = 子文本替换 (编辑框2.内容, “\”, “/”, , , 真)
域名头 = 文本_取左边 (m3u8, 网页_取域名 (m3u8), , ) + 网页_取域名 (m3u8)
域名尾 = 网页_取网址文件名 (m3u8)' index.m3u8
域名中 = 文本_取出中间文本 (m3u8, 域名头, 域名尾, , )
' =============================================================拆分初始地链接
地址源 = 到文本 (HTTP读文件 (删首尾空 (m3u8)))
.如果 (地址源 = “”)
    信息框 (“m3u8地址失效,可将https换成http再试”, 0, , )
    返回 ()

.否则
    .如果 (寻找文本 (地址源, “http”, , 假) ≠ -1)
      新地址 = m3u8
    .否则
      .如果 (寻找文本 (地址源, 域名中, , 假) ≠ -1)
            新地址 = 域名头 + 域名中 + 文本_取右边 (地址源, 域名中)
      .否则
            新地址 = m3u8
      .如果结束

    .如果结束

.如果结束

' ========================================================================得到二次链接
二次源 = 到文本 (HTTP读文件 (新地址))
.如果 (寻找文本 (二次源, 域名头 + 域名中, , 假) ≠ -1)
    域名 = 域名头 + 域名中
.否则
    域名 = 取文本左边 (新地址, 倒找文本 (新地址, “/”, , 假))
.如果结束
处理事件 ()
' ==========================================================================得到下载流前缀域名
.如果真 (寻找文本 (二次源, “.key”, , 假) > 0)
    key正则.创建 (“” + #引号 + “(.*?)” + #引号 + “”, 二次源)
    .计次循环首 (key正则.取匹配数量 (), 计数)
      key文件 = key正则.取子匹配文本 (计数, 1)
      key替换 = 路径 + “/” + 到文本 (计数) + “.key”
      二次源 = 文本_替换 (二次源, , , , key文件, key替换, , , )
      .如果 (寻找文本 (key文件, “https”, , 假) ≠ -1)
            本地key = key文件
      .否则
            本地key = 域名头 + key文件
      .如果结束
      写到文件 (临时目录 + “\” + 到文本 (计数) + “.key”, HTTP读文件 (本地key))' 写出key解密文件
    .计次循环尾 ()

.如果真结束

' ==============================================================================写出解密文件
超级列表框1.全部删除 ()
ts列表 = 分割文本 (二次源, 字符 (10), )
处理事件 ()

.如果 (取数组成员数 (ts列表) ≠ 0)
    .计次循环首 (取数组成员数 (ts列表), 计次)

      .如果真 (取文本右边 (ts列表 [计次], 3) = “.ts”)
            解析流名 = ts列表 [计次]
            加入成员 (待换数组, 解析流名)
            加入成员 (用作替换数组, 路径 + “/” + 取文本右边 (解析流名, 取文本长度 (解析流名) - 倒找文本 (解析流名, “/”, , 假)))


            .如果 (寻找文本 (解析流名, “http”, , 假) ≠ -1)
                解析流名 = ts列表 [计次]
            .否则
                .如果 (寻找文本 (解析流名, “/”, , 假) ≠ -1)
                  解析流名 = 文本_取右边 (解析流名, “/”)
                  解析流名 = 域名 + 解析流名
                .否则
                  解析流名 = 域名 + 解析流名
                .如果结束


            .如果结束

            表项行 = 超级列表框1.插入表项 (, , , , , )
            超级列表框1.置标题 (表项行, 0, 到文本 (表项行 + 1))
            超级列表框1.置标题 (表项行, 1, 解析流名)
            超级列表框1.保证显示 (表项行)

      .如果真结束

    .计次循环尾 ()
    .如果 (超级列表框1.取表项数 () > 0)
      标签2.标题 = “解析完成”
    .否则
      标签2.标题 = “解析失败”
    .如果结束


.否则

.如果结束


二次源 = 文本_快速替换_EX (二次源, 待换数组, 用作替换数组, 1, 1, )
写到文件 (临时目录 + “\index.m3u8”, 到字节集 (二次源))' 得到本地m3u8


处理事件 ()
关闭所有文件 ()
.如果真 (标签2.标题 = “解析完成”)
    执行下载 ()
.如果真结束




.子程序 _按钮_搜索_被单击
.局部变量 行内容, 文本型
.局部变量 网源码, 文本型


网源码 = 到文本 (HTTP读文件 (网页地址框.内容))
.如果 (文本_寻找文本 (网源码, “.m3u8”, , 假) = -1)
    信息框 (“没找到指定文件,请换网址再次搜寻”, 0, , )
    返回 ()
.否则
    行内容 = 文本_取指定变量文本行 (网源码, 文本_取文本所在行_优化版 (网源码, “.m3u8”, , 假))
    编辑框2.内容 = “http” + 文本_倒取出中间文本 (行内容, “.m3u8”, “http”, , 假) + “.m3u8”
.如果结束


.子程序 _按钮_符号_被单击

编辑框2.内容 = 子文本替换 (编辑框2.内容, “\/”, “/”, , , 真)
编辑框2.内容 = 子文本替换 (编辑框2.内容, “\”, “/”, , , 真)


.子程序 _按钮_下载_被单击

临时目录 = 取运行目录 () + “\” + 编辑框_文件名.内容
.如果 (编辑框2.内容 ≠ “” 且 编辑框_文件名.内容 ≠ “”)
    .如果 (文件是否存在 (取运行目录 () + “\” + 编辑框_文件名.内容 + “.mp4”) = 假)
      .如果 (寻找文件 (“ffmpeg.exe”, ) ≠ “”)
            运行 (“cmd.exe /c   ” + 取运行目录 () + “\ffmpeg.exe-i ” + 编辑框2.内容 + “ ” + 取运行目录 () + “\” + 编辑框_文件名.内容 + “.mp4”, 假, )
      .否则
            信息框 (“需有ffmpeg.exe”, 0, , )
            返回 ()
      .如果结束
      创建目录 (临时目录)
    .否则
      信息框 (“文件已存在或文件名重复,请重命名”, 0, , )
      返回 ()
    .如果结束

.否则
    信息框 (“下载链接或保存名没有填,请检查”, 0, , )
    返回 ()
.如果结束








.子程序 _进度条_位置被改变

mpv.置百分比位置 (进度条.位置)


**** Hidden Message *****

徐少 发表于 2025-3-11 18:41:30

感谢这个i资源

csw96781 发表于 2025-3-14 03:22:04

11111111111111111111111111

qq1423845446 发表于 2025-3-16 12:02:38

谢谢分享!~

徐少 发表于 2025-3-18 20:43:12

嘻嘻不错支持一个

咬牙坚持 发表于 2025-3-21 05:23:45

谢谢楼主的辛苦分享

sada 发表于 2025-3-22 21:28:17

看看看看看看看看看看看看

lllll557 发表于 2025-3-24 13:32:49

谢谢分享!~

w115182772 发表于 2025-3-26 05:37:21

谢谢楼主,,,收藏ing

中国好叔叔 发表于 2025-3-27 21:41:53

支持,赞
页: [1] 2
查看完整版本: 最新2025年易语言实现MPV自改线程池M3U8下载器源码(2025)