这版下载器是将MPV播放器和线程池下载M3U8结合在一起,方便先查看M3U8源是否可观看然后下载,还是需要用到ffmpeg.exe。如果线程池解析不出,可直接用ffmpeg下载,那需要用到33M以上的ffmpeg,你可以从网上下载,我资源里只传了11M的ffmpeg,因为目前我用线程池和11M的已经够用了。我封装依赖的模块,为了美化另用了皮肤模块,相关源码和成品在云盘里了。
33个皮肤模块.rar
(796.42 KB, 下载次数: 14)
MPV播放线程池下载模块2025.rar
(16.94 KB, 下载次数: 39)
窗口程序集名 | 保 留 | 保 留 | 备 注 | 窗口程序集_启动窗口 | | | | 变量名 | 类 型 | 数组 | 备 注 | 线程池 | 线程池自改版 | | 临时目录 | 文本型 | | 已下载数 | 整数型 | | mpv | mpv播放器 | |
mpv. 创建 (图片框1. 取窗口句柄 ()) 拖放对象1. 注册拖放控件 (图片框1. 取窗口句柄 ()) 加载皮肤 (20 )时钟1.时钟周期 = 1 标签6.标题 = 时间格式化 (到文本 (四舍五入 (mpv. 取位置 (), 2 )) ) + “/” + 时间格式化 (到文本 (四舍五入 (mpv. 取长度 (), 2 )) ) 进度条.位置 = mpv. 取百分比位置 ()mpv. 暂停 ()mpv. 播放 ()mpv. 是否循环播放 (真)mpv. 置音量 (hk条_音量.位置 ) 如果真 (通用对话框1. 打开 ())  mpv. 打开 (通用对话框1.文件名 ) mpv. 是否循环播放 (真) 如果 (编辑框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 mpv. 打开 (接收到的文件路径 )mpv. 是否循环播放 (真)线程池. 启动 (到整数 (编辑框_线程数.内容 ), &下载, ) 计次循环首 (超级列表框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, , ) 返回 () 启动线程 (&解析, , )变量名 | 类 型 | 静态 | 数组 | 备 注 | m3u8 | 文本型 | | | 路径 | 文本型 | | | 地址源 | 文本型 | | | 新地址 | 文本型 | | | 域名头 | 文本型 | | | 域名中 | 文本型 | | | 域名尾 | 文本型 | | | key正则 | 正则表达式类 | | | 本地key | 文本型 | | | key替换 | 文本型 | | | 计数 | 整数型 | | | key文件 | 文本型 | | | 域名 | 文本型 | | | 二次源 | 文本型 | | | ts列表 | 文本型 | | 0 | 解析流名 | 文本型 | | | 计次 | 整数型 | | | 待换数组 | 文本型 | | 0 | 用作替换数组 | 文本型 | | 0 | 表项行 | 整数型 | | |
路径 = 子文本替换 (临时目录, “\”, “/”, , , 真)m3u8 = 子文本替换 (编辑框2.内容, “\”, “/”, , , 真)域名头 = 文本_取左边 (m3u8, 网页_取域名 (m3u8 ), , ) + 网页_取域名 (m3u8 )域名尾 = 网页_取网址文件名 (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))
 计次循环尾 () 超级列表框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”, 到字节集 (二次源 )) 处理事件 ()关闭所有文件 () 如果真 (标签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. 置百分比位置 (进度条.位置 )|
edroptarget | iext | internet | EThread |
|