Changeset 850
- Timestamp:
- 05/30/06 01:26:30
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/plagger/lib/Plagger/Plugin/Filter/FindEnclosures.pm
r843 r850 5 5 use HTML::TokeParser; 6 6 use Plagger::Util qw( decode_content ); 7 use List::Util qw(first); 7 8 use URI; 8 9 use DirHandle; … … 82 83 83 84 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')) { 85 86 if ($tag->[0] eq 'a' ) { 86 87 $self->add_enclosure($args->{entry}, $tag, 'href'); 87 88 } 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} }); 89 90 } 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); 91 94 } 92 95 } 93 96 } 94 97 98 sub 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 95 130 sub 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})) { 99 135 Plagger->context->log(info => "Found enclosure $tag->[1]{$attr}"); 100 136 my $enclosure = Plagger::Enclosure->new; 101 137 $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}; 104 140 $entry->add_enclosure($enclosure); 105 141 return; … … 133 169 134 170 sub is_enclosure { 135 my($self, $tag, $attr ) = @_;171 my($self, $tag, $attr, $type) = @_; 136 172 137 173 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); 139 175 140 176 return; … … 142 178 143 179 sub 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) ); 147 183 $mime && $mime->mediaType =~ m!^(?:audio|video|image)$!; 148 184 }
