iTunesで再生回数の上位30曲をhtmlにするスクリプト。しかしスクリプトをhtmlできれいに表示するのは面倒だ。たぶん、きれいにhtmlで整形してくれるモジュールがありそうだ。CPANで探してみよう。
use strict;
use Win32::OLE;
use Date::Format;
#amazonへのリンクを設定する場合は、コメントにASINを入れておく必要がある。
my $yyyymmdd = time2str('%Y%m%d', time);
my $output_file = "C:/Data/iTunes-TopRate$yyyymmdd.html";
my $limit = 30;
my $link_to_amazon = 1;
my $amazon_id = "pdaenglish-22";
my $itunes = Win32::OLE->new("iTunes.Application") or die "bye\n";
my $library = $itunes->LibraryPlaylist;
my $tracks = $library->Tracks;
my @top_list = ();
my $playlist = $itunes->Sources->Item(1)->PlayLists->ItemByName('トップレート');
my $c = $playlist->Tracks->Count;
#コレクションはひとつのスカラー変数であり、配列ではないみたいだ。
for(my $n = 1; $n <= $c; $n++){
my $t = $playlist->Tracks->Item($n);
push(@top_list, {PlayedCount => $t->PlayedCount,
Name => $t->Name,
Album => $t->Album,
Artist => $t->Artist,
PlayedDate => $t->PlayedDate->Date("yyyyMMdd"),
Comment => $t->Comment});
}
die if scalar(@top_list) == 0;
open(OUT, ">$output_file");
$yyyymmdd = time2str('%Y/%m/%d %H:%M:%S', time);
print OUT "<html><body>$yyyymmdd時点
<table border=1 cellspacing=0 cellpadding=2>
<tr><td>順位</td><td>アーティスト</td><td>曲名</td>
<td>アルバム</td><td>回数</td><td>再生日</td></tr>\n";
@top_list = sort{$b->{PlayedCount} <=> $a->{PlayedCount}} @top_list;
my $i = 0;
my $count_before;
my $count_same = 0;
foreach my $t(@top_list){
my ($album, $amazon_url, $amazon_img_url);
if($link_to_amazon == 1){
if($t->{Comment} =~ m/(B.*)/){
$amazon_url = "http://www.amazon.co.jp/exec/obidos/ASIN/$1/$amazon_id";
}
}
if(defined $amazon_url){
$album = qq|<td><a href="$amazon_url">$t->{Album}</a></td>|;
}else{
$album = "<td>$t->{Album}</td>";
}
#前のレコードと同じ再生回数の場合の処理。
if($count_before == $t->{PlayedCount}){
$count_same++;
}else{
last if $i >= $limit;
$i = $i + $count_same + 1;
$count_same = 0;
}
$count_before = $t->{PlayedCount};
print OUT qq|<tr><td align="center">$i</td>
<td>$t->{Artist}</td>
<td>$t->{Name}</td>
$album
<td align="right">$t->{PlayedCount}</td>
<td>$t->{PlayedDate}</td>
</tr>\n|;
}
print OUT "</table>\n</body></html>\n";
close OUT;