package Plagger::Plugin::Filter::YouTubeFromTitle;

use strict;
use base qw( Plagger::Plugin );
use Encode;
use HTML::Entities;

sub register {
    my($self, $context) = @_;
    $context->register_hook(
        $self,
        'update.entry.fixup' => \&filter,
    );
}

sub filter {
    my($self, $context, $args) = @_;
    my $e = $args->{entry};
		my ($keywords, $title, $artist,$video_id);

		$title = $e->title;
		$title = encode('UTF-8',$title);
		
		#hatena music
		if($title =~ /(.*?)\s-\s.*?\s-\s(.*?)\Z/){
				$title = decode('UTF-8',$1);
				$artist = decode('UTF-8',$2);
		}
		#Last.FM/audioscrobbler
		elsif($title =~ /(.*?)\s–\s(.*?)\Z/){
				$artist = decode('UTF-8',$1);
				$title = decode('UTF-8',$2);
		}
		$keywords = $artist . " " . $title;
		
		$video_id = search_youtube($self,$context,$keywords);
		unless($video_id eq ''){
				$e->title( $title . " by " . $artist );
		}else{
				$video_id = search_youtube($self,$context,$artist);
				$e->title($artist);
		}
		
		unless($video_id eq ''){
				$e->link("http://www.youtube.com/watch?v=$video_id");
				$e->body(embed($video_id));
		}

}

sub embed{
		my ($video_id) = @_;
		my $html = '<object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/%s"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/%s" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object>';
		$html = sprintf($html, $video_id);
		return $html;
}

sub search_youtube{
		my ($self,$context,$query) = @_;
#		my $query = decode_entities($query);
    my $url  = URI->new('http://youtube.com/results');
    my $file = $self->cache->path_to('youtube_search_result.html');

    $query = encode('UTF-8', $query) unless $context->conf->{no_decode_utf8};
    $context->log( info => 'Getting YouTube search results for ' . $query );

    my $ua = Plagger::UserAgent->new;
		$url->query_form(
										 search_type     => 'search_videos',
										 search_query    => $query,
										 search_sort     => $self->conf->{search_sort} || 'video_view_count',
								 );
		
		my $res = $ua->mirror( $url->as_string => $file );
		if($res->is_error){
				$context->log( error => $res->status );
				return;
		}
		
		open my $fh, "<:encoding(utf-8)", $file
            or return $context->log(error => "$file: $!");

		my $video_id;
		while (<$fh>) {
				if(m!<a href="/watch\?v=(.*?)"!){
						$video_id = $1;
						$context->log(info => "Found YouTube video: $video_id");
						last;
				}
		}
		return $video_id;
}

1;
__END__

=head1 NAME

Plagger::Plugin::Filter::YouTubeFromTitle - get YouTube movie related entry title

=head1 SYNOPSIS

  - module: Filter::YouTubeFromTitle
    config:
      search_sort: video_view_count

=head1 CONFIG

=over 4

=item search_sort

Sort method. Optional.

=back

=head1 AUTHOR

Yusuke Wada

=head1 SEE ALSO

L<Plagger>

=cut
