--- url: /guide/quick-start.md --- # 快速开始 嗨~你好呀~这里是 yutto,一个可爱的命令行驱动的 B 站视频下载工具~ 我的工作方式非常简单快捷,你只需要提供给我 B 站的链接,我就可以帮你下载好视频啦~就像这样: 下面我将会从安装开始介绍我的使用方式~ ## 环境配置 ::: tip 注意 如果你使用 Homebrew、yay/paru/pacman、Docker 等可以自动帮助你配置环境的方式来安装,此部分内容可以跳过~ ::: ### Python 解释器安装 你可能会好奇,我是怎么指挥你的设备来帮助你下载想要的视频的,其实这很大程度归功于 Python 前辈的帮忙,有了 TA,我才能和你的设备正常沟通。不过有一点需要注意的就是,必须要 3.11 以上版本的 Python 前辈才可以哦,不然可能 TA 也听不懂我的一些「方言」呢~ 如果你是 Windows,请自行去 [Python 官网](https://www.python.org/)下载并安装,安装时记得要勾选「Add to PATH」选项,不然可能需要你手动添加到环境变量。 macOS 及 Linux 发行版一般都自带 Python 环境,但要注意版本。 安装完成后可以通过 `python --version` 来确定是否正确安装,当然这里仍然需要再次注意一下版本号~ ### FFmpeg 下载与配置 由于 B 站视频是需要混流合并的,因此我的正常运作离不开 FFmpeg 前辈的帮助,因此你需要事先将 TA 正确安装在你的设备上~ 如果你所使用的操作系统是 Windows,操作有些些麻烦,你需要[手动下载](https://ffmpeg.org/download.html)后,并将可执行文件所在路径设置到到你的环境变量中~ ::: details 详细操作 打开下载链接后,在 「Get packages & executable files」 部分选择 Windows 徽标,在 「Windows EXE Files」 下找到 「Windows builds by BtbN」 并点击,会跳转到一个 GitHub Releases 页面,在 「Latest release」 里就能看到最新的构建版本了~ 下载后解压,并随便放到一个安全的地方,然后在文件夹中找到 `ffmpeg.exe`,复制其所在文件夹路径。 右击「此电脑」,选择属性,在其中找到「高级系统设置」 → 「环境变量」,双击 PATH,在其中添加刚刚复制的路径(非 Win10 系统操作略有差异,请自行查阅「环境变量设置」的方法)。 保存保存,完事啦~~~ ::: 当然,如果你使用的是 macOS 或者 Linux 发行版的话,直接使用自己的包管理器就能一键完成该过程。 :::: details 示例 这里给出一些示例,不会一一列举,其它的大家可以自行搜索下~ ::: code-group ```bash [macOS] brew install ffmpeg ``` ```bash [Ubuntu] apt install ffmpeg ``` ```bash [Arch] pacman -S ffmpeg ``` ::: :::: 此时,你可以尝试在终端上使用 `ffmpeg -version` 命令来测试下安装是否正确,只要显示的不是 `Command not found` 之类的提示就说明成功啦~ ## 召唤 yutto 当当当,是时候主角登场啦~不过在此之前仍然需要学习一点小小的咒语~ 你可以通过以下几种方式中的任意一种来召唤(安装)我,我随叫随到~ ### 包管理器一键安装啦 我目前可以通过一些包管理器直接安装~这是最简单快捷的安装方式~ 使用 Homebrew 的小伙伴可以尝试下下面的命令: ```bash brew tap siguremo/tap brew install yutto ``` Arch Linux 用户可以从 [AUR](https://aur.archlinux.org/packages/yutto)(感谢 @ouuan)或 [archlinuxcn](https://github.com/archlinuxcn/repo) 安装: ```bash # 从 AUR 安装 yay -S yutto # 适用于 yay 用户 paru -S yutto # 适用于 paru 用户 # 或者从 archlinuxcn 安装 sudo pacman -S yutto ``` ### 使用 Docker 你也可以尝试使用 docker 直接运行(运行时的更多参数需要参考下后面的内容~) ```bash docker run --rm -it -v /path/to/download:/app siguremo/yutto [options] ``` 与直接本机运行不同的是,这里的下载目标路径是通过 `-v :/app` 指定的,也就是说 docker 内的我会将内容下载到 docker 里的 `/app` 目录下,与之相对应的挂载点 `` 就是下载路径。你也可以直接挂载到 `$(pwd)`,此时就和本机运行我的默认行为一致啦,也是下载到当前目录下~ ### pip/pipx/uv 安装 需自行配置环境 我的所有版本均已上传到 PyPI,因此你当然可以通过 pip 来安装啦~ ```bash pip install yutto ``` 当然,你也可以通过 [pipx](https://github.com/pypa/pipx)/[uv](https://github.com/astral-sh/uv) 来安装(当然,前提是你要自己先安装 TA 们) ```bash pipx install yutto # 使用 pipx uv tool install yutto # 或者使用 uv ``` pipx/uv 会类似 Homebrew 无感地为我创建一个独立的虚拟环境,与其余环境隔离开,避免污染 pip 的环境,因此相对于 pip,pipx/uv 是更推荐的安装方式(uv 会比 pipx 更快些~)。 ### 体验 main 分支最新特性 需自行配置环境 有些时候有一些在 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 ``` ## yutto 一下~ 嗯,跟随上面的指引后我应当可以正常工作啦,那么现在,请为我分配任务吧~ ```bash yutto ``` 没错,为我分配任务的方式就是这么简单~ 不过值得注意的是这样只可以下载单个视频,如果有批量下载需求的话请添加 `-b/--batch` 参数: ```bash yutto --batch # 或者使用其短参数 yutto -b ``` 此时我会认为该 url 是一个批量下载链接,会从其中解析出多个视频链接出来进行下载。 下面举例说明一下: 这里的 `` 是 [《転スラ日記》](https://www.bilibili.com/bangumi/play/ep395211) 第一话链接,那么如果你只想下载该话的话只需要运行: ```bash yutto https://www.bilibili.com/bangumi/play/ep395211 ``` 或者如果你想要该番剧全集,请运行: ```bash yutto -b https://www.bilibili.com/bangumi/play/ep395211 ``` ## 下一步 很好,到此为止你已经了解如何让我来帮你下载视频啦~ 不过你可能会有一些问题,比如: * 为什么下载的视频不够清晰?我在线看的视频明明至少都有 1080P 的呀 * 为什么需要这么冗长的 url 才能下载视频?是否有更简洁的方式? 这里先简单卖个关子,因为这些答案你都可以在后续内容中找到,这才刚刚开始呢~ 这里给出一些推荐内容,你可以尝试: * 如果你希望了解我具体都支持哪些链接,可以尝试前往 [支持的链接](./supported-links) 查看 * 如果你希望了解我的进阶用法,可以尝试前往 [命令行参数](./cli/introduction) 查看 --- --- url: /guide/supported-links.md --- # 支持的链接 本页面主要介绍了我所支持的链接类型,即 `yutto ` 中的 `` 具体可以是哪些值。 ## 一表速览 | 类型 | 是否支持选集 | 示例链接 | 默认路径模板 | | - | - | - | - | | 投稿视频 | - | `https://www.bilibili.com/video/BV1vZ4y1M7mQ/` `https://www.bilibili.com/video/av371660125/` `https://www.bilibili.com/video/BV1vZ4y1M7mQ?p=1` `av371660125` `BV1vZ4y1M7mQ` | `{title}` | | 投稿视频 批量 | :white\_check\_mark: | `https://www.bilibili.com/video/BV1vZ4y1M7mQ/` `https://www.bilibili.com/video/av371660125/` `av371660125` `BV1vZ4y1M7mQ` | `{title}/{name}` | | 番剧 | - | `https://www.bilibili.com/bangumi/play/ep395211` `ep395211` | `{name}` | | 番剧 批量 | :white\_check\_mark: | `https://www.bilibili.com/bangumi/play/ep395211` `https://www.bilibili.com/bangumi/play/ss38221` `https://www.bilibili.com/bangumi/media/md28233903` `ep395211` `ss38221` `md28233903` | `{title}/{name}` | | 课程 | - | `https://www.bilibili.com/cheese/play/ep6902` | `{name}` | | 课程 批量 | :white\_check\_mark: | `https://www.bilibili.com/cheese/play/ep6902` `https://www.bilibili.com/cheese/play/ss298` | `{title}/{name}` | | 用户指定收藏夹 批量 | :x: | `https://space.bilibili.com/100969474/favlist?fid=1306978874&ftype=create` | `{username}的收藏夹/{series_title}/{title}/{name}` | | 当前用户稍后再看 批量 | :x: | `https://www.bilibili.com/watchlater` `https://www.bilibili.com/list/watchlater` | `稍后再看/{title}/{name}` | | 用户全部收藏夹 批量 | :x: | `https://space.bilibili.com/100969474/favlist` | `{username}的收藏夹/{series_title}/{title}/{name}` | | UP 主个人空间 批量 | :x: | `https://space.bilibili.com/100969474/video` | `{username}的全部投稿视频/{title}/{name}` | | 合集 批量 | :white\_check\_mark: | `https://space.bilibili.com/3546619314178489/lists?sid=3221717?type=season` `https://space.bilibili.com/100969474/favlist?fid=3221717&ftype=collect&ctype=21` | `{series_title}/{title}` | | 视频列表 批量 | :x: | `https://space.bilibili.com/100969474/lists/1947439?type=series` `https://www.bilibili.com/list/100969474?sid=1947439` | `{series_title}/{title}/{name}` | 本表格展示了我所支持的所有类型的链接,以及最终下载的文件结构。 值得注意的是,这里标记「批量」的视频都必须通过 `-b/--batch` 参数来下载,否则会按照单个视频来解析下载。 ::: tip 其他链接 此外只要最终会重定向到我所支持的链接我都可以解析,比如以 `https://b23.tv/` 开头的短链接和 SEO 页面链接。 ::: ## 投稿视频 ### 投稿视频单 P 对于投稿视频,AV 号、BV 号的链接我都会支持,对于没有 `?p=n` 选集参数的页面,默认会认为是第一话。 ```bash yutto https://www.bilibili.com/video/BV1vZ4y1M7mQ/ yutto https://www.bilibili.com/video/av371660125/ yutto "https://www.bilibili.com/video/BV1vZ4y1M7mQ/?p=1" ``` 另外,我还支持直接使用 AV 号和 BV 号作为视频链接的唯一标识符。 ```bash yutto BV1vZ4y1M7mQ yutto av371660125 yutto "BV1vZ4y1M7mQ?p=1" ``` ### 投稿视频全集 与投稿视频单集相同,这同样支持 AV 号和 BV 号的链接,但 `?p=n` 的选集参数在此时是无效的,我会认为这只是一个入口链接,而你既然指定了要批量下载,那么我会解析该投稿视频的全集。如果你仍然想要指定下载剧集,请参考选集参数 `-p/--episodes`。 ```bash yutto -b https://www.bilibili.com/video/BV1vZ4y1M7mQ/ yutto -b https://www.bilibili.com/video/av371660125/ yutto -b BV1vZ4y1M7mQ yutto -b av371660125 yutto -b "BV1vZ4y1M7mQ?p=2" # 仍然会下载全集 yutto -b BV1vZ4y1M7mQ -p 2 # 这样才会只下载第二话 ``` ## 番剧 ### 番剧单话 番剧的话,我主要支持三种入口链接,分别是能够代表单话唯一标识符的 EP 号链接、代表整季番剧的 MD 号和 SS 号。 对于单话下载来说,MD 号和 SS 号均无法定位到具体某一话,因此单话下载不支持 MD 号和 SS 号,仅支持 EP 号。 ```bash yutto https://www.bilibili.com/bangumi/play/ep395211 yutto ep395211 ``` ### 番剧全集 对于番剧全集来说,MD 号、SS 号、EP 号均可以定位到这个番剧,因此是都支持的。 ```bash yutto -b https://www.bilibili.com/bangumi/play/ep395211 yutto -b https://www.bilibili.com/bangumi/play/ss38221 yutto -b https://www.bilibili.com/bangumi/media/md28233903 yutto -b ep395211 yutto -b ss38221 yutto -b md28233903 ``` 当然,如果需要选集请使用 `-p/--episodes` 参数。 ```bash yutto -b md28233903 -p 2 ``` ## 课程 ### 课程单集 课程的链接是以 `cheese` 开头的,与番剧非常类似,课程也是支持 EP 号的。 ```bash yutto https://www.bilibili.com/cheese/play/ep6902 ``` 注意,课程并不支持直接使用 EP 号作为唯一标识符哦,因为这会和番剧混淆。 ### 课程全集 课程全集的下载方式也和番剧很类似,你可以使用 EP 号或者 SS 号来下载。 ```bash yutto -b https://www.bilibili.com/cheese/play/ep6902 yutto -b https://www.bilibili.com/cheese/play/ss298 ``` 同样,你不可以直接使用 EP 号和 SS 号作为唯一标识符来下载以免混淆。 ## 用户个人空间 ::: warning ⚠️ 注意 请注意公开性,比如在未登录的情况下,未公开的收藏夹是无法下载的,这可以在 `个人中心` -> `设置` 中进行调节。 ::: ### 用户全部投稿视频 如果需要下载全部投稿,只需要 `个人中心` -> `投稿` 页面链接即可。 ```bash yutto -b https://space.bilibili.com/100969474/video ``` ### 用户全部收藏夹 如果需要下载全部收藏夹,只需要 `个人中心` -> `收藏` 页面链接即可。 ```bash yutto -b https://space.bilibili.com/100969474/favlist ``` ::: warning ⚠️ 注意 用户收藏夹往往非常庞大,解析时很容易触发反爬机制。如遇该问题请稍等片刻后重试。(emmm,如果视频太多的话还是建议逐个收藏夹下载……) ::: ### 指定收藏夹 对于指定收藏夹,自然就是在收藏页面再次点击具体收藏夹名称后的页面。 ```bash yutto -b "https://space.bilibili.com/100969474/favlist?fid=1306978874" ``` ### 当前用户稍后再看 稍后再看的页面链接也是支持的。 ```bash yutto -b https://www.bilibili.com/watchlater ``` 当然,由于你无权访问其他用户的稍后再看,这里只支持当前用户的稍后再看下载。另一方面,这强依赖于你的登录状态,如果你处于未登录状态,那么我当然也是无法获取到你的稍后再看列表的哦~ ### 合集和列表 与其他的相同,你可以在 `个人中心` -> `合集`(旧版页面为 `合集和列表`) 进入具体列表获取对应合集/列表的链接。 ```bash # 合集 yutto -b "https://space.bilibili.com/3546619314178489/lists?sid=3221717?type=season" # 列表 yutto -b "https://space.bilibili.com/100969474/lists/1947439?type=series" ``` 另外,视频列表的播放页面也可以唯一定位该视频列表 ```bash yutto -b "https://www.bilibili.com/list/100969474?sid=1947439" ``` ## 任务列表 如果你需要一次开启多个任务,可以试试将任务列表写在一个文件中,每行列出一个任务的参数。 ```text https://www.bilibili.com/bangumi/play/ss38221/ --batch -p $ https://www.bilibili.com/bangumi/play/ss38260/ --batch -p $ ``` 然后运行 ```bash yutto file:///path/to/list ``` 即可分别下载这两个番剧的最新一话。 我会将这样的 file scheme 链接视为一个任务列表进行解析,为了方便使用,直接使用相对或者绝对路径也是可以的 ```bash yutto ./path/to/list ``` 值得注意的是,在文件列表各项里的参数优先级是高于命令里的优先级的,比如文件中使用: ```text rimuru1 --batch -p $ --no-danmaku --vcodec="hevc:copy" rimuru2 --batch -p $ ``` 而命令中则使用 ```text yutto file:///path/to/list --vcodec="avc:copy" ``` 最终下载的 `rimuru1` 会是 `"hevc:copy"`,而 `rimuru2` 则会是 `"avc:copy"` 另外说一点,列表也是支持嵌套的哦(虽然没什么用 2333) ## 配置别名 除去使用以上所示的链接,你可以通过配置别名来避免每次下载都去视频页面找链接。 比如你可以为《転スラ日記》起一个别名 `rimuru-nikki`,我们将其存在一个文件中 `~/yutto-aliases` ```text rimuru-nikki=https://www.bilibili.com/bangumi/play/ss38221/ ``` 之后下载最新话只需要 ```bash yutto -b rimuru-nikki --alias-file=~/yutto-aliases ``` 当然,文件列表也是支持 alias 的,你完全可以为你的常用列表起一个别名,一个比较特别的用例是将你所有追番的内容放在一个文件里,然后为该文件起一个别名(比如 `subscription`),这样只需要 `yutto subscription --alias-file path/to/alias/file` 就可以达到追番效果啦~ --- --- url: /guide/cli/introduction.md --- # 命令行参数 既然我是基于 CLI(Command Line Interface)的工具,那么自然而然,我支持很多命令行参数来让你更好地调度我。 就比如说,你可以添加 `-d` 参数来指定下载的视频路径,或者使用 `--auth` 参数来设置用于登录状态的 Cookie。 ## 参数的使用方式 如果你是第一次接触命令行,那么你可能会对这些参数的使用方式感到困惑。 不过,不用担心,我会在这里为你详细地介绍一下。 ### 指定参数值 比如你需要修改下载路径到 `/path/to/videos`,只需要 ```bash yutto --dir /path/to/videos # 或者使用短参数 -d yutto -d /path/to/videos # 你也可以使用 = 将参数 key 和 value 连接在一起 yutto -d=/path/to/videos yutto --dir=/path/to/videos ``` ### 切换 `True` or `False` 对于那些不需要指定具体值,只切换 `True` or `False` 的参数,你也不需要在命令中指定值,比如开启强制覆盖已下载视频选项 ```bash yutto --overwrite # 或者 yutto -w ``` ### 多参数同时使用 当然,同时使用多个参数也是允许的,只需要写在一起即可,而且 `` 和其它参数都不强制要求顺序,比如下面这些命令都是合法的 ```bash yutto --overwrite --dir=/path/to/videos yutto --overwrite -d /path/to/videos yutto -w --d=/path/to/videos ``` ## 更多参数 当然,这些只是冰山一角啦,我支持的参数远不止这些,你可以通过 `yutto --help` 来查看所有支持的参数。也可以前往以下页面查看具体介绍: * [基础参数](./basic) * [个人信息认证参数](./auth) * [资源选择参数](./resource) * [弹幕设置参数](./danmaku) * [批量下载参数](./batch) ## 配置文件 当你熟悉 CLI 界面后,可能每次下载视频的时候都需要输入一长串的参数,你可能会希望有一种方式来保存常用的参数,下次下载时直接使用,这时候配置文件就派上用场啦~ 你可以通过 `--config` 参数来指定配置文件的路径,比如 ```bash yutto --config /path/to/config.toml ``` 我还支持配置自动发现,也就是说,如果不指定配置文件路径,我也会自动去以下路径查找配置文件的: * 当前目录下的 `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" # 设置大会员严格校验 vip_strict = true # 设置登录严格校验 login_strict = true [auth] # 推荐的认证信息写法(inline cookie) auth = "SESSDATA=***************; bili_jct=***************" [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) 扩展,配合我提供的 schema,可以获得最佳的提示体验。 --- --- url: /guide/cli/basic.md --- # 基础参数 我支持一些基础参数,无论是批量下载还是单视频下载都适用。 ## 最大并行 worker 数量 * 参数 `-n` 或 `--num-workers` * 配置项 `basic.num_workers` * 默认值 `8` 我使用协程来实现并发下载,本参数限制的是最大的并发 Worker 数量。 ## 指定视频清晰度等级 * 参数 `-q` 或 `--video-quality` * 配置项 `basic.video_quality` * 可选值 `127 | 126 | 125 | 120 | 116 | 112 | 100 | 80 | 74 | 64 | 32 | 16` * 默认值 `127` 清晰度对应关系如下 | code | 清晰度 | | :-: | :-: | | 127 | 8K 超高清 | | 126 | 杜比视界 | | 125 | 4K·HDR10 | | 120 | 4K 超高清 | | 116 | 1080P 60帧 | | 112 | 1080P 高码率 | | 100 | 智能修复 | | 80 | 1080P 高清 | | 74 | 720P 60帧 | | 64 | 720P 准高清 | | 32 | 480P 标清 | | 16 | 360P 流畅 | 并不是说指定某个清晰度就一定会下载该清晰度的视频,我只会尽可能满足你的要求,如果不存在指定的清晰度,我就会按照默认的清晰度搜索机制进行调节,比如指定清晰度为 `80`,**首先会依次降清晰度搜索** `74`、`64`、`32`、`16`,如果依然找不到合适的则**继续升清晰度搜索** `100`、`112`、`116`、`120`、`125`、`126`、`127`。 ## 指定音频码率等级 * 参数 `-aq` 或 `--audio-quality` * 配置项 `basic.audio_quality` * 可选值 `30251 | 30255 | 30250 | 30280 | 30232 | 30216` * 默认值 `30251` 码率对应关系如下 | code | 码率 | | :-: | :-: | | 30251 | - (Hi-Res) | | 30255 | - (杜比音效) | | 30250 | - (杜比全景声) | | 30280 | 320kbps | | 30232 | 128kbps | | 30216 | 64kbps | 码率自动调节机制与视频清晰度一致,也采用先降后升的匹配机制。 ## 指定视频编码 * 参数 `--vcodec` * 配置项 `basic.vcodec` * 下载编码可选值 `"av1" | "hevc" | "avc"` * 保存编码可选值 FFmpeg 所有可用的视频编码器 * 默认值 `"avc:copy"` 该参数略微复杂,前半部分表示在下载时**优先**选择哪一种编码的视频流,后半部分则表示在合并时如何编码视频流,两者使用 `:` 分隔。 值得注意的是,前半的下载编码只是优先下载的编码而已,如果不存在该编码,我会根据 `--download-vcodec-priority` 自动选择其余编码,如未设置 `--download-vcodec-priority`,则会类似视频清晰度调节机制先降序后升序的方式来选择。 而后半部分的参数如果设置成非 `copy` 的值则可以确保在下载完成后对其进行重新编码,而且不止支持 `av1`、`hevc` 与 `avc`,只要是 FFmpeg 前辈支持的视频编码器,我都可以完成重新编码。 ## 指定音频编码 * 参数 `--acodec` * 配置项 `basic.acodec` * 下载编码可选值 `"mp4a"` * 保存编码可选值 FFmpeg 所有可用的音频编码器 * 默认值 `"mp4a:copy"` 详情同视频编码。 ## 指定视频下载编码优先级 * 参数 `--download-vcodec-priority` * 配置项 `basic.download_vcodec_priority` * 默认值 `"auto"` * 可选值 `"auto"` 或者使用 `,` 分隔的下载编码列表,如 `"hevc,avc,av1"` 当使用默认值 `"auto"` 时,我会类似视频清晰度调节机制先降序后升序的方式来选择。 当使用自定义下载编码列表时,我会严格按照列表中的顺序进行选择,如果都不存在的话,我就会认为该视频没有视频流了。 ::: warning 如若设置本参数,请总是将 `--download-vcode-priority` 首选编码作为 `--vcodec` 的前半部分,否则可能会导致下载失败。 另外需要注意的是,作为配置项时,请直接使用列表形式,比如: ```toml [yutto.toml] [basic] download_vcodec_priority = ["hevc", "avc", "av1"] ``` ::: ## 指定输出格式 * 参数 `--output-format` * 配置项 `basic.output_format` * 可选值 `"infer" | "mp4" | "mkv" | "mov"` * 默认值 `"infer"` 在至少包含视频流时所使用的输出格式,默认选值 `"infer"` 表示自动根据情况进行推导以保证输出的可用,推导规则如下: * 如果输出包含音频流且音频流编码为 `"fLaC"`,则输出格式为 `"mkv"`,因为 `"mp4"` 尚不支持 `"fLaC"` 编码 * 否则为 `"mp4"` ## 指定在仅包含音频流时的输出格式 * 参数 `--output-format-audio-only` * 配置项 `basic.output_format_audio_only` * 可选值 `"infer" | "m4a" | "aac" | "mp3" | "flac" | "mp4" | "mkv" | "mov"` * 默认值 `"infer"` 在仅包含音频流时所使用的输出格式,默认选值 `"infer"` 表示自动根据情况进行推导以保证输出的可用,推导规则如下: * 如果音频流编码为 `"fLaC"`,且保存编码为 `"copy"`,则输出格式为 `"flac"`,因为 `"m4a"` 尚不支持 `"fLaC"` 编码 * 如果音频流编码为 `"EAC3"`,且保存编码为 `"copy"`,则输出格式为 `"mkv"`,因为 `"m4a"` 尚不支持 `"EAC3"` 编码 * 否则为 `"m4a"` ::: tip 并不是仅仅在指定 `--audio-only` 时才会仅仅包含视频流,有些视频是仅包含音频流的,此时即便不指定 `--audio-only` 选项也会按照本选项的格式进行输出。 ::: ## 启用 AI 原声翻译功能 * 参数 `--ai-translation-language` * 配置项 `basic.ai_translation_language` * 可选值 语言代码,比如 `"en"` 等,具体可用值根据视频而定 * 默认值 `None` 启用 AI 原声翻译功能后,如果视频支持该功能,音视频源会被替换为启用 AI 原声翻译功能后的源(主要为音频,视频可能有口型微调)。 ## 弹幕格式选择 * 参数 `-df` 或 `--danmaku-format` * 配置项 `basic.danmaku_format` * 可选值 `"ass" | "xml" | "protobuf"` * 默认值 `"ass"` B 站提供了 `xml` 与 `protobuf` 两种弹幕数据接口,`xml` 接口为旧接口,弹幕数上限较低,`protobuf` 接口相对较高,但不登录情况下只能获取很少的弹幕 为了确保无论是否登录都能获取最多的弹幕,我在登录时会下载 `protobuf` 源数据,在未登录时会下载 `xml` 源数据,并将其转换为主流播放器支持的 `ass` 格式 如果你不喜欢我自动转换的效果,可以选择输出格式为 `xml` 或 `protobuf`,手动通过一些工具进行转换,比如我默认使用的 [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` * 配置项 `basic.block_size` * 默认值 `0.5` 以 MiB 为单位,为分块下载时各块大小,不建议更改。 ## 强制覆盖已下载文件 * 参数 `-w` 或 `--overwrite` * 配置项 `basic.overwrite` * 默认值 `False` ## 代理设置 * 参数 `-x` 或 `--proxy` * 配置项 `basic.proxy` * 可选值 `"auto" | "no" | ` * 默认值 `"auto"` 设置代理服务器,默认是从环境变量读取,`no` 则为不设置代理,设置其它 http/https url 则将其作为代理服务器。 ## 存放根目录 * 参数 `-d` 或 `--dir` * 配置项 `basic.dir` * 默认值 `"./"` ## 临时文件目录 * 参数 `--tmp-dir` * 配置项 `basic.tmp_dir` * 默认值是“存放根目录”即 `-d, --dir` 的值 ## 存放子路径模板 * 参数 `-tp` 或 `--subpath-template` * 配置项 `basic.subpath_template` * 可选参数变量 `title | id | name | username | series_title | pubdate | download_date | owner_uid` (以后可能会有更多) * 默认值 `"{auto}"` 通过配置子路径模板可以灵活地控制视频存放位置。 默认情况是由我自动控制存放位置的。比如下载单个视频时默认就是直接存放在设定的根目录,不会创建一层容器目录,此时自动选择了 `{name}` 作为模板;而批量下载时则会根据视频层级生成多级目录,比如番剧会是 `{title}/{name}`,首先会在设定根目录里生成一个番剧名的目录,其内才会存放各个番剧剧集视频,这样方便了多个不同番剧的管理。当然,如果你仍希望将番剧直接存放在设定根目录下的话,可以修改该参数值为 `{name}`即可。 另外,该功能语法由 Python format 函数模板语法提供,所以也支持一些高级的用法,比如 `{id:0>3}{name}`,此外还专门为时间变量 🕛 增加了自定义时间模板的语法 `{pubdate@%Y-%m-%d %H:%M:%S}`,默认时间模板为 `%Y-%m-%d`。 值得注意的是,并不是所有变量在各种场合下都会提供,比如 `username`, `owner_uid`, `owner_uname` 变量当前仅在 UP 主全部投稿视频/收藏夹/稍后再看才提供,在其它情况下不应使用它。各变量详细作用域描述见下表: | Variable | Description | Scope | | - | - | - | | title | 系列视频总标题(番剧名/投稿视频标题) | 全部 | | id | 系列视频单 p 顺序标号 | 全部 | | aid | 视频 AV 号,早期使用的视频 ID,不建议使用,详见 [AV 号全面升级公告](https://www.bilibili.com/blackboard/activity-BV-PC.html) | 全部 | | bvid | 视频 BV 号,即视频 ID | 全部 | | name | 系列视频单 p 标题 | 全部 | | username | 视频作者用户名 | 个人空间、收藏夹、稍后再看、合集、视频列表下载 | | series\_title | 合集标题 | 收藏夹、视频合集、视频列表下载 | | pubdate🕛 | 投稿日期 | 仅投稿视频 | | download\_date🕛 | 下载日期 | 全部 | | owner\_uid | 视频作者 UID | 个人空间、收藏夹、稍后再看、合集、视频列表下载 | | owner\_uname | 视频作者用户名 | 个人空间、收藏夹、稍后再看、合集、视频列表下载 | ::: tip 未来可能会对路径变量及默认路径模板进行调整 ::: ## url 别名设置 * 参数 `-af` 或 `--alias-file` * 配置项 `basic.aliases` * 默认值 `None` 由于 CLI 和配置文件两种界面是不一致的,别名的配置方式有着较大的区别,下面分别介绍两者。 ### 别名文件路径设置(CLI) 在 CLI,你需要通过 `-af`/`--alias-file` 来指定别名文件路径,并在该文件中写明别名的映射关系,使用空格或者 `=` 分隔,示例如下: ``` 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 - ``` ### 别名配置设置(配置文件) 因为配置文件本身就是外部文件,因此可以直接通过结构化数据来表明别名映射关系,示例如下: ```toml [basic.aliases] 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/" ``` ## 指定媒体元数据值的格式 当前仅支持 `premiered` * 参数 `--metadata-format-premiered` * 配置项 `basic.metadata_format_premiered` * 默认值 `"%Y-%m-%d"` * 常用值 `"%Y-%m-%d %H:%M:%S"` ## 设置下载间隔 * 参数 `--download-interval` * 配置项 `basic.download_interval` * 默认值 `0` 设置两话之间的下载间隔(单位为秒),避免短时间內下载大量视频导致账号被封禁 ## 禁用下载镜像 * 参数 `--banned-mirrors-pattern` * 配置项 `basic.banned_mirrors_pattern` * 默认值 `None` 使用正则禁用特定镜像,比如 `--banned-mirrors-pattern "mirrorali"` 将禁用 url 中包含 `mirrorali` 的镜像 ## 严格校验大会员状态有效 * 参数 `--vip-strict` * 配置项 `basic.vip_strict` * 默认值 `False` ## 严格校验登录状态有效 * 参数 `--login-strict` * 配置项 `basic.login_strict` * 默认值 `False` ## 不显示颜色 * 参数 `--no-color` * 配置项 `basic.no_color` * 默认值 `False` ## 不显示进度条 * 参数 `--no-progress` * 配置项 `basic.no_progress` * 默认值 `False` ## 启用 Debug 模式 * 参数 `--debug` * 配置项 `basic.debug` * 默认值 `False` --- --- url: /guide/cli/auth.md --- # 个人信息认证参数 为了能够解锁更高清晰度以及大会员专享的剧集,你需要提供自己的登录信息,不过放心,我只会使用这些信息来访问 B 站,并不会上传或者泄露你的信息~ 我支持通过 `yutto auth login` 命令扫码登录并把认证信息写入 auth 文件,也支持直接通过 `--auth` 选项传入 Cookie 字符串。 对于第一种方式,执行 `yutto auth login` 后会提示你扫码登录: ```bash yutto auth login INFO 发现配置文件 yutto.toml,加载中…… <这里会有一个二维码> INFO 请使用哔哩哔哩 App 扫码并确认登录 INFO 二维码待扫描 INFO 登录成功,已写入认证文件:~/.config/yutto/auth.toml(profile: default,url: https://www.bilibili.com) ``` 如果你想显式检查当前登录状态,可以执行: ```bash yutto auth status INFO 当前认证信息有效。来源:/Users/you/.config/yutto/auth.toml(profile: default) 当前账号已登录,但不是大会员。 ``` 登录后,后续直接使用 `yutto` 命令时就会自动加载认证信息了: ```bash yutto INFO 发现配置文件 yutto.toml,加载中…… 大会员 成功以大会员身份登录~ ``` 对于第二种方式,你可以直接在命令行中使用 `--auth` 选项传入 Cookie 字符串: ```bash yutto --auth "SESSDATA=xxxxx; bili_jct=yyyyy" ``` ::: details `SESSDATA`、`bili_jct` 获取方式 这里用 Chrome 作为示例,其它浏览器请尝试类似方法。 首先,用你的帐号登录 B 站,然后随便打开一个 B 站网页,比如[首页](https://www.bilibili.com/)。 按 F12 打开开发者工具,切换到 Network 栏,刷新页面,此时第一个加载的资源应该就是当前页面的 html,选中该资源,在右侧 「Request Headers」 中找到 「cookie」,在其中找到类似于 `SESSDATA=d8bc7493%2C2843925707%2C08c3e*81;` 的一串字符串,复制这里的 `d8bc7493%2C2843925707%2C08c3e*81`,这就是你需要的 `SESSDATA`,你可以同样的方法找到 `bili_jct`。 ::: ## Inline Cookie 字符串 * 参数 `--auth` * 配置项 `auth.auth` * 默认值 `""` 推荐直接使用 inline cookie 字符串: ```bash yutto --auth "SESSDATA=xxxxx; bili_jct=yyyyy" ``` 对应配置文件写法: ```toml [yutto.toml] #:schema https://raw.githubusercontent.com/yutto-dev/yutto/refs/heads/main/schemas/config.json [auth] auth = "SESSDATA=xxxxx; bili_jct=yyyyy" ``` ## 认证文件 * 参数 `--auth-file` * 配置项 `auth.auth_file` 用于指定 `auth.toml` 的路径,优先级: 1. `--auth-file` 2. `auth.auth_file` 3. 默认路径(`~/.config/yutto/auth.toml` 或系统等价路径) ## 认证 Profile * 参数 `--auth-profile` * 配置项 `auth.auth_profile` * 默认值 `"default"` 用于在同一个 `auth.toml` 中切换不同认证条目,比如工作号/个人号分离。 ## `auth` 子命令组 ### `auth login` 通过 `yutto auth login` 你可以扫码登录,我会把认证信息写入 auth 文件(包含 `SESSDATA` 与 `bili_jct`)。 ```bash yutto auth login yutto auth login --auth-profile default yutto auth login --auth-file ~/.config/yutto/auth.toml ``` ### `auth status` 通过 `yutto auth status` 我会读取当前认证信息并检查登录是否有效。 ```bash yutto auth status yutto auth status --auth-profile default yutto auth status --auth-file ~/.config/yutto/auth.toml yutto auth status --auth "SESSDATA=xxxxx; bili_jct=yyyyy" ``` ### `auth logout` 通过 `yutto auth logout` 我会删除当前 `auth.toml` 中指定 profile 的认证信息。 如果你当前使用的是 `--auth` 参数或配置项 `auth.auth` 提供的 inline cookie,需要手动删除对应配置;`logout` 不会修改它们。 ```bash yutto auth logout yutto auth logout --auth-profile default yutto auth logout --auth-file ~/.config/yutto/auth.toml ``` ## 已弃用参数 * 参数 `-c` / `--sessdata`:已弃用 目前为了兼容旧脚本,`--sessdata` 仍然可用,但会打印弃用提示,并在前处理阶段自动转换到 `auth`。 推荐尽快迁移到 `--auth`,后续会以 `--auth` 作为唯一推荐入口。 --- --- url: /guide/cli/resource.md --- # 资源选择参数 这里有一些参数专用于资源选择,你可以告诉我你需要哪些资源,比如弹幕、音频、视频等等。 ## 仅下载视频流 * 参数 `--video-only` * 默认值 `False` ::: tip 这里「仅下载视频流」是指视频中音视频流仅选择视频流,而不是仅仅下载视频而不下载弹幕字幕等资源,如果需要取消字幕等资源下载,请额外使用 `--no-danmaku` 等参数。 「仅下载音频流」也是同样的。 ::: ## 仅下载音频流 * 参数 `--audio-only` * 默认值 `False` 仅下载其中的音频流,保存为 `.m4a` 文件。 ## 不生成弹幕文件 * 参数 `--no-danmaku` * 默认值 `False` ## 仅生成弹幕文件 * 参数 `--danmaku-only` * 默认值 `False` ## 不生成字幕文件 * 参数 `--no-subtitle` * 默认值 `False` ## 仅生成字幕文件 * 参数 `--subtitle-only` * 默认值 `False` ## 生成媒体元数据文件 * 参数 `--with-metadata` * 默认值 `False` 目前媒体元数据生成尚在试验阶段,可能提取出的信息并不完整。 ## 仅生成媒体元数据文件 * 参数 `--metadata-only` * 默认值 `False` ## 不生成视频封面 * 参数 `--no-cover` * 默认值 `False` ::: tip 当前仅支持为包含视频流的视频生成封面。 ::: ## 生成视频流封面时单独保存封面 * 参数 `--save-cover` * 默认值 `False` ## 仅生成视频封面 * 参数 `--cover-only` * 默认值 `False` ## 不生成章节信息 * 参数 `--no-chapter-info` * 默认值 `False` 不生成章节信息,包含 MetaData 和嵌入视频流的章节信息。 ## 配置项 与命令行界面完全不同,配置文件可以直接表明你要下载的资源类型,比如: ```toml [yutto.toml] [resource] require_audio = false require_subtitle = false require_danmaku = false ``` 如上配置表明了你不需要音频、字幕和弹幕资源。 具体配置项如下: ### 是否需要视频流 * 配置项 `resource.video_only` * 默认值 `True` ### 是否需要音频流 * 配置项 `resource.require_audio` * 默认值 `True` ### 是否需要弹幕 * 配置项 `resource.require_danmaku` * 默认值 `True` ### 是否需要字幕 * 配置项 `resource.require_subtitle` * 默认值 `True` ### 是否需要媒体元数据 * 配置项 `resource.require_metadata` * 默认值 `False` ### 是否需要视频封面 * 配置项 `resource.require_cover` * 默认值 `True` ### 是否需要章节信息 * 配置项 `resource.require_chapter_info` * 默认值 `True` ### 生成视频流封面时单独保存封面 * 配置项 `resource.save_cover` * 默认值 `False` --- --- url: /guide/cli/danmaku.md --- # 弹幕设置参数 通过与 biliass 的集成,我提供了一些 ASS 弹幕选项,包括字号、字体、速度等~ ## 弹幕字体大小 * 参数 `--danmaku-font-size` * 配置项 `danmaku.font_size` * 默认值 `video_width / 40` ## 弹幕字体 * 参数 `--danmaku-font` * 配置项 `danmaku.font` * 默认值 `"SimHei"` ## 弹幕不透明度 * 参数 `--danmaku-opacity` * 配置项 `danmaku.opacity` * 默认值 `0.8` ## 弹幕显示区域与视频高度的比例 * 参数 `--danmaku-display-region-ratio` * 配置项 `danmaku.display_region_ratio` * 默认值 `1.0` ## 弹幕速度 * 参数 `--danmaku-speed` * 配置项 `danmaku.speed` * 默认值 `1.0` ## 屏蔽顶部弹幕 * 参数 `--danmaku-block-top` * 配置项 `danmaku.block_top` * 默认值 `False` ## 屏蔽底部弹幕 * 参数 `--danmaku-block-bottom` * 配置项 `danmaku.block_bottom` * 默认值 `False` ## 屏蔽滚动弹幕 * 参数 `--danmaku-block-scroll` * 配置项 `danmaku.block_scroll` * 默认值 `False` ## 屏蔽逆向弹幕 * 参数 `--danmaku-block-reverse` * 配置项 `danmaku.block_reverse` * 默认值 `False` ## 屏蔽固定弹幕(顶部、底部) * 参数 `--danmaku-block-fixed` * 配置项 `danmaku.block_fixed` * 默认值 `False` ## 屏蔽高级弹幕 * 参数 `--danmaku-block-special` * 配置项 `danmaku.block_special` * 默认值 `False` ## 屏蔽彩色弹幕 * 参数 `--danmaku-block-colorful` * 配置项 `danmaku.block_colorful` * 默认值 `False` ## 屏蔽关键词 * 参数 `--danmaku-block-keyword-patterns` * 配置项 `danmaku.block_keyword_patterns` * 默认值 `None` 按关键词屏蔽,支持正则,作为 CLI 参数使用 `,` 分隔,作为配置项直接使用列表即可: ```toml [yutto.toml] [danmaku] block_keyword_patterns = [ ".*keyword1.*", ".*keyword2.*", ] ``` --- --- url: /guide/cli/batch.md --- # 批量参数 有些参数只有在批量下载时才可以使用哦 ## 启用批量下载 * 参数 `-b` 或 `--batch` * 配置项 「不支持」 * 默认值 `False` 只需要 `yutto --batch ` 即可启用批量下载功能。 ::: warning 该选项不支持配置项 因为是否启用批量下载在大多数情况需要针对具体链接来选择,因此将其设置在配置项里基本是无意义的。 ::: ## 选集 * 参数 `-p` 或 `--episodes` * 配置项 「不支持」 * 默认值 `1~-1`(也即全选) 也就是选集咯,其语法是这样的 * `` 单独下某一剧集 * 支持负数来选择倒数第几话 * 此外还可以使用 `$` 来代表 `-1` * `~` 使用 `~` 可以连续选取(如果起始为 1,或者终止为 -1 则可以省略) * `,,,...,` 使用 `,` 可以不连续选取 emmm,直接看的话大概并不能知道我在说什么,所以我们通过几个小例子来了解其语法 ```bash # 假设要下载一个具有 24 话的番剧 # 如果我们只想下载第 3 话,只需要这样 yutto -b -p 3 # 那如果我想下载第 5 话到第 7 话呢,使用 `~` 可以连续选中 yutto -b -p 5~7 # 那我想下载第 12 话和第 17 话又要怎么办?此时只需要 `,` 就可以将多个不连续的选集一起选中 yutto -b -p 12,17 # 那我突然又想将刚才那些都选中了呢?还是使用 `,` 呀,将它们连在一起即可 yutto -b -p 3,5~7,12,17 # 嗯,你已经把基本用法都了解过了,很简单吧~ # 下面是一些语法糖,不了解也完全不会影响任何功能哒~ # 那如果我只知道我想下载倒数第 3 话,而不想算倒数第三话是第几话应该怎么办? # 此时可以用负数哒~不过要注意的是,这种参数以 `-` 开头参数需要使用 `=` 来连接选项和参数 yutto -b -p=-3 # 那么如果想下载最后一话你可能会想到 `-p=-1` 对吧?不过我内置了符号 $ 用于代表最后一话 # 像下面这样就可以直接下载最后一话啦~ yutto -b -p $ # 为了进一步方便表示一个范围选取,在从第一话开始选取或者以最后一话为终止时可以省略它们 # 这样就是前三话啦(这里与以 `-` 开头类似,以 `~` 开头可能被识别为 $HOME,因此最好也用等号,或者使用引号包裹) yutto -b -p=~3 # 这样就是后四话啦 yutto -b -p=-4~ # 所有语法都了解完啦,我们看一个稍微复杂的例子 yutto -b -p "~3,10,12~14,16,-4~" # 很明显,上面的例子就是下载前 3 话、第 10 话、第 12 到 14 话、第 16 话以及后 4 话 ``` 下面是一些要注意的问题 1. 这里使用的序号是视频的顺序序号,而不是番剧所标注的`第 n 话`,因为有可能会出现 `第 x.5 话` 等等的特殊情况,此时一定要按照顺序自行计数。 2. 参数值里一定不要加空格 3. 参数值开头为特殊符号时最好使用 `=` 来连接选项和参数,或者尝试使用引号包裹参数 4. 个人空间、视频列表、收藏夹等批量下载暂不支持选集操作 ::: warning 该选项不支持配置项 与「启用批量下载」相同,具体选集只有在具体链接时才能确定,为该选项指定配置项同样无意义。 ::: ## 同时下载附加剧集 * 参数 `-s` 或 `--with-section` * 配置项 `batch.with_section` * 默认值 `False` ## 指定稿件发布时间范围 * 参数 `--batch-filter-start-time` 和 `--batch-filter-end-time` 分别表示`开始`和`结束`时间,该区间**左闭右开** * 配置项 `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` --- --- url: /guide/tips.md --- # 小技巧 ## 通过 Agent 使用 如果你有趁手的 Agent,你也可以通过如下命令来安装我的 skill: ```bash npx skills add https://github.com/yutto-dev/yutto --skill bilibili-video-download ``` 之后请直接描述你的需求,agent 就会帮你补齐环境检查、登录状态检查、下载目录和最终命令执行流程啦~例如: * “帮我下载 BVXXXXXXX 视频到 `/tmp/video`” * “把番剧 epxxxxxxx 最新一话下载到 `/data/anime`” * “下载用户 xxxxxx 的收藏夹,只要音频,保存到 `/downloads/music`” * “下载视频 BVXXXXXXX,4K 超高清,保存到桌面” ## 作为 log 输出到文件 由于进度条会一直刷新占据多行,可能影响 log 的阅读,另外颜色码也是难以阅读的,因此可以通过选项禁用它们: ```bash yutto --no-color --no-progress > log ``` ## 使用配置自定义默认参数 如果你希望修改我的部分参数,那么可能每次运行都需要在后面加上长长一串选项,为了避免这个问题,你可以尝试使用配置文件 ```toml # ~/.config/yutto/yutto.toml #:schema https://raw.githubusercontent.com/yutto-dev/yutto/refs/heads/main/schemas/config.json [basic] dir = "~/Movies/yutto" num_workers = 16 vcodec = "av1:copy" [auth] auth = "SESSDATA=***************; bili_jct=***************" ``` 当然,请手动修改 `auth` 内容为自己的 Cookie 哦~ --- --- url: /guide/faq.md --- # FAQ ## 版本号为什么是 2.0 因为 yutto 是 [bilili](https://github.com/yutto-dev/bilili) 的後輩呀~ ## 名字的由来 [《転スラ日記》第一话 00:24](https://www.bilibili.com/bangumi/play/ep395211?t=24) ## 何谓「任性」? 我不一定会满足你的所有需求哦,从设计者的角度,为我添加任何特性都需要以保证可维护性为前提,因此我不会支持过于复杂的特性,只需要满足大多数用户的需求即可~ --- --- url: /guide/feedback.md --- # 交流和反馈 在提出问题之前,希望你能先大致浏览一遍本文档哦,这样会节省彼此的一些时间~当然,如果你对文档的组织形式、内容等有任何问题的话,欢迎提出与贡献。 如果你有一些新的想法,可以在 GitHub 上[发起 discussion](https://github.com/yutto-dev/yutto/discussions),如果你确定你发现了一个 Bug,或者想请求我添加新的功能,也可以直接[发起 Issue](https://github.com/yutto-dev/yutto/issues/)。 此外你也可以通过 [Discord](https://discord.com/invite/5cQGyFwsqC) 来与大家讨论,建议问题尽可能直奔主题哦~ --- --- url: /guide/notice.md --- # 注意事项 我的工作只是将 B 站的视频搬运到你的电脑上,**仅此而已**啦,但有些事情你可能需要知道。 我不会帮你下载你没有权限访问的东西,因此我不是什么破解程序,该开大会员还是去乖乖开大会员,这是对 B 站的一种支持,所以请不要对我提让我为难的要求哦,无论现在还是以后。 我所下载的东西只代表你有权限获取,请不要将我获取的东西随意分享破坏平台和创作者的权益,如果你这么做了的话,那就不要怪我绝情咯,只能一切后果自负哦。 另外我本身的开源协议是 GPL-3.0,一方面我需要 FFmpeg 前辈和 [biliass](https://github.com/yutto-dev/yutto/tree/main/packages/biliass) 的帮忙,另一方面也尽可能维护 B 站本身的权益。不过我的文档采用的是 CC0-1.0 协议。 --- --- url: /guide/thanks.md --- # 特别感谢 ## 平台以及创作者 感谢 [bilibili](https://www.bilibili.com/) 平台以及平台上无数优质内容的创作者。 ## 依赖项目 我的正常运作离不开以下项目的支持 * [HTTPX](https://github.com/encode/httpx) 用于 HTTP 请求发送 * [FFmpeg](https://github.com/FFmpeg/FFmpeg) 用于视频的合并 * [biliass](https://github.com/yutto-dev/yutto/tree/main/packages/biliass) 用于 Bilibili XML/Protobuf 格式弹幕转换为 ASS 弹幕 * [Pydantic](https://github.com/pydantic/pydantic) 用于配置格式校验 * [VitePress](https://github.com/vuejs/vitepress) 本文档的生成器 ## 参考项目 我在探索过程中得到了以下项目的帮助 * 基本结构: * 协程下载: * 弹幕转换: * 样式设计: ## 云服务 * [Vercel](https://vercel.com/) 提供[文档托管](https://vercel.com/siguremo/yutto-docs) ## 贡献者 感谢每一位贡献者的辛勤付出 ## 赞助者 感谢各位赞助者的资金援助 ## 以及你的支持~ --- --- url: /sponsor.md --- # 赞助 首先说明,由于我只是将 B 站的视频搬运到你的电脑上,是一件很简单的事情,请把最大的感激给予平台以及创作者。 如果你想支持我的话,在 [GitHub 项目主页](https://github.com/yutto-dev/yutto)给予我一个 「Star」 就是对我的最大鼓励。 此外,如果你想给予 Nyakku 一定资金支持以激励 Nyakku 的开发的话,你可以通过以下方式进行 ## 一次性赞助 你可以通过[支付宝](https://img.nyakku.moe/sponsor/alipay.png)或者[微信](https://img.nyakku.moe/sponsor/wechat.png)来为 Nyakku 提供一笔开发资金。 ## 周期性赞助 你可以通过 [Patreon](https://www.patreon.com/SigureMo) 或者[爱发电](https://afdian.net/@siguremo)来为 Nyakku 提供每月的资金支持,以激励 Nyakku 创作更多有趣、实用的开源项目。 你的任何金额的赞助我都会无比珍惜,我会在[项目致谢](./guide/thanks)中标注你的 GitHub ID(需要在赞助时备注你的 GitHub ID,如果有资助后忘记留 ID 的可以联系我~)。