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