/XstreamDL-CLI

命令行版本的HLS/DASH流下载器,支持标准AES-128-CBC解密

Primary LanguagePythonGNU Lesser General Public License v2.1LGPL-2.1

XstreamDL-CLI

基于python 3.7.4+的,命令行版本的,HLS/DASH流下载器,仅支持HLS标准AES-128-CBC解密

使用

首先将ffmpegmp4decrypt的可执行文件放置在binaries文件夹中

可执行文件下载链接点此

安装必要的库

pip install -r requirements.txt

使用样式示例

python -m XstreamDL_CLI.cli [OPTION]... URL/FILE/FOLDER...

简单示例

python -m XstreamDL_CLI.cli --b64key oKi/hwKVuLveo/hISX1PQw== --hexiv b3d5ca56926d49d8e96b70aa5c7b358e --name 第一节总论 https://hls.videocc.net/d06ae002cb/2/d06ae002cb4a0bed78fb912c874fdbb2_2.m3u8

一些概念

README中存在一些对于新人不友好的术语或者我使用的名词,这里写一点说明,希望有帮助

元数据

通常情况下,直接访问m3u8/mpd链接可以看到含有完整或部分分段链接的文本内容,这些内容被称为元数据

通过元数据和m3u8/mpd链接,软件可以转换出全部分段链接,最终用于下载

也就是说软件所需要的链接是存放元数据的链接

分段链接

怎么会有人不知道什么是分段链接?根据我收到的反馈,真的有...

所谓分段链接就是媒体文件的链接,如果你下载某个链接,然后使用文本编辑器打开,例如记事本

发现显示在你眼前的是一些看不懂的乱码,恭喜你,你下载的是分段链接

初始分段链接/init分段

怎么知道一个分段链接是不是初始分段链接?

通常情况下,在加载元数据链接之后紧接着加载的分段链接,就是初始分段链接

当然上面的说法不是百分百正确,另一个判断方法是检查链接中?之前(如果有?的话)的末尾部分,是不是诸如map.xxx以及init.xxx的字符

如果是,那么这就是一个初始分段链接

更加准确的判断方法?

当然有,你下载这个分段链接后,使用mediainfo这一类工具查看其属性,如果有时间码率等信息,并且这个文件只有几KB大小

那么这就是一个初始分段链接

如何反馈

首先,请在使用软件前仔细阅读此README的详细说明,本软件在使用上存在一定门槛

当你确实遭遇到无法下载的链接,请先检查下面的问题

  • 输入链接是不是不被软件支持?
    • 案例一,有用户想下载dash流中的字幕,但传入的链接是init分段的链接。软件需要的是mpd链接而不是分段链接
    • 案例二,用户希望下载m3u8直播流,但下载失败。阅读下面的详细说明的直播录制后你就会知道目前还没有实现m3u8直播下载
  • 是不是和浏览器/抓包结果中链接不一样?
    • 链接一样,请阅读访问受限
    • raw.json中的链接是正确链接的一部分,请阅读链接鉴权
    • raw.json中的链接后半部分是正确链接的一部分,请阅读未成功下载任何文件
    • raw.json中的链接前半部分是正确链接的一部分,但后半部分和正确链接八竿子打不着,请提issue
  • 是不是没有使用代理?
    • 案例一,用户开启了全局代理,但无法下载视频。注意软件目前仅支持http代理,并且默认不走系统代理

为了方便理解彼此的意图,反馈时请尽可能提供下面的信息

  • 目标链接
  • 你所使用的完整命令
  • 正确的初始分段链接,除初始分段外的任意一个分段链接
  • 是否存在ip访问限制,如果存在这种可能性,请务必说明可以访问该链接的的地区
  • 是否存在时效性限制,特别是直播流
  • 对于存在鉴权、时效性较短的链接,请提供m3u8/mpd(元数据)文件
    • 你可以通过抓包/浏览器F12查看响应得到内容,然后复制保存到本地
  • 目标链接对应的在线网页地址

如果不想暴露目标链接/网站,请发送信息到我的邮箱

详细说明

下载默认/指定流

当前软件提供了--select选项用于辅助用户选择需要下载的流

但更多的用户希望可以通过指定分辨率、最佳质量一类选项进行下载

这会在以后实现

未成功下载任何文件

对于dash流,这有可能是因为mpd链接与实际分段链接不匹配,即软件使用了错误的base-url

这个时候请尝试使用--prefer-content-base-url选项进行修正

这是一个mpd内容解析的遗留bug,后续会修复

对于hls流,请上报详细信息给我

对于这种情况,请检查浏览器中的分段请求链接是否与raw.json文件中的一致

下载加速

如果要下载的目标文件所在的服务器与下载器直接的连接性较差,比如在你使用代理的时候,你可以选择

  • 增大--limit-per-host数值,以提升下载速度
  • 开启--disable-force-close选项,提升下载速度

如果连接性较好,则保持默认就好,当然--disable-force-close也是推荐开启的

Q: 为什么--disable-force-close选项不是默认开启

A: 之前在编写软件过程中,出现过bug,某个循环异常,开启该选项后导致在极短时间内网络连接数耗尽,然后网络瘫痪,所以默认强制关闭链接,以确保不会发生这种情况

直播录制

目前仅支持dash流的录制,可以通过--live选项指明这是直播流

通过--live-duration指明要录制的时长,该选项不是特别准确,最终文件时长通常大于期望的时长

如果是回放类型的dash流,可以尝试普通模式下载

后续会尝试支持m3u8直播流

代理

目前--proxy选项仅支持设定http代理,示例 -> http://127.0.0.1:10809

后续会尝试支持socks5代理

m3u8解密

下载器会自动尝试下载key,但目前绝大部分网站是不提供可直接用于解密的key的

所以需要手动指定解密所使用的keyiv

  • --b64key base64编码的解密key字符串
  • --hexiv 16进制形式的解密iv字符串,如果不设置则默认是二进制0

dash流解密

下载器调用mp4decrypt解密,请通过--key设置解密key,不设置则会强制二进制合并

ism解密

暂不支持

似乎是可以通过mp4decrypt进行解密的,但是我不知道如何构造解密需要的文件头,如果有人可以提供这方面的帮助,请联系我

访问受限

某些网站需要携带cookies、referer或者特定的请求头才能访问分段文件,这种情况可以通过设置--headers实现正常下载

链接鉴权

某系网站会在常规的链接后面增加一系列参数,用于检查用户是否有权限访问,通常情况下和流本身无关,往往是相同的内容,常见于dash类型流

遇到这种情况,可以使用--url-patch设置这部分内容,例如mpd域名是nammaflix-streams.streamready.in

仅解析

--parse-only表明仅仅解析流,而不会进行任何下载,使用该选项,只会产生raw.json文件

重复流

如果经常使用本下载器下载dash流,可能会发现有的网站两条流名字完全一样,实际上查看mpd内容,确实如此

--index-to-name正是为了处理这一问题而设置的

此外可以与--show-init搭配使用,将会显示对应的初始分段链接,辅助选择需要下载的流

日志

目前下载器添加了详细的日志记录,用于辅助程序异常定位,输出日志在logs文件夹中

--log-level选项用于指定要显示输出的日志级别,无论如何设置,完整的日志总是会记录到logs文件夹

GUI支持

已有基于PySide6的GUI计划

C#版写起来非常不顺手,搁置了

混流支持

已在计划中,将使用mp4box进行混流

下载重试

下载器重试次数为5

如果遇到图中这样的情况,即进度没有达到100%,说明下载并没有完成,请按之前的步骤重复操作,下载器会自动下载未完成的分段

最终成功的进度示意

HELP INFO

version 1.3.1, A downloader that download the HLS/DASH stream.
usage: XstreamDL-CLI [OPTION]... URL/FILE/FOLDER...

A downloader that download the HLS/DASH stream

positional arguments:
  URI                   URL/FILE/FOLDER string

optional arguments:
  -v, --version         print version and exit
  -h, --help            print help message and exit
  -live, --live         live mode
  -live-duration LIVE_DURATION, --live-duration LIVE_DURATION
                        live record time, format HH:MM:SS, example 00:00:30
                        will record about 30s
  -name NAME, --name NAME
                        specific stream base name
  -base-url BASE_URL, --base-url BASE_URL
                        set base url for Stream
  -prefer-content-base-url, --prefer-content-base-url
                        prefer use content base url for Stream
  -service-location SERVICE_LOCATION, --service-location SERVICE_LOCATION
                        set serviceLocation for BaseURL choose
  -save-dir SAVE_DIR, --save-dir SAVE_DIR
                        set save dir for Stream
  --select              show stream to select and download, default is to
                        download all
  --disable-force-close
                        default make all connections closed securely, but it
                        will make DL speed slower
  --limit-per-host LIMIT_PER_HOST
                        increase the value if your connection to the stream
                        host is poor, suggest >100 for DASH stream
  --user-agent USER_AGENT
                        set user-agent headers for request
  --referer REFERER     set custom referer for request
  --headers HEADERS     set custom headers for request, separators is |, e.g.
                        "header1:value1|header2:value2"
  --url-patch URL_PATCH
                        add some custom strings for all segments link
  --overwrite           overwrite output files
  --raw-concat          concat content as raw
  --disable-auto-concat
                        disable auto-concat
  --enable-auto-delete  enable auto-delete files after concat success
  --disable-auto-decrypt
                        disable auto-decrypt segments before dump to disk
  --key KEY             <id>:<k>, <id> is either a track ID in decimal or a
                        128-bit KID in hex, <k> is a 128-bit key in hex
  --b64key B64KEY       base64 format aes key, only for HLS standard
                        AES-128-CBC encryption
  --hexiv HEXIV         hex format aes iv
  --proxy PROXY         use http proxy, e.g. http://127.0.0.1:1080
  --disable-auto-exit   disable auto exit after download end, GUI will use
                        this option
  --parse-only          parse only, not to download
  --show-init           show initialization to help you identify same name
                        stream
  --index-to-name       some dash live have the same name for different
                        stream, use this option to avoid
  --log-level {DEBUG,INFO,WARNING,ERROR}
                        set log level, default is INFO
  --redl-code REDL_CODE
                        re-download set of response status codes , e.g.
                        408,500,502,503,504

pyinstaller打包

pyinstaller -i logo.ico -n XstreamDL-CLI_v1.3.1 -F XstreamDL_CLI\__main__.py

特性

  • 基于aiohttp

其他

  • 逐步完善中

反馈 & FeedBack