yutto


Nameyutto JSON
Version 2.0.0rc6 PyPI version JSON
download
home_pageNone
Summary🧊 一个可爱且任性的 B 站视频下载器
upload_time2024-12-14 15:38:55
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseGPL-3.0
keywords bilibili danmaku downloader python video
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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"
}
        
Elapsed time: 0.45069s