Blogに貼るLastFMの「最近聞いた曲」ウィジェットみたいなのあるけど、 あれじゃなんか気に食わないので、 CDジャケット写真とAmazonへのアサマシリンク付きのオリジナル「最近聞いた曲」ウィジェットを作る。 WebService-LastFMはあえて使わず、素直にAudioScrobblerのXMLを持ってきてパース、Amazon検索、TTに渡して、JavaScriptのdocument.write('ほげほげ')形式のファイルに書き出すPerlスクリプト。あとはcronでまわして、出てきたファイルをHTML内でincludeしてやればよし。
#!/usr/bin/perl
use strict;
use URI::Fetch;
use XML::Simple;
use Net::Amazon;
use Net::Amazon::Request::Keyword;
use Cache::File;
use DateTime;
use Template;
use Encode;
our $UserName = "yusukebe";
our $CacheDir = '/tmp/yusuke/lastfm_widget';
our $FileName = "/home/yusuke/public_html/yusukebe/m/now_playing.js";
our $DeveloperToken = "YOURTOKEN";
our $AssociateID = "kamawada-22";
my $track = fetch_track();
my $keyword = $track->{album}->{content} || $track->{name};
$keyword = $keyword . " " . $track->{artist}->{content};
my $item = search_aws( $keyword ) or die "cannot find Amazon item.";
my $dt = get_time($track->{date}->{uts});
my $template = Template->new or die $Template::ERROR;
my $html;
$template->process(
\*DATA, { track => $track, item => $item, dt => $dt }, \$html )
or die $template->error;
$html =~ s/\n//g;
warn encode("utf-8", $html) . "\n";
open HTML,"+>$FileName";
print HTML encode("utf-8", $html);
close HTML;
sub fetch_track {
my $url = "http://ws.audioscrobbler.com/1.0/user/$UserName/recenttracks.xml";
my $cache = Cache::File->new( cache_root => $CacheDir );
my $res = URI::Fetch->fetch( $url,
Cache => $cache
)
or die URI::Fetch->errstr;
my $xml = XMLin($res->content, ForceArray => ['track'], KeyAttr=> []);
return ${$xml->{track}}[0];
}
sub search_aws {
my ($keyword) = @_;
warn "Searching $keyword on Amazon...\n";
my $attr;
$attr->{token} = $DeveloperToken;
$attr->{locale} = "jp";
$attr->{affiliate_id} = $AssociateID;
$attr->{cache} = Cache::File->new(
cache_root => $CacheDir,
default_expires => '7 days',
);
my $ua = Net::Amazon->new(%$attr);
my $req = Net::Amazon::Request::Keyword->new(
keyword => $keyword,
mode => "music-jp",
);
my $response = $ua->request($req);
my $item = ($response->properties())[0];
return $item;
}
sub get_time {
my $epoch = shift;
my $dt = DateTime->from_epoch( epoch => $epoch );
$dt->set_time_zone( 'Asia/Tokyo' );
return $dt;
}
__DATA__
document.write('
[% USE JavaScript -%]
[% dt.month %]/[% dt.day %] [% dt.hms %]<br />
<a href="[% item.url %]">
<img src="[% item.ImageUrlSmall %]" alt="[% item.ProductName | js %]" />
</a><br />
<a href="[% item.url %]">[% track.artist.content | js %] - [% track.name | js %] [% IF track.album.content %]([% track.album.content %])[% END %]
</a><br />
')

