Changeset 2006
- Timestamp:
- 02/08/08 12:15:55
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/fastladder-crawler/plagger/lib/Plagger/Plugin/Store/Fastladder.pm
r2005 r2006 8 8 __PACKAGE__->mk_accessors(qw/schema me/); 9 9 10 use Plagger::UserAgent; 10 11 use Plagger::Plugin::Store::Fastladder::Schema::Loader; 11 12 … … 19 20 $self->{me} = $self->rs('Members')->find($self->conf->{member_id}) 20 21 or $c->error(qq{can't find fastladder user member_id: "@{[ $self->conf->{member_id} ]}"}); 22 23 if ($self->conf->{fetch_favicon}) { 24 eval q{ 25 use HTML::TreeBuilder; 26 use Imager 0.60; 27 }; 28 if ($@) { 29 $c->log(debug => $@); 30 $c->log(warn => 'turn off fetch_favicon feature: it requires Imager 0.60'); 31 $self->conf->{fetch_favicon} = 0; 32 } 33 } 21 34 22 35 $c->register_hook( $self, 'publish.feed' => \&store ); … … 46 59 $feed->created_on( $now ) unless $feed->in_storage; 47 60 $feed->insert_or_update; 61 62 # fetch favicon 63 if ($self->conf->{fetch_favicon} and my $icon = $self->fetch_favicon($c, $feed->link)) { 64 my $favicon = $self->rs('Favicons')->find_or_new({ feed_id => $feed->id }); 65 $favicon->image( $icon ); 66 $favicon->insert_or_update; 67 } 48 68 49 69 # subscribe … … 96 116 } 97 117 118 sub fetch_favicon { 119 my ($self, $c, $url) = @_; 120 121 $c->log( debug => "fetching favicon on $url" ); 122 123 my $ua = Plagger::UserAgent->new; 124 my $res = $ua->fetch($url); 125 126 my $icon; 127 if ($res->is_success) { 128 my $tree = HTML::TreeBuilder->new; 129 $tree->parse($res->content); 130 $tree->eof; 131 132 my @icons = $tree->look_down( 133 _tag => 'link', 134 rel => qr/shortcut icon/i, 135 ); 136 137 for my $icon_link (map { $_->attr('href') } @icons) { 138 my $res = $ua->fetch($icon_link); 139 if ($res->is_success) { 140 $icon = $res->content; 141 last; 142 } 143 } 144 145 $tree->delete; 146 } 147 148 unless ($icon) { 149 my $icon_link = URI->new($url); 150 my $res = $ua->fetch($icon_link); 151 $icon = $res->content if $res->is_success; 152 } 153 154 if ($icon) { 155 my $imager = Imager->new; 156 unless ($imager->read( data => $icon )) { 157 $c->log( debug => 'image read error: ' . Imager->errstr ); 158 return; 159 } 160 161 unless ($imager->getwidth == 16 and $imager->getheight == 16) { 162 $imager = $imager->scale( xpixels => 16, ypixels => 16, type => 'nonprop' ); 163 } 164 165 $imager->write( data => \my $png, type => 'png' ) 166 or $c->log( debug => 'image write error: ' . Imager->errstr ); 167 168 return $png; 169 } 170 171 return; 172 } 173 98 174 =head1 NAME 99 175 … … 131 207 132 208 1; 209 210
