The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Plagger::Plugin::Filter::DegradeYouTube;
use strict;
use base qw( Plagger::Plugin );

use WebService::YouTube;

my $regex = <<'...';
<object width="\d+" height="\d+".*?><param name="movie" value="(http://www.youtube.com/[^"]+)".*?><param name="wmode" value="transparent".*?>(.*?)</object>
...
chomp $regex;

sub register {
    my($self, $context) = @_;

    $context->register_hook(
        $self,
        'update.entry.fixup' => \&update,
    );
}

sub update {
    my($self, $context, $args) = @_;

    my $body  = $args->{entry}->body;
    $body =~ s{$regex}{
        my $url = $1;
        $context->log(info => "Found YouTube video $url");
        my $body;
        if (my $dev_id = $self->conf->{dev_id}) {
            my $thumb_url = $self->cache->get_callback(
                $url,
                sub { $self->_thumbnail_url($dev_id, $self->_video_id($url)) },
                60 * 60 * 24,
            );
            $context->log(info => "Thumbnail for $url => $thumb_url");
            qq{<a href="$url"><img src="$thumb_url" /></a>}
        } else {
            $context->log(warn => "No dev_id found. Just use the text replacement.");
            qq{<a href="$url">YouTube Movie</a>}
        }
    }ge;
    $args->{entry}->body($body);
}

sub _thumbnail_url {
    my ($self, $dev_id, $video_id) = @_;

    my $api = WebService::YouTube->new({dev_id => $dev_id});
    my $video = $api->videos->get_details($video_id);
    return $video->thumbnail_url;
}

sub _video_id {
    my ($self, $url) = @_;
    ($url =~ m[/v/([^/]+)$])[0];
}

1;
__END__

=for stopwords IMG

=head1 NAME

Plagger::Plugin::Filter::DegradeYouTube - Degrade YouTube object tags

=head1 SYNOPSIS

  - module: Filter::DegradeYouTube
    config:
      dev_id: YOUR-YOUTUBE-DEVID

=head1 DESCRIPTION

This plugin, when YouTube object tags are found in the entry body,
replaces the object tags into the degraded HTML, e.g. A link with IMG
to the thumbnail.

=head1 CONFIG

=over 4

=item dev_id

Your YouTube developer ID. If set, it tries to fetch the thumbnail
image using YouTube API. Optional.

=back

=head1 AUTHOR

Tokuhiro Matsuno

=head1 SEE ALSO

L<Plagger>

=cut