TinyURLを操作するPlagger用フィルタ

昨日の1日のTwitterをまとめてMixi日記になげるレシピをつかってMixiに投稿するとURLがTinyURLのままになってた。公開して読んでもらう日記なのにちょっと怖いし不親切かなってことで、TinyURLを元に戻すためのフィルタを作ってみた。ついでだったのでTinyURLを生成することもできるようにした。

フィードのbody部分の加工をするためのフィルタはBase.pmを継承してfilterをオーバーライドするだけで良いのですごく簡単。ここではWWW::Shorten::TinyURLを使ったのでほとんど何も考えてないのにできちゃった。継承ってすごいね!

TinyURL.pm

package Plagger::Plugin::Filter::TinyURL;
use strict;
use base qw( Plagger::Plugin::Filter::Base );

use URI::Find;
use URI::http;
use WWW::Shorten::TinyURL;

sub filter {
    my($self, $body) = @_;

    local @URI::ttp::ISA = qw(URI::http);

    my $count = 0;
    my $opt = $self->conf->{be} || 'short';
    my $finder = URI::Find->new(sub {
        my ($uri, $orig_uri) = @_;
        if ($opt eq 'long' && $uri =~ /tinyurl/) {
            $count++;
            return makealongerlink($orig_uri);
        } elsif ($opt eq 'short') {
            $count++;
            return makeashorterlink($orig_uri);
        }
    });

    $finder->find(\$body);
    ($count, $body);
}

1;

__END__

=head1 NAME

Plagger::Plugin::Filter::TinyURL - convert URL by TinyURL

=head1 SYNOPSIS

  - module: Filter::TinyURL
    config:
      be: long

=head1 DESCRIPTION

This plugin replaces URL with TinyURL or TinyURL with OriginalURL.

=head1 CONFIG

=over 4

=item text_only

When set to 1, uses HTML::Parser to avoid replacing URL inside
HTML attributes. Defaults to 0.

=item be

When set to long, TinyURL extracted to Original URL.
When set to short, URL converted into TinyURL.

=back

=head1 AUTHOR

Toshi

Tatsuhiko Miyagawa

=head1 SEE ALSO

L<Plagger>, L<HTML::Parser>

=cut

貼り付けてみて半分以上がPODだって気がついた(笑)
これを使うためのyamlには

  - module: Filter::TinyURL
    config:
      be: long

とか書けば良い。TinyURLを元に戻すときにはbe:にlongをTinyURL生成時にはshortを指定する。
注意点として、ほかのFilterと使うときにはyaml中でTinyURL.pmをFilterの先頭で指定しないとうまく適用できない。少なくとも昨日のFilter::AssembleEntries.pmではそうだった。実際にはこんな感じ。

plugins:
  - module: Subscription::Config
    config:
      feed:
        - url: http://twitter.com/statuses/user_timeline/ユーザID.atom

  - module: Filter::TinyURL
    config:
      be: long

  - module: Filter::AssembleEntries
    rule:
      expression: $args->{entry}->date->set_time_zone('Asia/Tokyo')->ymd eq Plagger::Date->now(timezone=>'Asia/Tokyo')->ymd
    config:
      title: 今日のTwitter
      link: http://twitter.com/xxxxxx/
      delimiter: <br />
      reverse: 1
      timelabel: hms
      empty_msg: なにもTwiってないよ。
      del_word: Toshi:

  - module: Publish::MixiDiary
    config:
      username: xxxxx@example.com
      password: password
      interval: 10