SmartFeed::All で生成されるフィードには Filter::Rule は適用できない

いまさら聞けない? 初心者向けPlagger設定覚え書き その5 というエントリで、

  - module: Filter::Rule
    rule:
      module: Deduped

  - module: SmartFeed::All

といった設定(一部のみ抜粋)をしていて、

過去に抽出したことのあるエントリも抽出してしまう(Dedupedによる削除がうまくできていない)という問題点がありました。

と書かれているのですが、こうなる理由を理解するためには、 SmartFeed::All と Filter::Rule が動作するフェーズと、実際にどの様な流れで処理されているかを理解する必要があります。

Filter::Rule も SmartFeed::All も、どちらも smartfeed.* フェーズで動作します。実際に Plagger.pm 中で smartfeed.* フェーズを実行している部分のコードは、以下の様になっています。

    $self->run_hook('smartfeed.init');
    for my $feed ($self->update->feeds) {
        for my $entry ($feed->entries) {
            $self->run_hook('smartfeed.entry', { feed => $feed, entry => $entry });
        }
        $self->run_hook('smartfeed.feed', { feed => $feed });
    }
    $self->run_hook('smartfeed.finalize');

SmartFeed::All と Filter::Rule に関わるこの部分の処理を言葉で説明すると、こんな感じです。

これを要約すると、

といった理由で、SmatFeed:All なフィードに Filter::Rule が適用されない、ということになります。

では、すべてのフィードをひとつにまとめた上で Rule を適用したい場合にどう書けばいいのか、ということになりますが、以下の様に書けば OK です。

  - module: SmartFeed
    rule:
      module: Deduped