Gosuke Miyashita about feed

Plagger::Event

26 August 2006

Amazon2iCal で、本やCDなんかの発売日に Google Calendar でメール通知してもらおうと思って設定したのだけど、Google Calendar が通知してくれない。

これはもしかして、Publish::iCal で生成した iCalendar データに時刻が入ってないせいかな、と思い時刻も入れようと思ったんだけど、どうせなら Plagger::Event とか作って、イベントハンドリングしやすくしてしまえ、ってことで、Plagger::Enclosure の様な感じで作ってみた。たったこれだけだけど。

package Plagger::Event;

use strict;

use base qw( Plagger::Thing );
PACKAGE->mk_accessors(qw( dtstart dtend summary description location organizer ));

1;

Event だと色んな意味があって曖昧な気がするから Plagger::iCal::Event とかの方がいいかな、と思ったけど、とりあえずの実装なのでまあいいか、と。

でもってこれに合わせて Plagger::Entry も修正。

Index: plagger/trunk/lib/Plagger/Entry.pm
===================================================================
--- plagger/trunk/lib/Plagger/Entry.pm (revision 238)
+++ plagger/trunk/lib/Plagger/Entry.pm (revision 241)
@@ -19,4 +19,5 @@
         meta    => {},
         enclosures => [],
+        events     => [],
     }, $class;
 }
@@ -102,4 +103,24 @@
 }

+sub add_event {

+sub event {

+sub events {

+sub has_event {

1;

更にこれに合わせて、Publish::iCal と CustomFeed::AmazonWebService も修正。

Index: plagger/trunk/lib/Plagger/Plugin/Publish/iCal.pm
===================================================================
--- plagger/trunk/lib/Plagger/Plugin/Publish/iCal.pm (revision 233)
+++ plagger/trunk/lib/Plagger/Plugin/Publish/iCal.pm (revision 241)
@@ -35,17 +35,19 @@
for my $entry ($feed->entries) {

--- plagger/trunk/lib/Plagger/Plugin/CustomFeed/AmazonWebService.pm (revision 232)
+++ plagger/trunk/lib/Plagger/Plugin/CustomFeed/AmazonWebService.pm (revision 241)
@@ -6,4 +6,5 @@
 use Net::Amazon::Request::Keyword;
 use Encode;
+use Plagger::Event;
 
 sub register {
@@ -59,4 +60,11 @@
             $entry->date($date);
 
+            my $event = Plagger::Event->new;
+            $event->dtstart($date);
+            $event->dtend( $date->clone->add( hours => 1 ) );
+            $event->summary($entry->title . ' - ' . $entry->author);
+            $event->organizer($entry->author);
+            $entry->add_event($event);
+
             $feed->add_entry($entry);
         }
@@ -91,5 +99,5 @@
 
 *Net::Amazon::Property::Music::author = *Net::Amazon::Property::Music::artist;
-*Net::Amazon::Property::DVD::author = sub { return ( $_[0]->starring() )[0] };
+*Net::Amazon::Property::DVD::author   = sub { return ( $_[0]->starring() )[0] };
 
 1;

あと、どうも意図したタイムゾーン通りの時刻にならないと思ったら、Plagger::Date::strptime で使われている DateTime::Format::Strptime は、time_zone を指定しないと、floating になってしまうみたい。なので、config.yaml で指定しているタイムゾーンを使うように修正してみました。

Index: plagger/trunk/lib/Plagger/Date.pm
===================================================================
--- plagger/trunk/lib/Plagger/Date.pm (revision 240)
+++ plagger/trunk/lib/Plagger/Date.pm (revision 241)
@@ -42,5 +42,8 @@
     my($class, $pattern, $date) = @_;
     Encode::_utf8_on($pattern);
-    my $format = DateTime::Format::Strptime->new(pattern => $pattern);
+    my $format = DateTime::Format::Strptime->new(
+        pattern   => $pattern,
+        time_zone => Plagger->context->conf->{timezone} || 'local',
+    );
     $class->parse($format, $date);
 }

trac のチェンジセットはこちら

追記
floating になってるのは こういう理由がある ということで、 CustomFeed::AmazonWebService の方で global: timezone の値を見て、set_time_zone するように修正しました