马上注册,结交更多易友,享用更多功能,让你轻松玩转觅风论坛。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
这版下载器是将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.置百分比位置 (进度条.位置)
复制代码
|