登录  | 立即注册

游客您好!登录后享受更多精彩

查看: 108|回复: 1

[源码] MPV自改线程池M3U8下载器(2025)

[复制链接]

171

主题

21

回帖

1048

积分

管理员

积分
1048
发表于 2025-3-9 20:05:28 | 显示全部楼层 |阅读模式
035725j8ww5s1wod7dg984.jpg

这版下载器是将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)
    域名 = 域名头 + 域名中
.否则
    域名 = 取文本左边 (新地址, 倒找文本 (新地址, “/”, , 假))
.如果结束
处理事件 ()
' ==========================================================================得到下载流前缀域名

游客,如果您要查看本帖隐藏内容请回复

0

主题

189

回帖

145

积分

注册会员

积分
145
发表于 7 天前 | 显示全部楼层
好东西 !!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|断点社区 |网站地图

GMT+8, 2025-4-4 14:01 , Processed in 0.119187 second(s), 23 queries , Yac On.

Powered by XiunoBBS

Copyright © 2001-2025, 断点社区.

快速回复 返回顶部 返回列表