iTunesで聞いている曲を表示する(↓のエントリのまとめ)

startup_itunes.vbsでstartup_itunes.batをDOSプロンプト表示しないで実行させて、
startup_itunes.batでitunes_updater.batでperlスクリプトを実行して適当に再生させる流れ。


itunes_updater.bat

@rem = '--*-Perl-*--
@echo off
if "%OS%" == "Windows_NT" goto WinNT
perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
goto endofperl
:WinNT
perl -x -S %0 %*
if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
if %errorlevel% == 9009 echo You do not have Perl in your PATH.
if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
goto endofperl
@rem ';
#!perl
#line 15

use utf8;
use strict;
use Dumpvalue;
use File::Spec;
use File::HomeDir::Windows;
use LWP::Simple;
use Win32::OLE;

my $itunes  = Win32::OLE->new('iTunes.Application');
my $library = $itunes->LibraryPlaylist;
my $tracks  = $library->Tracks;

my $path = File::HomeDir::Windows->my_music;
my $file = File::Spec->catfile($path, 'iTunes', 'iTunes Music Library.xml');

my @recent_playlist;
my %track_list;
my $last_id = -1;

# 再生
my $trackNum = int(rand($tracks->Count)+1);
$tracks->Item($trackNum)->Start;
$tracks->Item($trackNum)->Play;

while (1) {
  # ファイル操作
  open my $data, $file;
  while (my $line = <$data>) {
    # 処理の開始
    if ($line =~ /^<dict>$/) {
      while (my $line = <$data>) {
        # 楽曲の取得
        if ($line =~ /^\t<key>Tracks<\/key>$/) {
          get_music($data);
        }
        # プレイリストの取得
        # デフォルトのとか,Geniusとか,最近再生〜とか,最近追加〜など,左メニューに表示してるやつら
        if ($line =~ /^\t<key>Playlists<\/key>$/) {
          get_playlist($data);
        }
      }
    }
  }
  close $data;
  undef($data);
  
  if ($recent_playlist[0] != $last_id) {
    #print $track_list{$recent_playlist[0]}->{Name}, $/;
    my $result = get("表示するファイル出力させる");
    #if (is_error($result)) {
    #  die('oops');
    #}
    $last_id = $recent_playlist[0];
  }
  else {
    #print "-\n";
  }
  undef(@recent_playlist);
  #undef(%track_list);

  sleep(10);
}

# リスト表示
#foreach my $track_id(@recent_playlist) {
#  print $track_list{$track_id}->{Name}, " by ", $track_list{$track_id}->{Artist}, $/;
#}

exit;

sub get_music {
  my $data = shift;
  # <dict>の部分を省略
  my $line = <$data>;
  # 楽曲の取得開始
  while (my $line = <$data>) {
    # 楽曲の取得終了か?
    if ($line =~ /^\t<\/dict>$/) {
      last;
    }
    #my $id = -1;
    ## key
    #if ($line =~ /^\t\t\t<key>([0-9]*?)<\/key>$/) {
    #  $id = $1;
    #}
    # <dict>の部分を省略
    $line = <$data>;
    # dictの中身
    my $track_id;
    while (!((my $line = <$data>) =~ /^\t\t<\/dict>$/)) {
      my($key, $val) = ($line =~ /<key>(.*?)<\/key><[\w]+?>(.*?)<\/[\w]+?>/);
      if ($key eq 'Track ID') {
        $track_id = $val;
        $track_list{$val} = {};
      }
      elsif($key eq 'Artist' || $key eq 'Name') {
        $track_list{$track_id}->{$key} = $val;
      }
    }
  }
}

sub get_playlist {
  my $data = shift;
  # <array>の部分を省略
  my $line = <$data>;
  while (my $line = <$data>) {
    # ライブラリ、Genius、Alternative Plan、トップ25、最近追加した項目、などは無視
    my $str = "\t\t\t<key>Name<\/key><string>最近再生した項目<\/string>";
    utf8::encode($str);
    if ($line =~ /^$str$/) {
      # Playlist Itemsまでの行は無視
      while (my $line = <$data>) {
        if ($line =~ /^\t\t\t<key>Playlist Items<\/key>$/) {
          # <array>は無視
          $line = <$data>;
          # 最近再生したアイテムの取得開始
          while (my $line = <$data>) {
            # リストの取得終了か?
            if ($line =~ /^\t\t\t<\/array>$/) {
              last;
            }
            unless ($line =~ /dict>$/) {
              my($track_id) = ($line =~ /\t\t\t\t\t<key>Track ID<\/key><integer>([\d]*?)<\/integer>$/);
              push(@recent_playlist, $track_id);
            }
          }
          last;
        }
      }
    }
  }
}

1;

__END__
:endofperl



startup_itunes.bat

@echo off
start /b C:\service\itunes_updater.bat


startup_itunes.vbs

Dim WShell
Set WShell = WSCript.CreateObject("WScript.Shell")
WShell.Run "C:\\service\\startup_itunes.bat", 0


startup_itunes.vbsの

WShell.Run "C:\\service\\startup_itunes.bat", 0

WShell.Run "C:\\service\\itunes_updater.bat /e", 0

にしたらstartup_itunes.batいらなくなった