Changeset 2006

Show
Ignore:
Timestamp:
02/08/08 12:15:55
Author:
typester
Message:

added fetch_favicon option

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/fastladder-crawler/plagger/lib/Plagger/Plugin/Store/Fastladder.pm

    r2005 r2006  
    88__PACKAGE__->mk_accessors(qw/schema me/); 
    99 
     10use Plagger::UserAgent; 
    1011use Plagger::Plugin::Store::Fastladder::Schema::Loader; 
    1112 
     
    1920    $self->{me} = $self->rs('Members')->find($self->conf->{member_id}) 
    2021        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    } 
    2134 
    2235    $c->register_hook( $self, 'publish.feed' => \&store ); 
     
    4659    $feed->created_on( $now ) unless $feed->in_storage; 
    4760    $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    } 
    4868 
    4969    # subscribe 
     
    96116} 
    97117 
     118sub 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 
    98174=head1 NAME 
    99175 
     
    131207 
    1322081; 
     209 
     210