Changeset 760

Show
Ignore:
Timestamp:
05/17/06 03:42:54
Author:
miyagawa
Message:
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/plagger/lib/Plagger/Plugin/Filter/TruePermalink.pm

    r759 r760  
    55use DirHandle; 
    66use YAML; 
     7use Plagger::UserAgent; 
    78use URI; 
    89use URI::QueryParam; 
     
    2930 
    3031    Plagger->context->log(debug => "loading $file"); 
    31     push @{$self->{plugins}}, YAML::LoadFile($file); 
     32    my $data = YAML::LoadFile($file); 
     33    if (ref($data) eq 'ARRAY') { 
     34        push @{$self->{redirectors}}, { follow_link => "^(?:" . join("|", @$data) . ")" }; 
     35    } else { 
     36        push @{$self->{plugins}}, $data; 
     37    } 
    3238} 
    3339 
     
    8288                $count += $done; 
    8389                $rewritten = $_; 
    84                 $callback->($_); 
    8590                last; 
    8691            } 
     
    8893            my $param = URI->new($link)->query_param($plugin->{query_param}) 
    8994                or $context->error("No query param $plugin->{query_param} in " . $link); 
    90             $callback->($param); 
    9195            $count++; 
    9296            $rewritten = $param; 
     
    9599    } 
    96100 
     101    unless ($count) { 
     102        for my $red (@{ $self->{redirectors} }) { 
     103            next unless $red->{follow_link}; 
     104            if ($link =~ /$red->{follow_link}/i) { 
     105                my $url = $self->follow_redirect($link); 
     106                if ($url && $url ne $link) { 
     107                    $count++; 
     108                    $rewritten = $url; 
     109                    last; 
     110                } 
     111            } 
     112        } 
     113    } 
     114 
    97115    if ($count) { 
     116        $callback->($rewritten); 
    98117        $context->log(info => "Link $orig rewritten to $rewritten"); 
    99118    } 
    100119 
    101120    return $count; 
     121} 
     122 
     123sub follow_redirect { 
     124    my($self, $link) = @_; 
     125 
     126    my $url = $self->cache->get_callback( 
     127        "redirector:$link", 
     128        sub { 
     129            my $ua  = Plagger::UserAgent->new; 
     130            my $res = $ua->simple_request( HTTP::Request->new(GET => $link) ); 
     131            if ($res->is_redirect) { 
     132                return $res->header('Location'); 
     133            } 
     134            return; 
     135        }, 
     136        '1 day', 
     137    ); 
     138 
     139    Plagger->context->log(debug => "Resolving redirection of $link: $url") if $url; 
     140 
     141    return $url; 
    102142} 
    103143