XstreamDL-CLI BUG修复记录

928天前 · 分享 · 3980次阅读

XstreamDL-CLI是一款下载dash/hls流的命令行工具(当然也配套了GUI启动器

目前整体比较稳定,但还是有些细节(测试的样本不够多)没有完善好,有一些bug

于是在这里做bug修复记录,免得日后忘了【为什么要这么改】


DASH BaseURL 拼接错误

主要是之前的判断逻辑搞乱了导致,最后根据标准文档,并参考已有项目代码

最终分情况,结合XstreamDL-CLI代码架构进行修复

核心实现见此处代码,关键注释:

2021-10-30T06:34:57.png

m3u8 map分段消失

产生该bug的commit在此

2021-09-14T13:41:24.png

分段数量完整但文件名不连续

本次commit

20210905的时候正在琢磨解析内嵌字幕的dash流,放了一个样本,nilaoda反馈说缺少分片

2021-09-12T15:20:26.png

我亲手用XstreamDL-CLI下载的,怎么会这样呢(...

然后排查了一下,并不是缺少分片,而是命名出现了问题

2021-09-12T15:23:04.png

对于这个mpd,它主要分为两部分,一部分是预览,一部分是会员可看的

但是这种往往不限制后续分段的下载,于是XstreamDL-CLI设计时会自动识别属于同一个流的分段

然后将它们合并为一个流,这个点的代码在这里

即在解析过程中会根据对应流的信息得到一个skey,代码在这里

2021-09-12T15:37:16.png

查看对应的mpd文件,可以看到有两部分,这两部分实际上是同一个流(第一张图指的链接时initialization,指错了,第二张是对的)

2021-09-12T15:34:19.png

2021-09-12T15:35:19.png

由于文件命名是根据解析的时候设置的索引来的,而索引又是根据startNumber来的

所以一开始检查startNumber那里是不是计算错误了,后来发现和这里没有关系

2021-09-12T15:39:29.png

可以看到startNumber确实用于不断循环,生成每一分段的配置,但是并没有实际用于设置分段的索引

索引实际上是在stream.set_media_url(media_url)时会调用append_segment方法自增的

这个自增不是+1,而是通过计算已有的分段数来的

2021-09-12T15:42:48.png

另外还会在set_init_urlDASHStream初始化的时候调用append_segment

重点来了,在调用walk_s的时候,会执行set_init_url方法

2021-09-12T15:47:02.png

然后调用skey_stream[stream.skey].update(stream)合并流

2021-09-12T15:51:31.png

2021-09-12T15:52:00.png

这个时候就会把两个流的init分段都放进去,然后后面调整索引和对应文件名的时候就异常了

注意init的文件名是init.mp4,所以虽然合并后有两个init但是下载的时候只会下载一个

然后中间就出现命名整体向后偏移了

话说这里不是有stream.segments.remove(segment)应该已经将第二个流的init排除掉了呀

但是这里好像没有起作用...后面排查下

那么怎么改比较好呢,后面想了好一会儿,找到一个合适的地方

既然是要合并的流,那么只在最开始的地方设置一次init就行了,后面的流不设置init

这样则可以避免合并时init分段重复的bug

于是在startNumber为1的时候才进入if这里面

2021-09-12T16:00:59.png

OK,测试通过

后续发现是stream.segments_extend的segment.add_offset_for_name对index进行了计算

但即使去除了init分段,每个分段的index都没有变,所以计算修正的时候出现了整体+1的情况

现在改成判断init来决定要不要-1,个人认为这样比之前的startNumber判断方案好一点

commit见此

👍 0

none

最后修改于880天前

评论

取消回复
贴吧 狗头 原神 小黄脸
收起

贴吧

狗头

原神

小黄脸

  1. 1ew 853天前

    这样的key在里面包含的无法自动识别下载 https://v.qq.com/x/cover/mzc00200dd5r9fv/t004186cigp.html
    python -m XstreamDL_CLI.cli "08 .m3u8" 这样下载并不能播放成功 请问要怎么下载

    1. 未末 852天前

      播放视频时右键选择查看视频信息,可以知道这个是widevine加密,如果你要解密,需要通过--key 指定解密key,并启用二进制合并。至于key怎么获取,请自行解决

  2. mmlgdcll 870天前

    大佬好 您在GitHub發佈的wvguesser_v1.5.1離線版, 我嘗試了一下但是無法自動下載offline json
    網站是gagaoolala 請問是失效了還是網站不支持

    1. 未末 870天前

      哪个已经废弃了,建议直接使用插件

      https://github.com/nilaoda/widevine-l3-guesser/tree/modified

      使用时确保chrome是2209版本的cdm

  3. poohboy 915天前

    大佬,我想问一下,iqiyi的m3u8是不是没法获取?我只找到了一个dash链接,然后手动下载了里面的m4s,但用nilaoda的那个解密工具解不了,老提示获取kid失败

  4. Andist 923天前

    感谢您开发的这款软件,对于第一次下载mpd的小白而言很友好!
    这段时间用下来就是有时候下载直连的海外视频流时可能因为网络状况不佳,会有下载不完整的问题,下载完进度没到100%,但是也合并解密了,不知道能否增加下载不完整在最后输出报错信息的功能呢?
    以及我想请教一下如何让下载器使用小飞机的代理呢?我尝试在“使用自定义代理”的选项上勾选,但是好像命令行中没有变化?
    (另外我猜您图中的样本是在下载CP+上的用九柑仔店是吗?我也很喜欢这部剧,是我心目中排名第一的台剧哈哈)

    1. Andist 923天前

      en……实在不好意思,代理我知道怎么启用了。我只勾选了自定义代理,但没有填写proxy参数,我太愚钝了对不起!!!

  5. 大阿达 924天前

    可以下载 优酷的 copyright DRM内容吗

  6. dehooy 925天前

    发现命令行并没有针对本地M3U8下载完成后输出文件名的参数,批处理测试会自动启动本地M3U8的文件名,这不方便批处理调用。另外 ,测试发现关于音视频分流的情况,下载解密后并不会合并这两路流,这是一个BUG,可参考某酷CMAF类型WV加密的M3U8

    1. 未末 924天前

      要批量下载可以通过传入文件夹,文件夹内放要下载的m3u8。
      要批处理调用建议使用N_m3u8DL-CLI。

      你后面说的这个准确来说是混流操作,考虑到dash流,master m3u8的复杂性,目前不提供混流功能,这不是bug。混流请自行手动完成

目录

avatar

未末

迷失

126

文章数

275

评论数

7

分类