| 1 |
package Plagger::Plugin::Subscription::Toranoana; |
|---|
| 2 |
|
|---|
| 3 |
use strict; |
|---|
| 4 |
use warnings; |
|---|
| 5 |
|
|---|
| 6 |
use base qw( Plagger::Plugin ); |
|---|
| 7 |
|
|---|
| 8 |
use Plagger::Util; |
|---|
| 9 |
use Plagger::Feed; |
|---|
| 10 |
use Plagger::Entry; |
|---|
| 11 |
use Plagger::UserAgent; |
|---|
| 12 |
|
|---|
| 13 |
use URI; |
|---|
| 14 |
use HTML::TreeBuilder::XPath; |
|---|
| 15 |
|
|---|
| 16 |
sub register { |
|---|
| 17 |
my ($self, $context) = @_; |
|---|
| 18 |
$context->register_hook( |
|---|
| 19 |
$self, |
|---|
| 20 |
'subscription.load' => \&load, |
|---|
| 21 |
); |
|---|
| 22 |
} |
|---|
| 23 |
|
|---|
| 24 |
sub load { |
|---|
| 25 |
my($self, $context) = @_; |
|---|
| 26 |
|
|---|
| 27 |
my $feed = Plagger::Feed->new; |
|---|
| 28 |
$feed->aggregator( sub { $self->aggregate(@_); }); |
|---|
| 29 |
$context->subscription->add($feed); |
|---|
| 30 |
} |
|---|
| 31 |
|
|---|
| 32 |
sub aggregate { |
|---|
| 33 |
my($self, $context) = @_; |
|---|
| 34 |
|
|---|
| 35 |
my @tora_newka_shops = @{$self->conf->{shop}}; |
|---|
| 36 |
my $day = $self->conf->{day} || _today(time); |
|---|
| 37 |
|
|---|
| 38 |
for my $shop (@tora_newka_shops) { |
|---|
| 39 |
$self->aggregate_feed($context, $shop, $day); |
|---|
| 40 |
} |
|---|
| 41 |
} |
|---|
| 42 |
|
|---|
| 43 |
|
|---|
| 44 |
sub aggregate_feed { |
|---|
| 45 |
my($self, $context, $shop, $day) = @_; |
|---|
| 46 |
|
|---|
| 47 |
my $newka_uri = URI->new("http://www.toranoana.jp/shop/newka/${day}/${shop}_all.html"); |
|---|
| 48 |
my $response = Plagger::UserAgent->new->fetch($newka_uri); |
|---|
| 49 |
if ($response->is_error) { |
|---|
| 50 |
Plagger->context->log(error => "GET $newka_uri failed: " . |
|---|
| 51 |
$response->http_status . " " . |
|---|
| 52 |
$response->http_response->message); |
|---|
| 53 |
} |
|---|
| 54 |
my $data = Plagger::Util::decode_content($response->content); |
|---|
| 55 |
|
|---|
| 56 |
my $tree = HTML::TreeBuilder::XPath->new; |
|---|
| 57 |
|
|---|
| 58 |
$tree->parse($data); |
|---|
| 59 |
my $path = '//body/div[3]/table'; |
|---|
| 60 |
|
|---|
| 61 |
my $booknodes; |
|---|
| 62 |
eval { |
|---|
| 63 |
$booknodes = $tree->findnodes($path); |
|---|
| 64 |
} or die $@; |
|---|
| 65 |
|
|---|
| 66 |
my $feed = Plagger::Feed->new; |
|---|
| 67 |
$feed->title("Toranoana\@$shop"); |
|---|
| 68 |
$feed->link($newka_uri); |
|---|
| 69 |
for my $book (@$booknodes) { |
|---|
| 70 |
$self->_add_entry($context, $feed, $book); |
|---|
| 71 |
} |
|---|
| 72 |
$context->update->add($feed); |
|---|
| 73 |
} |
|---|
| 74 |
|
|---|
| 75 |
sub _add_entry { |
|---|
| 76 |
my($self, $context, $feed, $book) = @_; |
|---|
| 77 |
|
|---|
| 78 |
my $html = $book->as_HTML('<>&'); |
|---|
| 79 |
if (my @table = ($html =~ m|<td[^>]*>([^<]*)</td>|g)) { |
|---|
| 80 |
my $book_id = $table[0]; |
|---|
| 81 |
|
|---|
| 82 |
if ( |
|---|
| 83 |
($html =~ /color\: \ |
|---|
| 84 |
and ($self->conf->{yaoi_block}) |
|---|
| 85 |
) |
|---|
| 86 |
{ |
|---|
| 87 |
$context->log(info => "$book_id is yaoi"); |
|---|
| 88 |
return; |
|---|
| 89 |
} |
|---|
| 90 |
|
|---|
| 91 |
$book_id =~ /^(\d{2})(\d{4})(\d{2})(\d{2})/; |
|---|
| 92 |
my $book_link = "http://www.toranoana.jp/mailorder/article/$1/$2/$3/$4/$book_id.html"; |
|---|
| 93 |
my $img_link = "http://img.toranoana.jp/img/$1/$2/$3/$4/$book_id-%d.gif"; |
|---|
| 94 |
my $body; |
|---|
| 95 |
my $tag = sprintf("<img src=\"%s\" />", $img_link); |
|---|
| 96 |
for my $i (1..3) { |
|---|
| 97 |
$body .= sprintf($tag, $i) . "\n"; |
|---|
| 98 |
} |
|---|
| 99 |
|
|---|
| 100 |
my $entry = Plagger::Entry->new; |
|---|
| 101 |
$entry->title($table[2]); |
|---|
| 102 |
$entry->link($book_link); |
|---|
| 103 |
$entry->body($body); |
|---|
| 104 |
$entry->author($table[1]); |
|---|
| 105 |
$entry->tags([$table[3]]); |
|---|
| 106 |
|
|---|
| 107 |
$feed->add_entry($entry); |
|---|
| 108 |
} |
|---|
| 109 |
} |
|---|
| 110 |
|
|---|
| 111 |
sub _today { |
|---|
| 112 |
my @t = localtime(shift); |
|---|
| 113 |
my $day = sprintf("%02d%02d", $t[4]+1, $t[3]); |
|---|
| 114 |
return $day; |
|---|
| 115 |
} |
|---|
| 116 |
|
|---|
| 117 |
1; |
|---|