Files
Auto_Bangumi/examples/plugins/run-command
Estrella Pan 81bbf9c71d fix(plugins): 审查修复——示例插件与通知渠道的若干问题
- run-command:等待进程退出而不是等 stderr 关闭(后台子进程不再导致误判超时),
  stderr 写临时文件取末尾;只替换整项为 {字段} 的参数,{files} 展开为每个文件
  一个参数,夹带的占位符原样保留;不把宿主自己的 AB_* 环境变量传给命令;README
  说明脚本从 AB_* 环境变量读取事件数据
- strm-writer:路径规范化后为媒体根目录本身(. / ..)时跳过,不再写出 STRM 目录之外的文件
- slack-notifier / onebot-notifier:带海报发送失败时去掉图片只发文字重试一次
- wpush-notifier / onebot-notifier:非 2xx 时报告 HTTP 状态,响应不是 JSON 时不再报解析异常
- 插件通知渠道的 extra 包含已填写的已声明字段(group、icon 等),不只是 model_extra
- 新增通知渠道时切换类型会清掉上一类型的字段,避免 Bark 带上残留的 Webhook URL
2026-10-21 11:05:59 +02:00
..

运行外部命令(示例插件)

种子整理完成(torrent.organized)或文件被重命名(file.renamed)后运行一条外部命令,例如自己的清理脚本、FileBot、hlink。演示:

  • @subscribe("*", timeout=...) 订阅全部事件,按配置过滤;处理超时放宽到命令超时之上
  • asyncio.create_subprocess_exec 直接执行参数列表,不经过 shell
  • 命令超时被杀掉,退出码非 0 时记录 stderr 末尾;失败只记日志,不让插件被熔断

配置

字段 说明
命令 程序及其参数,每项一个,如 /config/scripts/link.sh、{files}。不经过 shell,管道、重定向、$变量 都不会展开;需要时把命令写成脚本
事件 在哪些事件后运行,默认只有 torrent.organized
超时(秒) 默认 300,最大 3600。超时后杀掉命令

传给命令的字段

每个字段都是环境变量。参数列表里某一项整项写成占位符(环境变量名去掉 AB_ 后的小写,如 {torrent_hash})时,这一项替换为字段值;{files} 展开为每个文件一个参数。只替换整项:--hash={torrent_hash}、sh -c "echo {new_path}" 这类夹在参数里的占位符不替换,原样传给程序;未知的占位符也原样保留。

文件名来自 RSS,可能含有 ;、$()、引号。不要把占位符写进 sh -c 的脚本文本,脚本里从 AB_* 环境变量读取事件数据,并给变量加双引号:

#!/bin/sh
# /config/scripts/on-rename.sh,命令填 ["/config/scripts/on-rename.sh"]
ln -f "$AB_NEW_PATH" "/media/links/$(basename "$AB_NEW_PATH")"
环境变量 事件 内容
AB_EVENT 全部 事件名
AB_BANGUMI_ID 全部 番剧 id;旧种子没有 ab:<id> 标签时为空
AB_DOWNLOADER_ID 全部 下载器实例 id
AB_TORRENT_HASH torrent.organized 种子 hash
AB_FILES torrent.organized 正片与字幕的最终路径,每行一个
AB_OLD_PATH / AB_NEW_PATH file.renamed 重命名前后的路径
AB_FILE_KIND file.renamed media 或 subtitle

命令继承 AutoBangumi 的环境变量,但 AutoBangumi 自己的 AB_*(如下载器密码)不传给命令。事件里没有种子的保存目录,需要时从 AB_FILES 取。路径是下载器视角,AutoBangumi 与下载器的挂载不同时,脚本要自己换算。命令按事件顺序逐个运行,一个命令运行时后面的事件排队。

torrent.organized 的投递是「至少一次」:每次 AutoBangumi 重启,已整理的种子会再发布一次。脚本必须幂等。

安装

cp -r examples/plugins/run-command config/plugins/local/

在「设置 → 插件」中开启「允许未签名插件」,启用并填写命令。Docker 中命令在 AutoBangumi 的容器里运行,只能使用镜像里有的程序和挂载进来的脚本。

测试

cd examples/plugins/run-command && uv run pytest

对应 issue:#897、#668