« Plagger::Plugin::Publish::FC2 / ver0.02 | メイン | Perlでニコニコ動画のflvとコメントxmlをダウンロードする »

LastFMの最近聞いた曲にAmazonの情報を付加して書き出す

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 />
')

トラックバック

このエントリーのトラックバックURL:
http://yusukebe.com/mt/mt-tb.cgi/2124

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)


ブログSEO対策:track word seo