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