root/plagger/trunk/my-plugins/Subscription-Toranoana/Toranoana.pm

Revision 1 (checked in by yohei, 2 years ago)

Add my Plagger plugins

Line 
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\: \#FF99FF/)
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;
Note: See TracBrowser for help on using the browser.