DATE : 2009/11/05 (Thu)
※ 本記事は、北陸アンカンファレンス2009で発表した内容を文章にまとめたものです。
はじめに
本記事では、Windows上でiTunesをスクリプトから操作できるように、以下の情報を提供します。
- スクリプトからiTunesに対してどのような操作ができるのか
- iTunesをスクリプトから操作するために必要となるもの
- スクリプトの例
- 「iTunes COM Interface Documentation」の見方
- スクリプトを書く上での注意事項
なお本記事の対象はWindowsで、対応する「iTunes COM Interface Documentation」のバージョンは8.1.0.52 です。MacOSに関しては扱いません。なおMacOSではOSA(Open Scripting Architecture)に対応したスクリプト言語からiTunesを操作できるようです。
スクリプトからiTunesに対してどのような操作ができるのか
以下の操作が、スクリプトから可能です。
- プレイヤーの状態の取得(再生中か否か、選択しているトラックなど)
- プレイヤーの操作(再生開始、停止、スキップなど)
- (音楽、ビデオなどにかかわらず)ライブラリの編集(トラックの情報の編集、プレイリストの作成など)
- Podcastの購読・更新
アプリケーション関係やGenius関係以外はだいたい操作できると思います。
iTunesをスクリプトから操作するために必要となるもの。
iTunesをスクリプトから操作するには、以下のものが必要です。
- iTunes
- スクリプトの実行環境
- iTunes COM for Windows SDK
COM(Component Object Model)にアクセス可能であれば、スクリプトの言語は問いません。
iTunes COM for Windows SDKは、以下の手順で入手できます(Apple IDが必要です)。
- Apple Developer Connectionにログインする。
- 「Downloads」を開く。
- 「Developer Tools」を開く。
- 「iTunes COM for Windows SDK」をダウンロード。
スクリプトの例
ここでは、ライブラリ内の曲の情報をコンソールに出力する例を示します。
以下の手順で、ライブラリから曲の情報を取り出します。
- iTunesのCOMオブジェクトを取得する。
- iTunesからライブラリを取得する。
- ライブラリ内の1曲ごとに
- 曲の情報を1行に出力する。
この手順をPython(Python 2.6)で表現すると以下のようになります(;´∀`)Pythonなのは、ただ単に自分がいつも使っている言語だからです。なおPythonでCOMを取得するには、Pythonの実行環境にくわえて「Python for Windows extensions」も必要です。
# iTunesのCOMオブジェクトを取得する。 import win32com.client itunes = win32com.client.Dispatch("iTunes.Application") # iTunesからライブラリを取得する。 musicLibrary = itunes.LibraryPlaylist # ライブラリ中の1曲ごとに for aTrack in musicLibrary.Tracks: # 曲の情報を1行に出力する。 print "%s, %s, %s" % (aTrack.Artist, aTrack.Name, aTrack.Album)
上記のスクリプトで最も重要なのは以下の部分です。
itunes = win32com.client.Dispatch("iTunes.Application")
(※ 以下では、「itunes」変数を、iTunesから初めに取得したCOMオブジェクトが入っている変数とします)
この部分は、iTunesからCOMを取り出す処理を行っています。つまりここからすべてが始まると言えます。「win32com.client.Dispatch」の部分はスクリプト言語によって変わりますが、「iTunes.Application」の部分はどのスクリプト言語であっても変わりません。
さて、iTunesからCOMを取り出す部分がすべての始まりだと言うことはわかりました。それでは、それから様々な操作を行うには、どのようにすればよいのでしょうか。その答えが「iTunes COM Interface Documentation」に書かれています。
「iTunes COM Interface Documentation」の見方
iTunes COM Interface Documentationを開くと、まず目に飛び込んでくるのがインタフェースやクラスの一覧です。
この中にある、「IiTunes」が、iTunesから初めに取得できるCOMオブジェクトとなります。つまり、まず「IiTunes」インタフェースからドキュメントを読んでいくと、スクリプトを使ってiTunesで何ができるのかわかります。
ところが、このiTunes COM Interface DocumentationはC言語向けに書かれており、スクリプトから使用する場合には若干理解しづらい書き方がされています。例えば、プレイリストを表すオブジェクトを生成する、IiTunesインタフェースのCreatePlaylistメソッドは以下のように記述されています。
HRESULT CreatePlaylist ([in] BSTR playlistName, [out, retval] IITPlaylist **iPlaylist)
スクリプトから使う際には、以下のように読むと使い方が理解しやすくなります。(ただし、スクリプトによっては以下のような理解では使えないものもあるかもしれません。しかし少なくとも、VBAやJScript、Ruby、Pythonでは以下のように理解しても問題はありません)。
- 「HRESULT」は無視する。
- 「CreatePlaylist」はメソッド名。
- 「[in]」はメソッドの引数。
- 「BSTR」は文字列型。
- 「[out, retval]」はメソッドの戻り値。
- 「IITPlaylist」はIITPlaylistインタフェース
つまり、プレイリストを生成するには以下のようにメソッド呼び出しを行います。
createdPlaylist = itunes.CreatePlaylist("New Playlist Name")
なお「BSTR」は文字列型を表しています。他にも「VARIANT_BOOL」や「long」、「DATE」などの型があります。このあたりは、スクリプト言語のどの型に相当するのかその名前から想像が付くと思います。
トラックのコレクションを表すIITTrackCollectionなどのxxxxCollectionインタフェースにも注意が必要です(例えば、「itunes.LibraryPlaylist.Tracks」で取得できるオブジェクトはIITTrackCollectionインタフェースを持っています)。言語によっては、これらxxxxCollectionインタフェースがそのスクリプト言語内でのコレクションにマッピングされることがあります。スクリプト言語内のコレクションにマッピングされた場合、xxxxCollectionインタフェースの、指定したインデックスの要素を返す「Item」プロパティは読み替えが必要です。具体的には次のようになります。
# ライブラリから初めの1曲を取り出すコード例 # IITTackCollectionがコレクションオブジェクトにマッピングされる言語の場合、 # このコードはうまく動作しない aFirstTrack = itunes.LibraryPlaylist.Tracks.Item(1) # 以下のように読み替えなければならない aFirstTrack = itunes.LibraryPlaylist.Tracks[0]
スクリプトを書く上での注意事項
iTunesのCOMでは、インデックスが「1」から始まる点に注意が必要です。
ところが、処理系によってはそのスクリプト言語内のコレクションにマッピングする際に、インデックスを補正して0始まりに修正する場合があります(例えばこれまでのコード例のように、Pythonでは0始まりとして扱えます)。それはそれで便利なのですが、気をつけなければならない点があります。コレクションにマッピングされる「Item」プロパティはインデックスが0始まりとして扱えますが、それ以外は1始まりとして扱わなければなりません。例えば、IITTrackCollectionには「ItemByPlayOrder」という指定したインデックスで再生順にトラックを返すメソッドがあります。このメソッドはItemプロパティとは異なり、コレクションにマッピングされる対象外のためインデックスは1始まりとなります。具体的には次のようになります。
# ライブラリから初めの1曲を取り出すコード例 # IITTackCollectionがコレクションオブジェクトにマッピングされる言語の場合、 # このコードはうまく動作するが aFirstTrack = itunes.LibraryPlaylist.Tracks[0] # 次のコードはうまく動作しない aFirstTrack = itunes.LibraryPlaylist.Tracks.ItemByPlayOrder(0) # コレクションにマッピングされないプロパティは、インデックスが1から始まる aFirstTrack = itunes.LibraryPlaylist.Tracks.ItemByPlayOrder(1)
つまり、コレクションへのマッピングの際にインデックスを0始まりに補正するスクリプト処理系でメソッドの引数にインデックスを渡す必要がある場合は、インデックスが1始まりであることを念頭に置いて処理しなければなりません。
最後に
以上、iTunesをスクリプトから操作する方法について簡単に説明してきました。iTunes自体のUIはとても良くできており、手動での操作でもかなりのことができます。ところが再生回数の変更やレートの一括変更など、細かいところではスクリプトの得意とする面もあります。またiTunes外からiTunesを操作するアプリケーションも数多く存在します。そう言った面では、アイディア次第でiTunesをさらに面白く活用することも可能ではないかと思います。
謝辞
北陸アンカンファレンス2009にて、本セッションを聞きに来てくださった方々、つたない説明ながらも熱心にお聞きくださり、誠にありがとうございました。