root/trunk/plagger/lib/Plagger/Plugin/Filter/FlickrContactPhotos.pm

Revision 2045 (checked in by otsune, 3 years ago)
  • test followed update of XML::RSS::LibXML

Add kzys's plugin Filter::FlickrContactPhotos? from http://gist.github.com/10849 (via http://blog.8-p.info/2008/118 )
Because Flickr::API returns gzipped response. (via http://gist.github.com/10830 )

Line 
1 package Plagger::Plugin::Filter::FlickrContactPhotos;
2 use strict;
3
4 use base qw( Plagger::Plugin );
5 use Flickr::API;
6 use XML::LibXML;
7
8 sub register {
9     my($self, $context) = @_;
10     $context->register_hook(
11         $self,
12         'plugin.init' => \&init_flickr,
13         'update.entry.fixup' => \&update,
14     );
15 }
16
17 sub init_flickr {
18     my ($self, $context, $args) = @_;
19
20     $self->{flickr} = Flickr::API->new({
21         key => $self->conf->{api_key}
22     });
23 }
24
25 sub update {
26     my($self, $context, $args) = @_;
27     my $entry = $args->{entry};
28
29     if ($entry->link !~ m{^http://www\.flickr\.com/photos/(.+?)/(\d+)/}) {
30         return;
31     }
32     my $user_id = $1;
33     my $photo_id = $2;
34
35     my $icon = $self->cache->get_callback(
36         "flickr-buddyicon-$user_id",
37         sub {
38             $self->_buddy_icon_of($photo_id);
39         },
40         '3 days'
41     );
42     $entry->icon($icon);
43 }
44
45 sub _buddy_icon_of {
46     my($self, $photo_id) = @_;
47
48     my $nsid = $self->_call_flickr(
49         'flickr.photos.getInfo',
50         { photo_id => $photo_id }
51     )->findvalue('/rsp/photo/owner/@nsid');
52
53     my $person = $self->_call_flickr(
54         'flickr.people.getInfo',
55         { user_id => $nsid }
56     );
57
58     my $title = $person->findvalue('/rsp/person/realname');
59     $title ||= $person->findvalue('/rsp/person/username');
60
61     return {
62         url => sprintf(
63             'http://farm%s.static.flickr.com/%s/buddyicons/%s.jpg',
64             $person->findvalue('/rsp/person/@iconfarm'),
65             $person->findvalue('/rsp/person/@iconserver'),
66             $nsid,
67         ),
68         link => $person->findvalue('/rsp/person/profileurl'),
69         title => $title,
70     };
71 }
72
73 sub _call_flickr {
74     my($self, $method, $args) = @_;
75
76     my $resp = $self->{flickr}->execute_method($method, $args);
77
78     my $doc = XML::LibXML->new->parse_string($resp->decoded_content);
79     return $doc;
80 }
81
82 1;
83 __END__
84
85 =head1 NAME
86
87 Plagger::Plugin::Filter::FlickrContactPhotos;
88
89 =head1 SYNOPSIS
90
91   - module: Filter::FlickrContactPhotos
92     config:
93      api_key: YOUR-FLICKR-APIKEY
94
95 =head1 DESCRIPTION
96
97 This plugin adds user's buddy icon to Flickr's photos.
98
99 =head1 AUTHOR
100
101 Kazuyoshi Kato
102
103 =head1 SEE ALSO
104
105 L<Plagger>, L<http://www.flickr.com/>, L<Flickr::API>
106
107 =cut
Note: See TracBrowser for help on using the browser.