Blog Hacks Hack #92 では、Winamp とそのプラグイン amip を使用して、今聞いている曲をエントリに追記する方法を紹介していますが、iTunes の場合は COM を利用してもっとスマートにできます。
某氏からのリクエストでこれにアートワークもひろってきて Amazon アフィリエイトリンクもつけてみる。
ActivePerl で Net::Amazon が必要。環境が用意できない場合は、JScript 版で開く URL を、G-Tools とか amazlet とかの検索フォームにしてしまうのが手っ取り早いかも。何ステップか増えてしまいますが。
JScript 版と基本的にやってることは同じですね。InternetExplorer.Application のいじり方で若干はまった。CPAN にある Win32::IE::Mechanize がその辺を隠蔽して WWW::Mechanize とおなじ API 提供してて素敵。
use strict;
use Encode;
use Net::Amazon;
use Net::Amazon::Request::Keyword;
use Win32::OLE;
# Configurtaion: path to your MT script
our $MT = "http://blog.bulknews.net/mt/mt.cgi";
our $BlogID = 6;
our $DeveloperToken = "YOUR-TOKEN";
our $AssociateID = "yourassoc-22";
# Get Trackname from iTunes using COM
my $itunes = Win32::OLE->new("iTunes.Application");
my $track = $itunes->CurrentTrack;
# Create text for "Now Playing"
my $now_playing = sprintf "Now Playing: %s - %s (%s)",
$track->Artist, $track->Name, $track->Album;
# Search AWS for Artist - Album
my $item = search_aws($track->Artist, $track->Album, "", "music");
$item ||= search_aws($track->Artist, $track->Album, "jp", "music-jp");
if ($item) {
$now_playing = sprintf qq(<a href="%s"><img src="%s" alt="%s - %s" border="0" clear="all" /><br />%s</a>),
$item->url, $item->ImageUrlMedium,
$track->Artist, $track->Album, $now_playing;
}
# Open "New Entry" page of MT in IE using COM
my $url = $MT . "?blog_id=" . $BlogID . "&__mode=view&_type=entry";
my $ie = Win32::OLE->new("InternetExplorer.Application");
$ie->{Visible} = "TRUE";
$ie->Navigate($url);
# Set "Now Playing:" text in a "exntended" textarea
1 while $ie->Busy;
1 while $ie->document->readyState ne "complete";
$ie->Document->forms(2)->text_more->{value} = $now_playing;
sub search_aws {
my($artist, $title, $locale, $mode) = @_;
warn "Searching $artist - $title on Amazon...\n";
my $attr;
$attr->{token} = $DeveloperToken;
$attr->{locale} = $locale if $locale;
$attr->{affiliate_id} = $AssociateID;
my $ua = Net::Amazon->new(%$attr);
my $keyword = "$artist $title";
Encode::from_to($keyword, "Shift_JIS" => "UTF-8");
my $req = Net::Amazon::Request::Keyword->new(
keyword => $keyword,
mode => $mode
);
my $response = $ua->request($req);
my $item = ($response->properties())[0];
return $item;
}