iTunesをPerl経由で何かしたかった

「〜したかった」ってタイトルの時は大体残念です。
というかいつも残念です。
まぁいいや。


2008年の08月頃に一時期ネットラジオとやらにハマっていた時期がありまして、
メッセのお友達とイントロクイズをしようという事で、
僕のiTunesのプレイリストからランダムで30秒曲を流して次の曲へ〜みたいなのを書いてたソースを探してて、
色々探した結果漸く見つけたのですが、また探すのが面倒くさいので晒しておきます。
コメントが全くコメントの意味を成してない良い例な気がします。
あんまり恥ずかしいコメントは若干変更してます。
あぁ恥ずかしい。

use strict;
use Win32::OLE;
use Dumpvalue;
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);

my $dumper  = Dumpvalue->new();
my $itunes  = Win32::OLE->new('iTunes.Application') or die "oops\n";
my $library = $itunes->LibraryPlaylist;
my $tracks  = $library->Tracks;
my $counter = 1;
my $ua = LWP::UserAgent->new;

# 再生リストが無い場合
unless ($tracks) {
  print 'Not exist play list...' . $/;
  exit;
}

# ランダム再生
while ($tracks->Count >= 1) {
  my $trackNum = int(rand($tracks->Count)+1);
  if ($tracks->Item($trackNum)->Enabled == 1) {
    # 最初に巻き戻したら
    $tracks->Item($trackNum)->Start;
    # 曲再生
    $tracks->Item($trackNum)->Play;
    # フェードイン
    foreach (0..50) {
      $itunes->{SoundVolume} = $_ * 4;
      sleep(0.8);
    }
    # 
    my $header   = $counter . '曲目だよ!さて、何て曲でしょー!!' . $/;
    print $header;
    # 休憩
    sleep(90);
    # 答え
    my $answer   = $counter++."曲目\r\nアーティスト名:".$tracks->Item($trackNum)->Artist."\r\n曲名: ".$tracks->Item($trackNum)->Name."\r\n出展(\結\構\適\当): ".($tracks->Item($trackNum)->Album || '不明')."\r\n\r\nあと".$tracks->Count."曲くらい\r\n";
    my $response = $ua->request(
      # 結果表示用uri
    );
    print $answer;
    # フェードアウト
    foreach (0..50) {
      $itunes->{SoundVolume} = 100 - $_ * 2;
      sleep(0.9);
      if ($itunes->{SoundVolume} <= 0) {
        last;
      }
    }
    # 次の準備
    foreach (1..8) {
      print 'wait ... ' . $_ . $/;
      sleep(1);
    }
#    $tracks->Item($trackNum)->{Enabled} = 0;
    $tracks->Item($trackNum)->Delete;
  }
}


miyagawaさんのPlaggerプラグインみて気付いたんだけど、My Music内のiTunesフォルダのiTunes Music Library.xmlに最近再生した楽曲のデータ載ってるんですね。
知らなかった。
http://search.cpan.org/~miyagawa/Plagger-0.7.17/lib/Plagger/Plugin/CustomFeed/iTunesRecentPlay.pm
でも, これはFile::HomeDir::Windowsの規格がちょっと変わってるからmy_win32_folderはmy_musicにしたりちょっと変えないといけないね。
line 36:

my $mymusic = File::HomeDir::Windows->my_win32_folder('My Music');


他、参考にしてたような気がするページ
iTunes COM APIはメンバー制になったのね。。。

Macだとこれが便利そう
http://blog.clouder.jp/archives/000250.html
・これがそもそものネタ。あとはAPIのリファレンス見ながら色々してただけっす・・・。
http://blog.bulknews.net/mt/archives/001244.html
・Win32::OLE系
http://homepage3.nifty.com/hippo2000/perltips/Win32/OLE.htm
http://www.drk7.jp/MT/archives/001251.html
http://www.site-cooler.com/kwl/perl/ole.htm
・Win32::API系だと、ちょっと前にtakesakoさんがだいなろーだーつかってすてきなすばらしいおそろしいものを載せてた
http://d.hatena.ne.jp/TAKESAKO/20090324/1237879559
・マンセーなnipotanさんがこんなのかいてた(今日知った)
http://blog.livedoor.jp/nipotan/archives/6677120.html
iTunes×TwitterなのをAIRでやったりしてる
http://www.atmarkit.co.jp/fwcr/column/ore02/01.html