Skip to main content

yutto 一个可爱且任性的 B 站视频下载器

Project description

yutto [WIP]

PyPI - Python Version pypi PyPI - Downloads LICENSE Gitmoji

yutto,一个可爱且任性的 B 站下载器(CLI)

版本号为什么是 2.0

因为 yutto 是 bilili 的後輩呀~

名字的由来

终于在 B 站播放《転スラ日記》这一天将 yutto 基本流程搭建完了,可以稍微休息一下了(

至于名字嘛,开始只是觉得 yutto 很可爱,印象里是萌王说过的,但具体忘记出处是在哪里了,今天“重温”《転スラ日記》第一话时候,居然 00:25 就是~总之,リムル最可爱啦〜

安装预览版

在此之前请确保安装 Python3.9(不支持 3.8 及以下,3.10 尚处于 beta,没有测试)与 FFmpeg(参照 bilili 文档

由于是预览版,所以希望得到更多的建议~特别是命令的设计上(当前这种多级子命令是否合适?)

pip 安装

pip install --pre yutto

git clone

git clone https://github.com/SigureMo/yutto.git
python setup.py build
python setup.py install

功能预览

基本命令

你可以通过 yutto 命令来下载一个视频。它支持 av/BV 号以及相应带 p=n 参数的投稿视频页面,也支持 ep 号(episode_id)的番剧页面。

比如只需要这样你就可以下载《転スラ日記》第一话:

yutto https://www.bilibili.com/bangumi/play/ep395211

不过有时你可能想要批量下载很多剧集,因此 yutto 提供了用于批量下载的参数 -b/--batch,它不仅支持前面所说的单个视频所在页面地址(会解析该单个视频所在的系列视频),还支持一些明确用于表示系列视频的地址,比如 md 页面(media_id)、ss 页面(season_id)。

比如像下面这样就可以下载《転スラ日記》所有已更新的剧集:

yutto --batch https://www.bilibili.com/bangumi/play/ep395211

基础参数

大部分参数与 bilili 重合,可参考 bilili 的 cli 文档

yutto 支持一些基础参数,无论是批量下载还是单视频下载都适用。

点击展开详细参数

最大并行 worker 数量

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

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

视频质量

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

用于调节视频清晰度(详情可参考 bilili 文档)。

音频质量

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

用于调节音频码率(详情可参考 bilili 文档)。

视频编码

  • 参数 --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

下载块大小

  • 参数 -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 (以后可能会有更多)
  • 默认值 {auto}

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

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

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

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
  • 默认值 ``

详情参考 bilili 文档。

不下载弹幕

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

不下载字幕

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

不显示颜色

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

启用 Debug 模式

  • 参数 --debug
  • 默认值 False

批量参数

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

点击展开详细参数

启用批量下载

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

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

选集

  • 参数 -p--episodes
  • 默认值 ^~$

详情参考 bilili 文档。

同时下载附加剧集

  • 参数 -s--with-section
  • 默认值 False

从 bilili1.x 迁移

取消的功能

  • - bilibili 目录的生成
  • 播放列表生成
  • 源格式修改功能(不再支持 flv 源视频下载,如果仍有视频不支持 dash 源,请继续使用 bilili)

默认行为的修改

  • 使用协程而非多线程进行下载,同时也不是批量解析批量下载,而是边解析边下载
  • 默认生成弹幕为 ASS
  • 默认启用从多镜像源下载的特性
  • 不仅可以控制是否使用系统代理,还能配置特定的代理服务器

新增的特性

  • 单视频下载与批量下载命令分离(bilili 命令与 yutto --batch 相类似)
  • 音频/视频编码选择
  • 仅下载音频/视频
  • 存放子路径的自由定制
  • 支持 url alias
  • 支持 file scheme

小技巧

使用 url alias

yutto 新增的 url alias 可以让你下载正在追的番剧时不必每次都打开浏览器复制 url,只需要将追番列表存储在一个文件中,并为这些 url 起一个别名即可

rimuru-nikki=https://www.bilibili.com/bangumi/play/ss38221/

之后下载最新话只需要

yutto --batch rimuru-nikki --alias-file=/path/to/alias-file

使用 file scheme 作为 url

现在 url 不仅支持 http/https scheme,还支持使用 file scheme 来用于表示文件列表,文件列表以行分隔,每行写一次命令的参数,该参数会覆盖掉主程序中所使用的参数,示例如下:

rimuru-nikki --batch -p $
https://www.bilibili.com/bangumi/play/ss38260/ --batch -p $

现在只需要

yutto --batch file:///path/to/list

即可分别下载这两个番剧的最新一话

当然,也许你不想每次输入这个路径,只需要将该路径存到 alias 文件中即可(alias 也支持 file scheme),比如

subscription=file:///path/to/list
rimuru-nikki=https://www.bilibili.com/bangumi/play/ss38221/

这样就可以直接使用

yutto --batch subscription --alias-file=/path/to/alias-file

貌似没太大作用呢 2333

值得注意的是,在文件列表各项里的参数优先级是高于命令里的优先级的,比如文件中使用:

rimuru-nikki --batch -p $ --no-danmaku --vcodec="hevc:copy"
rimuru1 --batch -p $

而命令中则使用

yutto --batch file:///path/to/list --vcodec="avc:copy"

最终下载的 rimuru-nikki 会是 "hevc:copy",而 rimuru1 则会是 "avc:copy"

最后,你当然可以在列表中嵌套列表~

TODO List

  • 完善的信息提示
  • 字幕、弹幕嵌入视频支持
  • 以插件形式支持更多音视频处理方面的功能,比如 autosub
  • 更多批下载支持(UP 主、收藏夹等)
  • 编写测试
  • 等等等等,以及
  • 更加可爱~

参考

参与贡献

请阅读 CONTRIBUTING.md

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

yutto-2.0.0a16.tar.gz (49.6 kB view hashes)

Uploaded Source

Built Distribution

yutto-2.0.0a16-py2.py3-none-any.whl (54.2 kB view hashes)

Uploaded Python 2 Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page