觅风十五年风雨与你同舟共济

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

[复制链接]

微信扫一扫 分享朋友圈

AbdulMolin 发表于 2025-3-9 10:00:56 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

马上注册,结交更多易友,享用更多功能,让你轻松玩转觅风论坛。

您需要 登录 才可以下载或查看,没有账号?立即注册

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

  1. .版本 2
  2. .支持库 edroptarget
  3. .支持库 iext
  4. .支持库 internet
  5. .支持库 EThread

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

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

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

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

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

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

  22. mpv.暂停 ()

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

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

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

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

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

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


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

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

  40. .如果结束


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

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


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

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

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

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

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

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


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

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

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



  89. .子程序 下载子程序

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

  102. .如果结束


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

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

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

  116. 启动线程 (&解析, , )


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


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

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

  157.     .如果结束

  158. .如果结束

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

  181. .如果真结束

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

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

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


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


  201.             .如果结束

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

  206.         .如果真结束

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


  213. .否则

  214. .如果结束


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


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




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


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


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

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


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

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

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








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

  256. mpv.置百分比位置 (进度条.位置)
复制代码


QQ20250309-095621.jpg
游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

精彩评论10

徐少 发表于 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
回复 支持 反对

使用道具 举报

中国好叔叔 发表于 7 天前 | 显示全部楼层
支持,赞
回复 支持 反对

使用道具 举报

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

本版积分规则

关注我们:觅风论坛与你快乐分享

收藏本站

用心服务做个非盈利公益编程网站

www.eyyba.com

服务人:觅风论坛

Email:eyyba@foxmail.com

Powered by WWW.EYYBA.COM X3.4© 2001-2023 Inc.   版权所有   

觅风论坛  疆ICP备15020893号-1