Changeset 850

Show
Ignore:
Timestamp:
05/30/06 01:26:30
Author:
miyagawa
Message:

FindEnclosures?: Find flash enclosure inside HTML body by looking up param@movie and param@flashvars inside <object> tag. Fixes #251

Files:

Legend:

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

    r843 r850  
    55use HTML::TokeParser; 
    66use Plagger::Util qw( decode_content ); 
     7use List::Util qw(first); 
    78use URI; 
    89use DirHandle; 
     
    8283 
    8384    my $parser = HTML::TokeParser->new(\$args->{entry}->body); 
    84     while (my $tag = $parser->get_tag('a', 'embed', 'img')) { 
     85    while (my $tag = $parser->get_tag('a', 'embed', 'img', 'object')) { 
    8586        if ($tag->[0] eq 'a' ) { 
    8687            $self->add_enclosure($args->{entry}, $tag, 'href'); 
    8788        } elsif ($tag->[0] eq 'embed') { 
    88             $self->add_enclosure($args->{entry}, $tag, 'src'); 
     89            $self->add_enclosure($args->{entry}, $tag, 'src', { type => $tag->[1]->{type} }); 
    8990        } elsif ($tag->[0] eq 'img') { 
    90             $self->add_enclosure($args->{entry}, $tag, 'src', 1); 
     91            $self->add_enclosure($args->{entry}, $tag, 'src', { inline => 1 }); 
     92        } elsif ($tag->[0] eq 'object') { 
     93            $self->add_enclosure_from_object($args->{entry}, $parser); 
    9194        } 
    9295    } 
    9396} 
    9497 
     98sub add_enclosure_from_object { 
     99    my($self, $entry, $parser) = @_; 
     100 
     101    # get param tags and find appropriate FLV movies 
     102    my @params; 
     103    while (my $tag = $parser->get_tag('param', '/object')) { 
     104        last if $tag->[0] eq '/object'; 
     105        push @params, $tag; 
     106    } 
     107 
     108    # find URL inside flashvars parameter 
     109    my $url; 
     110    if (my $flashvars = first { lc($_->[1]->{name}) eq 'flashvars' } @params) { 
     111        my %values = split /[=&]/, $flashvars->[1]->{value} || ''; 
     112        $url = first { m!^https?://! } values %values; 
     113    } 
     114 
     115    # if URL isn't found in flash vars, then fallback to <param name="movie" /> 
     116    if (!$url) { 
     117        my $movie = first { lc($_->[1]->{name}) eq 'movie' } @params; 
     118        $url = $movie->[1]->{value} if $movie; 
     119    } 
     120 
     121    if ($url) { 
     122        Plagger->context->log(info => "Found enclosure $url"); 
     123        my $enclosure = Plagger::Enclosure->new; 
     124        $enclosure->url( URI->new($url) ); 
     125        $enclosure->auto_set_type; 
     126        $entry->add_enclosure($enclosure); # XXX inline? 
     127    } 
     128} 
     129 
    95130sub add_enclosure { 
    96     my($self, $entry, $tag, $attr, $inline) = @_; 
    97  
    98     if ($self->is_enclosure($tag, $attr)) { 
     131    my($self, $entry, $tag, $attr, $opt) = @_; 
     132    $opt ||= {}; 
     133 
     134    if ($self->is_enclosure($tag, $attr, $opt->{type})) { 
    99135        Plagger->context->log(info => "Found enclosure $tag->[1]{$attr}"); 
    100136        my $enclosure = Plagger::Enclosure->new; 
    101137        $enclosure->url($tag->[1]{$attr}); 
    102         $enclosure->auto_set_type
    103         $enclosure->is_inline($inline)
     138        $enclosure->auto_set_type($opt->{type})
     139        $enclosure->is_inline(1) if $opt->{inline}
    104140        $entry->add_enclosure($enclosure); 
    105141        return; 
     
    133169 
    134170sub is_enclosure { 
    135     my($self, $tag, $attr) = @_; 
     171    my($self, $tag, $attr, $type) = @_; 
    136172 
    137173    return 1 if $tag->[1]{rel} && $tag->[1]{rel} eq 'enclosure'; 
    138     return 1 if $self->has_enclosure_mime_type($tag->[1]{$attr}); 
     174    return 1 if $self->has_enclosure_mime_type($tag->[1]{$attr}, $type); 
    139175 
    140176    return; 
     
    142178 
    143179sub has_enclosure_mime_type { 
    144     my($self, $url) = @_; 
    145  
    146     my $mime = Plagger::Util::mime_type_of( URI->new($url) ); 
     180    my($self, $url, $type) = @_; 
     181 
     182    my $mime = $type ? MIME::Type->new(type => $type) : Plagger::Util::mime_type_of( URI->new($url) ); 
    147183    $mime && $mime->mediaType =~ m!^(?:audio|video|image)$!; 
    148184}