root/trunk/plagger/lib/Plagger/Plugin/Subscription/Bloglines.pm

Revision 210 (checked in by miyagawa, 14 years ago)

Subscription::Bloglines: rename fetch_folders to fetch_meta. Set xmlUrl to $feed->url under fetch_meta mode.

  • Property svn:keywords set to Id Revision
Line 
1 package Plagger::Plugin::Subscription::Bloglines;
2 use strict;
3 use base qw( Plagger::Plugin );
4
5 our $VERSION = '0.10';
6 use WebService::Bloglines;
7
8 sub register {
9     my($self, $context) = @_;
10
11     $self->init_bloglines();
12
13     if ($self->conf->{no_sync_api}) {
14         $context->register_hook(
15             $self,
16             'subscription.load' => \&getsubs,
17         );
18     } else {
19         $context->register_hook(
20             $self,
21             'subscription.load' => \&notifier,
22             'aggregator.aggregate.bloglines' => \&sync,
23         );
24     }
25 }
26
27 sub getsubs {
28     my($self, $context) = @_;
29     my $subscription = $self->{bloglines}->listsubs();
30
31     for my $folder ($subscription->folders) {
32         $self->add_subscription($subscription, $folder->{BloglinesSubId}, $folder->{title});
33     }
34
35     $self->add_subscription($subscription, 0);
36 }
37
38 sub add_subscription {
39     my($self, $subscription, $subid, $title) = @_;
40
41     my @feeds = $subscription->feeds_in_folder($subid);
42     for my $source (@feeds) {
43         my $feed = Plagger::Feed->new;
44         $feed->title($source->{title});
45         $feed->link($source->{htmlUrl});
46         $feed->url($source->{xmlUrl} );
47         $feed->tags([ $title ]) if $title;
48         Plagger->context->subscription->add($feed);
49     }
50 }
51
52 sub init_bloglines {
53     my $self = shift;
54     $self->{bloglines} = WebService::Bloglines->new(
55         username => $self->conf->{username},
56         password => $self->conf->{password},
57     );
58 }
59
60 sub notifier {
61     my($self, $context) = @_;
62
63     my $count = $self->{bloglines}->notify();
64     $context->log(info => "You have $count unread item(s) on Bloglines.");
65     if ($count) {
66         my $feed = Plagger::Feed->new;
67         $feed->type('bloglines');
68         $context->subscription->add($feed);
69
70         if ($self->conf->{fetch_meta}) {
71             # TODO: cache it!
72             $self->fetch_meta($context);
73         }
74     }
75 }
76
77 sub fetch_meta {
78     my($self, $context) = @_;
79
80     $self->{folders} = {};
81     $context->log(info => "call Bloglines listsubs API to get folder structure");
82
83     my $subscription = $self->{bloglines}->listsubs();
84
85     for my $folder ($subscription->folders) {
86         my @feeds = $subscription->feeds_in_folder($folder->{BloglinesSubId});
87         for my $feed (@feeds) {
88             # BloglinesSubId is different from bloglines:siteid. Don't use it
89             $self->{bloglines_meta}->{$feed->{htmlUrl}} = {
90                 folder => $folder->{title},
91                 xmlUrl => $feed->{xmlUrl},
92             };
93         }
94     }
95 }
96
97 sub sync {
98     my($self, $context, $args) = @_;
99
100     my $mark_read = $self->conf->{mark_read};
101        $mark_read = 1 unless defined $mark_read;
102
103     my @updates = $self->{bloglines}->getitems(0, $mark_read);
104     $context->log(info => scalar(@updates) . " feed(s) updated.");
105
106     for my $update (@updates) {
107         my $source = $update->feed;
108
109         my $feed = Plagger::Feed->new;
110         $feed->type('bloglines');
111         $feed->title($source->{title});
112         $feed->link($source->{link});
113         $feed->image($source->{image});
114         $feed->description($source->{description});
115         $feed->language($source->{language});
116         $feed->author($source->{webmaster});
117         $feed->meta->{bloglines_id} = $source->{bloglines}->{siteid};
118
119         # under fetch_pfolders option, set folder as tags to feeds
120         if (my $meta = $self->{bloglines_meta}->{$feed->link}) {
121             $feed->tags([ $meta->{folder} ]);
122             $feed->url($meta->{xmlUrl});
123         }
124
125         $feed->source_xml($update->{_xml});
126
127         for my $item ( $update->items ) {
128             my $entry = Plagger::Entry->new;
129
130             $entry->title($item->{title});
131             $entry->author($item->{dc}->{creator});
132             $entry->tags([ $item->{dc}->{subject} ])
133                 if $item->{dc}->{subject};
134             $entry->date( Plagger::Date->parse('Mail', $item->{pubDate}) );
135             $entry->link($item->{link});
136             $entry->id($item->{guid});
137
138             $entry->body($item->{description});
139
140             $feed->add_entry($entry);
141         }
142
143         $context->update->add($feed);
144     }
145 }
146
147 1;
148
149 __END__
150
151 =head1 NAME
152
153 Plagger::Plugin::Subscription::Bloglines - Bloglines Subscription
154
155 =head1 SYNOPSIS
156
157   - module: Subscription::Bloglines
158     config:
159       username: your-email@account
160       password: your-password
161       mark_read: 1
162
163 =head1 DESCRIPTION
164
165 This plugin allows you to synchronize your subscription using
166 Bloglines Web Services sync API.
167
168 =head1 CONFIGURATION
169
170 =over 4
171
172 =item username, password
173
174 Your username & password to use with Bloglines API.
175
176 =item mark_read
177
178 C<mark_read> specifies whether this plugin I<marks as read> the items
179 you synchronize. With this option set to 0, you will get the
180 duplicated updates everytime you run Plagger, until you mark them
181 unread using Bloglines browser interface. Defaults to 1.
182
183 For people who uses Bloglines browser interface regularly, and use
184 Plagger as a tool to synchronize feed updates to mobile devices (like
185 PSP or iPod), I'd recommend set this option to 0.
186
187 Otherwise, especially for Publish::Gmail plugin users, I recommend set
188 to 1, the default.
189
190 =item fetch_meta
191
192 C<fetch_meta> specifies whether this plugin fetches I<folder>
193 strucuture using listsubs API. With this option on, all feeds under
194 I<Plagger> folder will have I<Plagger> as its tag.
195
196 You can use this tags information using Rules in later phase.
197
198 =back
199
200 =head1 AUTHOR
201
202 Tatsuhiko Miyagawa
203
204 =head1 SEE ALSO
205
206 L<Plagger>, L<WebService::Bloglines>, L<http://www.bloglines.com/>
207
208 =cut
209
Note: See TracBrowser for help on using the browser.