大家好,好久不见,我是某昨。
众所周知,叔叔在今年的某个时间点悄悄地关闭了分P投稿的入口,目前唯一的分P投稿入口就只有投稿工具和旧版的手机客户端了。由于叔叔在去年某个时候增加的1000粉限制,普通用户本就不能投稿分P;但这次的全量化则是针对所有用户的一击重锤。

由此,sswa 诞生了。sswa 是在 biliup-rs 的基础上进行开发的,为的是符合我个人以及身边一些其他用户的投稿需求。sswa 支持的首要分区为官延区,一切与该分区投稿相关的功能均以最高优先级开发。
ToC
协议相关
biliup-rs 以 MIT 协议开源。与之相对,sswa 以 Apache-2.0 协议开源,但其中任意涉及到与 biliup-rs 相关的部分遵循 MIT 协议。为不违反原协议,这个涉及的范围非常广泛。
后续 sswa 可能会将协议修改为 Rust 社区中更常用的 Apache-MIT 双协议。
下载
sswa 仍然处于开发阶段,因此暂时不提供 Release 包下载,但用户可以通过下载 GitHub Action 构建的 nightly 版本体验该工具的功能。
需要注意的是,下载 nightly 构建需要用户在 GitHub 已登录状态下进行。
首先,进入项目的 Actions。项目的 Actions 页为 [https://github.com/Yesterday17/sswa/actions](https://github.com/Yesterday17/sswa/actions),点击进入即可。如下图所示:

然后,点击最上方的 Workflow。例如上图就是点击 skip levels。最后将滚动条拉到页面底部,就可以看到不同平台的构建了。

所有构建均只支持 64 位操作系统,需要 32 位版本的可以手动构建。Linux 构建提供了 GLIBC 和 MUSL 两个版本,可以按需选择。
登录
此处以 Windows 为例,以 me 的身份登录。
./sswa.exe login me
会提示需要打开链接登录,在对应的链接中完成登录就可以了。
配置文件
sswa 是为重复投稿设计的,因此存在配置和模板的概念。配置所处的目录可以通过以下命令获得:
./sswa.exe config这条命令会输出 sswa 使用的配置文件目录,此后对配置文件的修改都需要在该目录中进行,简称为 $HOME。
全局配置
全局配置文件存储在 $HOME/config.toml,内容如下:
# 投稿线路line = "kodo"# 默认使用的投稿帐号default-user = "me"# 是否自动缩放封面(依赖 ffmpeg)scale-cover = false通过指定 line 参数,可以手动选择一条投稿线路,供后续使用。建议不使用该项,这样每次投稿前都会对可用的线路进行测速,并选择最优线路投稿。
通过指定 default-user,我们可以省略后续的一些参数。由于上文中登录使用的是 me,因此这里也填写 me。
scale-cover 则是自动生成合适大小封面的一个参数。当设置为 true 时,sswa 会针对原图生成适合作为 bilibili 封面的图片。我个人投稿一般会打开这个选项,但它毕竟会对封面图片作一定修改,所以默认值为 false。
模板配置
模板配置存储在 $HOME/templates 目录下,须命名为 模板名.toml。一个样例模板内容如下:
# 模板的默认投稿帐号default-user = "me"
# 标题title = "【字幕】【偶像大师百万广播{{num}}回】{{title}}【MillionRADIO】"# 描述description = '''片源:RabbitC翻译:{{translators}}校对:{{jiaodui}}时间轴:{{subtitle}}'''# 转载来源,该字段存在且不为空时以转载形式投稿,否则投成自制forward-source = "765.million"# 投稿分区tid = 152# 封面图片路径# 当留空或值为 auto 时,自动从第一个视频(不包含前缀视频)中随机提取cover = '''./{%-if cover -%} {{cover}}{%- else -%} folder{%- endif %}/cover.png'''# 动态文本dynamic-text = ""# 标签tags = ["田所梓", "山崎遥", "麻仓桃", "偶像大师百万广播", "{{guests}}"]# 定时投稿display-time = "tomorrow 10:00"# 前缀视频,在投稿时自动添加在选中视频**前面**video-prefix = [ # 建议写绝对路径,相对路径是相对命令执行时候的 CWD "D:\\prefix.mp4",]# 后缀视频,在投稿时自动添加在选中视频**后面**video-suffix = []
# 变量对应的解释文本,在需要用户手动输入时作为提示文本展示[variables]translators = "翻译"jiaodui = "校对"subtitle = "时间轴"guests = "嘉宾 Tag"
[variables.num]description = "广播回数"# 变量的默认值default = "123"
[variables.title]description = "标题"default = "默认标题"
[variables.cover]description = "封面图片目录"# 当未提供时 变量是否必须填写can-skip = true模板解析
sswa 的模板功能基于 [TinyTemplate](https://github.com/bheisler/TinyTemplate) 修改而来,支持变量、条件语句等。目前除 default-user 之外的所有字段均已支持模板字符串。
变量
嵌入变量的格式为 {{变量名}}。如上文中的 {{ s7i }}。sswa 自带了部分系统变量,以 $ 字符开头,如下表所示:
| 变量名 | 说明 |
$config_root | sswa 配置文件的根目录 |
$file_name | 第一个投稿视频的文件名(包含后缀名) |
$file_stem | 第一个投稿视频的文件名(不包含后缀名) |
$file_pwd | 第一个投稿视频所在的目录 |
一个使用了较多变量的例子如下:
# 以去除扩展名的第一个文件的文件名为标题title = "{{$file_stem}}"description = "上传文件名:{{ss_file_name}},包含扩展名"tid = 152# 封面为 config 目录下的 cover.jpgcover = "{{$config_path}}/cover.jpg"dynamic-text = ""video-prefix = [ # 第一个视频同目录下的 prefix.mkv "{{$file_pwd}}/prefix.mkv", # 重复上传一遍第一个视频(很神秘) "{{$file_pwd}}/{{$file_name}}",]去除空字符(Trim)
上文中的 {{、}}、{% 和 %} 旁边有一个字符 -,这个字符就是用来去除空字符的。空字符包括空格、换行、制表符等,- 字符在哪一侧,就去除哪一侧的空字符。
以下面的模板为例,假设 s7i 的内容为 s7i,则输出的内容为 s7i123。如果没有 -,输出的内容则是 s7i 123。- 去除了 <空格>123 字符串中靠近 {{ s7i }} 部分的空字符。
{{ s7i -}} 123语句
语句以 {% 开始,%} 结束。条件语句包括 {% if <condition> %},{% else %} 和 {% endif %}。
如下文中的 dynamic-text 就使用了 s7i 变量。当该变量存在时,动态的文本为 私は妻の(s7i的内容)を愛しています。
title = "Title"description = '''Description'''tid = 152cover = "./cover.jpg"dynamic-text = "{% if s7i -%} 私は妻の {{- s7i -}} を愛しています。{%- endif %}"简单投稿
对于基本的投稿,可以通过以下命令完成。
./sswa.exe upload -t 模板名 视频1.mkv 视频2.mp4当模板中存在变量时,sswa 会提示用户输入变量。所有变量均输入完成后,会向用户展示投稿内容,并要求用户复核。
复核通过后,sswa 会对视频和封面进行上传,之后要做的就只有等待了。
变量文件
通过命令行的提示输入变量内容固然可取,但一旦出现问题,所有的内容就需要重新输入一遍,有点麻烦。所以 sswa 支持通过变量文件的方式指定变量的内容,并通过 -f 指定变量文件的路径。
简单格式
变量文件的简单格式是以行为单位的 key=value 格式。如下例:
# 注释num=459title=炸红薯条与mocho认证食品translators=名羊茨尔戈 千和铭 Yuki MochizukiShigure 悠风jiaodui=ていsubtitle=某昨Pdate=2022-04-14cover=nagian-2.jpeg以 # 开头的行是注释,不会被解析;普通的变量行则是 key=value 的形式进行解析,value 部分的 \n 会被替换成换行。
参数 --quote 用于控制 value 部分单双引号的处理行为。当未指定时,value 部分的成堆引号将会被移除,以保持和旧版 env 行为的一致。
JSON 格式
当变量文件的第一个字符为 { 时,会以 JSON 格式进行解析。JSON 格式下的变量不会被作任何特殊处理。
增加分P
对使用了 sswa 投稿的视频,如果投稿用户的粉丝数量在 1000 以上,即可通过网页端添加分P。但其他情况下,分P是无法增加的。因此 sswa 提供了添加分P 的功能。命令如下:
./sswa.exe append -v <视频ID> test.mp4其中的 <视频ID> 使用 av 号或 BV 号均可。