コマンドラインからiTunesの曲を検索

iTunesで管理している曲ファイルの場所をコマンドラインから調べれるようにします。

iTunesのライブラリのxmlを読み込んで指定の曲を調べるスクリプトをためしに書いてみました。iTunesのライブラリのxmlは~/Music/iTunes/iTunes Music Library.xmlです。

XMLをパースしたりせずに、正規表現とフラグ変数で強引にやってみると以下のような感じになりました。

use strict;
use warnings;
use IO::File;
use Carp;
use Encode;
use Perl6::Say;
use URI::Escape;

my $itunes_lib_file = shift;
my $keyword = decode_utf8(shift);

my $fh = IO::File->new;

$fh->open($itunes_lib_file, 'r')
    or croak "Can't open $itunes_lib_file: $!";

my $found = '';
my $song_name = '';
my $location = '';
for my $line (<$fh>) {
    ($song_name) = $line =~ m!<key>Name</key><string>(.*?)</string>!;
    ($location)  = $line =~ m!<key>Location</key><string>(.*?)</string>!;

    if ($song_name) {
        if (decode_utf8($song_name) =~ m/$keyword/) {
            $found = $song_name;
            $song_name = '';
        }
    }
    elsif ($location) {
        if ($found) {
            $location =~ s!^file://localhost!!;
            $location = uri_unescape($location);
            say "$location";

            $found = '';
            $location = '';
        }
    }
}

次のように使うと、曲名がキーワードにマッチした曲ファイルの場所が出力されます。

$ perl find_music_file.pl ~/Music/iTunes/iTunes\ Music\ Library.xml ハレ

とここまで、書いてmdfind使えば良いじゃんと言う事に気づいた。

mdfind ハレ

MacOSX限定ですけど。