iTunes

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;