Twitter のアイコンには主に gif / jpeg / png が使われており、 png を表示できないガラケーがある。

Cache::Memcached::Fast でキャッシュしつつ、 Imager では一時ファイルを作らず。思っていたよりも楽にかけた

use LWP::UserAgent;
use Imager;
use Cache::Memcached::Fast;

use Plack::Request;
use Plack::Builder;

my $memd = Cache::Memcached::Fast->new({
    ...
});


builder {
    mount '/tw_thumbnail' => sub {
        my $env = shift;
        my $req = Plack::Request->new($env);

        if ($req->param("url") =~ m{^(http://a\d\.twimg\.com/.+)}) {
            my $url = $1;

            if (my $result = $memd->get($url)) {
                return [200, ['Content-Type' => 'image/jpeg'], [$result]];

            } else {
                my $img = LWP::UserAgent->new->get($url)->decoded_content;
                my $image = Imager->new;

                $image->read(data => $img)
                    or return [500, [], [$image->errstr]];

                $image->write(data => \my $out, jpegquality => 30, type => 'jpeg')
                    or return [500, [], [$image->errstr]];

                $memd->set($url, $out, 1 * 60 * 60 * 24);

                return [200, ['Content-Type' => 'image/jpeg'], [$out]];
            }

        } else {
            return [404, [], ['Not Found']];
        }
    };
};