如果yutto搭建下载bilibili视频

飒爽师叔2021-08-23教程UbuntuPythonyutto

TIP

我看到一个下载的bilibili视频的程序,贼好用但是需要Python3.9,就是我上一篇文章不是写了Python3.9的安装教程吗。其实最主要是Python安装有点反人类,至少在win上面,所以我只能在我习惯的linux上部署了。

::: theorem yutto 一个可爱且任性的 B 站视频下载器(bilili2.x) ::: right 来自 Githubopen in new window :::

[在Ubuntu如何安装Python3.9(Ubuntu 20.04)]

安装yutto

pip install --pre yutto
# 一半系统预装python都是3.8,所以想要调用3.9(更高版本以此类推)需要使用以下命令
# pip3.9 install --pre yutto
# 用于加速的
pip install uvloop

记得安装一下ffmpeg

apt install ffmpeg
yutto

最大并行 worker 数量

  • 参数 -n--num-workers
  • 默认值 8

与 bilili 不同的是,yutto 并不是使用多线程实现并行下载,而是使用协程实现的,本参数限制的是最大的并行 Worker 数量。

指定视频清晰度等级

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

清晰度对应关系如下

code清晰度
125HDR 真彩
1204K 超清
1161080P 60帧
1121080P 高码率
801080P 高清
74720P 60帧
64720P 高清
32480P 清晰
16360P 流畅

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

指定音频码率等级

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

码率对应关系如下

code码率
30280320kbps
30232128kbps
3021664kbps

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

指定视频编码

  • 参数 --vcodec
  • 下载编码可选值 "hevc" | "avc"
  • 保存编码可选值 FFmpeg 所有可用的视频编码器
  • 默认值 "avc:copy"

该参数略微复杂,前半部分表示在下载时优先选择哪一种编码的视频流,后半部分则表示在合并时如何编码视频流,两者使用 : 分隔。

值得注意的是,前半的下载编码只是优先下载的编码而已,如果不存在该编码,则仍会像视频清晰度调节机制一样自动选择其余编码。

而后半部分的参数如果设置成非 copy 的值则可以确保在下载完成后对其进行重新编码,而且不止支持 hevcavc,只要你的 FFmpeg 支持的视频编码器,它都可以完成。

指定音频编码

  • 参数 --acodec
  • 下载编码可选值 "mp4a"
  • 保存编码可选值 FFmpeg 所有可用的音频编码器
  • 默认值 "mp4a:copy"

详情同视频编码。

仅下载视频流

  • 参数 --video-only
  • 默认值 False

仅下载音频流

  • 参数 --audio-only
  • 默认值 False

仅下载其中的音频流,保存为 .aac 文件。

值得注意的是,在不选择视频流时,嵌入字幕、弹幕功能将无法工作。

弹幕格式选择

  • 参数 -df--danmaku-format
  • 可选值 "ass" | "xml" | "protobuf"
  • 默认值 "ass"

B 站提供了 xmlprotobuf 两种弹幕数据接口,yutto 会自动下载 xml 格式弹幕并转换为 ass 格式,如果你不喜欢 yutto 自动转换的效果,可以选择输出格式为 xmlprotobuf,手动通过一些工具进行转换,比如 yutto 和 bilili 所使用的 biliassopen in new window,或者使用 us-danmakuopen in new window 进行在线转换。

如果你不想下载弹幕,只需要使用参数 --no-danmaku 即可。

下载块大小

  • 参数 -bs--block-size
  • 默认值 0.5

以 MiB 为单位,为分块下载时各块大小,不建议更改。

强制覆盖已下载文件

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

代理设置

  • 参数 -x--proxy
  • 可选值 "auto" | "no" | <https?://url/to/proxy/server>
  • 默认值 "auto"

设置代理服务器,默认是从环境变量读取,no 则为不设置代理,设置其它 http/https url 则将其作为代理服务器。

存放根目录

  • 参数 -d--dir
  • 默认值 "./"

存放子路径模板

  • 参数 -tp--subpath-template
  • 可选参数变量 title | id | name | username | fav_title (以后可能会有更多)
  • 默认值 "{auto}"

通过配置子路径模板可以灵活地控制视频存放位置。

默认情况是由 yutto 自动控制存放位置的。比如下载单个视频时默认就是直接存放在设定的根目录,不会创建一层容器目录,此时自动选择了 {name} 作为模板;而批量下载时则会根据视频层级生成多级目录,比如番剧会是 {title}/{name},首先会在设定根目录里生成一个番剧名的目录,其内才会存放各个番剧剧集视频,这样方便了多个不同番剧的管理。当然,如果你仍希望将番剧直接存放在设定根目录下的话,可以修改该参数值为 {name}即可。

另外,该功能语法由 Python format 函数模板语法提供,所以也支持一些高级的用法,比如 {id:0>3}{name}

值得注意的是,并不是所有变量在各种场合下都会提供,比如 username 变量当前仅在 UP 主全部投稿视频/收藏夹才提供,在其它情况下不应使用它。

url 别名文件路径

  • 参数 -af--alias-file
  • 默认值 None

指定别名文件路径,别名文件中存放一个别名与其对应的 url,使用空格或者 = 分隔,示例如下:

rimuru1=https://www.bilibili.com/bangumi/play/ss25739/
rimuru2=https://www.bilibili.com/bangumi/play/ss36170/
rimuru-nikki=https://www.bilibili.com/bangumi/play/ss38221/

比如将上述内容存储到 ~/.yutto_alias,则通过以下命令即可解析该文件:

yutto rimuru1 --batch --alias-file='~/.yutto_alias'

当参数值为 - 时,会从标准输入中读取:

cat ~/.yutto_alias | yutto rimuru-nikki --batch --alias-file -

Cookies 设置

  • 参数 -c--sessdata
  • 默认值 ""

设置 Cookies 后你才可以下载更高清晰度以及更多的剧集,当你传入你的大会员 SESSDATA 时(当然前提是你是大会员),你就可以下载大会员可访问的资源咯。

SESSDATA 获取方式

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

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

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

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

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

当然,示例里的 SESSDATA 是无效的,请使用自己的 SESSDATA。

不下载弹幕

  • 参数 --no-danmaku
  • 默认值 False

不下载字幕

  • 参数 --no-subtitle
  • 默认值 False

不显示颜色

  • 参数 --no-color
  • 默认值 False

启用 Debug 模式

  • 参数 --debug
  • 默认值 False
批量参数

有些参数是只有批量下载时才可以使用的

启用批量下载

  • 参数 -b--batch
  • 默认值 False

只需要 yutto --batch <url> 即可启用批量下载功能。

选集

  • 参数 -p--episodes

  • 默认值 ^~$

  • 参数 -p--episodes

  • 默认值 ^~$(也即全选)

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

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

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

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

下面是一些要注意的问题

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

同时下载附加剧集

  • 参数 -s--with-section
  • 默认值 False
最后更新时间 4/10/2024, 10:53:24 PM