RSS Forwarder は先週、日次カードと通常メディア配信を安定させました。今週は別の読書パターンへ進みました。RSS 更新を一件ずつ即時に送るのではなく、決まった時刻に新しい項目をまとめ、一つの読みやすい集約メッセージにします。
この形は、個人の読書、趣味チャンネル、低い割り込み頻度の情報流に向いています。RSS の自動収集は残しつつ、配信リズムを source 起点の即時通知から、時間窓ごとの整理へ変えます。
プロジェクト概要
このプラグインは RhoninSeiei/astrbot_plugin_rss_forwarder で公開されています。主要設定は引き続き feeds、targets、jobs、daily_digests ですが、jobs は五項目の cron 式をトリガーとして使えるようになりました。
コードでは、scheduler.py が cron 式を解析して次回実行時刻を計算し、dispatcher.py が target 単位の確認と送信を保ちます。pipeline.py は集約タイトルと段落要約を作り、aggregate_card_image.py は Pillow でローカル集約カードを描画します。テストは設定解析、cron スケジュール、LLM JSON 解析、フォールバック要約、画像カードの項目保持を確認します。
Cron トリガー
jobs[].cron は、分、時、日、月、曜日の五項目を扱います。たとえば 0 9,18 * * * は毎日 09:00 と 18:00 に実行されます。同じ job に cron と interval_seconds が両方ある場合、スケジューラは cron を優先し、interval は互換用の値として残します。
これにより、一つのプラグインで高頻度通知と固定時刻のまとめを両方扱えます。個人の読書では、朝と夜に一回ずつ届く集約メッセージの方が、多数の即時通知より処理しやすい場合があります。
集約配信
新しい jobs[].aggregate_enabled は、フィルタ後の新規項目を一件ずつ送るのではなく、集約パイプラインへ渡します。集約前にも、履歴フィルタ、正確な重複判定、target 単位の確認、意味的な重複判定はそのまま行います。
集約モデルには、短いタイトルと複数の段落要約を返すよう求めます。プロンプトでは、カードのヘッダに向いた短いタイトル、簡体字中国語の段落タイトルと要約、コロン付きの冗長な前置きを避けることを求めます。出力は分析報告ではなく、カードとして読める形を目指します。
LLM が使えない、タイムアウトする、無効な JSON を返す場合は、ローカルの番号付き一覧へ戻します。後続の変更では、フォールバック時にも翻訳強化を先に通すため、集約失敗時に突然 raw source のタイトルと要約へ戻りにくくなりました。
集約カード
jobs[].aggregate_render_mode=image は、Pillow でローカル PNG カードを描画します。カードにはタイトル、source 情報、項目数、段落タイトル、要約が入ります。aggregate_include_images を有効にすると、項目画像をローカルへキャッシュし、対応する段落の横に描画しようとします。
このカードの価値は日次カードと似ています。複数項目を一つの読みやすい対象へ圧縮することです。違いはリズムです。日次カードは一日一回の整理に向き、cron 集約は数時間ごとに更新を見る使い方に向いています。
維持管理メモ
今回の更新により、RSS Forwarder は一件ずつの転送ツールから、軽量な情報整理ツールへさらに近づきました。cron がリズムを決め、集約が表現を整え、target 単位の確認が複数宛先配信を保ち、ローカルカードが読みやすい表示面を提供します。
個人的な興味の記録として、この変更は個別に残す意味があります。単なる設定項目の追加ではなく、source 読み込み、重複判定、要約、画像描画、送信確認を、日常の読書に合う形へ組み替えた更新です。