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 に関わるこの部分の処理を言葉で説明すると、こんな感じです。
- smartfeed.init が実行される。
- $self->update->feeds で現在持っているフィードをすべて抽出。ただし、 この中にはまだ SmartFeed::All なフィードは存在しない 。
- smartfeed.entry フェーズが実行され、このフェーズで SmartFeed::All なフィードが作られる。この時点では まだ Filter::Rule は実行されていないので、Deduped される前のエントリがすべて含まれることになる 。
- smartfeed.feed フェーズが実行され、Filter::Rule による Deduped が行われる。 ただし、SmartFeed::All なエントリは、$self->update->feeds で抽出したフィードの中にはないので、SmartFeed::All なエントリは Deduped の対象外 。
- smartfeed.finalize フェーズで、SmartFeed::All なフィードが add される。(つまり、Plagger がハンドルするフィードの中に登録されることになる。)
これを要約すると、
- SmartFeed::All なフィードは、各フィードが Deduped される前につくられる。
- SmartFeed::All なフィードは smartfeed.feed フェーズを通過しないので、Filter::Rule が適用されない。
といった理由で、SmatFeed:All なフィードに Filter::Rule が適用されない、ということになります。
では、すべてのフィードをひとつにまとめた上で Rule を適用したい場合にどう書けばいいのか、ということになりますが、以下の様に書けば OK です。
- module: SmartFeed rule: module: Deduped