Seacolor Labs. このページをアンテナに追加 RSSフィード

2006-06-15

[] CustomFeed::SoftAntenna作ってみました 13:14  CustomFeed::SoftAntenna作ってみました - Seacolor Labs. を含むブックマーク はてなブックマーク -  CustomFeed::SoftAntenna作ってみました - Seacolor Labs.  CustomFeed::SoftAntenna作ってみました - Seacolor Labs. のブックマークコメント

ソフトアンテナ更新情報を取得。

CustomFeedでやるのが正しいかとか以前に「それPlaggerでやらなくてもいいんじゃね?」という声が聞こえてきそうですがそれはまあ気にしない方向でひとつ。

package Plagger::Plugin::CustomFeed::SoftAntenna;
use strict;
use base qw( Plagger::Plugin );

use Plagger::UserAgent;
use Plagger::Util;
use Encode;
use URI;
use URI::QueryParam;

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

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

    if ($args->{feed}->url =~ m!^http://www\.softantenna\.com/!) {
        $self->aggregate($context, $args);
        return 1;
    }

    return;
}

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

    my $url = URI->new($args->{feed}->url);

    $context->log(info => "GET $url");

    my $agent = Plagger::UserAgent->new;
    my $res = $agent->fetch($url, $self);

    if ($res->http_response->is_error) {
        $context->log(error => "GET $url failed: " . $res->status_line);
        return;
    }

    my $content = Plagger::Util::decode_content($res);
    my $title   = Plagger::Util::extract_title($content);

    my $feed = Plagger::Feed->new;
    $feed->title(decode('iso 2022-jp', $title));
    $feed->link($args->{feed}->url);

    while ($content =~ m!<li class=saitem><strong><a href="(https?://[^"]*)">(.*?)</a>[^\n]+\n<span class=small>(.*?)</span>\n!g) {
        my($link, $title, $body) = ($1, $2, $3);

        my $entry = Plagger::Entry->new;
        $entry->title(decode('iso 2022-jp', $title));
        $entry->link($link);
        $entry->body(decode('iso 2022-jp', $body));

        $feed->add_entry($entry);
    }

    $context->update->add($feed);
}

1;

__END__

=head1 NAME

Plagger::Plugin::CustomFeed::SoftAntenna - Create SoftAntenna feed

=head1 SYNOPSIS

  - module: Subscription::Config
    config:
      feed:
        - http://www.softantenna.com/index.html

  - module: CustomFeed::SoftAntenna

=head1 DESCRIPTION

This plugin creates a feed off of SoftAntenna HTML pages.

=head1 AUTHOR

Kazushi Tominaga

=head1 SEE ALSO

L<Plagger>

=cut