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

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

Subscription::Bloglines: use_liberal support.

  • 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, 0) {
32         my $subid = $folder ? $folder->{BloglinesSubId} : 0;
33         my $title = $folder ? $folder->{title} : undef;
34         $self->add_subscription($subscription, $subid, $title);
35     }
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         use_liberal => 1,
58     );
59 }
60
61 sub notifier {
62     my($self, $context) = @_;
63
64     my $count = $self->{bloglines}->notify();
65     $context->log(info => "You have $count unread item(s) on Bloglines.");
66     if ($count) {
67         my $feed = Plagger::Feed->new;
68         $feed->type('bloglines');
69         $context->subscription->add($feed);
70
71         if ($self->conf->{fetch_meta}) {
72             $self->{bloglines_meta} = $self->cache->get_callback(
73                 'listsubs_meta',
74                 sub { $self->fetch_meta($context) },
75                 '1 day',
76             );
77         }
78     }
79 }
80
81 sub fetch_meta {
82     my($self, $context) = @_;
83
84     $self->{folders} = {};
85     $context->log(info => "call Bloglines listsubs API to get folder structure");
86
87     my $subscription = $self->{bloglines}->listsubs();
88
89     my $meta;
90     for my $folder ($subscription->folders, 0) {
91         my $subid = ref $folder ? $folder->{BloglinesSubId} : 0;
92         my @feeds = $subscription->feeds_in_folder($subid);
93         for my $feed (@feeds) {
94             # BloglinesSubId is different from bloglines:siteid. Don't use it
95             $meta->{$feed->{htmlUrl}} = {
96                 folder => $folder ? $folder->{title} : undef,
97                 xmlUrl => $feed->{xmlUrl},
98             };
99         }
100     }
101
102     $meta;
103 }
104
105 sub sync {
106     my($self, $context, $args) = @_;
107
108     my $mark_read = $self->conf->{mark_read};
109        $mark_read = 1 unless defined $mark_read;
110
111     my @updates = $self->{bloglines}->getitems(0, $mark_read);
112     $context->log(info => scalar(@updates) . " feed(s) updated.");
113
114     for my $update (@updates) {
115         my $source = $update->feed;
116
117         my $feed = Plagger::Feed->new;
118         $feed->type('bloglines');
119         $feed->title($source->{title});
120         $feed->link($source->{link});
121         $feed->image($source->{image});
122         $feed->description($source->{description});
123         $feed->language($source->{language});
124         $feed->author($source->{webmaster});
125         $feed->meta->{bloglines_id} = $source->{bloglines}->{siteid};
126
127         # under fetch_pfolders option, set folder as tags to feeds
128         if (my $meta = $self->{bloglines_meta}->{$feed->link}) {
129             $feed->tags([ $meta->{folder} ]) if $meta->{folder};
130             $feed->url($meta->{xmlUrl});
131         }
132
133         $feed->source_xml($update->{_xml});
134
135         for my $item ( $update->items ) {
136             my $entry = Plagger::Entry->new;
137
138             $entry->title($item->{title});
139             $entry->author($item->{dc}->{creator});
140             $entry->tags([ $item->{dc}->{subject} ])
141                 if $item->{dc}->{subject};
142             $entry->date( Plagger::Date->parse('Mail', $item->{pubDate}) );
143             $entry->link($item->{link});
144             $entry->id($item->{guid});
145
146             $entry->body($item->{description});
147
148             $feed->add_entry($entry);
149         }
150
151         $context->update->add($feed);
152     }
153 }
154
155 1;
156
157 __END__
158
159 =head1 NAME
160
161 Plagger::Plugin::Subscription::Bloglines - Bloglines Subscription
162
163 =head1 SYNOPSIS
164
165   - module: Subscription::Bloglines
166     config:
167       username: your-email@account
168       password: your-password
169       mark_read: 1
170
171 =head1 DESCRIPTION
172
173 This plugin allows you to synchronize your subscription using
174 Bloglines Web Services sync API.
175
176 =head1 CONFIGURATION
177
178 =over 4
179
180 =item username, password
181
182 Your username & password to use with Bloglines API.
183
184 =item mark_read
185
186 C<mark_read> specifies whether this plugin I<marks as read> the items
187 you synchronize. With this option set to 0, you will get the
188 duplicated updates everytime you run Plagger, until you mark them
189 unread using Bloglines browser interface. Defaults to 1.
190
191 For people who uses Bloglines browser interface regularly, and use
192 Plagger as a tool to synchronize feed updates to mobile devices (like
193 PSP or iPod), I'd recommend set this option to 0.
194
195 Otherwise, especially for Publish::Gmail plugin users, I recommend set
196 to 1, the default.
197
198 =item fetch_meta
199
200 C<fetch_meta> specifies whether this plugin fetches I<folder>
201 strucuture using listsubs API. With this option on, all feeds under
202 I<Plagger> folder will have I<Plagger> as its tag.
203
204 You can use this tags information using Rules in later phase.
205
206 =back
207
208 =head1 AUTHOR
209
210 Tatsuhiko Miyagawa
211
212 =head1 SEE ALSO
213
214 L<Plagger>, L<WebService::Bloglines>, L<http://www.bloglines.com/>
215
216 =cut
217
Note: See TracBrowser for help on using the browser.