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']]; } }; };