zerosp.blog > Web Programming > 2010/03/07 23:42 >

[Perl] iTunesのライブラリファイル(Music Library.xml)を使ってアルバムの再生回数をカウントしたい。

1年間に良く聴いたアルバムをピックアップしたいのですが、iTunesは曲の再生回数のカウントのみでアルバムの再生回数はカウントしていないようです。そこでiTunesの曲ライブラリを記録しているiTunes Music Library.xmlを利用してPerlを使って大まかなカウントをしてみました。

アルバム再生回数といっても10曲収録なら「10曲のトータル再生回数/10」ってな感じの単純平均で求めたいと思います。

ライブラリファイルxmlの中身が、Amazon Product Advertising APIのような

<要素名>値</要素名>

という形ではなく

<key>Album</key><string>えりあし</string>
<key>Play Count</key><integer>5</integer>

のような違った形になっています。最初はXML-Simple、XML-LibXMLを使ってスクリプトを書いたのですが、MP3のIDタグの情報量によって要素の順番が変わってしまい上手く取得できないことがあったので最終的には正規表現をつかって処理しました。

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Encode;

my $input_data;
my $file = "./iTunes Music Library.xml";

open my $in_fh, "<", $file or die "Cannot open '$file': $!";
while (my $line = <$in_fh>) {
  $input_data .= $line;
}
close $in_fh;

my $res = Encode::decode("utf8", $input_data);
my @songs = split/<\/key>\n\t\t<dict>/, $res;
shift (@songs);

my %total_count;
foreach my $song (@songs) {
  my ($artist, $album);
  if ($song =~ /<key>Compilation<\/key><true\/>/) {
    $artist = "Compilation";
  } elsif ($song =~ /<key>Artist<\/key><string>(.*?)<\/string>/) {
    $artist = $1;
  }
  $artist =~ s/"/"/g;
  if ($song =~ /<key>Album<\/key><string>(.*?)<\/string>/) {
    $album = $1;
  }
  $album =~ s/"/"/g;
  if ($song =~ /<key>Play Count<\/key><integer>(.*?)<\/integer>/) {
    $total_count{$artist}{$album}{'cnt'} += $1;
  }
  $total_count{$artist}{$album}{'song_total'} += 1;
}

my $out_data;
foreach my $artist (%total_count) {
  foreach my $album (keys(%{$total_count{$artist}})) {
    $total_count{$artist}{$album}{'cnt'} = 1 unless exists($total_count{$artist}{$album}{'cnt'});
    my $cnt = $total_count{$artist}{$album}{'cnt'} / $total_count{$artist}{$album}{'song_total'};
    $total_count{$artist}{$album} = int($cnt);
    $out_data .= "\"$artist\",\"$album\",\"$total_count{$artist}{$album}\"\n";
  }
}
$out_data = Encode::encode("sjis", $out_data);

open my $out_fh, ">", "music_data.csv";
print $out_fh $out_data;
close $out_fh;

あんましキレイなコードではないですが・・・。コードを実行すると各アルバムの再生回数がファイルに出力されます。

"DEAD END","METAMORPHOSIS","17"
"陰陽座","魔王戴天","3"
"Compilation","hide TRIBUTE SPIRITS","1"

CSV形式で出力されますので、あとは表計算ソフトでソートでもしてください。うちは年末にライブラリファイルのバックアップを取って、再生回数をリセットしています。手元に2008年、2009年分があるので後ほど年間で良く聴いたアルバムの記事でも書こうかな。

CPU Celerin M340(1.5GMhz)、メモリ 1GBのThinkPadで15.5MBのiTunes Music Library.xmlを処理してみると2分前後かかりました。

初めてのPerl 第5版続・初めてのPerl 改訂版

投稿日 2010-03-07 23:42

当サイトのコメントとトラックバックの扱いについて。

スパム対策のため認証制となっています。受け取ったコメント、トラックバックは一旦保留扱いとなり管理人が許可したものだけ表示されます。

トラックバック

トラックバックの受付は停止中です。

コメント

コメントの受付は停止中です。