# yutto<sup>2.0.0-rc</sup>
<p align="center">
<a href="https://python.org/" target="_blank"><img alt="PyPI - Python Version" src="https://img.shields.io/pypi/pyversions/yutto?logo=python&style=flat-square"></a>
<a href="https://pypi.org/project/yutto/" target="_blank"><img src="https://img.shields.io/pypi/v/yutto?style=flat-square" alt="pypi"></a>
<a href="https://pypi.org/project/yutto/" target="_blank"><img alt="PyPI - Downloads" src="https://img.shields.io/pypi/dm/yutto?style=flat-square"></a>
<a href="LICENSE"><img alt="LICENSE" src="https://img.shields.io/github/license/yutto-dev/yutto?style=flat-square"></a>
<br/>
<a href="https://github.com/astral-sh/uv"><img alt="uv" src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json&style=flat-square"></a>
<a href="https://github.com/astral-sh/ruff"><img alt="ruff" src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json&style=flat-square"></a>
<a href="https://gitmoji.dev"><img alt="Gitmoji" src="https://img.shields.io/badge/gitmoji-%20😜%20😍-FFDD67?style=flat-square"></a>
<a href="https://discord.gg/5cQGyFwsqC"><img src="https://img.shields.io/badge/chat-discord-5d24a3?logo=discord&style=flat-square" alt="discord chat"></a>
</p>
yutto,一个可爱且任性的 B 站下载器(CLI)
当前 yutto 目前处于 RC 阶段,请通过 [Issues](https://github.com/yutto-dev/yutto/issues) 反馈功能正确性问题和功能请求,其他问题请通过 [Discussions](https://github.com/yutto-dev/yutto/discussions) 反馈~
## 版本号为什么是 2.0
因为 yutto 是 [bilili](https://github.com/yutto-dev/bilili) 的後輩呀~
## 从安装开始~
### 包管理器一键安装啦
目前 yutto 已经可以通过部分包管理器直接安装~
使用 Homebrew 的用户可以尝试下下面的命令:
```bash
brew tap siguremo/tap
brew install yutto
```
使用 [paru](https://github.com/Morganamilo/paru)(Arch 上的 AUR 包管理器)的用户可以尝试下这样的命令(感谢 @ouuan):
```bash
paru -S yutto
```
### 使用 Docker
你也可以尝试使用 docker 直接运行 yutto(具体如何运行需要参考下后面的内容~)
```bash
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 文档](https://bilili.nyakku.moe/guide/getting-started.html))
```bash
pip install --pre yutto
```
当然,你也可以通过 [pipx](https://github.com/pypa/pipx)/[uv](https://github.com/astral-sh/uv) 来安装 yutto(当然,前提是你要自己先安装它)
```bash
pipx install --pre yutto # 使用 pipx
uv tool install --pre yutto # 或者使用 uv
```
pipx/uv 会类似 Homebrew 无感地为 yutto 创建一个虚拟环境,与其余环境隔离开,避免污染 pip 的环境,因此相对于 pip,pipx/uv 是更推荐的安装方式(uv 会比 pipx 更快些~)。
### 体验 main 分支最新特性
> [!TIP]
>
> 这同样要求你自行配置 Python 和 FFmpeg 环境
有些时候有一些在 main 分支还没有发布的新特性或者 bugfix,你可以尝试直接安装 main 分支的代码,最快的方式仍然是通过 pip 安装,只不过需要使用 git 描述符
```bash
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
```
## 主要功能
### 已支持的下载类型
<!-- prettier-ignore -->
| 类型 | 是否支持选集 | 示例链接 | 默认路径模板 |
| - | - | - | - |
| 投稿视频 | - | `https://www.bilibili.com/video/BV1vZ4y1M7mQ` <br/> `https://www.bilibili.com/video/av371660125` <br/> `https://www.bilibili.com/video/BV1vZ4y1M7mQ?p=1` <br/> `av371660125` <br/> `BV1vZ4y1M7mQ` | `{title}` |
| 投稿视频 <sup>批量</sup> | :white_check_mark: | `https://www.bilibili.com/video/BV1vZ4y1M7mQ` <br/> `https://www.bilibili.com/video/av371660125` <br/> `av371660125` <br/> `BV1vZ4y1M7mQ` | `{title}/{name}` |
| 番剧 | - | `https://www.bilibili.com/bangumi/play/ep395211` <br/> `ep395211` | `{name}` |
| 番剧 <sup>批量</sup> | :white_check_mark: | `https://www.bilibili.com/bangumi/play/ep395211` <br/> `https://www.bilibili.com/bangumi/play/ss38221` <br/> `https://www.bilibili.com/bangumi/media/md28233903` <br/> `ep395211` <br/> `ss38221` <br/> `md28233903` | `{title}/{name}` |
| 课程 | - | `https://www.bilibili.com/cheese/play/ep6902` | `{name}` |
| 课程 <sup>批量</sup> | :white_check_mark: | `https://www.bilibili.com/cheese/play/ep6902` <br/> `https://www.bilibili.com/cheese/play/ss298` | `{title}/{name}` |
| 用户指定收藏夹 <sup>批量</sup> | :x: | `https://space.bilibili.com/100969474/favlist?fid=1306978874&ftype=create` | `{username}的收藏夹/{series_title}/{title}/{name}` |
| 当前用户稍后再看 <sup>批量</sup> | :x: | `https://www.bilibili.com/watchlater` | `稍后再看/{title}/{name}` |
| 用户全部收藏夹 <sup>批量</sup> | :x: | `https://space.bilibili.com/100969474/favlist` | `{username}的收藏夹/{series_title}/{title}/{name}` |
| UP 主个人空间 <sup>批量</sup> | :x: | `https://space.bilibili.com/100969474/video` | `{username}的全部投稿视频/{title}/{name}` |
| 合集 <sup>批量</sup> | :white_check_mark: | `https://space.bilibili.com/361469957/channel/collectiondetail?sid=23195` <br/> `https://www.bilibili.com/medialist/play/361469957?business=space_collection&business_id=23195` | `{series_title}/{title}` |
| 视频列表 <sup>批量</sup> | :x: | `https://space.bilibili.com/100969474/channel/seriesdetail?sid=1947439` <br/> `https://www.bilibili.com/medialist/play/100969474?business=space_series&business_id=1947439` <br/> `https://space.bilibili.com/100969474/favlist?fid=270359&ftype=collect` | `{series_title}/{title}/{name}` |
> [!NOTE]
>
> 标记「批量」的视频都必须通过 `-b/--batch` 参数来下载,否则会按照单个视频来解析下载
### 基本命令
yutto 的基本命令如下:
```bash
yutto <url>
```
你可以通过 `yutto -h` 查看详细命令参数。
如果你需要下载**单个**视频,只需要使用 yutto 加上这个视频的地址即可。它支持 av/BV 号以及相应带 p=n 参数的投稿视频页面,也支持 ep 号(episode_id)的番剧页面。
比如只需要这样你就可以下载[《転スラ日記》](https://www.bilibili.com/bangumi/play/ep395211)第一话:
```bash
yutto https://www.bilibili.com/bangumi/play/ep395211
```
yutto 还支持直接使用能够唯一定位资源的 id 来作为 `<url>`,刚刚的功能与下面的简化后的命令功能是完全一样的
```bash
yutto ep395211
```
不过有时你可能想要批量下载很多剧集,因此 yutto 提供了用于批量下载的参数 `-b/--batch`,它不仅支持前面所说的单个视频所在页面地址(会解析该单个视频所在的系列视频),还支持一些明确用于表示系列视频的地址,比如 md 页面(media_id)、ss 页面(season_id)。
比如像下面这样就可以下载《転スラ日記》所有已更新的剧集:
```bash
yutto --batch https://www.bilibili.com/bangumi/play/ep395211
```
### 基础参数
yutto 支持一些基础参数,无论是批量下载还是单视频下载都适用。
<details>
<summary>点击展开详细参数</summary>
#### 最大并行 worker 数量
- 参数 `-n` 或 `--num-workers`
- 默认值 `8`
与 bilili 不同的是,yutto 并不是使用多线程实现并行下载,而是使用协程实现的,本参数限制的是最大的并行 Worker 数量。
#### 指定视频清晰度等级
- 参数 `-q` 或 `--video-quality`
- 可选值 `127 | 126 | 125 | 120 | 116 | 112 | 100 | 80 | 74 | 64 | 32 | 16`
- 默认值 `127`
清晰度对应关系如下
<!-- prettier-ignore -->
| code | 清晰度 |
| :-: | :-: |
| 127 | 8K 超高清 |
| 126 | 杜比视界 |
| 125 | HDR 真彩 |
| 120 | 4K 超清 |
| 116 | 1080P 60帧 |
| 112 | 1080P 高码率 |
| 100 | 智能修复 |
| 80 | 1080P 高清 |
| 74 | 720P 60帧 |
| 64 | 720P 高清 |
| 32 | 480P 清晰 |
| 16 | 360P 流畅 |
并不是说指定某个清晰度就一定会下载该清晰度的视频,yutto 只会尽可能满足你的要求,如果不存在指定的清晰度,yutto 就会按照默认的清晰度搜索机制进行调节,比如指定清晰度为 `80`,**首先会依次降清晰度搜索** `74`、`64`、`32`、`16`,如果依然找不到合适的则**继续升清晰度搜索** `100`、`112`、`116`、`120`、`125`、`126`、`127`。
值得注意的是,目前杜比视界视频只能简单下载音视频流并合并,合并后并不能达到在线观看的效果。
#### 指定音频码率等级
- 参数 `-aq` 或 `--audio-quality`
- 可选值 `30251 | 30255 | 30250 | 30280 | 30232 | 30216`
- 默认值 `30251`
码率对应关系如下
<!-- prettier-ignore -->
| 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] 渲染会出问题,因为 GitHub 尚不支持嵌套在 summary 中,因此暂时回退到 **Warning** 的写法
更多讨论见
https://github.com/orgs/community/discussions/16925#discussioncomment-7571187
-->
> **Warning**
>
> 如若设置本参数,请总是将 `--download-vcode-priority` 首选编码作为 `--vcodec` 的前半部分,否则可能会导致下载失败。
#### 指定输出格式
- 参数 `--output-format`
- 可选值 `"infer" | "mp4" | "mkv" | "mov"`
- 默认值 `"infer"`
在至少包含视频流时所使用的输出格式,默认选值 `"infer"` 表示自动根据情况进行推导以保证输出的可用,推导规则如下:
- 如果输出包含音频流且音频流编码为 `"fLaC"`,则输出格式为 `"mkv"`,因为 `"mp4"` 尚不支持 `"fLaC"` 编码
- 否则为 `"mp4"`
#### 指定在仅包含音频流时的输出格式
- 参数 `--output-format-audio-only`
- 可选值 `"infer" | "aac" | "mp3" | "flac" | "mp4" | "mkv" | "mov"`
- 默认值 `"infer"`
在仅包含音频流时所使用的输出格式,默认选值 `"infer"` 表示自动根据情况进行推导以保证输出的可用,推导规则如下:
- 如果音频流编码为 `"fLaC"`,则输出格式为 `"flac"`
- 否则为 `"aac"`
> **Note**
>
> 并不是仅仅在指定 `--audio-only` 时才会仅仅包含视频流,有些视频是仅包含音频流的,此时即便不指定 `--audio-only` 选项也会按照本选项的格式进行输出。
#### 弹幕格式选择
- 参数 `-df` 或 `--danmaku-format`
- 可选值 `"ass" | "xml" | "protobuf"`
- 默认值 `"ass"`
B 站提供了 `xml` 与 `protobuf` 两种弹幕数据接口,`xml` 接口为旧接口,弹幕数上限较低,`protobuf` 接口相对较高,但不登录情况下只能获取很少的弹幕
为了确保无论是否登录都能获取最多的弹幕,yutto 在登录时会下载 `protobuf` 源数据,在未登录时会下载 `xml` 源数据,并将其转换为主流播放器支持的 `ass` 格式
如果你不喜欢 yutto 自动转换的效果,可以选择输出格式为 `xml` 或 `protobuf`,手动通过一些工具进行转换,比如 yutto 和 bilili 所使用的 [biliass](https://github.com/yutto-dev/yutto/tree/main/packages/biliass),或者使用 [us-danmaku](https://tiansh.github.io/us-danmaku/bilibili/) 进行在线转换。
如果你不想下载弹幕,只需要使用参数 `--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`
- 默认值 `"./"`
#### 临时文件目录
- 参数 `--tmp-dir`
- 默认值是“存放根目录”即 `-d, --dir` 的值
#### Cookies 设置
- 参数 `-c` 或 `--sessdata`
- 默认值 `""`
设置 Cookies 后你才可以下载更高清晰度以及更多的剧集,当你传入你的大会员 `SESSDATA` 时(当然前提是你是大会员),你就可以下载大会员可访问的资源咯。
<details><summary> SESSDATA 获取方式 </summary>
这里用 Chrome 作为示例,其它浏览器请尝试类似方法。
首先,用你的帐号登录 B 站,然后随便打开一个 B 站网页,比如[首页](https://www.bilibili.com/)。
按 F12 打开开发者工具,切换到 Network 栏,刷新页面,此时第一个加载的资源应该就是当前页面的 html,选中该资源,在右侧 「Request Headers」 中找到 「cookie」,在其中找到类似于 `SESSDATA=d8bc7493%2C2843925707%2C08c3e*81;` 的一串字符串,复制这里的 `d8bc7493%2C2843925707%2C08c3e*81`,这就是你需要的 `SESSDATA`。
</details>
另外,由于 SESSDATA 中可能有特殊符号,所以传入时你可能需要使用双引号来包裹
```bash
yutto <url> -c "d8bc7493%2C2843925707%2C08c3e*81"
```
当然,示例里的 SESSDATA 是无效的,请使用自己的 SESSDATA。
#### 存放子路径模板
- 参数 `-tp` 或 `--subpath-template`
- 可选参数变量 `title | id | name | username | series_title | pubdate | download_date | owner_uid` (以后可能会有更多)
- 默认值 `"{auto}"`
通过配置子路径模板可以灵活地控制视频存放位置。
默认情况是由 yutto 自动控制存放位置的。比如下载单个视频时默认就是直接存放在设定的根目录,不会创建一层容器目录,此时自动选择了 `{name}` 作为模板;而批量下载时则会根据视频层级生成多级目录,比如番剧会是 `{title}/{name}`,首先会在设定根目录里生成一个番剧名的目录,其内才会存放各个番剧剧集视频,这样方便了多个不同番剧的管理。当然,如果你仍希望将番剧直接存放在设定根目录下的话,可以修改该参数值为 `{name}`即可。
另外,该功能语法由 Python format 函数模板语法提供,所以也支持一些高级的用法,比如 `{id:0>3}{name}`,此外还专门为时间变量 🕛 增加了自定义时间模板的语法 `{pubdate@%Y-%m-%d %H:%M:%S}`,默认时间模板为 `%Y-%m-%d`。
值得注意的是,并不是所有变量在各种场合下都会提供,比如 `username`, `owner_uid` 变量当前仅在 UP 主全部投稿视频/收藏夹/稍后再看才提供,在其它情况下不应使用它。各变量详细作用域描述见下表:
<!-- prettier-ignore -->
| Variable | Description | Scope |
| - | - | - |
| title | 系列视频总标题(番剧名/投稿视频标题) | 全部 |
| id | 系列视频单 p 顺序标号 | 全部 |
| name | 系列视频单 p 标题 | 全部 |
| username | UP 主用户名 | 个人空间、收藏夹、稍后再看、合集、视频列表下载 |
| series_title | 合集标题 | 收藏夹、视频合集、视频列表下载 |
| pubdate🕛 | 投稿日期 | 仅投稿视频 |
| download_date🕛 | 下载日期 | 全部 |
| owner_uid | UP 主UID | 个人空间、收藏夹、稍后再看、合集、视频列表下载 |
> **Note**
>
> 未来可能会对路径变量及默认路径模板进行调整
#### url 别名文件路径
- 参数 `-af` 或 `--alias-file`
- 默认值 `None`
指定别名文件路径,别名文件中存放一个别名与其对应的 url,使用空格或者 `=` 分隔,示例如下:
```
tensura1=https://www.bilibili.com/bangumi/play/ss25739/
tensura2=https://www.bilibili.com/bangumi/play/ss36170/
tensura-nikki=https://www.bilibili.com/bangumi/play/ss38221/
```
比如将上述内容存储到 `~/.yutto_alias`,则通过以下命令即可解析该文件:
```bash
yutto tensura1 --batch --alias-file='~/.yutto_alias'
```
当参数值为 `-` 时,会从标准输入中读取:
```bash
cat ~/.yutto_alias | yutto tensura-nikki --batch --alias-file -
```
#### 指定媒体元数据值的格式
当前仅支持 `premiered`
- 参数 `--metadata-format-premiered`
- 默认值 `"%Y-%m-%d"`
- 常用值 `"%Y-%m-%d %H:%M:%S"`
#### 严格校验大会员状态有效
- 参数 `--vip-strict`
- 默认值 `False`
#### 严格校验登录状态有效
- 参数 `--login-strict`
- 默认值 `False`
#### 设置下载间隔
- 参数 `--download-interval`
- 默认值 `0`
设置两话之间的下载间隔(单位为秒),避免短时间內下载大量视频导致账号被封禁
#### 禁用下载镜像
- 参数 `--banned-mirrors-pattern`
- 默认值 `None`
使用正则禁用特定镜像,比如 `--banned-mirrors-pattern "mirrorali"` 将禁用 url 中包含 `mirrorali` 的镜像
#### 不显示颜色
- 参数 `--no-color`
- 默认值 `False`
#### 不显示进度条
- 参数 `--no-progress`
- 默认值 `False`
#### 启用 Debug 模式
- 参数 `--debug`
- 默认值 `False`
</details>
### 资源选择参数
此外有一些参数专用于资源选择,比如选择是否下载弹幕、音频、视频等等。
<details>
<summary>点击展开详细参数</summary>
#### 仅下载视频流
- 参数 `--video-only`
- 默认值 `False`
> **Note**
>
> 这里「仅下载视频流」是指视频中音视频流仅选择视频流,而不是仅仅下载视频而不下载弹幕字幕等资源,如果需要取消字幕等资源下载,请额外使用 `--no-danmaku` 等参数。
>
> 「仅下载音频流」也是同样的。
#### 仅下载音频流
- 参数 `--audio-only`
- 默认值 `False`
仅下载其中的音频流,保存为 `.aac` 文件。
#### 不生成弹幕文件
- 参数 `--no-danmaku`
- 默认值 `False`
#### 仅生成弹幕文件
- 参数 `--danmaku-only`
- 默认值 `False`
#### 不生成字幕文件
- 参数 `--no-subtitle`
- 默认值 `False`
#### 仅生成字幕文件
- 参数 `--subtitle-only`
- 默认值 `False`
#### 生成媒体元数据文件
- 参数 `--with-metadata`
- 默认值 `False`
目前媒体元数据生成尚在试验阶段,可能提取出的信息并不完整。
#### 仅生成媒体元数据文件
- 参数 `--metadata-only`
- 默认值 `False`
#### 不生成视频封面
- 参数 `--no-cover`
- 默认值 `False`
> [!NOTE]
>
> 当前仅支持为包含视频流的视频生成封面。
#### 生成视频流封面时单独保存封面
- 参数 `--save-cover`
- 默认值 `False`
#### 仅生成视频封面
- 参数 `--cover-only`
- 默认值 `False`
#### 不生成章节信息
- 参数 `--no-chapter-info`
- 默认值 `False`
不生成章节信息,包含 MetaData 和嵌入视频流的章节信息。
</details>
### 弹幕设置参数<sup>Experimental</sup>
yutto 通过与 biliass 的集成,提供了一些 ASS 弹幕选项,包括字号、字体、速度等~
<details>
<summary>点击展开详细参数</summary>
#### 弹幕字体大小
- 参数 `--danmaku-font-size`
- 默认值 `video_width / 40`
#### 弹幕字体
- 参数 `--danmaku-font`
- 默认值 `"SimHei"`
#### 弹幕不透明度
- 参数 `--danmaku-opacity`
- 默认值 `0.8`
#### 弹幕显示区域与视频高度的比例
- 参数 `--danmaku-display-region-ratio`
- 默认值 `1.0`
#### 弹幕速度
- 参数 `--danmaku-speed`
- 默认值 `1.0`
#### 屏蔽顶部弹幕
- 参数 `--danmaku-block-top`
- 默认值 `False`
#### 屏蔽底部弹幕
- 参数 `--danmaku-block-bottom`
- 默认值 `False`
#### 屏蔽滚动弹幕
- 参数 `--danmaku-block-scroll`
- 默认值 `False`
#### 屏蔽逆向弹幕
- 参数 `--danmaku-block-reverse`
- 默认值 `False`
#### 屏蔽固定弹幕(顶部、底部)
- 参数 `--danmaku-block-fixed`
- 默认值 `False`
#### 屏蔽高级弹幕
- 参数 `--danmaku-block-special`
- 默认值 `False`
#### 屏蔽彩色弹幕
- 参数 `--danmaku-block-colorful`
- 默认值 `False`
#### 屏蔽关键词
- 参数 `"--danmaku-block-keyword-patterns`
- 默认值 `None`
按关键词屏蔽,支持正则,使用 `,` 分隔
</details>
### 批量参数
有些参数是只有批量下载时才可以使用的
<details>
<summary>点击展开详细参数</summary>
#### 启用批量下载
- 参数 `-b` 或 `--batch`
- 默认值 `False`
只需要 `yutto --batch <url>` 即可启用批量下载功能。
#### 选集
- 参数 `-p` 或 `--episodes`
- 默认值 `1~-1`(也即全选)
也就是选集咯,其语法是这样的
- `<p1>` 单独下某一剧集
- 支持负数来选择倒数第几话
- 此外还可以使用 `$` 来代表 `-1`
- `<p_start>~<p_end>` 使用 `~` 可以连续选取(如果起始为 1,或者终止为 -1 则可以省略)
- `<p1>,<p2>,<p3>,...,<pn>` 使用 `,` 可以不连续选取
emmm,直接看的话大概并不能知道我在说什么,所以我们通过几个小例子来了解其语法
```bash
# 假设要下载一个具有 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 $
# 为了进一步方便表示一个范围选取,在从第一话开始选取或者以最后一话为终止时可以省略它们
# 这样就是前三话啦(这里与以 `-` 开头类似,以 `~` 开头可能被识别为 $HOME,因此最好也用等号,或者使用引号包裹)
yutto <url> -b -p=~3
# 这样就是后四话啦
yutto <url> -b -p=-4~
# 所有语法都了解完啦,我们看一个稍微复杂的例子
yutto <url> -b -p "~3,10,12~14,16,-4~"
# 很明显,上面的例子就是下载前 3 话、第 10 话、第 12 到 14 话、第 16 话以及后 4 话
```
下面是一些要注意的问题
1. 这里使用的序号是视频的顺序序号,而不是番剧所标注的`第 n 话`,因为有可能会出现 `第 x.5 话` 等等的特殊情况,此时一定要按照顺序自行计数。
2. 参数值里一定不要加空格
3. 参数值开头为特殊符号时最好使用 `=` 来连接选项和参数,或者尝试使用引号包裹参数
4. 个人空间、视频列表、收藏夹等批量下载暂不支持选集操作
#### 同时下载附加剧集
- 参数 `-s` 或 `--with-section`
- 默认值 `False`
#### 指定稿件发布时间范围
- 参数 `--batch-filter-start-time` 和 `--batch-filter-end-time` 分别表示`开始`和`结束`时间,该区间**左闭右开**
- 默认 `不限制`
- 支持的格式
- `%Y-%m-%d`
- `%Y-%m-%d %H:%M:%S`
例如仅下载 2020 年投稿的视频,可以这样:
`--batch-filter-start-time=2020-01-01 --batch-filter-end-time=2021-01-01`
</details>
### 配置文件<sup>Experimental</sup>
yutto 自 `2.0.0-rc.3` 起增加了实验性的配置文件功能,你可以通过 `--config` 选项来指定配置文件路径,比如
```bash
yutto --config /path/to/config.toml <url>
```
如果不指定配置文件路径,yutto 也支持配置自动发现,根据优先级,搜索路径如下:
- 当前目录下的 `yutto.toml`
- 搜索 [`XDG_CONFIG_HOME`](https://specifications.freedesktop.org/basedir-spec/latest/) 下的 `yutto/yutto.toml` 文件
- 非 Windows 系统下的 `~/.config/yutto/yutto.toml`,Windows 系统下的 `~/AppData/Roaming/yutto/yutto.toml`
你可以通过配置文件来设置一些默认参数,整体上与命令行参数基本一致,下面以一些示例来展示配置文件的写法:
```toml
# yutto.toml
#:schema https://raw.githubusercontent.com/yutto-dev/yutto/refs/heads/main/schemas/config.json
[basic]
# 设置下载目录
dir = "/path/to/download"
# 设置临时文件目录
tmp_dir = "/path/to/tmp"
# 设置 SESSDATA
sessdata = "***************"
# 设置大会员严格校验
vip_strict = true
# 设置登录严格校验
login_strict = true
[resource]
# 不下载字幕
require_subtitle = false
[danmaku]
# 设置弹幕速度
speed = 2.0
# 设置弹幕屏蔽关键词
block_keyword_patterns = [
".*keyword1.*",
".*keyword2.*",
]
[batch]
# 下载额外剧集
with_section = true
```
如果你使用 VS Code 对配置文件编辑,强烈建议使用 [Even Better TOML](https://marketplace.visualstudio.com/items?itemName=tamasfe.even-better-toml) 扩展,配合 yutto 提供的 schema,可以获得最佳的提示体验。
## 从 bilili1.x 迁移
### 取消的功能
- `- bilibili` 目录的生成
- 播放列表生成
- 源格式修改功能(不再支持 flv 源视频下载,如果仍有视频不支持 dash 源,请继续使用 bilili)
- 对 Python3.8 的支持,最低支持 Python3.9
- 下载前询问
- 弃用选集语法糖开始符号 `^`,直接使用明确的剧集号 `1` 即可
### 默认行为的修改
- 使用协程而非多线程进行下载
- 默认生成弹幕为 ASS
- 默认启用从多镜像源下载的特性
- 不仅可以控制是否使用系统代理,还能配置特定的代理服务器
### 新增的特性
- 单视频下载与批量下载命令分离(`bilili` 命令与 `yutto --batch` 相类似)
- 音频/视频编码选择
- 可选仅下载音频/视频
- 存放子路径的自由定制
- 支持 url 别名
- 支持文件列表
- 更多的批下载支持(现已支持 UP 主全部投稿视频、视频合集、收藏夹等)
- 更加完善的 warning 与 error 提示
- 支持仅输入 id 即可下载(aid、bvid、episode_id 等)
- 支持描述文件生成
- 将链接解析延迟到下载前一刻,避免短时间大量请求导致 IP 被封的问题
## 小技巧
### 作为 log 输出到文件
虽说 yutto 不像 bilili 那样会全屏刷新,但进度条还是会一直刷新占据多行,可能影响 log 的阅读,另外颜色码也是难以阅读的,因此我们可以通过选项禁用他们:
```bash
yutto --no-color --no-progress <url> > log
```
### 使用配置自定义默认参数
如果你希望修改 yutto 的部分参数,那么可能每次运行都需要在后面加上长长一串选项,为了避免这个问题,你可以尝试使用配置文件
```toml
# ~/.config/yutto/yutto.toml
#:schema https://raw.githubusercontent.com/yutto-dev/yutto/refs/heads/main/schemas/config.json
[basic]
dir = "~/Movies/yutto"
sessdata = "***************"
num_workers = 16
vcodec = "av1:copy"
```
当然,请手动修改 `sessdata` 内容为自己的 `SESSDATA` 哦~
> [!TIP]
>
> 本方案可替代原有的「自定义命令别名」方式~
>
> <details>
> <summary>原「自定义命令别名」方案</summary>
>
> 在 `~/.zshrc` / `~/.bashrc` 中自定义一条 alias,像这样
>
> ```bash
> alias ytt='yutto -d ~/Movies/yutto/ -c `cat ~/.sessdata` -n 16 --vcodec="av1:copy"'
> ```
>
> 这样我每次只需要 `ytt <url>` 就可以直接使用这些参数进行下载啦~
>
> 由于我提前在 `~/.sessdata` 存储了我的 `SESSDATA`,所以避免每次都要手动输入 cookie 的问题。
>
> </details>
### 使用 url alias
yutto 新增的 url alias 可以让你下载正在追的番剧时不必每次都打开浏览器复制 url,只需要将追番列表存储在一个文件中,并为这些 url 起一个别名即可
```
tensura-nikki=https://www.bilibili.com/bangumi/play/ss38221/
```
之后下载最新话只需要
```
yutto --batch tensura-nikki --alias-file=/path/to/alias-file
```
你同样可以通过配置文件来实现这一点(推荐)
```toml
# ~/.config/yutto/yutto.toml
#:schema https://raw.githubusercontent.com/yutto-dev/yutto/refs/heads/main/schemas/config.json
[basic.aliases]
tensura-nikki = "https://www.bilibili.com/bangumi/play/ss38221/"
```
### 使用任务列表
现在 url 不仅支持 http/https 链接与裸 id,还支持使用文件路径与 file scheme 来用于表示文件列表,文件列表以行分隔,每行写一次命令的参数,该参数会覆盖掉主程序中所使用的参数,示例如下:
首先将下面的文件存储到一个地方
```
https://www.bilibili.com/bangumi/play/ss38221/ --batch -p $
https://www.bilibili.com/bangumi/play/ss38260/ --batch -p $
```
然后运行
```
yutto file:///path/to/list
```
即可分别下载这两个番剧的最新一话
或者直接使用相对或者绝对路径也是可以的
```
yutto ./path/to/list
```
值得注意的是,在文件列表各项里的参数优先级是高于命令里的优先级的,比如文件中使用:
```
tensura1 --batch -p $ --no-danmaku --vcodec="hevc:copy"
tensura2 --batch -p $
```
而命令中则使用
```
yutto file:///path/to/list --vcodec="avc:copy"
```
最终下载的 tensura1 会是 "hevc:copy",而 tensura2 则会是 "avc:copy"
另外,文件列表也是支持 alias 的,你完全可以为该列表起一个别名,一个比较特别的用例是将你所有追番的内容放在一个文件里,然后为该文件起一个别名(比如 `subscription`),这样只需要 `yutto subscription --alias-file path/to/alias/file` 就可以达到追番效果啦~
最后,列表也是支持嵌套的哦(虽然没什么用 2333)
## FAQ
### 名字的由来
[《転スラ日記》第一话 00:24](https://www.bilibili.com/bangumi/play/ep395211?t=24)
### 何谓「任性」?
yutto 添加任何特性都需要以保证可维护性为前提,因此 yutto 不会添加过于复杂的特性,只需要满足够用即可。
### yutto 会替代 bilili 吗
yutto 自诞生以来已经过去三年多了,功能上基本可以替代 bilili 了,由于 B 站接口的不断变化,bilili 也不再适用于现在的环境,因此请 bilili 用户尽快迁移到 yutto ~
### 正式版什么时候发布
快了……吧?
## 其他应用
你也可以通过这些应用来使用 yutto
- [KubeSpider](https://github.com/opennaslab/kubespider): 一个多功能全局资源编排下载系统,支持下载、订阅各类资源网站~
## Roadmap
### 2.0.0-rc
- [x] feat: 投稿视频描述文件支持
- [x] refactor: 整理路径变量名
- [x] feat: 视频合集选集支持(合集貌似有取代分 p 的趋势,需要对其进行合适的处理)
- [x] refactor: 重写 biliass
### 2.0.0
- [x] feat: 支持弹幕字体、字号、速度等设置
- [x] feat: 配置文件支持
- [x] feat: 配置文件功能优化,支持自定义配置路径
- [ ] docs: issue template 添加配置引导
- [x] docs: 优化 biliass rust 重构后的贡献指南
- [ ] feat: 新的基于 toml 的任务列表
- [ ] refactor: 配置参数复用 pydantic 验证
- [ ] docs: 可爱的静态文档(WIP in [#86](https://github.com/yutto-dev/yutto/pull/86))
### future
- [ ] refactor: 针对视频合集优化路径变量
- [ ] refactor: 优化杜比视界/音效/全景声选取逻辑(Discussing in [#62](https://github.com/yutto-dev/yutto/discussions/62))
- [ ] refactor: 直接使用 rich 替代内置的终端显示模块
- [ ] feat: 更多批下载支持
- [ ] feat: 以及更加可爱~
## 参考
- 基本结构:<https://github.com/yutto-dev/bilili>
- 协程下载:<https://github.com/changmenseng/AsyncBilibiliDownloader>
- 弹幕转换:<https://github.com/yutto-dev/yutto/tree/main/packages/biliass>
- 样式设计:<https://github.com/willmcgugan/rich>
## 参与贡献
请阅读 [CONTRIBUTING.md](CONTRIBUTING.md)
Raw data
{
"_id": null,
"home_page": null,
"name": "yutto",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "bilibili, danmaku, downloader, python, video",
"author": null,
"author_email": "Nyakku Shigure <sigure.qaq@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/70/cb/10388d8e3c1f0fa67bc06d5f8ff45ae43ae85cd15de10c4c62c7b2a6c9a2/yutto-2.0.0rc6.tar.gz",
"platform": null,
"description": "# yutto<sup>2.0.0-rc</sup>\n\n<p align=\"center\">\n <a href=\"https://python.org/\" target=\"_blank\"><img alt=\"PyPI - Python Version\" src=\"https://img.shields.io/pypi/pyversions/yutto?logo=python&style=flat-square\"></a>\n <a href=\"https://pypi.org/project/yutto/\" target=\"_blank\"><img src=\"https://img.shields.io/pypi/v/yutto?style=flat-square\" alt=\"pypi\"></a>\n <a href=\"https://pypi.org/project/yutto/\" target=\"_blank\"><img alt=\"PyPI - Downloads\" src=\"https://img.shields.io/pypi/dm/yutto?style=flat-square\"></a>\n <a href=\"LICENSE\"><img alt=\"LICENSE\" src=\"https://img.shields.io/github/license/yutto-dev/yutto?style=flat-square\"></a>\n <br/>\n <a href=\"https://github.com/astral-sh/uv\"><img alt=\"uv\" src=\"https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json&style=flat-square\"></a>\n <a href=\"https://github.com/astral-sh/ruff\"><img alt=\"ruff\" src=\"https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json&style=flat-square\"></a>\n <a href=\"https://gitmoji.dev\"><img alt=\"Gitmoji\" src=\"https://img.shields.io/badge/gitmoji-%20\ud83d\ude1c%20\ud83d\ude0d-FFDD67?style=flat-square\"></a>\n <a href=\"https://discord.gg/5cQGyFwsqC\"><img src=\"https://img.shields.io/badge/chat-discord-5d24a3?logo=discord&style=flat-square\" alt=\"discord chat\"></a>\n</p>\n\nyutto\uff0c\u4e00\u4e2a\u53ef\u7231\u4e14\u4efb\u6027\u7684 B \u7ad9\u4e0b\u8f7d\u5668\uff08CLI\uff09\n\n\u5f53\u524d yutto \u76ee\u524d\u5904\u4e8e RC \u9636\u6bb5\uff0c\u8bf7\u901a\u8fc7 [Issues](https://github.com/yutto-dev/yutto/issues) \u53cd\u9988\u529f\u80fd\u6b63\u786e\u6027\u95ee\u9898\u548c\u529f\u80fd\u8bf7\u6c42\uff0c\u5176\u4ed6\u95ee\u9898\u8bf7\u901a\u8fc7 [Discussions](https://github.com/yutto-dev/yutto/discussions) \u53cd\u9988\uff5e\n\n## \u7248\u672c\u53f7\u4e3a\u4ec0\u4e48\u662f 2.0\n\n\u56e0\u4e3a yutto \u662f [bilili](https://github.com/yutto-dev/bilili) \u7684\u5f8c\u8f29\u5440\uff5e\n\n## \u4ece\u5b89\u88c5\u5f00\u59cb\uff5e\n\n### \u5305\u7ba1\u7406\u5668\u4e00\u952e\u5b89\u88c5\u5566\n\n\u76ee\u524d yutto \u5df2\u7ecf\u53ef\u4ee5\u901a\u8fc7\u90e8\u5206\u5305\u7ba1\u7406\u5668\u76f4\u63a5\u5b89\u88c5\uff5e\n\n\u4f7f\u7528 Homebrew \u7684\u7528\u6237\u53ef\u4ee5\u5c1d\u8bd5\u4e0b\u4e0b\u9762\u7684\u547d\u4ee4\uff1a\n\n```bash\nbrew tap siguremo/tap\nbrew install yutto\n```\n\n\u4f7f\u7528 [paru](https://github.com/Morganamilo/paru)\uff08Arch \u4e0a\u7684 AUR \u5305\u7ba1\u7406\u5668\uff09\u7684\u7528\u6237\u53ef\u4ee5\u5c1d\u8bd5\u4e0b\u8fd9\u6837\u7684\u547d\u4ee4\uff08\u611f\u8c22 @ouuan\uff09\uff1a\n\n```bash\nparu -S yutto\n```\n\n### \u4f7f\u7528 Docker\n\n\u4f60\u4e5f\u53ef\u4ee5\u5c1d\u8bd5\u4f7f\u7528 docker \u76f4\u63a5\u8fd0\u884c yutto\uff08\u5177\u4f53\u5982\u4f55\u8fd0\u884c\u9700\u8981\u53c2\u8003\u4e0b\u540e\u9762\u7684\u5185\u5bb9\uff5e\uff09\n\n```bash\ndocker run --rm -it -v /path/to/download:/app siguremo/yutto <url> [options]\n```\n\n\u4e0e\u76f4\u63a5\u8fd0\u884c yutto \u4e0d\u540c\u7684\u662f\uff0c\u8fd9\u91cc\u7684\u4e0b\u8f7d\u76ee\u6807\u8def\u5f84\u662f\u901a\u8fc7 `-v <path>:/app` \u6307\u5b9a\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4 docker \u91cc\u7684 yutto \u4f1a\u5c06\u5185\u5bb9\u4e0b\u8f7d\u5230 docker \u91cc\u7684 `/app` \u76ee\u5f55\u4e0b\uff0c\u4e0e\u4e4b\u76f8\u5bf9\u5e94\u7684\u6302\u8f7d\u70b9 `<path>` \u5c31\u662f\u4e0b\u8f7d\u8def\u5f84\u3002\u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u6302\u8f7d\u5230 `$(pwd)`\uff0c\u6b64\u65f6\u5c31\u548c\u672c\u673a yutto \u7684\u9ed8\u8ba4\u884c\u4e3a\u4e00\u81f4\u5566\uff0c\u4e5f\u662f\u4e0b\u8f7d\u5230\u5f53\u524d\u76ee\u5f55\u4e0b\uff5e\n\n### pip/pipx/uv \u5b89\u88c5\n\n> [!TIP]\n>\n> \u5728\u6b64\u4e4b\u524d\u8bf7\u786e\u4fdd\u5b89\u88c5 Python3.9 \u53ca\u4ee5\u4e0a\u7248\u672c\uff0c\u5e76\u914d\u7f6e\u597d FFmpeg\uff08\u53c2\u7167 [bilili \u6587\u6863](https://bilili.nyakku.moe/guide/getting-started.html)\uff09\n\n```bash\npip install --pre yutto\n```\n\n\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u901a\u8fc7 [pipx](https://github.com/pypa/pipx)/[uv](https://github.com/astral-sh/uv) \u6765\u5b89\u88c5 yutto\uff08\u5f53\u7136\uff0c\u524d\u63d0\u662f\u4f60\u8981\u81ea\u5df1\u5148\u5b89\u88c5\u5b83\uff09\n\n```bash\npipx install --pre yutto # \u4f7f\u7528 pipx\nuv tool install --pre yutto # \u6216\u8005\u4f7f\u7528 uv\n```\n\npipx/uv \u4f1a\u7c7b\u4f3c Homebrew \u65e0\u611f\u5730\u4e3a yutto \u521b\u5efa\u4e00\u4e2a\u865a\u62df\u73af\u5883\uff0c\u4e0e\u5176\u4f59\u73af\u5883\u9694\u79bb\u5f00\uff0c\u907f\u514d\u6c61\u67d3 pip \u7684\u73af\u5883\uff0c\u56e0\u6b64\u76f8\u5bf9\u4e8e pip\uff0cpipx/uv \u662f\u66f4\u63a8\u8350\u7684\u5b89\u88c5\u65b9\u5f0f\uff08uv \u4f1a\u6bd4 pipx \u66f4\u5feb\u4e9b\uff5e\uff09\u3002\n\n### \u4f53\u9a8c main \u5206\u652f\u6700\u65b0\u7279\u6027\n\n> [!TIP]\n>\n> \u8fd9\u540c\u6837\u8981\u6c42\u4f60\u81ea\u884c\u914d\u7f6e Python \u548c FFmpeg \u73af\u5883\n\n\u6709\u4e9b\u65f6\u5019\u6709\u4e00\u4e9b\u5728 main \u5206\u652f\u8fd8\u6ca1\u6709\u53d1\u5e03\u7684\u65b0\u7279\u6027\u6216\u8005 bugfix\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u76f4\u63a5\u5b89\u88c5 main \u5206\u652f\u7684\u4ee3\u7801\uff0c\u6700\u5feb\u7684\u65b9\u5f0f\u4ecd\u7136\u662f\u901a\u8fc7 pip \u5b89\u88c5\uff0c\u53ea\u4e0d\u8fc7\u9700\u8981\u4f7f\u7528 git \u63cf\u8ff0\u7b26\n\n```bash\npip install git+https://github.com/yutto-dev/yutto@main # \u901a\u8fc7 pip\npipx install git+https://github.com/yutto-dev/yutto@main # \u901a\u8fc7 pipx\nuv tool install git+https://github.com/yutto-dev/yutto.git@main # \u901a\u8fc7 uv\n```\n\n## \u4e3b\u8981\u529f\u80fd\n\n### \u5df2\u652f\u6301\u7684\u4e0b\u8f7d\u7c7b\u578b\n\n<!-- prettier-ignore -->\n| \u7c7b\u578b | \u662f\u5426\u652f\u6301\u9009\u96c6 | \u793a\u4f8b\u94fe\u63a5 | \u9ed8\u8ba4\u8def\u5f84\u6a21\u677f |\n| - | - | - | - |\n| \u6295\u7a3f\u89c6\u9891 | - | `https://www.bilibili.com/video/BV1vZ4y1M7mQ` <br/> `https://www.bilibili.com/video/av371660125` <br/> `https://www.bilibili.com/video/BV1vZ4y1M7mQ?p=1` <br/> `av371660125` <br/> `BV1vZ4y1M7mQ` | `{title}` |\n| \u6295\u7a3f\u89c6\u9891 <sup>\u6279\u91cf</sup> | :white_check_mark: | `https://www.bilibili.com/video/BV1vZ4y1M7mQ` <br/> `https://www.bilibili.com/video/av371660125` <br/> `av371660125` <br/> `BV1vZ4y1M7mQ` | `{title}/{name}` |\n| \u756a\u5267 | - | `https://www.bilibili.com/bangumi/play/ep395211` <br/> `ep395211` | `{name}` |\n| \u756a\u5267 <sup>\u6279\u91cf</sup> | :white_check_mark: | `https://www.bilibili.com/bangumi/play/ep395211` <br/> `https://www.bilibili.com/bangumi/play/ss38221` <br/> `https://www.bilibili.com/bangumi/media/md28233903` <br/> `ep395211` <br/> `ss38221` <br/> `md28233903` | `{title}/{name}` |\n| \u8bfe\u7a0b | - | `https://www.bilibili.com/cheese/play/ep6902` | `{name}` |\n| \u8bfe\u7a0b <sup>\u6279\u91cf</sup> | :white_check_mark: | `https://www.bilibili.com/cheese/play/ep6902` <br/> `https://www.bilibili.com/cheese/play/ss298` | `{title}/{name}` |\n| \u7528\u6237\u6307\u5b9a\u6536\u85cf\u5939 <sup>\u6279\u91cf</sup> | :x: | `https://space.bilibili.com/100969474/favlist?fid=1306978874&ftype=create` | `{username}\u7684\u6536\u85cf\u5939/{series_title}/{title}/{name}` |\n| \u5f53\u524d\u7528\u6237\u7a0d\u540e\u518d\u770b <sup>\u6279\u91cf</sup> | :x: | `https://www.bilibili.com/watchlater` | `\u7a0d\u540e\u518d\u770b/{title}/{name}` |\n| \u7528\u6237\u5168\u90e8\u6536\u85cf\u5939 <sup>\u6279\u91cf</sup> | :x: | `https://space.bilibili.com/100969474/favlist` | `{username}\u7684\u6536\u85cf\u5939/{series_title}/{title}/{name}` |\n| UP \u4e3b\u4e2a\u4eba\u7a7a\u95f4 <sup>\u6279\u91cf</sup> | :x: | `https://space.bilibili.com/100969474/video` | `{username}\u7684\u5168\u90e8\u6295\u7a3f\u89c6\u9891/{title}/{name}` |\n| \u5408\u96c6 <sup>\u6279\u91cf</sup> | :white_check_mark: | `https://space.bilibili.com/361469957/channel/collectiondetail?sid=23195` <br/> `https://www.bilibili.com/medialist/play/361469957?business=space_collection&business_id=23195` | `{series_title}/{title}` |\n| \u89c6\u9891\u5217\u8868 <sup>\u6279\u91cf</sup> | :x: | `https://space.bilibili.com/100969474/channel/seriesdetail?sid=1947439` <br/> `https://www.bilibili.com/medialist/play/100969474?business=space_series&business_id=1947439` <br/> `https://space.bilibili.com/100969474/favlist?fid=270359&ftype=collect` | `{series_title}/{title}/{name}` |\n\n> [!NOTE]\n>\n> \u6807\u8bb0\u300c\u6279\u91cf\u300d\u7684\u89c6\u9891\u90fd\u5fc5\u987b\u901a\u8fc7 `-b/--batch` \u53c2\u6570\u6765\u4e0b\u8f7d\uff0c\u5426\u5219\u4f1a\u6309\u7167\u5355\u4e2a\u89c6\u9891\u6765\u89e3\u6790\u4e0b\u8f7d\n\n### \u57fa\u672c\u547d\u4ee4\n\nyutto \u7684\u57fa\u672c\u547d\u4ee4\u5982\u4e0b\uff1a\n\n```bash\nyutto <url>\n```\n\n\u4f60\u53ef\u4ee5\u901a\u8fc7 `yutto -h` \u67e5\u770b\u8be6\u7ec6\u547d\u4ee4\u53c2\u6570\u3002\n\n\u5982\u679c\u4f60\u9700\u8981\u4e0b\u8f7d**\u5355\u4e2a**\u89c6\u9891\uff0c\u53ea\u9700\u8981\u4f7f\u7528 yutto \u52a0\u4e0a\u8fd9\u4e2a\u89c6\u9891\u7684\u5730\u5740\u5373\u53ef\u3002\u5b83\u652f\u6301 av/BV \u53f7\u4ee5\u53ca\u76f8\u5e94\u5e26 p=n \u53c2\u6570\u7684\u6295\u7a3f\u89c6\u9891\u9875\u9762\uff0c\u4e5f\u652f\u6301 ep \u53f7\uff08episode_id\uff09\u7684\u756a\u5267\u9875\u9762\u3002\n\n\u6bd4\u5982\u53ea\u9700\u8981\u8fd9\u6837\u4f60\u5c31\u53ef\u4ee5\u4e0b\u8f7d[\u300a\u8ee2\u30b9\u30e9\u65e5\u8a18\u300b](https://www.bilibili.com/bangumi/play/ep395211)\u7b2c\u4e00\u8bdd\uff1a\n\n```bash\nyutto https://www.bilibili.com/bangumi/play/ep395211\n```\n\nyutto \u8fd8\u652f\u6301\u76f4\u63a5\u4f7f\u7528\u80fd\u591f\u552f\u4e00\u5b9a\u4f4d\u8d44\u6e90\u7684 id \u6765\u4f5c\u4e3a `<url>`\uff0c\u521a\u521a\u7684\u529f\u80fd\u4e0e\u4e0b\u9762\u7684\u7b80\u5316\u540e\u7684\u547d\u4ee4\u529f\u80fd\u662f\u5b8c\u5168\u4e00\u6837\u7684\n\n```bash\nyutto ep395211\n```\n\n\u4e0d\u8fc7\u6709\u65f6\u4f60\u53ef\u80fd\u60f3\u8981\u6279\u91cf\u4e0b\u8f7d\u5f88\u591a\u5267\u96c6\uff0c\u56e0\u6b64 yutto \u63d0\u4f9b\u4e86\u7528\u4e8e\u6279\u91cf\u4e0b\u8f7d\u7684\u53c2\u6570 `-b/--batch`\uff0c\u5b83\u4e0d\u4ec5\u652f\u6301\u524d\u9762\u6240\u8bf4\u7684\u5355\u4e2a\u89c6\u9891\u6240\u5728\u9875\u9762\u5730\u5740\uff08\u4f1a\u89e3\u6790\u8be5\u5355\u4e2a\u89c6\u9891\u6240\u5728\u7684\u7cfb\u5217\u89c6\u9891\uff09\uff0c\u8fd8\u652f\u6301\u4e00\u4e9b\u660e\u786e\u7528\u4e8e\u8868\u793a\u7cfb\u5217\u89c6\u9891\u7684\u5730\u5740\uff0c\u6bd4\u5982 md \u9875\u9762\uff08media_id\uff09\u3001ss \u9875\u9762\uff08season_id\uff09\u3002\n\n\u6bd4\u5982\u50cf\u4e0b\u9762\u8fd9\u6837\u5c31\u53ef\u4ee5\u4e0b\u8f7d\u300a\u8ee2\u30b9\u30e9\u65e5\u8a18\u300b\u6240\u6709\u5df2\u66f4\u65b0\u7684\u5267\u96c6\uff1a\n\n```bash\nyutto --batch https://www.bilibili.com/bangumi/play/ep395211\n```\n\n### \u57fa\u7840\u53c2\u6570\n\nyutto \u652f\u6301\u4e00\u4e9b\u57fa\u7840\u53c2\u6570\uff0c\u65e0\u8bba\u662f\u6279\u91cf\u4e0b\u8f7d\u8fd8\u662f\u5355\u89c6\u9891\u4e0b\u8f7d\u90fd\u9002\u7528\u3002\n\n<details>\n<summary>\u70b9\u51fb\u5c55\u5f00\u8be6\u7ec6\u53c2\u6570</summary>\n\n#### \u6700\u5927\u5e76\u884c worker \u6570\u91cf\n\n- \u53c2\u6570 `-n` \u6216 `--num-workers`\n- \u9ed8\u8ba4\u503c `8`\n\n\u4e0e bilili \u4e0d\u540c\u7684\u662f\uff0cyutto \u5e76\u4e0d\u662f\u4f7f\u7528\u591a\u7ebf\u7a0b\u5b9e\u73b0\u5e76\u884c\u4e0b\u8f7d\uff0c\u800c\u662f\u4f7f\u7528\u534f\u7a0b\u5b9e\u73b0\u7684\uff0c\u672c\u53c2\u6570\u9650\u5236\u7684\u662f\u6700\u5927\u7684\u5e76\u884c Worker \u6570\u91cf\u3002\n\n#### \u6307\u5b9a\u89c6\u9891\u6e05\u6670\u5ea6\u7b49\u7ea7\n\n- \u53c2\u6570 `-q` \u6216 `--video-quality`\n- \u53ef\u9009\u503c `127 | 126 | 125 | 120 | 116 | 112 | 100 | 80 | 74 | 64 | 32 | 16`\n- \u9ed8\u8ba4\u503c `127`\n\n\u6e05\u6670\u5ea6\u5bf9\u5e94\u5173\u7cfb\u5982\u4e0b\n\n<!-- prettier-ignore -->\n| code | \u6e05\u6670\u5ea6 |\n| :-: | :-: |\n| 127 | 8K \u8d85\u9ad8\u6e05 |\n| 126 | \u675c\u6bd4\u89c6\u754c |\n| 125 | HDR \u771f\u5f69 |\n| 120 | 4K \u8d85\u6e05 |\n| 116 | 1080P 60\u5e27 |\n| 112 | 1080P \u9ad8\u7801\u7387 |\n| 100 | \u667a\u80fd\u4fee\u590d |\n| 80 | 1080P \u9ad8\u6e05 |\n| 74 | 720P 60\u5e27 |\n| 64 | 720P \u9ad8\u6e05 |\n| 32 | 480P \u6e05\u6670 |\n| 16 | 360P \u6d41\u7545 |\n\n\u5e76\u4e0d\u662f\u8bf4\u6307\u5b9a\u67d0\u4e2a\u6e05\u6670\u5ea6\u5c31\u4e00\u5b9a\u4f1a\u4e0b\u8f7d\u8be5\u6e05\u6670\u5ea6\u7684\u89c6\u9891\uff0cyutto \u53ea\u4f1a\u5c3d\u53ef\u80fd\u6ee1\u8db3\u4f60\u7684\u8981\u6c42\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u6307\u5b9a\u7684\u6e05\u6670\u5ea6\uff0cyutto \u5c31\u4f1a\u6309\u7167\u9ed8\u8ba4\u7684\u6e05\u6670\u5ea6\u641c\u7d22\u673a\u5236\u8fdb\u884c\u8c03\u8282\uff0c\u6bd4\u5982\u6307\u5b9a\u6e05\u6670\u5ea6\u4e3a `80`\uff0c**\u9996\u5148\u4f1a\u4f9d\u6b21\u964d\u6e05\u6670\u5ea6\u641c\u7d22** `74`\u3001`64`\u3001`32`\u3001`16`\uff0c\u5982\u679c\u4f9d\u7136\u627e\u4e0d\u5230\u5408\u9002\u7684\u5219**\u7ee7\u7eed\u5347\u6e05\u6670\u5ea6\u641c\u7d22** `100`\u3001`112`\u3001`116`\u3001`120`\u3001`125`\u3001`126`\u3001`127`\u3002\n\n\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u76ee\u524d\u675c\u6bd4\u89c6\u754c\u89c6\u9891\u53ea\u80fd\u7b80\u5355\u4e0b\u8f7d\u97f3\u89c6\u9891\u6d41\u5e76\u5408\u5e76\uff0c\u5408\u5e76\u540e\u5e76\u4e0d\u80fd\u8fbe\u5230\u5728\u7ebf\u89c2\u770b\u7684\u6548\u679c\u3002\n\n#### \u6307\u5b9a\u97f3\u9891\u7801\u7387\u7b49\u7ea7\n\n- \u53c2\u6570 `-aq` \u6216 `--audio-quality`\n- \u53ef\u9009\u503c `30251 | 30255 | 30250 | 30280 | 30232 | 30216`\n- \u9ed8\u8ba4\u503c `30251`\n\n\u7801\u7387\u5bf9\u5e94\u5173\u7cfb\u5982\u4e0b\n\n<!-- prettier-ignore -->\n| code | \u7801\u7387 |\n| :-: | :-: |\n| 30251 | - (Hi-Res) |\n| 30255 | - (\u675c\u6bd4\u97f3\u6548) |\n| 30250 | - (\u675c\u6bd4\u5168\u666f\u58f0) |\n| 30280 | 320kbps |\n| 30232 | 128kbps |\n| 30216 | 64kbps |\n\n\u7801\u7387\u81ea\u52a8\u8c03\u8282\u673a\u5236\u4e0e\u89c6\u9891\u6e05\u6670\u5ea6\u4e00\u81f4\uff0c\u4e5f\u91c7\u7528\u5148\u964d\u540e\u5347\u7684\u5339\u914d\u673a\u5236\u3002\n\n#### \u6307\u5b9a\u89c6\u9891\u7f16\u7801\n\n- \u53c2\u6570 `--vcodec`\n- \u4e0b\u8f7d\u7f16\u7801\u53ef\u9009\u503c `\"av1\" | \"hevc\" | \"avc\"`\n- \u4fdd\u5b58\u7f16\u7801\u53ef\u9009\u503c FFmpeg \u6240\u6709\u53ef\u7528\u7684\u89c6\u9891\u7f16\u7801\u5668\n- \u9ed8\u8ba4\u503c `\"avc:copy\"`\n\n\u8be5\u53c2\u6570\u7565\u5fae\u590d\u6742\uff0c\u524d\u534a\u90e8\u5206\u8868\u793a\u5728\u4e0b\u8f7d\u65f6**\u4f18\u5148**\u9009\u62e9\u54ea\u4e00\u79cd\u7f16\u7801\u7684\u89c6\u9891\u6d41\uff0c\u540e\u534a\u90e8\u5206\u5219\u8868\u793a\u5728\u5408\u5e76\u65f6\u5982\u4f55\u7f16\u7801\u89c6\u9891\u6d41\uff0c\u4e24\u8005\u4f7f\u7528 `:` \u5206\u9694\u3002\n\n\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u524d\u534a\u7684\u4e0b\u8f7d\u7f16\u7801\u53ea\u662f\u4f18\u5148\u4e0b\u8f7d\u7684\u7f16\u7801\u800c\u5df2\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u8be5\u7f16\u7801\uff0c\u5219\u4f1a\u6839\u636e `--download-vcodec-priority` \u81ea\u52a8\u9009\u62e9\u5176\u4f59\u7f16\u7801\uff0c\u5982\u672a\u8bbe\u7f6e `--download-vcodec-priority`\uff0c\u5219\u4f1a\u7c7b\u4f3c\u89c6\u9891\u6e05\u6670\u5ea6\u8c03\u8282\u673a\u5236\u5148\u964d\u5e8f\u540e\u5347\u5e8f\u7684\u65b9\u5f0f\u6765\u9009\u62e9\u3002\n\n\u800c\u540e\u534a\u90e8\u5206\u7684\u53c2\u6570\u5982\u679c\u8bbe\u7f6e\u6210\u975e `copy` \u7684\u503c\u5219\u53ef\u4ee5\u786e\u4fdd\u5728\u4e0b\u8f7d\u5b8c\u6210\u540e\u5bf9\u5176\u8fdb\u884c\u91cd\u65b0\u7f16\u7801\uff0c\u800c\u4e14\u4e0d\u6b62\u652f\u6301 `av1`\u3001`hevc` \u4e0e `avc`\uff0c\u53ea\u8981\u4f60\u7684 FFmpeg \u652f\u6301\u7684\u89c6\u9891\u7f16\u7801\u5668\uff0c\u5b83\u90fd\u53ef\u4ee5\u5b8c\u6210\u3002\n\n#### \u6307\u5b9a\u97f3\u9891\u7f16\u7801\n\n- \u53c2\u6570 `--acodec`\n- \u4e0b\u8f7d\u7f16\u7801\u53ef\u9009\u503c `\"mp4a\"`\n- \u4fdd\u5b58\u7f16\u7801\u53ef\u9009\u503c FFmpeg \u6240\u6709\u53ef\u7528\u7684\u97f3\u9891\u7f16\u7801\u5668\n- \u9ed8\u8ba4\u503c `\"mp4a:copy\"`\n\n\u8be6\u60c5\u540c\u89c6\u9891\u7f16\u7801\u3002\n\n#### \u6307\u5b9a\u89c6\u9891\u4e0b\u8f7d\u7f16\u7801\u4f18\u5148\u7ea7\n\n- \u53c2\u6570 `--download-vcodec-priority`\n- \u9ed8\u8ba4\u503c `\"auto\"`\n- \u53ef\u9009\u503c `\"auto\"` \u6216\u8005\u4f7f\u7528 `,` \u5206\u9694\u7684\u4e0b\u8f7d\u7f16\u7801\u5217\u8868\uff0c\u5982 `\"hevc,avc,av1\"`\n\n\u5f53\u4f7f\u7528\u9ed8\u8ba4\u503c `\"auto\"` \u65f6\uff0cyutto \u4f1a\u7c7b\u4f3c\u89c6\u9891\u6e05\u6670\u5ea6\u8c03\u8282\u673a\u5236\u5148\u964d\u5e8f\u540e\u5347\u5e8f\u7684\u65b9\u5f0f\u6765\u9009\u62e9\u3002\n\n\u5f53\u4f7f\u7528\u81ea\u5b9a\u4e49\u4e0b\u8f7d\u7f16\u7801\u5217\u8868\u65f6\uff0cyutto \u4f1a\u4e25\u683c\u6309\u7167\u5217\u8868\u4e2d\u7684\u987a\u5e8f\u8fdb\u884c\u9009\u62e9\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u5219\u4f1a\u8ba4\u4e3a\u8be5\u89c6\u9891\u65e0\u89c6\u9891\u6d41\u3002\n\n<!--\n\u8fd9\u91cc\u4f7f\u7528 [!Warning] \u6e32\u67d3\u4f1a\u51fa\u95ee\u9898\uff0c\u56e0\u4e3a GitHub \u5c1a\u4e0d\u652f\u6301\u5d4c\u5957\u5728 summary \u4e2d\uff0c\u56e0\u6b64\u6682\u65f6\u56de\u9000\u5230 **Warning** \u7684\u5199\u6cd5\n\u66f4\u591a\u8ba8\u8bba\u89c1\nhttps://github.com/orgs/community/discussions/16925#discussioncomment-7571187\n-->\n\n> **Warning**\n>\n> \u5982\u82e5\u8bbe\u7f6e\u672c\u53c2\u6570\uff0c\u8bf7\u603b\u662f\u5c06 `--download-vcode-priority` \u9996\u9009\u7f16\u7801\u4f5c\u4e3a `--vcodec` \u7684\u524d\u534a\u90e8\u5206\uff0c\u5426\u5219\u53ef\u80fd\u4f1a\u5bfc\u81f4\u4e0b\u8f7d\u5931\u8d25\u3002\n\n#### \u6307\u5b9a\u8f93\u51fa\u683c\u5f0f\n\n- \u53c2\u6570 `--output-format`\n- \u53ef\u9009\u503c `\"infer\" | \"mp4\" | \"mkv\" | \"mov\"`\n- \u9ed8\u8ba4\u503c `\"infer\"`\n\n\u5728\u81f3\u5c11\u5305\u542b\u89c6\u9891\u6d41\u65f6\u6240\u4f7f\u7528\u7684\u8f93\u51fa\u683c\u5f0f\uff0c\u9ed8\u8ba4\u9009\u503c `\"infer\"` \u8868\u793a\u81ea\u52a8\u6839\u636e\u60c5\u51b5\u8fdb\u884c\u63a8\u5bfc\u4ee5\u4fdd\u8bc1\u8f93\u51fa\u7684\u53ef\u7528\uff0c\u63a8\u5bfc\u89c4\u5219\u5982\u4e0b\uff1a\n\n- \u5982\u679c\u8f93\u51fa\u5305\u542b\u97f3\u9891\u6d41\u4e14\u97f3\u9891\u6d41\u7f16\u7801\u4e3a `\"fLaC\"`\uff0c\u5219\u8f93\u51fa\u683c\u5f0f\u4e3a `\"mkv\"`\uff0c\u56e0\u4e3a `\"mp4\"` \u5c1a\u4e0d\u652f\u6301 `\"fLaC\"` \u7f16\u7801\n- \u5426\u5219\u4e3a `\"mp4\"`\n\n#### \u6307\u5b9a\u5728\u4ec5\u5305\u542b\u97f3\u9891\u6d41\u65f6\u7684\u8f93\u51fa\u683c\u5f0f\n\n- \u53c2\u6570 `--output-format-audio-only`\n- \u53ef\u9009\u503c `\"infer\" | \"aac\" | \"mp3\" | \"flac\" | \"mp4\" | \"mkv\" | \"mov\"`\n- \u9ed8\u8ba4\u503c `\"infer\"`\n\n\u5728\u4ec5\u5305\u542b\u97f3\u9891\u6d41\u65f6\u6240\u4f7f\u7528\u7684\u8f93\u51fa\u683c\u5f0f\uff0c\u9ed8\u8ba4\u9009\u503c `\"infer\"` \u8868\u793a\u81ea\u52a8\u6839\u636e\u60c5\u51b5\u8fdb\u884c\u63a8\u5bfc\u4ee5\u4fdd\u8bc1\u8f93\u51fa\u7684\u53ef\u7528\uff0c\u63a8\u5bfc\u89c4\u5219\u5982\u4e0b\uff1a\n\n- \u5982\u679c\u97f3\u9891\u6d41\u7f16\u7801\u4e3a `\"fLaC\"`\uff0c\u5219\u8f93\u51fa\u683c\u5f0f\u4e3a `\"flac\"`\n- \u5426\u5219\u4e3a `\"aac\"`\n\n> **Note**\n>\n> \u5e76\u4e0d\u662f\u4ec5\u4ec5\u5728\u6307\u5b9a `--audio-only` \u65f6\u624d\u4f1a\u4ec5\u4ec5\u5305\u542b\u89c6\u9891\u6d41\uff0c\u6709\u4e9b\u89c6\u9891\u662f\u4ec5\u5305\u542b\u97f3\u9891\u6d41\u7684\uff0c\u6b64\u65f6\u5373\u4fbf\u4e0d\u6307\u5b9a `--audio-only` \u9009\u9879\u4e5f\u4f1a\u6309\u7167\u672c\u9009\u9879\u7684\u683c\u5f0f\u8fdb\u884c\u8f93\u51fa\u3002\n\n#### \u5f39\u5e55\u683c\u5f0f\u9009\u62e9\n\n- \u53c2\u6570 `-df` \u6216 `--danmaku-format`\n- \u53ef\u9009\u503c `\"ass\" | \"xml\" | \"protobuf\"`\n- \u9ed8\u8ba4\u503c `\"ass\"`\n\nB \u7ad9\u63d0\u4f9b\u4e86 `xml` \u4e0e `protobuf` \u4e24\u79cd\u5f39\u5e55\u6570\u636e\u63a5\u53e3\uff0c`xml` \u63a5\u53e3\u4e3a\u65e7\u63a5\u53e3\uff0c\u5f39\u5e55\u6570\u4e0a\u9650\u8f83\u4f4e\uff0c`protobuf` \u63a5\u53e3\u76f8\u5bf9\u8f83\u9ad8\uff0c\u4f46\u4e0d\u767b\u5f55\u60c5\u51b5\u4e0b\u53ea\u80fd\u83b7\u53d6\u5f88\u5c11\u7684\u5f39\u5e55\n\n\u4e3a\u4e86\u786e\u4fdd\u65e0\u8bba\u662f\u5426\u767b\u5f55\u90fd\u80fd\u83b7\u53d6\u6700\u591a\u7684\u5f39\u5e55\uff0cyutto \u5728\u767b\u5f55\u65f6\u4f1a\u4e0b\u8f7d `protobuf` \u6e90\u6570\u636e\uff0c\u5728\u672a\u767b\u5f55\u65f6\u4f1a\u4e0b\u8f7d `xml` \u6e90\u6570\u636e\uff0c\u5e76\u5c06\u5176\u8f6c\u6362\u4e3a\u4e3b\u6d41\u64ad\u653e\u5668\u652f\u6301\u7684 `ass` \u683c\u5f0f\n\n\u5982\u679c\u4f60\u4e0d\u559c\u6b22 yutto \u81ea\u52a8\u8f6c\u6362\u7684\u6548\u679c\uff0c\u53ef\u4ee5\u9009\u62e9\u8f93\u51fa\u683c\u5f0f\u4e3a `xml` \u6216 `protobuf`\uff0c\u624b\u52a8\u901a\u8fc7\u4e00\u4e9b\u5de5\u5177\u8fdb\u884c\u8f6c\u6362\uff0c\u6bd4\u5982 yutto \u548c bilili \u6240\u4f7f\u7528\u7684 [biliass](https://github.com/yutto-dev/yutto/tree/main/packages/biliass)\uff0c\u6216\u8005\u4f7f\u7528 [us-danmaku](https://tiansh.github.io/us-danmaku/bilibili/) \u8fdb\u884c\u5728\u7ebf\u8f6c\u6362\u3002\n\n\u5982\u679c\u4f60\u4e0d\u60f3\u4e0b\u8f7d\u5f39\u5e55\uff0c\u53ea\u9700\u8981\u4f7f\u7528\u53c2\u6570 `--no-danmaku` \u5373\u53ef\u3002\n\n#### \u4e0b\u8f7d\u5757\u5927\u5c0f\n\n- \u53c2\u6570 `-bs` \u6216 `--block-size`\n- \u9ed8\u8ba4\u503c `0.5`\n\n\u4ee5 MiB \u4e3a\u5355\u4f4d\uff0c\u4e3a\u5206\u5757\u4e0b\u8f7d\u65f6\u5404\u5757\u5927\u5c0f\uff0c\u4e0d\u5efa\u8bae\u66f4\u6539\u3002\n\n#### \u5f3a\u5236\u8986\u76d6\u5df2\u4e0b\u8f7d\u6587\u4ef6\n\n- \u53c2\u6570 `-w` \u6216 `--overwrite`\n- \u9ed8\u8ba4\u503c `False`\n\n#### \u4ee3\u7406\u8bbe\u7f6e\n\n- \u53c2\u6570 `-x` \u6216 `--proxy`\n- \u53ef\u9009\u503c `\"auto\" | \"no\" | <https?://url/to/proxy/server>`\n- \u9ed8\u8ba4\u503c `\"auto\"`\n\n\u8bbe\u7f6e\u4ee3\u7406\u670d\u52a1\u5668\uff0c\u9ed8\u8ba4\u662f\u4ece\u73af\u5883\u53d8\u91cf\u8bfb\u53d6\uff0c`no` \u5219\u4e3a\u4e0d\u8bbe\u7f6e\u4ee3\u7406\uff0c\u8bbe\u7f6e\u5176\u5b83 http/https url \u5219\u5c06\u5176\u4f5c\u4e3a\u4ee3\u7406\u670d\u52a1\u5668\u3002\n\n#### \u5b58\u653e\u6839\u76ee\u5f55\n\n- \u53c2\u6570 `-d` \u6216 `--dir`\n- \u9ed8\u8ba4\u503c `\"./\"`\n\n#### \u4e34\u65f6\u6587\u4ef6\u76ee\u5f55\n\n- \u53c2\u6570 `--tmp-dir`\n- \u9ed8\u8ba4\u503c\u662f\u201c\u5b58\u653e\u6839\u76ee\u5f55\u201d\u5373 `-d, --dir` \u7684\u503c\n\n#### Cookies \u8bbe\u7f6e\n\n- \u53c2\u6570 `-c` \u6216 `--sessdata`\n- \u9ed8\u8ba4\u503c `\"\"`\n\n\u8bbe\u7f6e Cookies \u540e\u4f60\u624d\u53ef\u4ee5\u4e0b\u8f7d\u66f4\u9ad8\u6e05\u6670\u5ea6\u4ee5\u53ca\u66f4\u591a\u7684\u5267\u96c6\uff0c\u5f53\u4f60\u4f20\u5165\u4f60\u7684\u5927\u4f1a\u5458 `SESSDATA` \u65f6\uff08\u5f53\u7136\u524d\u63d0\u662f\u4f60\u662f\u5927\u4f1a\u5458\uff09\uff0c\u4f60\u5c31\u53ef\u4ee5\u4e0b\u8f7d\u5927\u4f1a\u5458\u53ef\u8bbf\u95ee\u7684\u8d44\u6e90\u54af\u3002\n\n<details><summary> SESSDATA \u83b7\u53d6\u65b9\u5f0f </summary>\n\n\u8fd9\u91cc\u7528 Chrome \u4f5c\u4e3a\u793a\u4f8b\uff0c\u5176\u5b83\u6d4f\u89c8\u5668\u8bf7\u5c1d\u8bd5\u7c7b\u4f3c\u65b9\u6cd5\u3002\n\n\u9996\u5148\uff0c\u7528\u4f60\u7684\u5e10\u53f7\u767b\u5f55 B \u7ad9\uff0c\u7136\u540e\u968f\u4fbf\u6253\u5f00\u4e00\u4e2a B \u7ad9\u7f51\u9875\uff0c\u6bd4\u5982[\u9996\u9875](https://www.bilibili.com/)\u3002\n\n\u6309 F12 \u6253\u5f00\u5f00\u53d1\u8005\u5de5\u5177\uff0c\u5207\u6362\u5230 Network \u680f\uff0c\u5237\u65b0\u9875\u9762\uff0c\u6b64\u65f6\u7b2c\u4e00\u4e2a\u52a0\u8f7d\u7684\u8d44\u6e90\u5e94\u8be5\u5c31\u662f\u5f53\u524d\u9875\u9762\u7684 html\uff0c\u9009\u4e2d\u8be5\u8d44\u6e90\uff0c\u5728\u53f3\u4fa7 \u300cRequest Headers\u300d \u4e2d\u627e\u5230 \u300ccookie\u300d\uff0c\u5728\u5176\u4e2d\u627e\u5230\u7c7b\u4f3c\u4e8e `SESSDATA=d8bc7493%2C2843925707%2C08c3e*81;` \u7684\u4e00\u4e32\u5b57\u7b26\u4e32\uff0c\u590d\u5236\u8fd9\u91cc\u7684 `d8bc7493%2C2843925707%2C08c3e*81`\uff0c\u8fd9\u5c31\u662f\u4f60\u9700\u8981\u7684 `SESSDATA`\u3002\n\n</details>\n\n\u53e6\u5916\uff0c\u7531\u4e8e SESSDATA \u4e2d\u53ef\u80fd\u6709\u7279\u6b8a\u7b26\u53f7\uff0c\u6240\u4ee5\u4f20\u5165\u65f6\u4f60\u53ef\u80fd\u9700\u8981\u4f7f\u7528\u53cc\u5f15\u53f7\u6765\u5305\u88f9\n\n```bash\nyutto <url> -c \"d8bc7493%2C2843925707%2C08c3e*81\"\n```\n\n\u5f53\u7136\uff0c\u793a\u4f8b\u91cc\u7684 SESSDATA \u662f\u65e0\u6548\u7684\uff0c\u8bf7\u4f7f\u7528\u81ea\u5df1\u7684 SESSDATA\u3002\n\n#### \u5b58\u653e\u5b50\u8def\u5f84\u6a21\u677f\n\n- \u53c2\u6570 `-tp` \u6216 `--subpath-template`\n- \u53ef\u9009\u53c2\u6570\u53d8\u91cf `title | id | name | username | series_title | pubdate | download_date | owner_uid` \uff08\u4ee5\u540e\u53ef\u80fd\u4f1a\u6709\u66f4\u591a\uff09\n- \u9ed8\u8ba4\u503c `\"{auto}\"`\n\n\u901a\u8fc7\u914d\u7f6e\u5b50\u8def\u5f84\u6a21\u677f\u53ef\u4ee5\u7075\u6d3b\u5730\u63a7\u5236\u89c6\u9891\u5b58\u653e\u4f4d\u7f6e\u3002\n\n\u9ed8\u8ba4\u60c5\u51b5\u662f\u7531 yutto \u81ea\u52a8\u63a7\u5236\u5b58\u653e\u4f4d\u7f6e\u7684\u3002\u6bd4\u5982\u4e0b\u8f7d\u5355\u4e2a\u89c6\u9891\u65f6\u9ed8\u8ba4\u5c31\u662f\u76f4\u63a5\u5b58\u653e\u5728\u8bbe\u5b9a\u7684\u6839\u76ee\u5f55\uff0c\u4e0d\u4f1a\u521b\u5efa\u4e00\u5c42\u5bb9\u5668\u76ee\u5f55\uff0c\u6b64\u65f6\u81ea\u52a8\u9009\u62e9\u4e86 `{name}` \u4f5c\u4e3a\u6a21\u677f\uff1b\u800c\u6279\u91cf\u4e0b\u8f7d\u65f6\u5219\u4f1a\u6839\u636e\u89c6\u9891\u5c42\u7ea7\u751f\u6210\u591a\u7ea7\u76ee\u5f55\uff0c\u6bd4\u5982\u756a\u5267\u4f1a\u662f `{title}/{name}`\uff0c\u9996\u5148\u4f1a\u5728\u8bbe\u5b9a\u6839\u76ee\u5f55\u91cc\u751f\u6210\u4e00\u4e2a\u756a\u5267\u540d\u7684\u76ee\u5f55\uff0c\u5176\u5185\u624d\u4f1a\u5b58\u653e\u5404\u4e2a\u756a\u5267\u5267\u96c6\u89c6\u9891\uff0c\u8fd9\u6837\u65b9\u4fbf\u4e86\u591a\u4e2a\u4e0d\u540c\u756a\u5267\u7684\u7ba1\u7406\u3002\u5f53\u7136\uff0c\u5982\u679c\u4f60\u4ecd\u5e0c\u671b\u5c06\u756a\u5267\u76f4\u63a5\u5b58\u653e\u5728\u8bbe\u5b9a\u6839\u76ee\u5f55\u4e0b\u7684\u8bdd\uff0c\u53ef\u4ee5\u4fee\u6539\u8be5\u53c2\u6570\u503c\u4e3a `{name}`\u5373\u53ef\u3002\n\n\u53e6\u5916\uff0c\u8be5\u529f\u80fd\u8bed\u6cd5\u7531 Python format \u51fd\u6570\u6a21\u677f\u8bed\u6cd5\u63d0\u4f9b\uff0c\u6240\u4ee5\u4e5f\u652f\u6301\u4e00\u4e9b\u9ad8\u7ea7\u7684\u7528\u6cd5\uff0c\u6bd4\u5982 `{id:0>3}{name}`\uff0c\u6b64\u5916\u8fd8\u4e13\u95e8\u4e3a\u65f6\u95f4\u53d8\u91cf \ud83d\udd5b \u589e\u52a0\u4e86\u81ea\u5b9a\u4e49\u65f6\u95f4\u6a21\u677f\u7684\u8bed\u6cd5 `{pubdate@%Y-%m-%d %H:%M:%S}`\uff0c\u9ed8\u8ba4\u65f6\u95f4\u6a21\u677f\u4e3a `%Y-%m-%d`\u3002\n\n\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u5e76\u4e0d\u662f\u6240\u6709\u53d8\u91cf\u5728\u5404\u79cd\u573a\u5408\u4e0b\u90fd\u4f1a\u63d0\u4f9b\uff0c\u6bd4\u5982 `username`, `owner_uid` \u53d8\u91cf\u5f53\u524d\u4ec5\u5728 UP \u4e3b\u5168\u90e8\u6295\u7a3f\u89c6\u9891/\u6536\u85cf\u5939/\u7a0d\u540e\u518d\u770b\u624d\u63d0\u4f9b\uff0c\u5728\u5176\u5b83\u60c5\u51b5\u4e0b\u4e0d\u5e94\u4f7f\u7528\u5b83\u3002\u5404\u53d8\u91cf\u8be6\u7ec6\u4f5c\u7528\u57df\u63cf\u8ff0\u89c1\u4e0b\u8868\uff1a\n\n<!-- prettier-ignore -->\n| Variable | Description | Scope |\n| - | - | - |\n| title | \u7cfb\u5217\u89c6\u9891\u603b\u6807\u9898\uff08\u756a\u5267\u540d/\u6295\u7a3f\u89c6\u9891\u6807\u9898\uff09 | \u5168\u90e8 |\n| id | \u7cfb\u5217\u89c6\u9891\u5355 p \u987a\u5e8f\u6807\u53f7 | \u5168\u90e8 |\n| name | \u7cfb\u5217\u89c6\u9891\u5355 p \u6807\u9898 | \u5168\u90e8 |\n| username | UP \u4e3b\u7528\u6237\u540d | \u4e2a\u4eba\u7a7a\u95f4\u3001\u6536\u85cf\u5939\u3001\u7a0d\u540e\u518d\u770b\u3001\u5408\u96c6\u3001\u89c6\u9891\u5217\u8868\u4e0b\u8f7d |\n| series_title | \u5408\u96c6\u6807\u9898 | \u6536\u85cf\u5939\u3001\u89c6\u9891\u5408\u96c6\u3001\u89c6\u9891\u5217\u8868\u4e0b\u8f7d |\n| pubdate\ud83d\udd5b | \u6295\u7a3f\u65e5\u671f | \u4ec5\u6295\u7a3f\u89c6\u9891 |\n| download_date\ud83d\udd5b | \u4e0b\u8f7d\u65e5\u671f | \u5168\u90e8 |\n| owner_uid | UP \u4e3bUID | \u4e2a\u4eba\u7a7a\u95f4\u3001\u6536\u85cf\u5939\u3001\u7a0d\u540e\u518d\u770b\u3001\u5408\u96c6\u3001\u89c6\u9891\u5217\u8868\u4e0b\u8f7d |\n\n> **Note**\n>\n> \u672a\u6765\u53ef\u80fd\u4f1a\u5bf9\u8def\u5f84\u53d8\u91cf\u53ca\u9ed8\u8ba4\u8def\u5f84\u6a21\u677f\u8fdb\u884c\u8c03\u6574\n\n#### url \u522b\u540d\u6587\u4ef6\u8def\u5f84\n\n- \u53c2\u6570 `-af` \u6216 `--alias-file`\n- \u9ed8\u8ba4\u503c `None`\n\n\u6307\u5b9a\u522b\u540d\u6587\u4ef6\u8def\u5f84\uff0c\u522b\u540d\u6587\u4ef6\u4e2d\u5b58\u653e\u4e00\u4e2a\u522b\u540d\u4e0e\u5176\u5bf9\u5e94\u7684 url\uff0c\u4f7f\u7528\u7a7a\u683c\u6216\u8005 `=` \u5206\u9694\uff0c\u793a\u4f8b\u5982\u4e0b\uff1a\n\n```\ntensura1=https://www.bilibili.com/bangumi/play/ss25739/\ntensura2=https://www.bilibili.com/bangumi/play/ss36170/\ntensura-nikki=https://www.bilibili.com/bangumi/play/ss38221/\n```\n\n\u6bd4\u5982\u5c06\u4e0a\u8ff0\u5185\u5bb9\u5b58\u50a8\u5230 `~/.yutto_alias`\uff0c\u5219\u901a\u8fc7\u4ee5\u4e0b\u547d\u4ee4\u5373\u53ef\u89e3\u6790\u8be5\u6587\u4ef6\uff1a\n\n```bash\nyutto tensura1 --batch --alias-file='~/.yutto_alias'\n```\n\n\u5f53\u53c2\u6570\u503c\u4e3a `-` \u65f6\uff0c\u4f1a\u4ece\u6807\u51c6\u8f93\u5165\u4e2d\u8bfb\u53d6\uff1a\n\n```bash\ncat ~/.yutto_alias | yutto tensura-nikki --batch --alias-file -\n```\n\n#### \u6307\u5b9a\u5a92\u4f53\u5143\u6570\u636e\u503c\u7684\u683c\u5f0f\n\n\u5f53\u524d\u4ec5\u652f\u6301 `premiered`\n\n- \u53c2\u6570 `--metadata-format-premiered`\n- \u9ed8\u8ba4\u503c `\"%Y-%m-%d\"`\n- \u5e38\u7528\u503c `\"%Y-%m-%d %H:%M:%S\"`\n\n#### \u4e25\u683c\u6821\u9a8c\u5927\u4f1a\u5458\u72b6\u6001\u6709\u6548\n\n- \u53c2\u6570 `--vip-strict`\n- \u9ed8\u8ba4\u503c `False`\n\n#### \u4e25\u683c\u6821\u9a8c\u767b\u5f55\u72b6\u6001\u6709\u6548\n\n- \u53c2\u6570 `--login-strict`\n- \u9ed8\u8ba4\u503c `False`\n\n#### \u8bbe\u7f6e\u4e0b\u8f7d\u95f4\u9694\n\n- \u53c2\u6570 `--download-interval`\n- \u9ed8\u8ba4\u503c `0`\n\n\u8bbe\u7f6e\u4e24\u8bdd\u4e4b\u95f4\u7684\u4e0b\u8f7d\u95f4\u9694\uff08\u5355\u4f4d\u4e3a\u79d2\uff09\uff0c\u907f\u514d\u77ed\u65f6\u95f4\u5167\u4e0b\u8f7d\u5927\u91cf\u89c6\u9891\u5bfc\u81f4\u8d26\u53f7\u88ab\u5c01\u7981\n\n#### \u7981\u7528\u4e0b\u8f7d\u955c\u50cf\n\n- \u53c2\u6570 `--banned-mirrors-pattern`\n- \u9ed8\u8ba4\u503c `None`\n\n\u4f7f\u7528\u6b63\u5219\u7981\u7528\u7279\u5b9a\u955c\u50cf\uff0c\u6bd4\u5982 `--banned-mirrors-pattern \"mirrorali\"` \u5c06\u7981\u7528 url \u4e2d\u5305\u542b `mirrorali` \u7684\u955c\u50cf\n\n#### \u4e0d\u663e\u793a\u989c\u8272\n\n- \u53c2\u6570 `--no-color`\n- \u9ed8\u8ba4\u503c `False`\n\n#### \u4e0d\u663e\u793a\u8fdb\u5ea6\u6761\n\n- \u53c2\u6570 `--no-progress`\n- \u9ed8\u8ba4\u503c `False`\n\n#### \u542f\u7528 Debug \u6a21\u5f0f\n\n- \u53c2\u6570 `--debug`\n- \u9ed8\u8ba4\u503c `False`\n\n</details>\n\n### \u8d44\u6e90\u9009\u62e9\u53c2\u6570\n\n\u6b64\u5916\u6709\u4e00\u4e9b\u53c2\u6570\u4e13\u7528\u4e8e\u8d44\u6e90\u9009\u62e9\uff0c\u6bd4\u5982\u9009\u62e9\u662f\u5426\u4e0b\u8f7d\u5f39\u5e55\u3001\u97f3\u9891\u3001\u89c6\u9891\u7b49\u7b49\u3002\n\n<details>\n<summary>\u70b9\u51fb\u5c55\u5f00\u8be6\u7ec6\u53c2\u6570</summary>\n\n#### \u4ec5\u4e0b\u8f7d\u89c6\u9891\u6d41\n\n- \u53c2\u6570 `--video-only`\n- \u9ed8\u8ba4\u503c `False`\n\n> **Note**\n>\n> \u8fd9\u91cc\u300c\u4ec5\u4e0b\u8f7d\u89c6\u9891\u6d41\u300d\u662f\u6307\u89c6\u9891\u4e2d\u97f3\u89c6\u9891\u6d41\u4ec5\u9009\u62e9\u89c6\u9891\u6d41\uff0c\u800c\u4e0d\u662f\u4ec5\u4ec5\u4e0b\u8f7d\u89c6\u9891\u800c\u4e0d\u4e0b\u8f7d\u5f39\u5e55\u5b57\u5e55\u7b49\u8d44\u6e90\uff0c\u5982\u679c\u9700\u8981\u53d6\u6d88\u5b57\u5e55\u7b49\u8d44\u6e90\u4e0b\u8f7d\uff0c\u8bf7\u989d\u5916\u4f7f\u7528 `--no-danmaku` \u7b49\u53c2\u6570\u3002\n>\n> \u300c\u4ec5\u4e0b\u8f7d\u97f3\u9891\u6d41\u300d\u4e5f\u662f\u540c\u6837\u7684\u3002\n\n#### \u4ec5\u4e0b\u8f7d\u97f3\u9891\u6d41\n\n- \u53c2\u6570 `--audio-only`\n- \u9ed8\u8ba4\u503c `False`\n\n\u4ec5\u4e0b\u8f7d\u5176\u4e2d\u7684\u97f3\u9891\u6d41\uff0c\u4fdd\u5b58\u4e3a `.aac` \u6587\u4ef6\u3002\n\n#### \u4e0d\u751f\u6210\u5f39\u5e55\u6587\u4ef6\n\n- \u53c2\u6570 `--no-danmaku`\n- \u9ed8\u8ba4\u503c `False`\n\n#### \u4ec5\u751f\u6210\u5f39\u5e55\u6587\u4ef6\n\n- \u53c2\u6570 `--danmaku-only`\n- \u9ed8\u8ba4\u503c `False`\n\n#### \u4e0d\u751f\u6210\u5b57\u5e55\u6587\u4ef6\n\n- \u53c2\u6570 `--no-subtitle`\n- \u9ed8\u8ba4\u503c `False`\n\n#### \u4ec5\u751f\u6210\u5b57\u5e55\u6587\u4ef6\n\n- \u53c2\u6570 `--subtitle-only`\n- \u9ed8\u8ba4\u503c `False`\n\n#### \u751f\u6210\u5a92\u4f53\u5143\u6570\u636e\u6587\u4ef6\n\n- \u53c2\u6570 `--with-metadata`\n- \u9ed8\u8ba4\u503c `False`\n\n\u76ee\u524d\u5a92\u4f53\u5143\u6570\u636e\u751f\u6210\u5c1a\u5728\u8bd5\u9a8c\u9636\u6bb5\uff0c\u53ef\u80fd\u63d0\u53d6\u51fa\u7684\u4fe1\u606f\u5e76\u4e0d\u5b8c\u6574\u3002\n\n#### \u4ec5\u751f\u6210\u5a92\u4f53\u5143\u6570\u636e\u6587\u4ef6\n\n- \u53c2\u6570 `--metadata-only`\n- \u9ed8\u8ba4\u503c `False`\n\n#### \u4e0d\u751f\u6210\u89c6\u9891\u5c01\u9762\n\n- \u53c2\u6570 `--no-cover`\n- \u9ed8\u8ba4\u503c `False`\n\n> [!NOTE]\n>\n> \u5f53\u524d\u4ec5\u652f\u6301\u4e3a\u5305\u542b\u89c6\u9891\u6d41\u7684\u89c6\u9891\u751f\u6210\u5c01\u9762\u3002\n\n#### \u751f\u6210\u89c6\u9891\u6d41\u5c01\u9762\u65f6\u5355\u72ec\u4fdd\u5b58\u5c01\u9762\n\n- \u53c2\u6570 `--save-cover`\n- \u9ed8\u8ba4\u503c `False`\n\n#### \u4ec5\u751f\u6210\u89c6\u9891\u5c01\u9762\n\n- \u53c2\u6570 `--cover-only`\n- \u9ed8\u8ba4\u503c `False`\n\n#### \u4e0d\u751f\u6210\u7ae0\u8282\u4fe1\u606f\n\n- \u53c2\u6570 `--no-chapter-info`\n- \u9ed8\u8ba4\u503c `False`\n\n\u4e0d\u751f\u6210\u7ae0\u8282\u4fe1\u606f\uff0c\u5305\u542b MetaData \u548c\u5d4c\u5165\u89c6\u9891\u6d41\u7684\u7ae0\u8282\u4fe1\u606f\u3002\n\n</details>\n\n### \u5f39\u5e55\u8bbe\u7f6e\u53c2\u6570<sup>Experimental</sup>\n\nyutto \u901a\u8fc7\u4e0e biliass \u7684\u96c6\u6210\uff0c\u63d0\u4f9b\u4e86\u4e00\u4e9b ASS \u5f39\u5e55\u9009\u9879\uff0c\u5305\u62ec\u5b57\u53f7\u3001\u5b57\u4f53\u3001\u901f\u5ea6\u7b49\uff5e\n\n<details>\n<summary>\u70b9\u51fb\u5c55\u5f00\u8be6\u7ec6\u53c2\u6570</summary>\n\n#### \u5f39\u5e55\u5b57\u4f53\u5927\u5c0f\n\n- \u53c2\u6570 `--danmaku-font-size`\n- \u9ed8\u8ba4\u503c `video_width / 40`\n\n#### \u5f39\u5e55\u5b57\u4f53\n\n- \u53c2\u6570 `--danmaku-font`\n- \u9ed8\u8ba4\u503c `\"SimHei\"`\n\n#### \u5f39\u5e55\u4e0d\u900f\u660e\u5ea6\n\n- \u53c2\u6570 `--danmaku-opacity`\n- \u9ed8\u8ba4\u503c `0.8`\n\n#### \u5f39\u5e55\u663e\u793a\u533a\u57df\u4e0e\u89c6\u9891\u9ad8\u5ea6\u7684\u6bd4\u4f8b\n\n- \u53c2\u6570 `--danmaku-display-region-ratio`\n- \u9ed8\u8ba4\u503c `1.0`\n\n#### \u5f39\u5e55\u901f\u5ea6\n\n- \u53c2\u6570 `--danmaku-speed`\n- \u9ed8\u8ba4\u503c `1.0`\n\n#### \u5c4f\u853d\u9876\u90e8\u5f39\u5e55\n\n- \u53c2\u6570 `--danmaku-block-top`\n- \u9ed8\u8ba4\u503c `False`\n\n#### \u5c4f\u853d\u5e95\u90e8\u5f39\u5e55\n\n- \u53c2\u6570 `--danmaku-block-bottom`\n- \u9ed8\u8ba4\u503c `False`\n\n#### \u5c4f\u853d\u6eda\u52a8\u5f39\u5e55\n\n- \u53c2\u6570 `--danmaku-block-scroll`\n- \u9ed8\u8ba4\u503c `False`\n\n#### \u5c4f\u853d\u9006\u5411\u5f39\u5e55\n\n- \u53c2\u6570 `--danmaku-block-reverse`\n- \u9ed8\u8ba4\u503c `False`\n\n#### \u5c4f\u853d\u56fa\u5b9a\u5f39\u5e55\uff08\u9876\u90e8\u3001\u5e95\u90e8\uff09\n\n- \u53c2\u6570 `--danmaku-block-fixed`\n- \u9ed8\u8ba4\u503c `False`\n\n#### \u5c4f\u853d\u9ad8\u7ea7\u5f39\u5e55\n\n- \u53c2\u6570 `--danmaku-block-special`\n- \u9ed8\u8ba4\u503c `False`\n\n#### \u5c4f\u853d\u5f69\u8272\u5f39\u5e55\n\n- \u53c2\u6570 `--danmaku-block-colorful`\n- \u9ed8\u8ba4\u503c `False`\n\n#### \u5c4f\u853d\u5173\u952e\u8bcd\n\n- \u53c2\u6570 `\"--danmaku-block-keyword-patterns`\n- \u9ed8\u8ba4\u503c `None`\n\n\u6309\u5173\u952e\u8bcd\u5c4f\u853d\uff0c\u652f\u6301\u6b63\u5219\uff0c\u4f7f\u7528 `,` \u5206\u9694\n\n</details>\n\n### \u6279\u91cf\u53c2\u6570\n\n\u6709\u4e9b\u53c2\u6570\u662f\u53ea\u6709\u6279\u91cf\u4e0b\u8f7d\u65f6\u624d\u53ef\u4ee5\u4f7f\u7528\u7684\n\n<details>\n<summary>\u70b9\u51fb\u5c55\u5f00\u8be6\u7ec6\u53c2\u6570</summary>\n\n#### \u542f\u7528\u6279\u91cf\u4e0b\u8f7d\n\n- \u53c2\u6570 `-b` \u6216 `--batch`\n- \u9ed8\u8ba4\u503c `False`\n\n\u53ea\u9700\u8981 `yutto --batch <url>` \u5373\u53ef\u542f\u7528\u6279\u91cf\u4e0b\u8f7d\u529f\u80fd\u3002\n\n#### \u9009\u96c6\n\n- \u53c2\u6570 `-p` \u6216 `--episodes`\n- \u9ed8\u8ba4\u503c `1~-1`\uff08\u4e5f\u5373\u5168\u9009\uff09\n\n\u4e5f\u5c31\u662f\u9009\u96c6\u54af\uff0c\u5176\u8bed\u6cd5\u662f\u8fd9\u6837\u7684\n\n- `<p1>` \u5355\u72ec\u4e0b\u67d0\u4e00\u5267\u96c6\n - \u652f\u6301\u8d1f\u6570\u6765\u9009\u62e9\u5012\u6570\u7b2c\u51e0\u8bdd\n - \u6b64\u5916\u8fd8\u53ef\u4ee5\u4f7f\u7528 `$` \u6765\u4ee3\u8868 `-1`\n- `<p_start>~<p_end>` \u4f7f\u7528 `~` \u53ef\u4ee5\u8fde\u7eed\u9009\u53d6\uff08\u5982\u679c\u8d77\u59cb\u4e3a 1\uff0c\u6216\u8005\u7ec8\u6b62\u4e3a -1 \u5219\u53ef\u4ee5\u7701\u7565\uff09\n- `<p1>,<p2>,<p3>,...,<pn>` \u4f7f\u7528 `,` \u53ef\u4ee5\u4e0d\u8fde\u7eed\u9009\u53d6\n\nemmm\uff0c\u76f4\u63a5\u770b\u7684\u8bdd\u5927\u6982\u5e76\u4e0d\u80fd\u77e5\u9053\u6211\u5728\u8bf4\u4ec0\u4e48\uff0c\u6240\u4ee5\u6211\u4eec\u901a\u8fc7\u51e0\u4e2a\u5c0f\u4f8b\u5b50\u6765\u4e86\u89e3\u5176\u8bed\u6cd5\n\n```bash\n# \u5047\u8bbe\u8981\u4e0b\u8f7d\u4e00\u4e2a\u5177\u6709 24 \u8bdd\u7684\u756a\u5267\n# \u5982\u679c\u6211\u4eec\u53ea\u60f3\u4e0b\u8f7d\u7b2c 3 \u8bdd\uff0c\u53ea\u9700\u8981\u8fd9\u6837\nyutto <url> -b -p 3\n# \u90a3\u5982\u679c\u6211\u60f3\u4e0b\u8f7d\u7b2c 5 \u8bdd\u5230\u7b2c 7 \u8bdd\u5462\uff0c\u4f7f\u7528 `~` \u53ef\u4ee5\u8fde\u7eed\u9009\u4e2d\nyutto <url> -b -p 5~7\n# \u90a3\u6211\u60f3\u4e0b\u8f7d\u7b2c 12 \u8bdd\u548c\u7b2c 17 \u8bdd\u53c8\u8981\u600e\u4e48\u529e\uff1f\u6b64\u65f6\u53ea\u9700\u8981 `,` \u5c31\u53ef\u4ee5\u5c06\u591a\u4e2a\u4e0d\u8fde\u7eed\u7684\u9009\u96c6\u4e00\u8d77\u9009\u4e2d\nyutto <url> -b -p 12,17\n# \u90a3\u6211\u7a81\u7136\u53c8\u60f3\u5c06\u521a\u624d\u90a3\u4e9b\u90fd\u9009\u4e2d\u4e86\u5462\uff1f\u8fd8\u662f\u4f7f\u7528 `,` \u5440\uff0c\u5c06\u5b83\u4eec\u8fde\u5728\u4e00\u8d77\u5373\u53ef\nyutto <url> -b -p 3,5~7,12,17\n# \u55ef\uff0c\u4f60\u5df2\u7ecf\u628a\u57fa\u672c\u7528\u6cd5\u90fd\u4e86\u89e3\u8fc7\u4e86\uff0c\u5f88\u7b80\u5355\u5427\uff5e\n# \u4e0b\u9762\u662f\u4e00\u4e9b\u8bed\u6cd5\u7cd6\uff0c\u4e0d\u4e86\u89e3\u4e5f\u5b8c\u5168\u4e0d\u4f1a\u5f71\u54cd\u4efb\u4f55\u529f\u80fd\u54d2\uff5e\n# \u90a3\u5982\u679c\u6211\u53ea\u77e5\u9053\u6211\u60f3\u4e0b\u8f7d\u5012\u6570\u7b2c 3 \u8bdd\uff0c\u800c\u4e0d\u60f3\u7b97\u5012\u6570\u7b2c\u4e09\u8bdd\u662f\u7b2c\u51e0\u8bdd\u5e94\u8be5\u600e\u4e48\u529e\uff1f\n# \u6b64\u65f6\u53ef\u4ee5\u7528\u8d1f\u6570\u54d2\uff5e\u4e0d\u8fc7\u8981\u6ce8\u610f\u7684\u662f\uff0c\u8fd9\u79cd\u53c2\u6570\u4ee5 `-` \u5f00\u5934\u53c2\u6570\u9700\u8981\u4f7f\u7528 `=` \u6765\u8fde\u63a5\u9009\u9879\u548c\u53c2\u6570\nyutto <url> -b -p=-3\n# \u90a3\u4e48\u5982\u679c\u60f3\u4e0b\u8f7d\u6700\u540e\u4e00\u8bdd\u4f60\u53ef\u80fd\u4f1a\u60f3\u5230 `-p=-1` \u5bf9\u5427\uff1f\u4e0d\u8fc7\u6211\u5185\u7f6e\u4e86\u7b26\u53f7 $ \u7528\u4e8e\u4ee3\u8868\u6700\u540e\u4e00\u8bdd\n# \u50cf\u4e0b\u9762\u8fd9\u6837\u5c31\u53ef\u4ee5\u76f4\u63a5\u4e0b\u8f7d\u6700\u540e\u4e00\u8bdd\u5566\uff5e\nyutto <url> -b -p $\n# \u4e3a\u4e86\u8fdb\u4e00\u6b65\u65b9\u4fbf\u8868\u793a\u4e00\u4e2a\u8303\u56f4\u9009\u53d6\uff0c\u5728\u4ece\u7b2c\u4e00\u8bdd\u5f00\u59cb\u9009\u53d6\u6216\u8005\u4ee5\u6700\u540e\u4e00\u8bdd\u4e3a\u7ec8\u6b62\u65f6\u53ef\u4ee5\u7701\u7565\u5b83\u4eec\n# \u8fd9\u6837\u5c31\u662f\u524d\u4e09\u8bdd\u5566\uff08\u8fd9\u91cc\u4e0e\u4ee5 `-` \u5f00\u5934\u7c7b\u4f3c\uff0c\u4ee5 `~` \u5f00\u5934\u53ef\u80fd\u88ab\u8bc6\u522b\u4e3a $HOME\uff0c\u56e0\u6b64\u6700\u597d\u4e5f\u7528\u7b49\u53f7\uff0c\u6216\u8005\u4f7f\u7528\u5f15\u53f7\u5305\u88f9\uff09\nyutto <url> -b -p=~3\n# \u8fd9\u6837\u5c31\u662f\u540e\u56db\u8bdd\u5566\nyutto <url> -b -p=-4~\n# \u6240\u6709\u8bed\u6cd5\u90fd\u4e86\u89e3\u5b8c\u5566\uff0c\u6211\u4eec\u770b\u4e00\u4e2a\u7a0d\u5fae\u590d\u6742\u7684\u4f8b\u5b50\nyutto <url> -b -p \"~3,10,12~14,16,-4~\"\n# \u5f88\u660e\u663e\uff0c\u4e0a\u9762\u7684\u4f8b\u5b50\u5c31\u662f\u4e0b\u8f7d\u524d 3 \u8bdd\u3001\u7b2c 10 \u8bdd\u3001\u7b2c 12 \u5230 14 \u8bdd\u3001\u7b2c 16 \u8bdd\u4ee5\u53ca\u540e 4 \u8bdd\n```\n\n\u4e0b\u9762\u662f\u4e00\u4e9b\u8981\u6ce8\u610f\u7684\u95ee\u9898\n\n1. \u8fd9\u91cc\u4f7f\u7528\u7684\u5e8f\u53f7\u662f\u89c6\u9891\u7684\u987a\u5e8f\u5e8f\u53f7\uff0c\u800c\u4e0d\u662f\u756a\u5267\u6240\u6807\u6ce8\u7684`\u7b2c n \u8bdd`\uff0c\u56e0\u4e3a\u6709\u53ef\u80fd\u4f1a\u51fa\u73b0 `\u7b2c x.5 \u8bdd` \u7b49\u7b49\u7684\u7279\u6b8a\u60c5\u51b5\uff0c\u6b64\u65f6\u4e00\u5b9a\u8981\u6309\u7167\u987a\u5e8f\u81ea\u884c\u8ba1\u6570\u3002\n2. \u53c2\u6570\u503c\u91cc\u4e00\u5b9a\u4e0d\u8981\u52a0\u7a7a\u683c\n3. \u53c2\u6570\u503c\u5f00\u5934\u4e3a\u7279\u6b8a\u7b26\u53f7\u65f6\u6700\u597d\u4f7f\u7528 `=` \u6765\u8fde\u63a5\u9009\u9879\u548c\u53c2\u6570\uff0c\u6216\u8005\u5c1d\u8bd5\u4f7f\u7528\u5f15\u53f7\u5305\u88f9\u53c2\u6570\n4. \u4e2a\u4eba\u7a7a\u95f4\u3001\u89c6\u9891\u5217\u8868\u3001\u6536\u85cf\u5939\u7b49\u6279\u91cf\u4e0b\u8f7d\u6682\u4e0d\u652f\u6301\u9009\u96c6\u64cd\u4f5c\n\n#### \u540c\u65f6\u4e0b\u8f7d\u9644\u52a0\u5267\u96c6\n\n- \u53c2\u6570 `-s` \u6216 `--with-section`\n- \u9ed8\u8ba4\u503c `False`\n\n#### \u6307\u5b9a\u7a3f\u4ef6\u53d1\u5e03\u65f6\u95f4\u8303\u56f4\n\n- \u53c2\u6570 `--batch-filter-start-time` \u548c `--batch-filter-end-time` \u5206\u522b\u8868\u793a`\u5f00\u59cb`\u548c`\u7ed3\u675f`\u65f6\u95f4\uff0c\u8be5\u533a\u95f4**\u5de6\u95ed\u53f3\u5f00**\n- \u9ed8\u8ba4 `\u4e0d\u9650\u5236`\n- \u652f\u6301\u7684\u683c\u5f0f\n\n - `%Y-%m-%d`\n - `%Y-%m-%d %H:%M:%S`\n\n \u4f8b\u5982\u4ec5\u4e0b\u8f7d 2020 \u5e74\u6295\u7a3f\u7684\u89c6\u9891\uff0c\u53ef\u4ee5\u8fd9\u6837:\n\n `--batch-filter-start-time=2020-01-01 --batch-filter-end-time=2021-01-01`\n\n</details>\n\n### \u914d\u7f6e\u6587\u4ef6<sup>Experimental</sup>\n\nyutto \u81ea `2.0.0-rc.3` \u8d77\u589e\u52a0\u4e86\u5b9e\u9a8c\u6027\u7684\u914d\u7f6e\u6587\u4ef6\u529f\u80fd\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7 `--config` \u9009\u9879\u6765\u6307\u5b9a\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\uff0c\u6bd4\u5982\n\n```bash\nyutto --config /path/to/config.toml <url>\n```\n\n\u5982\u679c\u4e0d\u6307\u5b9a\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\uff0cyutto \u4e5f\u652f\u6301\u914d\u7f6e\u81ea\u52a8\u53d1\u73b0\uff0c\u6839\u636e\u4f18\u5148\u7ea7\uff0c\u641c\u7d22\u8def\u5f84\u5982\u4e0b\uff1a\n\n- \u5f53\u524d\u76ee\u5f55\u4e0b\u7684 `yutto.toml`\n- \u641c\u7d22 [`XDG_CONFIG_HOME`](https://specifications.freedesktop.org/basedir-spec/latest/) \u4e0b\u7684 `yutto/yutto.toml` \u6587\u4ef6\n- \u975e Windows \u7cfb\u7edf\u4e0b\u7684 `~/.config/yutto/yutto.toml`\uff0cWindows \u7cfb\u7edf\u4e0b\u7684 `~/AppData/Roaming/yutto/yutto.toml`\n\n\u4f60\u53ef\u4ee5\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u6765\u8bbe\u7f6e\u4e00\u4e9b\u9ed8\u8ba4\u53c2\u6570\uff0c\u6574\u4f53\u4e0a\u4e0e\u547d\u4ee4\u884c\u53c2\u6570\u57fa\u672c\u4e00\u81f4\uff0c\u4e0b\u9762\u4ee5\u4e00\u4e9b\u793a\u4f8b\u6765\u5c55\u793a\u914d\u7f6e\u6587\u4ef6\u7684\u5199\u6cd5\uff1a\n\n```toml\n# yutto.toml\n#:schema https://raw.githubusercontent.com/yutto-dev/yutto/refs/heads/main/schemas/config.json\n[basic]\n# \u8bbe\u7f6e\u4e0b\u8f7d\u76ee\u5f55\ndir = \"/path/to/download\"\n# \u8bbe\u7f6e\u4e34\u65f6\u6587\u4ef6\u76ee\u5f55\ntmp_dir = \"/path/to/tmp\"\n# \u8bbe\u7f6e SESSDATA\nsessdata = \"***************\"\n# \u8bbe\u7f6e\u5927\u4f1a\u5458\u4e25\u683c\u6821\u9a8c\nvip_strict = true\n# \u8bbe\u7f6e\u767b\u5f55\u4e25\u683c\u6821\u9a8c\nlogin_strict = true\n\n[resource]\n# \u4e0d\u4e0b\u8f7d\u5b57\u5e55\nrequire_subtitle = false\n\n[danmaku]\n# \u8bbe\u7f6e\u5f39\u5e55\u901f\u5ea6\nspeed = 2.0\n# \u8bbe\u7f6e\u5f39\u5e55\u5c4f\u853d\u5173\u952e\u8bcd\nblock_keyword_patterns = [\n \".*keyword1.*\",\n \".*keyword2.*\",\n]\n\n[batch]\n# \u4e0b\u8f7d\u989d\u5916\u5267\u96c6\nwith_section = true\n```\n\n\u5982\u679c\u4f60\u4f7f\u7528 VS Code \u5bf9\u914d\u7f6e\u6587\u4ef6\u7f16\u8f91\uff0c\u5f3a\u70c8\u5efa\u8bae\u4f7f\u7528 [Even Better TOML](https://marketplace.visualstudio.com/items?itemName=tamasfe.even-better-toml) \u6269\u5c55\uff0c\u914d\u5408 yutto \u63d0\u4f9b\u7684 schema\uff0c\u53ef\u4ee5\u83b7\u5f97\u6700\u4f73\u7684\u63d0\u793a\u4f53\u9a8c\u3002\n\n## \u4ece bilili1.x \u8fc1\u79fb\n\n### \u53d6\u6d88\u7684\u529f\u80fd\n\n- `- bilibili` \u76ee\u5f55\u7684\u751f\u6210\n- \u64ad\u653e\u5217\u8868\u751f\u6210\n- \u6e90\u683c\u5f0f\u4fee\u6539\u529f\u80fd\uff08\u4e0d\u518d\u652f\u6301 flv \u6e90\u89c6\u9891\u4e0b\u8f7d\uff0c\u5982\u679c\u4ecd\u6709\u89c6\u9891\u4e0d\u652f\u6301 dash \u6e90\uff0c\u8bf7\u7ee7\u7eed\u4f7f\u7528 bilili\uff09\n- \u5bf9 Python3.8 \u7684\u652f\u6301\uff0c\u6700\u4f4e\u652f\u6301 Python3.9\n- \u4e0b\u8f7d\u524d\u8be2\u95ee\n- \u5f03\u7528\u9009\u96c6\u8bed\u6cd5\u7cd6\u5f00\u59cb\u7b26\u53f7 `^`\uff0c\u76f4\u63a5\u4f7f\u7528\u660e\u786e\u7684\u5267\u96c6\u53f7 `1` \u5373\u53ef\n\n### \u9ed8\u8ba4\u884c\u4e3a\u7684\u4fee\u6539\n\n- \u4f7f\u7528\u534f\u7a0b\u800c\u975e\u591a\u7ebf\u7a0b\u8fdb\u884c\u4e0b\u8f7d\n- \u9ed8\u8ba4\u751f\u6210\u5f39\u5e55\u4e3a ASS\n- \u9ed8\u8ba4\u542f\u7528\u4ece\u591a\u955c\u50cf\u6e90\u4e0b\u8f7d\u7684\u7279\u6027\n- \u4e0d\u4ec5\u53ef\u4ee5\u63a7\u5236\u662f\u5426\u4f7f\u7528\u7cfb\u7edf\u4ee3\u7406\uff0c\u8fd8\u80fd\u914d\u7f6e\u7279\u5b9a\u7684\u4ee3\u7406\u670d\u52a1\u5668\n\n### \u65b0\u589e\u7684\u7279\u6027\n\n- \u5355\u89c6\u9891\u4e0b\u8f7d\u4e0e\u6279\u91cf\u4e0b\u8f7d\u547d\u4ee4\u5206\u79bb\uff08`bilili` \u547d\u4ee4\u4e0e `yutto --batch` \u76f8\u7c7b\u4f3c\uff09\n- \u97f3\u9891/\u89c6\u9891\u7f16\u7801\u9009\u62e9\n- \u53ef\u9009\u4ec5\u4e0b\u8f7d\u97f3\u9891/\u89c6\u9891\n- \u5b58\u653e\u5b50\u8def\u5f84\u7684\u81ea\u7531\u5b9a\u5236\n- \u652f\u6301 url \u522b\u540d\n- \u652f\u6301\u6587\u4ef6\u5217\u8868\n- \u66f4\u591a\u7684\u6279\u4e0b\u8f7d\u652f\u6301\uff08\u73b0\u5df2\u652f\u6301 UP \u4e3b\u5168\u90e8\u6295\u7a3f\u89c6\u9891\u3001\u89c6\u9891\u5408\u96c6\u3001\u6536\u85cf\u5939\u7b49\uff09\n- \u66f4\u52a0\u5b8c\u5584\u7684 warning \u4e0e error \u63d0\u793a\n- \u652f\u6301\u4ec5\u8f93\u5165 id \u5373\u53ef\u4e0b\u8f7d\uff08aid\u3001bvid\u3001episode_id \u7b49\uff09\n- \u652f\u6301\u63cf\u8ff0\u6587\u4ef6\u751f\u6210\n- \u5c06\u94fe\u63a5\u89e3\u6790\u5ef6\u8fdf\u5230\u4e0b\u8f7d\u524d\u4e00\u523b\uff0c\u907f\u514d\u77ed\u65f6\u95f4\u5927\u91cf\u8bf7\u6c42\u5bfc\u81f4 IP \u88ab\u5c01\u7684\u95ee\u9898\n\n## \u5c0f\u6280\u5de7\n\n### \u4f5c\u4e3a log \u8f93\u51fa\u5230\u6587\u4ef6\n\n\u867d\u8bf4 yutto \u4e0d\u50cf bilili \u90a3\u6837\u4f1a\u5168\u5c4f\u5237\u65b0\uff0c\u4f46\u8fdb\u5ea6\u6761\u8fd8\u662f\u4f1a\u4e00\u76f4\u5237\u65b0\u5360\u636e\u591a\u884c\uff0c\u53ef\u80fd\u5f71\u54cd log \u7684\u9605\u8bfb\uff0c\u53e6\u5916\u989c\u8272\u7801\u4e5f\u662f\u96be\u4ee5\u9605\u8bfb\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u9009\u9879\u7981\u7528\u4ed6\u4eec\uff1a\n\n```bash\nyutto --no-color --no-progress <url> > log\n```\n\n### \u4f7f\u7528\u914d\u7f6e\u81ea\u5b9a\u4e49\u9ed8\u8ba4\u53c2\u6570\n\n\u5982\u679c\u4f60\u5e0c\u671b\u4fee\u6539 yutto \u7684\u90e8\u5206\u53c2\u6570\uff0c\u90a3\u4e48\u53ef\u80fd\u6bcf\u6b21\u8fd0\u884c\u90fd\u9700\u8981\u5728\u540e\u9762\u52a0\u4e0a\u957f\u957f\u4e00\u4e32\u9009\u9879\uff0c\u4e3a\u4e86\u907f\u514d\u8fd9\u4e2a\u95ee\u9898\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\n\n```toml\n# ~/.config/yutto/yutto.toml\n#:schema https://raw.githubusercontent.com/yutto-dev/yutto/refs/heads/main/schemas/config.json\n[basic]\ndir = \"~/Movies/yutto\"\nsessdata = \"***************\"\nnum_workers = 16\nvcodec = \"av1:copy\"\n```\n\n\u5f53\u7136\uff0c\u8bf7\u624b\u52a8\u4fee\u6539 `sessdata` \u5185\u5bb9\u4e3a\u81ea\u5df1\u7684 `SESSDATA` \u54e6\uff5e\n\n> [!TIP]\n>\n> \u672c\u65b9\u6848\u53ef\u66ff\u4ee3\u539f\u6709\u7684\u300c\u81ea\u5b9a\u4e49\u547d\u4ee4\u522b\u540d\u300d\u65b9\u5f0f\uff5e\n>\n> <details>\n> <summary>\u539f\u300c\u81ea\u5b9a\u4e49\u547d\u4ee4\u522b\u540d\u300d\u65b9\u6848</summary>\n>\n> \u5728 `~/.zshrc` / `~/.bashrc` \u4e2d\u81ea\u5b9a\u4e49\u4e00\u6761 alias\uff0c\u50cf\u8fd9\u6837\n>\n> ```bash\n> alias ytt='yutto -d ~/Movies/yutto/ -c `cat ~/.sessdata` -n 16 --vcodec=\"av1:copy\"'\n> ```\n>\n> \u8fd9\u6837\u6211\u6bcf\u6b21\u53ea\u9700\u8981 `ytt <url>` \u5c31\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u8fd9\u4e9b\u53c2\u6570\u8fdb\u884c\u4e0b\u8f7d\u5566\uff5e\n>\n> \u7531\u4e8e\u6211\u63d0\u524d\u5728 `~/.sessdata` \u5b58\u50a8\u4e86\u6211\u7684 `SESSDATA`\uff0c\u6240\u4ee5\u907f\u514d\u6bcf\u6b21\u90fd\u8981\u624b\u52a8\u8f93\u5165 cookie \u7684\u95ee\u9898\u3002\n>\n> </details>\n\n### \u4f7f\u7528 url alias\n\nyutto \u65b0\u589e\u7684 url alias \u53ef\u4ee5\u8ba9\u4f60\u4e0b\u8f7d\u6b63\u5728\u8ffd\u7684\u756a\u5267\u65f6\u4e0d\u5fc5\u6bcf\u6b21\u90fd\u6253\u5f00\u6d4f\u89c8\u5668\u590d\u5236 url\uff0c\u53ea\u9700\u8981\u5c06\u8ffd\u756a\u5217\u8868\u5b58\u50a8\u5728\u4e00\u4e2a\u6587\u4ef6\u4e2d\uff0c\u5e76\u4e3a\u8fd9\u4e9b url \u8d77\u4e00\u4e2a\u522b\u540d\u5373\u53ef\n\n```\ntensura-nikki=https://www.bilibili.com/bangumi/play/ss38221/\n```\n\n\u4e4b\u540e\u4e0b\u8f7d\u6700\u65b0\u8bdd\u53ea\u9700\u8981\n\n```\nyutto --batch tensura-nikki --alias-file=/path/to/alias-file\n```\n\n\u4f60\u540c\u6837\u53ef\u4ee5\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u6765\u5b9e\u73b0\u8fd9\u4e00\u70b9\uff08\u63a8\u8350\uff09\n\n```toml\n# ~/.config/yutto/yutto.toml\n#:schema https://raw.githubusercontent.com/yutto-dev/yutto/refs/heads/main/schemas/config.json\n[basic.aliases]\ntensura-nikki = \"https://www.bilibili.com/bangumi/play/ss38221/\"\n```\n\n### \u4f7f\u7528\u4efb\u52a1\u5217\u8868\n\n\u73b0\u5728 url \u4e0d\u4ec5\u652f\u6301 http/https \u94fe\u63a5\u4e0e\u88f8 id\uff0c\u8fd8\u652f\u6301\u4f7f\u7528\u6587\u4ef6\u8def\u5f84\u4e0e file scheme \u6765\u7528\u4e8e\u8868\u793a\u6587\u4ef6\u5217\u8868\uff0c\u6587\u4ef6\u5217\u8868\u4ee5\u884c\u5206\u9694\uff0c\u6bcf\u884c\u5199\u4e00\u6b21\u547d\u4ee4\u7684\u53c2\u6570\uff0c\u8be5\u53c2\u6570\u4f1a\u8986\u76d6\u6389\u4e3b\u7a0b\u5e8f\u4e2d\u6240\u4f7f\u7528\u7684\u53c2\u6570\uff0c\u793a\u4f8b\u5982\u4e0b\uff1a\n\n\u9996\u5148\u5c06\u4e0b\u9762\u7684\u6587\u4ef6\u5b58\u50a8\u5230\u4e00\u4e2a\u5730\u65b9\n\n```\nhttps://www.bilibili.com/bangumi/play/ss38221/ --batch -p $\nhttps://www.bilibili.com/bangumi/play/ss38260/ --batch -p $\n```\n\n\u7136\u540e\u8fd0\u884c\n\n```\nyutto file:///path/to/list\n```\n\n\u5373\u53ef\u5206\u522b\u4e0b\u8f7d\u8fd9\u4e24\u4e2a\u756a\u5267\u7684\u6700\u65b0\u4e00\u8bdd\n\n\u6216\u8005\u76f4\u63a5\u4f7f\u7528\u76f8\u5bf9\u6216\u8005\u7edd\u5bf9\u8def\u5f84\u4e5f\u662f\u53ef\u4ee5\u7684\n\n```\nyutto ./path/to/list\n```\n\n\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u5728\u6587\u4ef6\u5217\u8868\u5404\u9879\u91cc\u7684\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u547d\u4ee4\u91cc\u7684\u4f18\u5148\u7ea7\u7684\uff0c\u6bd4\u5982\u6587\u4ef6\u4e2d\u4f7f\u7528\uff1a\n\n```\ntensura1 --batch -p $ --no-danmaku --vcodec=\"hevc:copy\"\ntensura2 --batch -p $\n```\n\n\u800c\u547d\u4ee4\u4e2d\u5219\u4f7f\u7528\n\n```\nyutto file:///path/to/list --vcodec=\"avc:copy\"\n```\n\n\u6700\u7ec8\u4e0b\u8f7d\u7684 tensura1 \u4f1a\u662f \"hevc:copy\"\uff0c\u800c tensura2 \u5219\u4f1a\u662f \"avc:copy\"\n\n\u53e6\u5916\uff0c\u6587\u4ef6\u5217\u8868\u4e5f\u662f\u652f\u6301 alias \u7684\uff0c\u4f60\u5b8c\u5168\u53ef\u4ee5\u4e3a\u8be5\u5217\u8868\u8d77\u4e00\u4e2a\u522b\u540d\uff0c\u4e00\u4e2a\u6bd4\u8f83\u7279\u522b\u7684\u7528\u4f8b\u662f\u5c06\u4f60\u6240\u6709\u8ffd\u756a\u7684\u5185\u5bb9\u653e\u5728\u4e00\u4e2a\u6587\u4ef6\u91cc\uff0c\u7136\u540e\u4e3a\u8be5\u6587\u4ef6\u8d77\u4e00\u4e2a\u522b\u540d\uff08\u6bd4\u5982 `subscription`\uff09\uff0c\u8fd9\u6837\u53ea\u9700\u8981 `yutto subscription --alias-file path/to/alias/file` \u5c31\u53ef\u4ee5\u8fbe\u5230\u8ffd\u756a\u6548\u679c\u5566\uff5e\n\n\u6700\u540e\uff0c\u5217\u8868\u4e5f\u662f\u652f\u6301\u5d4c\u5957\u7684\u54e6\uff08\u867d\u7136\u6ca1\u4ec0\u4e48\u7528 2333\uff09\n\n## FAQ\n\n### \u540d\u5b57\u7684\u7531\u6765\n\n[\u300a\u8ee2\u30b9\u30e9\u65e5\u8a18\u300b\u7b2c\u4e00\u8bdd 00:24](https://www.bilibili.com/bangumi/play/ep395211?t=24)\n\n### \u4f55\u8c13\u300c\u4efb\u6027\u300d\uff1f\n\nyutto \u6dfb\u52a0\u4efb\u4f55\u7279\u6027\u90fd\u9700\u8981\u4ee5\u4fdd\u8bc1\u53ef\u7ef4\u62a4\u6027\u4e3a\u524d\u63d0\uff0c\u56e0\u6b64 yutto \u4e0d\u4f1a\u6dfb\u52a0\u8fc7\u4e8e\u590d\u6742\u7684\u7279\u6027\uff0c\u53ea\u9700\u8981\u6ee1\u8db3\u591f\u7528\u5373\u53ef\u3002\n\n### yutto \u4f1a\u66ff\u4ee3 bilili \u5417\n\nyutto \u81ea\u8bde\u751f\u4ee5\u6765\u5df2\u7ecf\u8fc7\u53bb\u4e09\u5e74\u591a\u4e86\uff0c\u529f\u80fd\u4e0a\u57fa\u672c\u53ef\u4ee5\u66ff\u4ee3 bilili \u4e86\uff0c\u7531\u4e8e B \u7ad9\u63a5\u53e3\u7684\u4e0d\u65ad\u53d8\u5316\uff0cbilili \u4e5f\u4e0d\u518d\u9002\u7528\u4e8e\u73b0\u5728\u7684\u73af\u5883\uff0c\u56e0\u6b64\u8bf7 bilili \u7528\u6237\u5c3d\u5feb\u8fc1\u79fb\u5230 yutto \uff5e\n\n### \u6b63\u5f0f\u7248\u4ec0\u4e48\u65f6\u5019\u53d1\u5e03\n\n\u5feb\u4e86\u2026\u2026\u5427\uff1f\n\n## \u5176\u4ed6\u5e94\u7528\n\n\u4f60\u4e5f\u53ef\u4ee5\u901a\u8fc7\u8fd9\u4e9b\u5e94\u7528\u6765\u4f7f\u7528 yutto\n\n- [KubeSpider](https://github.com/opennaslab/kubespider): \u4e00\u4e2a\u591a\u529f\u80fd\u5168\u5c40\u8d44\u6e90\u7f16\u6392\u4e0b\u8f7d\u7cfb\u7edf\uff0c\u652f\u6301\u4e0b\u8f7d\u3001\u8ba2\u9605\u5404\u7c7b\u8d44\u6e90\u7f51\u7ad9\uff5e\n\n## Roadmap\n\n### 2.0.0-rc\n\n- [x] feat: \u6295\u7a3f\u89c6\u9891\u63cf\u8ff0\u6587\u4ef6\u652f\u6301\n- [x] refactor: \u6574\u7406\u8def\u5f84\u53d8\u91cf\u540d\n- [x] feat: \u89c6\u9891\u5408\u96c6\u9009\u96c6\u652f\u6301\uff08\u5408\u96c6\u8c8c\u4f3c\u6709\u53d6\u4ee3\u5206 p \u7684\u8d8b\u52bf\uff0c\u9700\u8981\u5bf9\u5176\u8fdb\u884c\u5408\u9002\u7684\u5904\u7406\uff09\n- [x] refactor: \u91cd\u5199 biliass\n\n### 2.0.0\n\n- [x] feat: \u652f\u6301\u5f39\u5e55\u5b57\u4f53\u3001\u5b57\u53f7\u3001\u901f\u5ea6\u7b49\u8bbe\u7f6e\n- [x] feat: \u914d\u7f6e\u6587\u4ef6\u652f\u6301\n- [x] feat: \u914d\u7f6e\u6587\u4ef6\u529f\u80fd\u4f18\u5316\uff0c\u652f\u6301\u81ea\u5b9a\u4e49\u914d\u7f6e\u8def\u5f84\n- [ ] docs: issue template \u6dfb\u52a0\u914d\u7f6e\u5f15\u5bfc\n- [x] docs: \u4f18\u5316 biliass rust \u91cd\u6784\u540e\u7684\u8d21\u732e\u6307\u5357\n- [ ] feat: \u65b0\u7684\u57fa\u4e8e toml \u7684\u4efb\u52a1\u5217\u8868\n- [ ] refactor: \u914d\u7f6e\u53c2\u6570\u590d\u7528 pydantic \u9a8c\u8bc1\n- [ ] docs: \u53ef\u7231\u7684\u9759\u6001\u6587\u6863\uff08WIP in [#86](https://github.com/yutto-dev/yutto/pull/86)\uff09\n\n### future\n\n- [ ] refactor: \u9488\u5bf9\u89c6\u9891\u5408\u96c6\u4f18\u5316\u8def\u5f84\u53d8\u91cf\n- [ ] refactor: \u4f18\u5316\u675c\u6bd4\u89c6\u754c/\u97f3\u6548/\u5168\u666f\u58f0\u9009\u53d6\u903b\u8f91\uff08Discussing in [#62](https://github.com/yutto-dev/yutto/discussions/62)\uff09\n- [ ] refactor: \u76f4\u63a5\u4f7f\u7528 rich \u66ff\u4ee3\u5185\u7f6e\u7684\u7ec8\u7aef\u663e\u793a\u6a21\u5757\n- [ ] feat: \u66f4\u591a\u6279\u4e0b\u8f7d\u652f\u6301\n- [ ] feat: \u4ee5\u53ca\u66f4\u52a0\u53ef\u7231\uff5e\n\n## \u53c2\u8003\n\n- \u57fa\u672c\u7ed3\u6784\uff1a<https://github.com/yutto-dev/bilili>\n- \u534f\u7a0b\u4e0b\u8f7d\uff1a<https://github.com/changmenseng/AsyncBilibiliDownloader>\n- \u5f39\u5e55\u8f6c\u6362\uff1a<https://github.com/yutto-dev/yutto/tree/main/packages/biliass>\n- \u6837\u5f0f\u8bbe\u8ba1\uff1a<https://github.com/willmcgugan/rich>\n\n## \u53c2\u4e0e\u8d21\u732e\n\n\u8bf7\u9605\u8bfb [CONTRIBUTING.md](CONTRIBUTING.md)\n",
"bugtrack_url": null,
"license": "GPL-3.0",
"summary": "\ud83e\uddca \u4e00\u4e2a\u53ef\u7231\u4e14\u4efb\u6027\u7684 B \u7ad9\u89c6\u9891\u4e0b\u8f7d\u5668",
"version": "2.0.0rc6",
"project_urls": {
"Documentation": "https://github.com/yutto-dev/yutto",
"Homepage": "https://github.com/yutto-dev/yutto",
"Issues": "https://github.com/yutto-dev/yutto/issues",
"Repository": "https://github.com/yutto-dev/yutto"
},
"split_keywords": [
"bilibili",
" danmaku",
" downloader",
" python",
" video"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "2a5fa8bd4682e52532cd4c46d5b3d31a737aeabacb4f3a0fedcdd41d3109c78c",
"md5": "2e65bdff848461c3fde053ba9c578d50",
"sha256": "aa616bca43f098e1ee5c13e2969d86bf8cef25355ce059ed0a6a1df101552ece"
},
"downloads": -1,
"filename": "yutto-2.0.0rc6-py3-none-any.whl",
"has_sig": false,
"md5_digest": "2e65bdff848461c3fde053ba9c578d50",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 112222,
"upload_time": "2024-12-14T15:38:52",
"upload_time_iso_8601": "2024-12-14T15:38:52.505583Z",
"url": "https://files.pythonhosted.org/packages/2a/5f/a8bd4682e52532cd4c46d5b3d31a737aeabacb4f3a0fedcdd41d3109c78c/yutto-2.0.0rc6-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "70cb10388d8e3c1f0fa67bc06d5f8ff45ae43ae85cd15de10c4c62c7b2a6c9a2",
"md5": "1ca8e6e8b54f2c0cdf57a5cfc8900796",
"sha256": "33667790ffff5d0c43227b8a3d4b100c51caeaa2afb2ce848a96bad59b4a8777"
},
"downloads": -1,
"filename": "yutto-2.0.0rc6.tar.gz",
"has_sig": false,
"md5_digest": "1ca8e6e8b54f2c0cdf57a5cfc8900796",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 181507,
"upload_time": "2024-12-14T15:38:55",
"upload_time_iso_8601": "2024-12-14T15:38:55.554361Z",
"url": "https://files.pythonhosted.org/packages/70/cb/10388d8e3c1f0fa67bc06d5f8ff45ae43ae85cd15de10c4c62c7b2a6c9a2/yutto-2.0.0rc6.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-12-14 15:38:55",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "yutto-dev",
"github_project": "yutto",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "yutto"
}