Bulknews::Subtech RSSフィード

2006/09/25 (月)

[Plagger] Discovery proof of concept 03:16  [Plagger] Discovery proof of concept - Bulknews::Subtech を含むブックマーク はてなブックマーク -  [Plagger] Discovery proof of concept - Bulknews::Subtech

IRC にて、del.icio.us のフィードを Subscription::Feed に食わせて、その各URL に対するはてなブックマークのフィード (b.hatena.ne.jp/entry/rss/$url) を集めてくる には? という質問があったのでちょっと書いてみた。

package Plagger::Plugin::Discovery::HatenaBookmarkComments;
use strict;
use base qw( Plagger::Plugin );

sub register {
    my($self, $context) = @_;
    $context->register_hook(
        $self,
        'customfeed.handle' => \&handle,
    );
}

sub handle {
    my($self, $context, $args) = @_;

    my $url = $args->{feed}->url;
       $url =~ s/#/%23/;
    $args->{feed}->url("http://b.hatena.ne.jp/entry/rss/$url");

    return; # not success ... to be fetched with Aggregator::Simple
}

1;

このあたりは ページが見つかりません。 - Plagger とか ページが見つかりません。 - Plagger でもっとスマートに、かつ assets とかを使って透過的にやりたいなとは思っていますが、現状でもこのコードで動きますね。

やってることはシンプルで customfeed.handle をフックして $args->{feed}->url を書き換えつつ最後に return しているのがポイント。customfeed.handle は run_hook_once なるメソッドでフックが実行されているため、Chain of Responsibilities パターンとなっている。return; することによってその後に実行される Aggregator::Simple が読み込む URL を変えているというわけ。

Aggregator::Simple は config.yaml になければ自動で読み込みされるので、デフォルトでは customfeed.handle フェーズの最後で実行される。