yutto2.0.0-beta
yutto,一个可爱且任性的 B 站下载器(CLI)
当前 yutto 尚处于 beta 阶段,有任何建议尽管在 Discussions 提出~~~
版本号为什么是 2.0
因为 yutto 是 bilili 的後輩呀~
从安装开始~
包管理器一键安装啦
目前 yutto 已经可以通过部分包管理器直接安装~
使用 Homebrew 的用户可以尝试下下面的命令:
brew tap siguremo/tap
brew install yutto
使用 paru(Arch 上的 AUR 包管理器)的用户可以尝试下这样的命令(感谢 @ouuan):
paru -S yutto
使用 Docker
你也可以尝试使用 docker 直接运行 yutto(具体如何运行需要参考下后面的内容~)
docker run --rm -it -v /path/to/download:/app siguremo/yutto <url> [options]
与直接运行 yutto 不同的是,这里的下载目标路径是通过 -v <path>:/app
指定的,也就是说 docker 里的 yutto 会将内容下载到 docker 里的 /app
目录下,与之相对应的挂载点 <path>
就是下载路径。你也可以直接挂载到 $(pwd)
,此时就和本机 yutto 的默认行为一致啦,也是下载到当前目录下~
pip/pipx/uv 安装
[!TIP]
在此之前请确保安装 Python3.9 及以上版本,并配置好 FFmpeg(参照 bilili 文档)
pip install --pre yutto
当然,你也可以通过 pipx/uv 来安装 yutto(当然,前提是你要自己先安装它)
pipx install yutto # 使用 pipx
uv tool install yutto # 或者使用 uv
pipx/uv 会类似 Homebrew 无感地为 yutto 创建一个虚拟环境,与其余环境隔离开,避免污染 pip 的环境,因此相对于 pip,pipx/uv 是更推荐的安装方式(uv 会比 pipx 更快些~)。
体验 main 分支最新特性
[!TIP]
这同样要求你自行配置 Python 和 FFmpeg 环境
有些时候有一些在 main 分支还没有发布的新特性或者 bugfix,你可以尝试直接安装 main 分支的代码,最快的方式仍然是通过 pip 安装,只不过需要使用 git 描述符
pip install git+https://github.com/yutto-dev/yutto@main # 通过 pip
pipx install git+https://github.com/yutto-dev/yutto@main # 通过 pipx
uv tool install git+https://github.com/yutto-dev/yutto.git@main # 通过 uv
主要功能
已支持的下载类型
类型 | 是否支持选集 | 示例链接 | 默认路径模板 |
---|---|---|---|
投稿视频 | - | https://www.bilibili.com/video/BV1vZ4y1M7mQ https://www.bilibili.com/video/av371660125 https://www.bilibili.com/video/BV1vZ4y1M7mQ?p=1 av371660125 BV1vZ4y1M7mQ | {title} |
投稿视频 批量 | :white_check_mark: | https://www.bilibili.com/video/BV1vZ4y1M7mQ https://www.bilibili.com/video/av371660125 av371660125 BV1vZ4y1M7mQ | {title}/{name} |
番剧 | - | https://www.bilibili.com/bangumi/play/ep395211 ep395211 | {name} |
番剧 批量 | :white_check_mark: | https://www.bilibili.com/bangumi/play/ep395211 https://www.bilibili.com/bangumi/play/ss38221 https://www.bilibili.com/bangumi/media/md28233903 ep395211 ss38221 md28233903 | {title}/{name} |
课程 | - | https://www.bilibili.com/cheese/play/ep6902 | {name} |
课程 批量 | :white_check_mark: | https://www.bilibili.com/cheese/play/ep6902 https://www.bilibili.com/cheese/play/ss298 | {title}/{name} |
用户指定收藏夹 批量 | :x: | https://space.bilibili.com/100969474/favlist?fid=1306978874&ftype=create | {username}的收藏夹/{series_title}/{title}/{name} |
当前用户稍后再看 批量 | :x: | https://www.bilibili.com/watchlater | 稍后再看/{title}/{name} |
用户全部收藏夹 批量 | :x: | https://space.bilibili.com/100969474/favlist | {username}的收藏夹/{series_title}/{title}/{name} |
UP 主个人空间 批量 | :x: | https://space.bilibili.com/100969474/video | {username}的全部投稿视频/{title}/{name} |
合集 批量 | :white_check_mark: | https://space.bilibili.com/361469957/channel/collectiondetail?sid=23195 https://www.bilibili.com/medialist/play/361469957?business=space_collection&business_id=23195 | {series_title}/{title} |
视频列表 批量 | :x: | https://space.bilibili.com/100969474/channel/seriesdetail?sid=1947439 https://www.bilibili.com/medialist/play/100969474?business=space_series&business_id=1947439 https://space.bilibili.com/100969474/favlist?fid=270359&ftype=collect | {series_title}/{title}/{name} |
[!NOTE]
标记「批量」的视频都必须通过
-b/--batch
参数来下载,否则会按照单个视频来解析下载
基本命令
yutto 的基本命令如下:
yutto <url>
你可以通过 yutto -h
查看详细命令参数。
如果你需要下载单个视频,只需要使用 yutto 加上这个视频的地址即可。它支持 av/BV 号以及相应带 p=n 参数的投稿视频页面,也支持 ep 号(episode_id)的番剧页面。
比如只需要这样你就可以下载《転スラ日記》第一话:
yutto https://www.bilibili.com/bangumi/play/ep395211
yutto 还支持直接使用能够唯一定位资源的 id 来作为 <url>
,刚刚的功能与下面的简化后的命令功能是完全一样的
yutto ep395211
不过有时你可能想要批量下载很多剧集,因此 yutto 提供了用于批量下载的参数 -b/--batch
,它不仅支持前面所说的单个视频所在页面地址(会解析该单个视频所在的系列视频),还支持一些明确用于表示系列视频的地址,比如 md 页面(media_id)、ss 页面(season_id)。
比如像下面这样就可以下载《転スラ日記》所有已更新的剧集:
yutto --batch https://www.bilibili.com/bangumi/play/ep395211
基础参数
yutto 支持一些基础参数,无论是批量下载还是单视频下载都适用。
点击展开详细参数
最大并行 worker 数量
- 参数
-n
或--num-workers
- 默认值
8
与 bilili 不同的是,yutto 并不是使用多线程实现并行下载,而是使用协程实现的,本参数限制的是最大的并行 Worker 数量。
指定视频清晰度等级
- 参数
-q
或--video-quality
- 可选值
127 | 126 | 125 | 120 | 116 | 112 | 80 | 74 | 64 | 32 | 16
- 默认值
127
清晰度对应关系如下
code | 清晰度 |
---|---|
127 | 8K 超高清 |
126 | 杜比视界 |
125 | HDR 真彩 |
120 | 4K 超清 |
116 | 1080P 60帧 |
112 | 1080P 高码率 |
80 | 1080P 高清 |
74 | 720P 60帧 |
64 | 720P 高清 |
32 | 480P 清晰 |
16 | 360P 流畅 |
并不是说指定某个清晰度就一定会下载该清晰度的视频,yutto 只会尽可能满足你的要求,如果不存在指定的清晰度,yutto 就会按照默认的清晰度搜索机制进行调节,比如指定清晰度为 80
,首先会依次降清晰度搜索 74
、64
、32
、16
,如果依然找不到合适的则继续升清晰度搜索 112
、116
、120
、125
、126
、127
。
值得注意的是,目前杜比视界视频只能简单下载音视频流并合并,合并后并不能达到在线观看的效果。
指定音频码率等级
- 参数
-aq
或--audio-quality
- 可选值
30251 | 30255 | 30250 | 30280 | 30232 | 30216
- 默认值
30251
码率对应关系如下
code | 码率 |
---|---|
30251 | - (Hi-Res) |
30255 | - (杜比音效) |
30250 | - (杜比全景声) |
30280 | 320kbps |
30232 | 128kbps |
30216 | 64kbps |
码率自动调节机制与视频清晰度一致,也采用先降后升的匹配机制。
指定视频编码
- 参数
--vcodec
- 下载编码可选值
"av1" | "hevc" | "avc"
- 保存编码可选值 FFmpeg 所有可用的视频编码器
- 默认值
"avc:copy"
该参数略微复杂,前半部分表示在下载时优先选择哪一种编码的视频流,后半部分则表示在合并时如何编码视频流,两者使用 :
分隔。
值得注意的是,前半的下载编码只是优先下载的编码而已,如果不存在该编码,则会根据 --download-vcodec-priority
自动选择其余编码,如未设置 --download-vcodec-priority
,则会类似视频清晰度调节机制先降序后升序的方式来选择。
而后半部分的参数如果设置成非 copy
的值则可以确保在下载完成后对其进行重新编码,而且不止支持 av1
、hevc
与 avc
,只要你的 FFmpeg 支持的视频编码器,它都可以完成。
指定音频编码
- 参数
--acodec
- 下载编码可选值
"mp4a"
- 保存编码可选值 FFmpeg 所有可用的音频编码器
- 默认值
"mp4a:copy"
详情同视频编码。
指定视频下载编码优先级
- 参数
--download-vcodec-priority
- 默认值
"auto"
- 可选值
"auto"
或者使用,
分隔的下载编码列表,如"hevc,avc,av1"
当使用默认值 "auto"
时,yutto 会类似视频清晰度调节机制先降序后升序的方式来选择。
当使用自定义下载编码列表时,yutto 会严格按照列表中的顺序进行选择,如果不存在则会认为该视频无视频流。
Warning
如若设置本参数,请总是将
--download-vcode-priority
首选编码作为--vcodec
的前半部分,否则可能会导致下载失败。