前几天不是那啥庆余年电视剧比较热嘛, 鄙人也跟风追了一次剧, 毕竟是当初的老书迷了. 本来原原本本的应该不会起啥波澜的, 我腾讯爱奇艺的视频会员都还是有那么半年多, 慢慢的每周看上几集就好了, 凡是都有意外嘛, 年轻人怎么会不看新闻, 不逛社区呢, 视频网站出一个SVIP, 盗版网站直接流出全集 … 舍不得那炒鸡VIP又想看那后面的剧情, 就只能去盗版网站看咯
才出来那几天那些网站真的卡, 也有可能是因为我用的是移动的网络吧, 反正看个剧卡的我一顿一顿的真的不能忍啊. 我用那个猫抓解析看了下, 这视频有是m3u8的流视频, 开始就直接用猫抓解析直接生成 wget 命令, 然后自己给加上 ffmpeg 的合并命令, 再那慢慢的下载, 不过需要自己手动去编辑每条命令, 而且wget这个单线程下载真的炒鸡慢, 必须要前一个下载好了才会下载下一个, 针对这种很多小文件 wget 真不是啥好的选择, 这才诞生了自己做点啥的想法
生成 wget 脚本
本人再工作上还主要是偏前端js的, 跟文件有关只能去搞nodejs咯. 先来实现下用M3U8文件地址自动生成一个sh脚本
m3u8的文件结构
首先当然是要来分析下文件结构咯
1 | #EXTM3U |
我们主要就是想提取那个ts文件嘛, 我最开始是按照\n拆出每行, 然后通过正则筛选出.ts结尾的元素
1 | ... |
但是直到我遇到非.ts的元素, 还有windows的系统换行就一个\n, 我又没拆出元素来, emmm, 后面再看了几眼那个文件, 才灵光一闪, 发现非文件元素前面都会带上一个#, 这就好办多了嘛…
1 | const list = data.split('\n').filter(item=> !/^#\w+/.test(item)) |
提取文件链接的元素
[700ab1ea944000001.ts, 700ab1ea944000000.ts, … ] 经过我们处理过的数据应该就是这样子了, 但是我们那这个也没用吧, 还需要给他加上文件的路径, 这个就需要我们从链接元素里面提取了
这里我同样通过拆解链接里面的目录, 把最后的文件提取出来, 然后原链接替换一下就是目录了
1 | const { filePath, fileName } = ((url)=>{ |
生成 wget 合并脚本
上面思路大致都好了, 我们http获取m3u8数据, 然后拆解获得文件的数组, 后面嘛我们遍历一下, 拼接出sh脚本内容就行,最后直接用node的fs模块直接降内容写入的文件就行
1 | let shData = '' // 脚本数据 |
代码实现
前奏基本都好了, 我这里依然使用我的老朋友axios来发起 HTTP 请求, 不过我这是自己封装过10秒超时, 然后直接返回data的http.
1 | const $http = require('./libs/http') |
这样我们运行整个代码, 就会生成一个文件夹, 里面有个脚本文件可以直接运行的, 当然windows系统的话你需要先手动下载wget.exe, 放到stystem32 / System64文件夹下面, 并且安装上了ffmpge. Linux也需要确保wget命令, ffmpg及其依赖安装上了.