Package: yutto
yutto2.0.0-betayutto，一个可爱且任性的 B 站下载器（CLI）当前 yutto 尚处于 beta 阶段，有任何建议尽管在Discussions提出～～～版本号为什么是 2.0因为 yutto 是bilili的後輩呀～从安装开始～包管理器一键安装啦测试中目前 yutto 已经可以通过部分包管理器直接安装～使用 Homebrew 的用户可以尝试下下面的命令：brewtapsiguremo/tap
brewinstallyutto使用paru（Arch 上的 AUR 包管理器）的用户可以尝试下这样的命令（感谢 @ouuan）：paru-Syutto使用 Docker测试中你也可以尝试使用 docker 直接运行 yutto（具体如何运行需要参考下后面的内容～）dockerrun--rm-it-v/path/to/download:/appsiguremo/yutto<url>[options]与直接运行 yutto 不同的是，这里的下载目标路径是通过-v <path>:/app指定的，也就是说 docker 里的 yutto 会将内容下载到 docker 里的/app目录下，与之相对应的挂载点<path>就是下载路径。你也可以直接挂载到$(pwd)，此时就和本机 yutto 的默认行为一致啦，也是下载到当前目录下～pip/pipx 安装在此之前请确保安装 Python3.9 及以上版本，并配置好 FFmpeg（参照bilili 文档）pipinstall--preyutto如果想要尝试 Nightly 版本，可尝试pipinstallgit+https://github.com/yutto-dev/yutto@main当然，你也可以通过pipx来安装 yutto（当然，前提是你要自己先安装它）pipxinstallyuttopipx 会类似 Homebrew 无感地为 yutto 创建一个虚拟环境，与其余环境隔离开，避免污染 pip 的环境，因此相对于 pip，pipx 是更推荐的安装方式。从 GitHub 手动拉取源码安装这同样要求你自行配置 Python 和 FFmpeg 环境gitclonehttps://github.com/yutto-dev/yutto.gitcdyutto/
pipinstall.主要功能已支持的下载类型类型是否支持选集示例链接默认路径模板投稿视频-https://www.bilibili.com/video/BV1vZ4y1M7mQhttps://www.bilibili.com/video/av371660125https://www.bilibili.com/video/BV1vZ4y1M7mQ?p=1av371660125BV1vZ4y1M7mQ{title}投稿视频批量:white_check_mark:https://www.bilibili.com/video/BV1vZ4y1M7mQhttps://www.bilibili.com/video/av371660125av371660125BV1vZ4y1M7mQ{title}/{name}番剧-https://www.bilibili.com/bangumi/play/ep395211ep395211{name}番剧批量:white_check_mark:https://www.bilibili.com/bangumi/play/ep395211https://www.bilibili.com/bangumi/play/ss38221https://www.bilibili.com/bangumi/media/md28233903ep395211ss38221md28233903{title}/{name}课程-https://www.bilibili.com/cheese/play/ep6902{name}课程批量:white_check_mark:https://www.bilibili.com/cheese/play/ep6902https://www.bilibili.com/cheese/play/ss298{title}/{name}用户指定收藏夹批量:x:https://space.bilibili.com/100969474/favlist?fid=1306978874&ftype=create{username}的收藏夹/{series_title}/{title}/{name}当前用户稍后再看批量:x:https://www.bilibili.com/watchlater稍后再看/{title}/{name}用户全部收藏夹批量:x:https://space.bilibili.com/100969474/favlist{username}的收藏夹/{series_title}/{title}/{name}UP 主个人空间批量:x:https://space.bilibili.com/100969474/video{username}的全部投稿视频/{title}/{name}合集批量:white_check_mark:https://space.bilibili.com/361469957/channel/collectiondetail?sid=23195https://www.bilibili.com/medialist/play/361469957?business=space_collection&business_id=23195{series_title}/{title}视频列表批量:x:https://space.bilibili.com/100969474/channel/seriesdetail?sid=1947439https://www.bilibili.com/medialist/play/100969474?business=space_series&business_id=1947439https://space.bilibili.com/100969474/favlist?fid=270359&ftype=collect{series_title}/{title}/{name}[!NOTE]标记「批量」的视频都必须通过-b/--batch参数来下载，否则会按照单个视频来解析下载基本命令yutto 的基本命令如下：yutto<url>你可以通过yutto -h查看详细命令参数。如果你需要下载单个视频，只需要使用 yutto 加上这个视频的地址即可。它支持 av/BV 号以及相应带 p=n 参数的投稿视频页面，也支持 ep 号（episode_id）的番剧页面。比如只需要这样你就可以下载《転スラ日記》第一话：yuttohttps://www.bilibili.com/bangumi/play/ep395211yutto 还支持直接使用能够唯一定位资源的 id 来作为<url>，刚刚的功能与下面的简化后的命令功能是完全一样的yuttoep395211不过有时你可能想要批量下载很多剧集，因此 yutto 提供了用于批量下载的参数-b/--batch，它不仅支持前面所说的单个视频所在页面地址（会解析该单个视频所在的系列视频），还支持一些明确用于表示系列视频的地址，比如 md 页面（media_id）、ss 页面（season_id）。比如像下面这样就可以下载《転スラ日記》所有已更新的剧集：yutto--batchhttps://www.bilibili.com/bangumi/play/ep395211基础参数yutto 支持一些基础参数，无论是批量下载还是单视频下载都适用。点击展开详细参数最大并行 worker 数量参数-n或--num-workers默认值8与 bilili 不同的是，yutto 并不是使用多线程实现并行下载，而是使用协程实现的，本参数限制的是最大的并行 Worker 数量。指定视频清晰度等级参数-q或--video-quality可选值127 | 126 | 125 | 120 | 116 | 112 | 80 | 74 | 64 | 32 | 16默认值127清晰度对应关系如下code清晰度1278K 超高清126杜比视界125HDR 真彩1204K 超清1161080P 60帧1121080P 高码率801080P 高清74720P 60帧64720P 高清32480P 清晰16360P 流畅并不是说指定某个清晰度就一定会下载该清晰度的视频，yutto 只会尽可能满足你的要求，如果不存在指定的清晰度，yutto 就会按照默认的清晰度搜索机制进行调节，比如指定清晰度为80，首先会依次降清晰度搜索74、64、32、16，如果依然找不到合适的则继续升清晰度搜索112、116、120、125、126、127。值得注意的是，目前杜比视界视频只能简单下载音视频流并合并，合并后并不能达到在线观看的效果。指定音频码率等级参数-aq或--audio-quality可选值30280 | 30232 | 30216默认值30280码率对应关系如下code码率30251- (Hi-Res)30280320kbps30232128kbps3021664kbps码率自动调节机制与视频清晰度一致，也采用先降后升的匹配机制。指定视频编码参数--vcodec下载编码可选值"av1" | "hevc" | "avc"保存编码可选值 FFmpeg 所有可用的视频编码器默认值"avc:copy"该参数略微复杂，前半部分表示在下载时优先选择哪一种编码的视频流，后半部分则表示在合并时如何编码视频流，两者使用:分隔。值得注意的是，前半的下载编码只是优先下载的编码而已，如果不存在该编码，则会根据--download-vcodec-priority自动选择其余编码，如未设置--download-vcodec-priority，则会类似视频清晰度调节机制先降序后升序的方式来选择。而后半部分的参数如果设置成非copy的值则可以确保在下载完成后对其进行重新编码，而且不止支持av1、hevc与avc，只要你的 FFmpeg 支持的视频编码器，它都可以完成。指定音频编码参数--acodec下载编码可选值"mp4a"保存编码可选值 FFmpeg 所有可用的音频编码器默认值"mp4a:copy"详情同视频编码。指定视频下载编码优先级参数--download-vcodec-priority默认值"auto"可选值"auto"或者使用,分隔的下载编码列表，如"hevc,avc,av1"当使用默认值"auto"时，yutto 会类似视频清晰度调节机制先降序后升序的方式来选择。当使用自定义下载编码列表时，yutto 会严格按照列表中的顺序进行选择，如果不存在则会认为该视频无视频流。Warning如若设置本参数，请总是将--download-vcode-priority首选编码作为--vcodec的前半部分，否则可能会导致下载失败。指定输出格式参数--output-format可选值"infer" | "mp4" | "mkv" | "mov"默认值"infer"在至少包含视频流时所使用的输出格式，默认选值"infer"表示自动根据情况进行推导以保证输出的可用，推导规则如下：如果输出包含音频流且音频流编码为"fLaC"，则输出格式为"mkv"，因为"mp4"尚不支持"fLaC"编码否则为"mp4"指定在仅包含音频流时的输出格式参数--output-format-audio-only可选值"infer" | "aac" | "flac" | "mp4" | "mkv" | "mov"默认值"infer"在仅包含音频流时所使用的输出格式，默认选值"infer"表示自动根据情况进行推导以保证输出的可用，推导规则如下：如果音频流编码为"fLaC"，则输出格式为"flac"否则为"aac"Note并不是仅仅在指定--audio-only时才会仅仅包含视频流，有些视频是仅包含音频流的，此时即便不指定--audio-only选项也会按照本选项的格式进行输出。弹幕格式选择参数-df或--danmaku-format可选值"ass" | "xml" | "protobuf"默认值"ass"B 站提供了xml与protobuf两种弹幕数据接口，yutto 会自动下载xml格式弹幕并转换为ass格式，如果你不喜欢 yutto 自动转换的效果，可以选择输出格式为xml或protobuf，手动通过一些工具进行转换，比如 yutto 和 bilili 所使用的biliass，或者使用us-danmaku进行在线转换。如果你不想下载弹幕，只需要使用参数--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时（当然前提是你是大会员），你就可以下载大会员可访问的资源咯。SESSDATA 获取方式这里用 Chrome 作为示例，其它浏览器请尝试类似方法。首先，用你的帐号登录 B 站，然后随便打开一个 B 站网页，比如首页。按 F12 打开开发者工具，切换到 Network 栏，刷新页面，此时第一个加载的资源应该就是当前页面的 html，选中该资源，在右侧 「Request Headers」 中找到 「cookie」，在其中找到类似于SESSDATA=d8bc7493%2C2843925707%2C08c3e*81;的一串字符串，复制这里的d8bc7493%2C2843925707%2C08c3e*81，这就是你需要的SESSDATA。另外，由于 SESSDATA 中可能有特殊符号，所以传入时你可能需要使用双引号来包裹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 主全部投稿视频/收藏夹/稍后再看才提供，在其它情况下不应使用它。各变量详细作用域描述见下表：VariableDescriptionScopetitle系列视频总标题（番剧名/投稿视频标题）全部id系列视频单 p 顺序标号全部name系列视频单 p 标题全部usernameUP 主用户名个人空间、收藏夹、稍后再看、合集、视频列表下载series_title合集标题收藏夹、视频合集、视频列表下载pubdate🕛投稿日期仅投稿视频download_date🕛下载日期全部owner_uidUP 主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，则通过以下命令即可解析该文件：yuttotensura1--batch--alias-file='~/.yutto_alias'当参数值为-时，会从标准输入中读取：cat~/.yutto_alias|yuttotensura-nikki--batch--alias-file-仅下载视频流参数--video-only默认值FalseNote这里「仅下载视频流」是指视频中音视频流仅选择视频流，而不是仅仅下载视频而不下载弹幕字幕等资源，如果需要取消字幕等资源下载，请额外使用--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]当前仅支持为包含视频流的视频生成封面。指定媒体元数据值的格式当前仅支持premiered参数--metadata-format-premiered默认值"%Y-%m-%d"常用值"%Y-%m-%d %H:%M:%S"严格校验大会员状态有效参数--vip-strict默认值False严格校验登录状态有效参数--login-strict默认值False设置下载间隔参数--download-interval默认值0设置两话之间的下载间隔（单位为秒），避免短时间內下载大量视频导致账号被封禁不显示颜色参数--no-color默认值False不显示进度条参数--no-progress默认值False启用 Debug 模式参数--debug默认值False批量参数有些参数是只有批量下载时才可以使用的点击展开详细参数启用批量下载参数-b或--batch默认值False只需要yutto --batch <url>即可启用批量下载功能。选集参数-p或--episodes默认值1~-1（也即全选）也就是选集咯，其语法是这样的<p1>单独下某一剧集支持负数来选择倒数第几话此外还可以使用$来代表-1<p_start>~<p_end>使用~可以连续选取（如果起始为 1，或者终止为 -1 则可以省略）<p1>,<p2>,<p3>,...,<pn>使用,可以不连续选取emmm，直接看的话大概并不能知道我在说什么，所以我们通过几个小例子来了解其语法# 假设要下载一个具有 24 话的番剧# 如果我们只想下载第 3 话，只需要这样yutto<url>-b-p3# 那如果我想下载第 5 话到第 7 话呢，使用 `~` 可以连续选中yutto<url>-b-p5~7# 那我想下载第 12 话和第 17 话又要怎么办？此时只需要 `,` 就可以将多个不连续的选集一起选中yutto<url>-b-p12,17# 那我突然又想将刚才那些都选中了呢？还是使用 `,` 呀，将它们连在一起即可yutto<url>-b-p3,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 话下面是一些要注意的问题这里使用的序号是视频的顺序序号，而不是番剧所标注的第 n 话，因为有可能会出现第 x.5 话等等的特殊情况，此时一定要按照顺序自行计数。参数值里一定不要加空格参数值开头为特殊符号时最好使用=来连接选项和参数，或者尝试使用引号包裹参数个人空间、视频列表、收藏夹等批量下载暂不支持选集操作同时下载附加剧集参数-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从 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 的阅读，另外颜色码也是难以阅读的，因此我们可以通过选项禁用他们：yutto--no-color--no-progress<url>>log使用 url aliasyutto 新增的 url alias 可以让你下载正在追的番剧时不必每次都打开浏览器复制 url，只需要将追番列表存储在一个文件中，并为这些 url 起一个别名即可tensura-nikki=https://www.bilibili.com/bangumi/play/ss38221/之后下载最新话只需要yutto --batch tensura-nikki --alias-file=/path/to/alias-file使用任务列表现在 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）自定义命令别名如果你不习惯于 yutto 的默认参数，那么可能每次运行都需要在后面加上长长一串参数，为了避免这一点，我是这样做的：在~/.zshrc/~/.bashrc中自定义一条 alias，像这样aliasytt='yutto -d ~/Movies/yutto/ -c `cat ~/.sessdata` -n 16 --vcodec="av1:copy"'这样我每次只需要ytt <url>就可以直接使用这些参数进行下载啦～由于我提前在~/.sessdata存储了我的SESSDATA，所以避免每次都要手动输入 cookie 的问题。FAQ名字的由来《転スラ日記》第一话 00:24何谓「任性」？yutto 添加任何特性都需要以保证可维护性为前提，因此 yutto 不会添加过于复杂的特性，只需要满足够用即可。yutto 会替代 bilili 吗yutto 自诞生以来已经过去两年多了，功能上基本可以替代 bilili 了，因此 bilili 将会在 yutto 正式版发布后正式停止维护～（咳，正式版早着呢，我现在都懒得 RC，一直 beta 下去挺好的 ξ( ✿ ＞ ◡❛)）其他应用你也可以通过这些应用来使用 yuttoKubeSpider: 一个多功能全局资源编排下载系统，支持下载、订阅各类资源网站～Roadmap2.0.0-betafeat: 支持 bare name (bare id, bare path)refactor: url 列表能够预线性展开feat: 添加各种 return codetest: 编写单元测试2.0.0-rcfeat: 投稿视频描述文件支持refactor: 整理路径变量名feat: 视频合集选集支持（合集貌似有取代分 p 的趋势，需要对其进行合适的处理）refactor: 针对视频合集优化路径变量refactor: 优化杜比视界/音效/全景声选取逻辑（Disscusing in#62）docs: 可爱的静态文档（WIP in#86）futurefeat: 增加参数--reverse以允许逆序下载（不清楚是否有必要诶……可能只是我个人的需求）feat: 字幕、弹幕嵌入视频支持（也许？）feat: 封面下载支持（也许？）refactor: 以插件形式支持更多音视频处理方面的功能，比如类似 autosub 的工具（也许？）refactor: 直接使用 rich 替代内置的终端显示模块feat: 更多批下载支持feat: 以及更加可爱～参考基本结构：https://github.com/yutto-dev/bilili协程下载：https://github.com/changmenseng/AsyncBilibiliDownloader弹幕转换：https://github.com/yutto-dev/biliass样式设计：https://github.com/willmcgugan/rich参与贡献请阅读CONTRIBUTING.md