Changeset 211

Show
Ignore:
Timestamp:
07/29/06 19:28:04 (2 years ago)
Author:
miya
Message:

Copy from plagger.org trunk.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • plagger/trunk/lib/Plagger/Plugin/CustomFeed/YouTube.pm

    r109 r211  
    66use Plagger::Enclosure; 
    77use Plagger::UserAgent; 
    8 use XML::Simple; 
    98 
    109sub register { 
     
    2625    my($self, $context, $args) = @_; 
    2726 
    28     my $type = $self->conf->{feed_type}; 
    29     $self->$type($context, $args); 
    30  
    31 } 
    32  
    33 sub search { 
    34     my($self, $context, $args) = @_; 
    35  
    3627    my $q = $self->conf->{query}; 
    3728    $q =~ s/\s/\+/g; 
     
    3930    my $file = $self->cache->path_to('youtube_search_result.html'); 
    4031 
    41     $context->log( info => 'Getting YouTube search results.' ); 
     32    $context->log( info => 'Getting YouTube search results for ' . $self->conf->{query} ); 
     33 
    4234    my $ua = Plagger::UserAgent->new; 
    4335 
     
    6254        while (<$fh>) { 
    6355            # get title 
    64             m!<div class="title">! 
     56            m!<div class="vtitle">! 
    6557                and $title_flag = 1; 
    6658            m!<a href="/watch\?v=([^&]+)&search=[^>]+">(.+)</a>! 
     
    7264                    } 
    7365                }; 
    74             m!<img src="(http://static\d+.youtube.com/[^">]+/1.jpg)" class="vimgSm" />! 
     66            m!<img src="(http://[\w-]*static\d+(.[\w-]+)?\.youtube.com/[^">]+/1.jpg)" class="vimg90" />! 
    7567                and $data->{image}->{url} = $1; 
    76             m!<div class="desc">(.*)</div>! 
     68            m!<div class="vdesc">(.*)</div>! 
    7769                and $data->{description} = $1; 
    78             m!<td><span class="grayText">Tags:</span></td>! 
     70            m!<div class="vtagLabel">Tags:</div>! 
    7971                and $tag_flag = 1; 
    80             m!(<td><a href="/results\?search=.*)! 
     72            m!(<a href="/results\?search=.*)! 
    8173                and do { 
    8274                    if($tag_flag){ 
     
    10799 
    108100                    # enclosure 
    109                     my $res = $ua->fetch($entry->link); 
    110                     if($res->is_error){ 
    111                         $context->log( error => $res->status_line ); 
    112                         return; 
    113                     } 
    114                     if($res->content =~ /&t=([^&]+)/gms){ 
     101                    my $video_url = $self->cache->get_callback( 
     102                        "item-" . $entry->link, sub { 
     103                            my $res = $ua->fetch($entry->link); 
     104                            if ($res->is_error){ 
     105                                $context->log( error => $res->status_line ); 
     106                                return; 
     107                            } 
     108                            my $url; 
     109                            if ($res->content =~ /&t=([^&]+)/gms){ 
     110                                $url = 'http://youtube.com/get_video?video_id=' . $data->{id} . "&t=$1"; 
     111                            } 
     112                            return $url; 
     113                        }, 
     114                        '24 hours', 
     115                    ); 
     116 
     117                    if ($video_url) { 
     118                        my $video_id = ( $video_url =~ /video_id=(\w+)/ )[0]; 
     119 
    115120                        my $enclosure = Plagger::Enclosure->new; 
    116                         $enclosure->url('http://youtube.com/get_video?video_id=' . $data->{id} . "&t=$1"); 
    117                         $enclosure->type('application/x-shockwave-flash'); 
     121                        $enclosure->url( URI->new($video_url) ); 
     122                        $enclosure->type('video/x-flv'); 
     123                        $enclosure->filename("$video_id.flv"); 
    118124                        $entry->add_enclosure($enclosure); 
    119125                    } 
     
    125131    } 
    126132 
    127     $context->update->add($feed); 
    128 } 
    129  
    130 sub tag { 
    131     my($self, $context, $args) = @_; 
    132  
    133     my $q = $self->conf->{query}; 
    134  
    135     $context->log( info => "Getting http://youtube.com/rss/tag/$q.rss" ); 
    136     my $ua = Plagger::UserAgent->new; 
    137     my $res = $ua->fetch("http://youtube.com/rss/tag/$q.rss"); 
    138     if($res->is_error){ 
    139         $context->log( error => $res->status_line ); 
    140         return; 
    141     } 
    142  
    143     my $rss = XMLin( $res->content ); 
    144  
    145     my $feed = Plagger::Feed->new; 
    146     $feed->type('youtubetagrss'); 
    147     $feed->title($rss->{channel}->{title}); 
    148     $feed->description($rss->{channel}->{description}); 
    149     $feed->link($rss->{channel}->{link}); 
    150  
    151     foreach my $item (@{$rss->{channel}->{item}}) { 
    152         my $entry = Plagger::Entry->new; 
    153         $entry->title($item->{title}); 
    154         $entry->body($item->{description}); 
    155         $entry->id($item->{guid}); 
    156         $entry->link($item->{link}); 
    157         $entry->date( Plagger::Date->parse('Mail', $item->{pubDate}) ); 
    158  
    159         $entry->icon({ 
    160             url    => $item->{'media:thumbnail'}->{url}, 
    161             width  => $item->{'media:thumbnail'}->{width}, 
    162             height => $item->{'media:thumbnail'}->{height}, 
    163         }); 
    164  
    165         my $enclosure = Plagger::Enclosure->new; 
    166         $enclosure->url($item->{enclosure}->{url}); 
    167         $enclosure->type($item->{enclosure}->{type}); 
    168         $entry->add_enclosure($enclosure); 
    169  
    170         $feed->add_entry($entry); 
    171     } 
    172133    $context->update->add($feed); 
    173134} 
     
    184145  - module: CustomFeed::YouTube 
    185146    config: 
    186       feed_type: search|tag 
    187       query: keyword|tag 
     147      query: Twenty Four 
    188148      sort: video_date_uploaded 
    189149      page: 5 
     
    197157=over 4 
    198158 
    199 =item feed_type 
    200  
    201 'search' fetches the the result of YouTube search.'tag' fetches the rss of a specified tag. 
    202  
    203159=item query 
    204160 
    205 Specify search queries or rss tag name
     161Specify search query
    206162 
    207163=item sort 
    208164 
    209 Set sort condition.Available condisions are below.Default is video_date_uploaded. 
     165Set sort condition. Available condisions are below. Default is video_date_uploaded. 
    210166 
    211  relevance 
    212  video_date_uploaded 
    213  title_sort 
    214  video_view_count 
    215  rating_sort 
     167  relevance 
     168  video_date_uploaded 
     169  title_sort 
     170  n video_view_count 
     171  rating_sort 
    216172 
    217173=item page 
    218174 
    219 Number of pages of search result you get.(Valid when feed_typs is search.) 
    220 Default is 1. 
     175Number of pages of search result you get. Default is 1. 
    221176 
    222177=back