[4.0] — Beta
4.0 はプラグイン化のための大型リリースです。ダウンロード、通知、解析、検索、リネーム、ファイル整理はすべて同じ拡張ポイントで実装され、内蔵機能とサードパーティープラグインは同じインターフェースを使います。ダウンローダーは複数のインスタンスを持てるようになり、リネーム、ハードリンク、トレントフィルター、メディアサーバーの更新は内蔵プラグインが提供します。アップグレードは 3.3.x からのみ対応し、初回起動時に設定を自動移行して元のファイルをバックアップします。
アップグレード手順、ロールバック方法、アップグレード後の確認項目は 3.3 から 4.0 へのアップグレード を参照してください。
4.0.0-beta.3
互換性のない変更
- MCP は Streamable HTTP に変わり、エンドポイントは
/mcpです。旧/mcp/sseは削除されました。MCP クライアントのアドレスを更新してください。 - JSON ボディを持つ API 呼び出しは
Content-Type: application/jsonを送る必要があります。送らない場合は 422 を返します。 - 未知の
/api/…パスは 404 を返し、WebUI ページを返しません。 - プラグイン SDK(
ab_sdk)0.6.0:AdapterContext.build_http_clientはhttpx2.AsyncClientを返します。get/postだけを呼ぶプラグインは変更不要です。httpx 固有の API を使うプラグインは更新が必要です。 - 実行環境:Python 3.14。
4.0.0-beta.1
Docker イメージ:ghcr.io/estrellaxd/auto_bangumi:4.0.0-beta.1(dev-latest も最新のベータ版を指します)。
互換性のない変更
- 3.3.x からのみアップグレード可能。 古いバージョンのデータ(
config/version.infoが 3.3 未満、または 2.x のdata/data.jsonが残っている)を検出すると起動を拒否し、最新の 3.3.x に一度アップグレードして起動するよう案内します。 - 設定構造の変更と自動移行。 ダウンローダーは
plugins.instancesのインスタンスになり、plugins.slots.downloaderが既定インスタンスを指します。リネーム方式とリビジョン競合ポリシーはplugins.slots.rename_strategy/plugins.slots.conflict_policyに移りました。初回起動時に 3.3 のdownloader、bangumi_manage.rename_method、bangumi_manage.revision_conflict_policyを自動移行し、元のファイルをconfig.json.v3.bakにバックアップします(既存のバックアップは上書きせず、config.json.v3.bak.1などに保存)。移行に失敗するとconfig.jsonはそのまま残り、起動を拒否し、ログに原因のフィールドを表示します。AB_DOWNLOADER_*、AB_DOWNLOAD_PATH、AB_METHOD、AB_REVISION_CONFLICT_POLICY環境変数は引き続き有効です。 - 通知チャンネルの旧フィールド。 Bark は
tokenを読まなくなりました(device_keyを使用)。WeCom はchat_idを読まなくなりました(webhook_urlを使用)。アップグレード時に自動移行します。 - 旧 API の削除。 3.2 互換の GET 制御エンドポイント(
/api/v1/restart、/start、/stop、/shutdown)とGET /api/v1/auth/refresh_tokenを削除しました。POST を使ってください。 - 旧設定の削除。
experimental_openai設定セクションと通知の単一チャンネル用旧フィールドを削除しました(3.3 でllmとnotification.providersに移行済み)。非推奨のnormalリネーム方式を削除し、既存の設定は同じ動作のnoneに自動変更します。 - データベースは schema v26 に自動更新されます(プラグイン用ストレージテーブルと
downloader_id列を追加)。
プラグインシステム
- 新しいプラグインランタイム。プラグインは内蔵フォルダー、署名済みプラグインカタログ、ローカルフォルダー(
config/plugins/local/)、pip パッケージから読み込めます。ローカルと pip のプラグインは署名されていないため、設定 → プラグイン → 未署名プラグインを許可(plugins.allow_unsigned)をオンにしたときだけ読み込まれます。 - プラグインはダウンローダー、通知チャンネル、LLM パーサープロバイダー、検索サイト、メタデータソース、定期タスクを提供できます。内蔵の qBittorrent / aria2 と各通知チャンネルも同じ拡張ポイントを使います。ダウンローダーの種類、通知チャンネル、購読パーサーのドロップダウンにはプラグインの選択肢も表示されます。
- RSS ダウンロードの流れの中で、プラグインはトレントのフィルター、解析結果の修正、保存パス / カテゴリー / タグの変更、プライベートサイト向けの Cookie などのリクエストヘッダーの追加ができます。
- 設定ページに「プラグイン」カードを追加しました。状態の確認、有効化 / 無効化、自動生成されるフォームでのプラグイン設定の編集ができます。秘密フィールドは読み取り API で常にマスクされます。
- 署名済みプラグインカタログ:
GET /api/v1/plugins/catalogでカタログを一覧し、POST /api/v1/plugins/{id}/installで sha256 と ed25519 署名を検証してからインストールして有効にし、DELETE /api/v1/plugins/{id}でアンインストールします。 - プラグインのフック呼び出しにはタイムアウトがあります。同じプラグインが 5 回連続で失敗すると自動的に無効になります。問題を直してから設定ページで再度有効にしてください。
複数のダウンローダー
- 設定 → ダウンローダー設定 で複数のダウンローダーインスタンス(qBittorrent、aria2、またはプラグインのダウンローダー)を追加し、既定インスタンスを指定できます。
- ルールと RSS 購読はダウンローダーを選択できます。空欄なら既定インスタンスを使います。購読から作成されたルールは購読の選択を引き継ぎます。
- 各トレントは所属するダウンローダーを記録し、リネームと削除はそのダウンローダー上で行います。ルールが別のダウンローダーに変わっても、既存のトレントは元の場所に残ります。
- リネームはダウンローダーごとに実行します。接続できないダウンローダーはスキップし、最初に接続できなかったときに通知します。
- ダウンローダーページとトレント一覧に、トレントが属するダウンローダーを表示します。
GET /api/v1/downloader/torrentsはすべてのインスタンスのトレントを返し、一時停止 / 再開 / 削除 / タグ付けのエンドポイントにdownloader_idを追加しました。GET /api/v1/downloader/instancesを追加しました。
リネームとファイル整理
- リネームはプラグインになりました。
pn/advance/templateは既定で有効な内蔵プラグインrenameが提供し、noneは AB 本体が提供します。pn/advanceの出力は 3.3 と完全に同じです。字幕は動画と同じ方式を使います。 - 新しいリネーム方式
template:テンプレートでファイル名を自由に決められます。通常のエピソードでは既定のテンプレートはpnと同じ結果になります(劇場版ではpnはSxxExxを付けませんが、既定のテンプレートは付けます)。保存時に試しにレンダリングし、不正なテンプレートは保存できません。実行時にレンダリングに失敗したファイルは元の名前のまま残り、通知が送られます。pnへのフォールバックはしません。 - 新しい内蔵プラグイン
hardlink(既定で無効):トレントの整理が終わると、動画と字幕をメディアライブラリのフォルダーにリンクします。ダウンロードフォルダーはシードを続けます。ダウンローダーインスタンスごとにパスの対応(path_map)を設定します。ファイルシステムをまたぐ場合は既定でコピーします。自分が作っていないファイルは上書きせず、リビジョン更新後は自分が作ったリンクを置き換えます。コピーが中断しても、ライブラリに途中までのファイルは残りません。既存のファイルはPOST /api/v1/plugins/hardlink/backfillでリンクできます。 - 新しい内蔵プラグイン
media-server-refresh:Jellyfin / Emby / Plex のアドレスと API キーを設定すると、一定時間内に整理が終わったトレントをまとめて、ライブラリの更新を要求します。設定しなければ何もしません。 - 新しい内蔵プラグイン
ingest-filters(既定で有効):includeオプションを設定すると、名前がいずれかの式に一致するトレントだけをダウンロードします(すべての購読に適用)。空欄なら何もフィルターしません。
イベント、API、MCP
- システムイベント(RSS 購読のエラー、トレント追加の失敗、ダウンローダーの接続不可、新バージョン、ファイルのリネーム、トレントの整理完了など)はイベントバスに送られ、プラグインから購読できます。
- プラグインは REST ルート(
/api/v1/plugins/<プラグイン id>/配下、ログイン必須)、MCP ツール、MCP リソースを提供できます。また、イベントの種類とチャンネルごとにシステム通知のタイトルと本文を書き換えられます。 - プラグインは通知センターに通知を送れます。
- 通知センターはイベントで更新されるようになり、新着、既読、削除がすぐに反映されます(以前は 3 秒ごとに確認)。
フロントエンドプラグイン
- WebUI にプラグインのマウントポイントを追加しました。プラグインは指定の場所に独自の UI(Web Component)を追加できます。内蔵の
hardlinkプラグインはこれを使ってリンク補完のボタンを提供します。 - フロントエンドのマウントポイントの使い方を示すサンプルプラグイン
manual-pickを追加しました。
プラグイン開発ツール
- プラグイン SDK
ab_sdkをautobangumi-sdkwheel として各 GitHub Release に添付します(PyPI には公開しません)。 - 新しい
ab-pluginコマンドライン:newはプラグインの雛形と契約テストを生成し、validateはマニフェストと SDK バージョン範囲を検証し、packはインストール可能な zip を作り、devはプラグインフォルダーをconfig/plugins/local/にリンクしてplugins.dev_modeをオンにします。dev_modeがオンのとき、ローカルプラグインのファイルを変更すると自動的に再読み込みされます。 ab_sdk.testingにダウンローダー、リネーム方式、通知チャンネル、検索サイトの契約テストスイートを追加しました。examples/plugins/に 5 つのサンプルプラグインを追加しました:webhook-on-event、custom-rss-site、template-rename、nfo-writer、ntfy-notifier。CI がそれぞれのテストを実行します。- プラグイン作者向けの agent skill を各 GitHub Release に
autobangumi-plugin-skill-<バージョン>.zipとして添付します。 - プラグイン開発ドキュメントを概要、基本概念、拡張ポイントごとのページに分けました(中国語 / 英語 / 日本語)。プラグイン開発 を参照してください。
修正
- 新しく保存した検索サイトが、再起動するまで検索サイト一覧に表示されませんでした。今はすぐに表示されます。
- MCP クライアントが SSE 接続を閉じると、ログに
AssertionError: Unexpected message http.response.startが出ていました(3.x から存在)。 - プラグイン設定のバリデーターがエラーを出したとき、保存 API が 422 ではなく 500 を返していました。
version.infoがマイナーバージョンだけを比較していたため、メジャーバージョンをまたぐアップグレード(3.3 → 4.0 など)が記録されませんでした。- 4.x は実行バージョンを
config/version_v4.infoに書き込み、3.3 のデータで初めて起動したときにデータベースをdata/data.db.v3.bakにバックアップします。3.3 へのロールバックで 3.0 の移行が誤って実行され、データベースが作り直されることはなくなりました。
クリーンアップ
- 3.0 → 3.1、3.1 → 3.2 のバージョン間移行、旧 JWT とメモリー内セッションの実装、呼び出し元のない約 70 の関数・メソッド・モデルを削除しました。CI にデッドコードのチェックを追加しました。