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

2007-09-20

[] Subscription::Toranoana 大きい画像へのリンク付き修正版  Subscription::Toranoana 大きい画像へのリンク付き修正版 - SweetPotato::Plagger を含むブックマーク はてなブックマーク -  Subscription::Toranoana 大きい画像へのリンク付き修正版 - SweetPotato::Plagger  Subscription::Toranoana 大きい画像へのリンク付き修正版 - SweetPotato::Plagger のブックマークコメント

とらのあなの各店舗の出庫同人誌一覧を取得し,同人誌の小さいサンプル画像と通販ページにある個々の同人誌ページへのリンクを出力する,d:id:fubaさん作のSubscription::Toranoana

私はこのプラグインの常用者なんだけど,最近(というか大分前なのかな?)個々の同人誌ページに大きいサンプル画像へのリンクが追加されたようなので,プラグインの出力結果にも大きい画像へのリンクを含めるようにしてみた。ついでにリファクタリングをしたり,ログメッセージを詳しくしてみた。

Plagger/Plugin/Subscription/Toranoana.pm

本文に3枚のサンプル画像が表示されるのは以前と同じだが,各画像を選択すると大きい画像にジャンプする。「画像サイズが小さすぎてエロシーンが読めねえ!」とお嘆きの俺もこれで一安心。

package Plagger::Plugin::Subscription::Toranoana;
use base qw( Plagger::Plugin );
use strict;
use warnings;

use Plagger::Entry;
use Plagger::Feed;
use Plagger::Util;

use HTML::TreeBuilder::XPath;
use URI;

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

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

    my $shops = $self->conf->{shop};
       $shops = [$shops] unless ref $shops;
    my $day = $self->conf->{day} || Plagger::Date->today->strftime('%m%d');

    for my $shop (@$shops) {
        my $feed = Plagger::Feed->new;
           $feed->aggregator(sub { $self->aggregate($context, $shop, $day) });
        $context->subscription->add($feed);
    }
}

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

    my $feed = Plagger::Feed->new;
       $feed->title('Toranoana@'."$shop $day");

    my $url = URI->new("http://www.toranoana.jp/shop/newka/$day/${shop}_all.html");
    my $tree = HTML::TreeBuilder::XPath->new;
       $tree->parse(Plagger::Util::load_uri($url));

    my $books = eval { $tree->findnodes('//body/div[3]/table') };
    if ($@) {
        $self->log(error => $@);
        return;
    }

    for my $book (@$books) {
        my $entry = $self->create_entry($context, $book) or next;
        $feed->add_entry($entry);
    }

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

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

    my $html = $book->as_HTML('<>&');

    my @record = ($html =~ m!<td[^>]*>([^<]*)</td>!g) or return;
    my ($id, $circle, $title, $genre) = @record;

    my $dir = join '/', ($id =~ /^(\d{2})(\d{4})(\d{2})(\d{2})/);
    my $link = "http://www.toranoana.jp/mailorder/article/$dir/$id.html";

    if ($self->conf->{yaoi_block} && ($html =~ /color: #FF99FF/)) {
        $context->log(info => "$title by $circle ($link) is yaoi");
        return;
    }

    my $body = join '', map {
          qq!<a href="http://img.toranoana.jp/popup_img/$dir/$id-${_}p.jpg">!
        . qq!<img src="http://img.toranoana.jp/img/$dir/$id-$_.gif" />!
        . qq!</a>!
    } (1..3);

    my $entry = Plagger::Entry->new;
       $entry->title($title);
       $entry->link($link);
       $entry->body($body);
       $entry->author($circle);
       $entry->tags([$genre]);

    return $entry;
}

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