Plagger::Plugin::Subscription::Toranoanaでmetaを使ってみる

どうやら世間はmetaブームらしいので、

  • is_yaoi
  • is_adult

をtrue = "1", false = ""で{entry}->meta->{is_*}に入れてみる。真偽値の表現はよくわからない。1/0の方が自然なんだろうかーあーでもフィードだしいやXMLじゃないしうーん。まあPlaggerで動けばいいや。is_adultあたりは夢がありそうだがさて。一晩寝るとmeta汚染が心配になってきた。あーでもどうなんだろうーんまあ気にしない事にしよう。
日付まわりはPlagger::Dateを使うようにした。さらに今までの日付設定(mmdd)のほかにもPPC::MelonBooksのyyyy/mm/dd、あとその辺りの半端な表現に対応。つまりは((yyyy)?mmdd|(yyyy/)?mm/dd)という感じで。といろいろやったけど結局yesterdayとか使いたいよなってことでDateTime::Format::Natural::ENも使ってみたんだけど、うちの環境だと何送っても現在時刻が帰って来るな。

ec% date && perl -MDateTime::Format::Natural::EN -e 'print DateTime::Format::Natural::EN->parse_datetime("yesterday")."\n"'
木 10 26 04:20:58 JST 2006
2006-10-26T04:20:58

こんな感じ。眠いので深追いしないけどそのうち直るのだろうか。つーかユーザが存在することがあきらかになったので後でPOD書いとく。寝る。
コメント欄にもあるよーにtagsにもメタデータ入れてみた。18禁かどうかは個人的にも結構ありだな。あとPOD書いた。
module:行だけで動くよーにしてたのだけど、デフォルト値の扱いミスってたのでデバグ。

config.yaml

例えば男性向けエロ同人だけのフィードをつくるなら、

  - module: Subscription::Toranoana
    config:
      shop:
        - mailorder
        - aki1

  - module: Filter::Rule
    rule:
      expression: (!$args->{entry}->meta->{is_yaoi} && $args->{entry}->meta->{is_adult})

やおいねーちゃん用なら、

  - module: Filter::Rule
    rule:
      expression: $args->{entry}->meta->{is_yaoi}

P/P/S/Toranoana.pm

ここにはDiffだけ。

@@ -8,6 +8,7 @@
 use Plagger::Util;
 use Plagger::Feed;
 use Plagger::Entry;
+use Plagger::Date;
 
 use URI;
 use HTML::TreeBuilder::XPath;
@@ -41,15 +42,17 @@
     my($self, $context, $shop) = @_;
     
     my @t = localtime(time);
-    my $day = $self->conf->{day} || sprintf("%02d%02d", $t[4]+1, $t[3]);
+    my $dt = $self->_datetime;
+    my $mmdd = $dt->strftime('%m%d');
+    my $yyyymmdd = $dt->strftime('%Y%m%d');
     
     my $booknodes = $self->_uri2nodes(
-        "http://www.toranoana.jp/shop/newka/${day}/${shop}_all.html",
+        "http://www.toranoana.jp/shop/newka/${mmdd}/${shop}_all.html",
         "//body/div[3]/table"
     );
     
     my $feed = Plagger::Feed->new;
-    $feed->title("Toranoana\@$shop: $day");
+    $feed->title("Toranoana\@$shop: $yyyymmdd");
     for my $book (@$booknodes) {
         $self->_add_entry($context, $feed, {
             html => $book,
@@ -63,17 +66,17 @@
     my($self, $context) = @_;
     
     my @t = localtime(time);
-    my $day = $self->conf->{day} || sprintf("%02d%02d", $t[4]+1, $t[3]);
-    my $mon = substr($day, 0, 2);
-    my $year = 1900 + $t[5];
+    my $dt = $self->_datetime;
+    my $day = $dt->strftime('%Y/%m/%Y%m%d');
+    my $yyyymmdd = $dt->strftime('%Y%m%d');
     
     my $booknodes = $self->_uri2nodes(
-        "http://www.toranoana.jp/cgi-bin/navi.cgi\?nvl=/mailorder/cot/newly/$year/$mon/$year$day.nvl\&n=1",
+        "http://www.toranoana.jp/cgi-bin/navi.cgi\?nvl=/mailorder/cot/newly/$day.nvl\&n=1",
         "//table"
     );
     
     my $feed = Plagger::Feed->new;
-    $feed->title("Toranoana mailorder: $year$day");
+    $feed->title("Toranoana mailorder: $yyyymmdd");
     for my $book (@$booknodes) {
         $self->_add_entry($context, $feed, {
             html => $book,
@@ -108,6 +111,7 @@
         while (my ($key, $value) = each %$book_ref) {
             eval('$entry->'.$key.'($value)');
         }
+        
         $feed->add_entry($entry);
     }
 }
@@ -120,12 +124,7 @@
     if (my @table = ($html =~ m|<td[^>]*>([^<]*)</td>|g)) {
         my $book_id = $table[0];
         
-        if ($self->_is_yaoi($html, 'color\: \#FF99FF')) {
-            $context->log(info => "$book_id is yaoi");
-            return;
-        }
-        
-        my $dir = join('/', ($book_id =~ /^(\d{2})(\d{4})(\d{2})(\d{2})/)) . $book_id;
+        my $dir = join('/', ($book_id =~ /^(\d{2})(\d{4})(\d{2})(\d{2})/) , $book_id);
         my $link = "http://www.toranoana.jp/mailorder/article/$dir.html";
 
         my $result = {
@@ -136,6 +135,9 @@
             tags => $table[3]
         };
         
+        $result->{meta}->{is_adult} = ($html =~ /color\: \#FF0000/) ? '1' : '';
+        $result->{meta}->{is_yaoi} = ($html =~ /color\: \#FF99FF/) ? '1' : '';
+        
         return $result;
     }
 }
@@ -149,11 +151,6 @@
     my $dir = $1;
     
     if ($dir) {
-        if ($self->_is_yaoi($html, 'navi_icon_bl\.gif')) {
-            $context->log(info => "$dir is yaoi");
-            return;
-        }
-        
         my $link = "http://www.toranoana.jp/mailorder/article/$dir.html";
         
         $html =~ /\>([^\<]+)\<\/a/m;
@@ -161,31 +158,22 @@
         my $result = {
             title => $1,
             link => $link,
-            body => _gen_body($dir, $link)
+            body => _gen_body($dir, $link),
+            meta => {},
         };
         
-        if ($html =~ /<td class\=\"td_block_no_color\">\s+([^<]*)<.*<td class\=\"td_block_color\">\s+([^<]*)</m) {
+        if ($html =~ /<td class\=\"td_block_no_color\">\s+([^<]*)<.*<td class\=\"td_block_color\">\s+([^<]*)</) {
             $result->{tags} = $1;
             $result->{author} = $2;
         }
         
+        $result->{meta}->{is_adult} = ($html =~ /navi_icon_18\.gif/) ? '1' : '';
+        $result->{meta}->{is_yaoi} = ($html =~ /navi_icon_bl\.gif/) ? '1' : '';
+        
         return $result;
     }
 }
 
-sub _is_yaoi {
-    my ($self, $target, $regexp) = @_;
-    if (
-        ($target =~ /$regexp/)
-        and ($self->conf->{yaoi_block})
-        )
-    {
-        return 1;
-    }
-    
-    return undef;
-}
-
 sub _gen_body {
     my ($dir, $link) = @_;
     
@@ -197,5 +185,27 @@
     return $result;
 }
 
+sub _datetime {
+    my $self = shift;
+    my $day = $self->conf->{day};
+    
+    my $dt = Plagger::Date->now;
+    return $dt unless ($day);
+    
+    if ($day =~ /^\d{4}(\d{4})?$/) {
+        if (length($day) == 4) {
+            $day = $dt->year.$day;
+        }
+        if (length($day) == 8) {
+            return Plagger::Date->strptime('%Y%m%d', $day);
+        }
+    }
+    elsif ($day =~ /^[\d\/]{10}$/) {
+        return Plagger::Date->strptime('%Y/%m/%d', $day);
+    }
+    
+    return Plagger::Date->parse("Natural::EN", $day);
+}
+
 1;