SweetPotato::Plagger このページをアンテナに追加 RSSフィード

2007-02-16

[] CustomFeed::TaiyoshaComic  CustomFeed::TaiyoshaComic - SweetPotato::Plagger を含むブックマーク はてなブックマーク -  CustomFeed::TaiyoshaComic - SweetPotato::Plagger  CustomFeed::TaiyoshaComic - SweetPotato::Plagger のブックマークコメント

このプラグインはWeb::Scraperを用いて書き直されました。最新版はCodeReposに置いてあります。

太洋社コミック発売予定一覧の「発売日順」表を解析し,コミックごとにエントリ化する。

CustomFeed::Manganomoriとやっていることは似ているので,普段信頼している情報源にあわせてお好きな方をどうぞ。

Plagger/Plugin/CustomFeed/TaiyoshaComic.pm

モジュール内で日本語を使用しているので,UTF-8(BOMなし)で保存すること。

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

use Plagger::Date;
use Plagger::Util;
use Switch;
use URI;

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

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

    my $ym = $self->conf->{month} || Plagger::Date->now()->strftime("%y%m");

    my $feed = Plagger::Feed->new;
    $feed->aggregator( sub { $self->aggregate($context, $ym); });
    $context->subscription->add($feed);
}

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

    my @urls = map { "http://www.taiyosha.co.jp/comic/comic${ym}_date${_}.html" } (1..2);

    my $feed = Plagger::Feed->new;
    $feed->link($urls[0]);
    $feed->title("大洋社 コミック発売一覧 $ym");

    for my $url (@urls) {
        my $list = $self->parse(Plagger::Util::load_uri(URI->new($url)));

        for my $item (@$list) {
            my $entry = Plagger::Entry->new;
            $entry->title($item->{title});
            $entry->author($item->{author});
            $entry->tags([$item->{publisher}]);
            $entry->body(join ', ', ($item->{author}, $item->{publisher}, $item->{price}));
            $entry->body($entry->body.', '.$item->{shoseki}) if $item->{shoseki};

            if ($item->{day} !~ /^\d+$/) {
                $entry->body($item->{day}.'旬, '.$entry->body);
                $item->{day} = $self->part_to_day($item->{day});
            }
            $entry->date(Plagger::Date->strptime("%y%m%d", $ym.$item->{day}));

            $feed->add_entry($entry);
        }
    }

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

sub parse {
    my ($self, $content) = @_;

    my $list = [];
    while ($content =~ m{
        <TR><TD
        .*?<font.*?>(.*?)/(.*?)</font>
        .*?<font.*?>(.*?)</font>
        .*?<font.*?>(.*?)</font>
        .*?<font.*?>(.*?)</font>
        .*?<font.*?>(.*?)</font>
        .*?<font.*?>(.*?)</font>
    }gsx) {
        push @$list, {
            month => $1, day => $2, publisher => $3, title => $4,
            author => $5, price => $6, shoseki => $7,
        };
    }

    $list;
}

sub part_to_day {
    my ($self, $part) = @_;

    switch ($part) {
        case '上' { return "01"; }
        case '中' { return "11"; }
        case '下' { return "21"; }
    }

    $part;
}

1;

config.taiyosha_comic.yaml

monthには取得したいコミック一覧の年月を %y%m 形式で指定する。指定しない場合は今月のコミック一覧を取得する。

以下の例では出力にPublish::iCalを使用。

plugins:
  - module: CustomFeed::TaiyoshaComic
    config:
      month: 0702
  - module: Publish::iCal
    config:
      dir: .
      filename: taiyosha_comic.ics

関連

トラックバック - http://plagger.g.hatena.ne.jp/SweetPotato/20070216