実はすごい簡単なiTunesスクリプトの書き方(Windows版iTunes)

iTunesスクリプトを書くためのノウハウが少し溜まったのでまとめておきます。iTunesスクリプトを書くのって実はすごい簡単なんです。でもググってもあまりいい情報がヒットしませんし、開発者用のSDKは会員登録が必要と、無駄にハードルが高いのです。そこで少しでもそのお手伝いができたらと思います。

このスクリプトで何ができるの?

簡単なJScript(正確にはWindows Script Hostのスクリプト)を書くことでiTunesを操作できます。また普段手動で行っているようなiTunesの操作をスクリプトを書くことで自動化できます。例えばiTunesの曲を一曲一曲編集するのは大変ですよね。スクリプトを書けばこれを自動で行えます。ただし今回とりあげるのは、Windows版のiTunesのみです。今回書くのと似た奴にアップルスクリプトというものがあります。こちらはMac専用で、今回書くものとは別物ですので注意してください。

さて今回書くJScriptというのはJavaScriptのお友達です。文法はJavaScriptと一緒と考えていいかと思います。ちなみにJScript以外にもVisual BasicC#C++といった言語からもiTunesを操作できますが、今回はJScriptによる方法のみ取り上げます。

スクリプトの一例

まずは自分で書き始めるよりも、どんなスクリプトがあるのか見てみましょう。場合によっては自分でスクリプトを書かなくても、すでに誰かが作ってくれているかもしれませんね。

iTunes for Windowsのまとめサイト 便利なスクリプト

上記のページでいくつか便利なスクリプトが紹介されています。このなかでも一番有名なものはデッドリンクを自動で削除してくれるスクリプトです。音楽ファイルを移動したりするとリンクが切れて、曲の左側に「!」マークがつきますよね。これをライブラリから自動で削除してくれます。

スクリプトの実行方法

スクリプトの使いかたは簡単。コードを書いてテキストとして保存。JScriptのコードは拡張子を(.js)にする。VisualBasicスクリプトは拡張子を(.vbs)にする。変更できたらこのファイルをクリックして実行します。このときWindows Based Script Hostというプログラムで実行されるはずです。もしテキストエディタで実行されるようであれば、ファイルを右クリックしてプログラムから開くで、Windows Based Script Host(C:\Windows\System32\wscript.exe)で実行されるように関連付けてください。

これだけは注意してください

スクリプトを使ってiTunesを操作するわけですから、下手したらiTunesのライブラリが消えます。スクリプトなんて試行錯誤で書いていくものですから、変な操作をしちゃうことも考えられます。必ず音楽ファイルとiTunesの設定ファイル両方のバックアップを取るか、開発用にテストできる環境を整えてください。

簡単にテスト環境を整える方法を書いておきます。まずiTunesの設定ファイルを探します。設定ファイルの保存場所は、iTunesの編集>設定>詳細で確認することができます。ちなみに私の場合(Windows7)、「C:\Users\[ユーザー名]\Music\iTunes\iTunes Music」です。そしてiTunes Musicフォルダより一つ上の「C:\Users\[ユーザー名]\Music\iTunes」に設定ファイルが保存されています。今回この「iTunes」というフォルダの名前を変更します。とりあえず「iTunes_backup」とでもしておけばいいでしょう。これでiTunesを起動してみると、一曲も登録されていない初期状態になっているはずです。これで「iTunes」というフォルダが自動で作られているはずです。次にmp3のような音楽ファイルを追加します。ただし曲の情報がぐちゃぐちゃになることも考えられますので、必ずコピーしてあるものにしてください。あくまでテストなので50曲もあれば十分ではないかと思います。iTunesを元に戻したい場合はこのフォルダを削除し、先ほどの「iTunes_backup」というフォルダを元の名前「iTunes」に戻してやれば良いです。

超基本

ではさっそく書いてみましょう。

var iTunesApp = WScript.CreateObject("iTunes.Application");
iTunesApp.NextTrack();

まず絶対必要な操作ですが、最初にIiTunesクラスのオブジェクト、iTunesAppを作っています。続いて二行目でiTunesAppのNextTrack()メソッドを実行しています。これは今聞いている曲の、次の曲を再生させるためのスクリプトです。実行方法は上に書いたのと同じで、これをテキストに書いて、拡張子を(.js)にして実行します。動きましたか?

このIiTunesクラスは公式ドキュメントのIiTunes Interfaceに対応しています。なお公式ドキュメントの入手は少々面倒ですが今後絶対必要になるものです。これはiTunes COM for Windows SDKCommentsに含まれています。これの入手方法について以前書いた記事がありますので、こちらを参照してください。さて、このIiTunes InterfaceではiTunesに対する最も基本的な操作が行えます。このIiTunes Interfaceのメソッドとして再生、一時停止、停止、前の曲を再生、次の曲を再生するといった機能が提供されています。一部ですがそのメソッドを乗せておきます。ちなみに以下で紹介するメソッドは引数なしです。返り値は「S_OK」とか「E_FAIL」っていう文字列が返って来るのが基本です。

機能 メソッド名
次のトラックを再生 NextTrack ()
前のトラックを再生 BackTrack()
再生 Play()
一時停止 Pause()
停止 Stop()
iTunes終了 Quit()

IiTunes Interfaceのプロパティ

プロパティを参照する

IiTunes Interfaceに含まれるプロパティの例として、Muteというものがあります。これは音がミュート状態になっているかどうかを調べるものです。実行すると現在ミュートなら1、そうでないなら0が返って来ます。

var iTunesApp = WScript.CreateObject("iTunes.Application");
var m = iTunesApp.Mute;
WScript.Echo(m);

一行目は先ほどと同じです。二行目と三行目に注目してください。IiTunes InterfaceのMuteというプロパティは、現在iTunesがミュート状態なら1という値が、ミュートじゃないなら0、状態がうまく取得できない場合は-1という値が入っています。二行目でこの値をmという変数に代入しています。このMuteプロパティは関数ではないので当然括弧がいりません。

三行目ではWScript.Echo()というメソッドを利用して、先ほどの値を出力しています。このWScript.Echo()というメソッドはiTunes用のライブラリとして定義されているものではなく、Windows Script Hostの機能です。文字を出力する際に今後良く使います。

プロパティに値を設定する
var iTunesApp = WScript.CreateObject("iTunes.Application");
iTunesApp.Mute = 1;

次は先ほどのMuteというプロパティに値を設定します。Muteの1はミュート状態という意味なので、iTunesがミュート状態になります。正常に動きましたか?

このようにMuteというプロパティを参照する方法、値を設定する方法があります。公式ドキュメントではプロパティを参照する方法と値を設定する方法が以下のように別々に定義されています。一見するとメソッドの定義と間違えそうですね。

Muteプロパティを参照する方法の定義
HRESULT IiTunes::Mute  (  [out, retval] VARIANT_BOOL *  isMuted   )   

Muteプロパティを設定する方法の定義
HRESULT IiTunes::Mute  (  [in] VARIANT_BOOL  shouldMute   )   

一応いくつか他のプロパティも見ておきましょう。

役割 プロパティ名 設定されている値
ミュート状態かどうか Mute 0,1,-1
音量 SoundVolume 0~100
現在再生しているのは何秒目か PlayerPosition 0~

ある一曲に対する操作

ある曲をライブラリから削除したい、名前を変更したい、プレイリストに追加したい。こういう一曲に対する操作を行う場合はどうすればいいのでしょうか。ここではサンプルを取り上げて説明します。ちなみにこのサンプルはお湯ブログを参考にさせていただいたものです。というか、ほとんどそのままです…。これは「無題のプレイリスト」というプレイリストの中に入っている曲の曲名とアーティスト名を表示するスクリプトです。

//IiTunesのオブジェクトを作る
var iTunesApp = WScript.CreateObject("iTunes.Application");
//IiTunesのオブジェクトから、ある条件に一致する曲の集合をとってくる
var playlist = iTunesApp.LibrarySource.Playlists.ItemByName("無題のプレイリスト");

if (playlist) {
  var numTracks = playlist.Tracks.Count;// プレイリスト中の曲数
  for ( var i = 1; i <= numTracks; i++) {
    //曲の集合からさらに一曲取り出す
    var track = playlist.Tracks(i);
    //取り出した一曲に対して操作を行う
    var name = track.Name;//曲名
    var artist = track.Artist;//アーティスト
    var str = str + name + "/" + artist + "\n";
  }
  WScript.Echo(str);
}

一曲を操作する場合の基本的な流れは次のようになります

  1. IiTunesのオブジェクトを作る
  2. IiTunesのオブジェクトから、ある条件に一致する曲の集合をとってくる
  3. 曲の集合からさらに一曲取り出す
  4. 取り出した一曲に対して操作を行う

「IiTunesのオブジェクトから、ある条件に一致する曲の集合をとってくる」というのは今回の場合だと「無題のプレイリスト」という名前のプレイリストに含まれる全ての曲を取ってきています。他にもライブラリに含まれる全ての曲をとってくる、現在選択している曲をとってくるといった操作が可能です。「取り出した一曲に対して操作を行う」という箇所では、曲名とアーティスト名を取得しています。

上記のサンプルでは曲名とアーティスト名を参照しているだけでしたが、曲名やアーティスト名を変更するのも簡単です。

    track.Name = "(不明な曲)"
    track.Artist = "(不明なアーティスト)";

ある一曲に対する操作(IITTrackとIITFileOrCDTrackのプロパティ)

上のサンプルで登場したtrackという変数には、公式ドキュメントでいうところのIITFileOrCDTrackクラスのオブジェクトが入っています。IITFileOrCDTrackクラスはIITTrackクラスを継承しているため、IITTrackで定義されているプロパティやメソッドも利用可能です。IITFileOrCDTrackとIITTrackで利用できるプロパティの一例を挙げておきます。

プロパティ名 意味
Album アルバム名
AlbumArtist アルバムアーティスト
Genre ジャンル
Lyrics 歌詞
PlayedCount 再生回数
Size 対象ファイルのサイズ(byte)
Playlists この曲を含んでいるプレイリストの集合

ある一曲に対する操作(IITTrackのメソッド)

IITTrackではPlay()、AddArtworkFromFile()、Delete()というメソッドが定義されています。Play()はこの曲を再生します。AddArtworkFromFile()はアートワークを設定します。そして、Delete()は現在のプレイリストからこの曲を削除します。ここで注意が必要です。公式のドキュメントには以下のような一文があります。

Note that if a track is deleted from a source's primary playlist, it will be deleted from all playlist's in that source.

上で書いたサンプルでは「無題のプレイリスト」からこの曲を取り出していましたよね。つまりこの場合、「無題のプレイリスト」からこの曲が削除されることになります。でももし、ライブラリに含まれる全ての曲の集合から、この曲を選択していた場合は、iTunesのライブラリからこの曲が削除されるという意味です。

最後に

長くなりましたがここまでにします。公式ドキュメントはAPIリファレンスしかなく、入門用としては物足りなかったので、そのお手伝いができればと少しまとまった記事を書いてみました。以下に参考になるリンクを貼っておきます。

追記 2010/1/17

まとめ記事を書きました
http://d.hatena.ne.jp/prime503/20100117/1263692522: