# 命令行参数

我能做到的远不止你看到的这些哦~

参数的使用方法

如果你经常使用命令行工具的话,这部分直接跳过就好啦~

  • 指定参数值

    比如你需要修改下载格式为 flv,只需要

    bilili <url> --type=flv
    # 或者
    bilili <url> -t flv
    # 当然你也可以不拘泥于这样的用法,下面这两种当然也是可以的
    bilili <url> -t=flv
    bilili <url> --type flv
    
  • 切换 True or False

    对于那些不需要指定具体值,只切换 True or False 的参数,你也不需要在命令中指定值,比如开启强制覆盖已下载视频选项

    bilili <url> --overwrite
    # 或者
    bilili <url> -w
    
  • 多参数同时使用

    直接向后加即可,而且 <url> 和其它参数都不强制要求顺序,比如下面这些命令都是合法的

    bilili <url> --overwrite --format=flv
    bilili --overwrite -f flv <url>
    bilili -w <url> --format=flv
    

# 源格式修改

  • 参数 -t--type
  • 可选值 flv | dash | mp4
  • 默认值 dash

视频格式是指 bilibili 直接提供的资源格式,不过我最终都会转换成通用的 mp4 格式方便观看的啦,不同格式在通用性、下载速度等方面的比较如下

dash flv mp4
支持程度 中(少数视频不支持) 低(仅支持投稿视频)
下载速度
需要 FFmpeg 合并
清晰度支持 全面 中(部分较新的 4K 等清晰度无法获取) 极少(仅支持 1080P 及更低的清晰度,且无法选择)
备用链接数量 2 2 0
我该怎么选 B 站当前使用的格式,拥有齐全的清晰度和最佳的下载速度 当 dash 无法下载时的备用选项 除了不需要合并,一无是处

# 指定存储目录

  • 参数 -d--dir
  • 默认值 运行目录

也就是指定我要把视频放到哪里啦,不告诉我的话,就只能放在你的运行目录了。

# 指定视频清晰度

  • 参数 -q--quality
  • 可选值 120 | 116 | 116 | 112 | 80 | 74 | 64 | 32 | 16
  • 默认值 120

清晰度对应关系如下

code 清晰度
120 超清 4K
116 超清 1080P60
112 高清 1080P+
80 高清 1080P
74 高清 720P60
64 高清 720P
32 清晰 480P
16 流畅 360P
208 高清 1080P,MP4 格式专属,无法作为参数指定
192 高清 720P,MP4 格式专属,无法作为参数指定
6 极速 240P,MP4 格式专属,无法作为参数指定

并不是说指定某个清晰度就一定会下载该清晰度的视频,我只会尽可能满足你的要求,如果不存在指定的清晰度,我就会按照默认的清晰度搜索机制进行调节,比如指定清晰度为 80我首先会依次降清晰度搜索 74643216,如果依然找不到合适的则继续升清晰度搜索 112116120

# 修改下载线程最大数量

  • 参数 -n--num-threads
  • 默认值 16

也就是我的下载分身数量咯,越多的话,同时下载的视频块就越多,但并不是说分身越多就越好哟,如果你的带宽不够,分身再多也木有用滴。

# 指定需要下载的剧集

  • 参数 -p--episodes
  • 默认值 ^~$(也即全选)

也就是选集咯,其语法是这样的

  • <p1> 单独下某一剧集
    • 支持负数来选择倒数第几话
    • 此外还可以使用 ^$ 来分别代表 1-1
  • <p_start>~<p_end> 使用 ~ 可以连续选取
  • <p1>,<p2>,<p3>,...,<pn> 使用 , 可以不连续选取

emmm,直接看的话大概并不能知道我在说什么,所以我们通过几个小例子来了解其语法

# 假设要下载一个具有 24 话的番剧
# 如果我们只想下载第 3 话,只需要这样
bilili <url> -p 3
# 那如果我想下载第 5 话到第 7 话呢,使用 `~` 可以连续选中
bilili <url> -p 5~7
# 那我想下载第 12 话和第 17 话又要怎么办?此时只需要 `,` 就可以将多个不连续的选集一起选中
bilili <url> -p 12,17
# 那我突然又想将刚才那些都选中了呢?还是使用 `,` 呀,将它们连在一起即可
bilili <url> -p 3,5~7,12,17
# 嗯,你已经把基本用法都了解完了,很简单吧~
# 下面是一些语法糖,不了解也完全不会影响任何功能哒~
# 那如果我只知道我想下载倒数第 3 话,而不想算倒数第三话是第几话应该怎么办?
# 此时可以用负数哒~不过要注意的是,开头如果是 `-` 的话前面应该使用 `=`
bilili <url> -p=-3
# 那么如果想下载最后一话你可能会想到 `-p=-1` 对吧?不过我内置了两个符号分别代表第一话(^)和最后一话($)
# 像下面这样就可以直接下载最后一话啦~
bilili <url> -p $
# 所有语法都了解完啦,我们看一个稍微复杂的例子
bilili <url> -p ^~3,10,12~14,16,-4~$
# 很明显,上面的例子就是下载前 3 话、第 10 话、第 12 到 14 话、第 16 话以及后 4 话

一些要注意的问题

  1. 这里使用的序号是视频的顺序序号,而不是番剧所标注的第 n 话,因为有可能会出现 第 x.5 话 等等的特殊情况,此时一定要按照顺序自行计数。
  2. 参数值里一定不要加空格
  3. 参数值开头为 - 时前面应该使用 = 而非空格

# 强制覆盖已下载视频

  • 参数 -w--overwrite
  • 默认值 False

也就是强制将已经下载过的部分覆盖掉啦。

# 个人信息认证

  • 参数 -c--sess-data
  • 默认值 None

使用个人认证可以让你下载更高清晰度以及更多的剧集,当你传入你的大会员 SESSDATA 时(当然前提是你是大会员),你就可以下载大会员可访问的资源咯。

SESSDATA 获取方式

这里用 Chrome 作为示例,其它浏览器请尝试类似方法。

首先,用你的帐号登录 B 站,然后随便打开一个 B 站网页,比如首页 (opens new window)

按 F12 打开开发者工具,切换到 Network 栏,刷新页面,此时第一个加载的资源应该就是当前页面的 html,选中该资源,在右侧 「Request Headers」 中找到 「cookie」,在其中找到类似于 SESSDATA=d8bc7493%2C2843925707%2C08c3e*81; 的一串字符串,复制这里的 d8bc7493%2C2843925707%2C08c3e*81,这就是你需要的 SESSDATA

TIP

SESSDATA 中可能有特殊符号,所以传入时你可能需要使用双引号来包裹

bilili <url> -c "d8bc7493%2C2843925707%2C08c3e*81"

# 跳过下载询问

  • 参数 -y--yes
  • 默认值 False

跳过下载前的询问。

# 指定音频码率等级

  • 参数 --audio-quality
  • 可选值 30280 | 30232 | 30216
  • 默认值 30280

码率对应关系如下

code 码率
30280 320kbps
30232 128kbps
30216 64kbps

清晰度自动调节机制与视频清晰度一致,也采用先降后升的匹配机制。

# 指定播放列表类型

  • 参数 --playlist-type
  • 可选值 dpl | m3u | no
  • 默认值 dpl

dpl 是 PotPlayer 的专属播放列表格式,PotPlayer 可以在其中保存进度等。

m3u 有着更好的通用性,大多数播放器都支持。

当然指定 no 就是不生成播放列表。

# 指定下载弹幕类型

  • 参数 --danmaku
  • 可选值 xml | ass | no
  • 默认值 xml

B 站只提供 xml 格式的弹幕,因此我默认会下载 xml 格式的弹幕,但本地播放器一般不支持 B 站提供的默认弹幕,因此需要你手动转换,比如使用 us-danmaku (opens new window) 在线转换。

当然我也可以帮你自动转换咯,指定值为 ass 就好啦,该功能依赖于 danmaku2ass (opens new window) 啦,在需要该功能的时候我从 GitHub 请她来帮忙。

当然指定为 no 就是不需要弹幕咯。

# 指定分块下载时块的大小

  • 参数 --block-size
  • 默认值 128

因为内置分块下载机制,该参数就是指定分块下载的块大小咯,单位为 MB,当设置为 0 时可以禁用分块下载功能。

# 修改播放列表路径类型为绝对路径

  • 参数 --abs-path
  • 默认值 False

播放列表默认使用的是相对路径,这样即便移动下载后的文件夹也可以正常播放。

但偶尔有些播放器不支持相对路径的播放列表,所以提供了该选项来指定为绝对路径。当然,为了播放列表的灵活性,你应当只在发生本情况的前提下修改本参数。

# 启用从多个镜像源下载功能 beta

  • 参数 --use-mirrors
  • 默认值 False

从多个镜像下载,当然,由于我的每个分身(子线程)只处理一个块,所以被分为多个块的资源才有效哦。

# 绕过系统代理 beta

  • 参数 --disable-proxy
  • 默认值 False

因为我的依赖 requests 库会自动使用系统代理,使用本参数就可以绕过它啦。

# 开启 Debug 模式

  • 参数 --debug
  • 默认值 False

对 debug 更友好的模式,仅开发时使用。