RubyOSA で iTunes を操作

iTunesへの楽曲登録やトラック情報の入力を自動化したいと思って検索してみたら、Macだと RubyOSA というRubyのライブラリでiTunesを操作できるらしいので試してみた。環境は Tiger + Ruby 1.8.7

インストール

libxml-ruby が新しいと BUS Error とか言われて何もできないので、先に古いのを手動で入れる。

$ sudo gem install -v 0.3.8.4 libxml-ruby
$ sudo gem install rubyosa

私の場合はlibxml-rubyに依存しているのが無かったのでこれで良かったけど、新しいバージョンを入れる必要のある場合は この辺 の手順でRubyOSAのソースを書き換えないとだめかも。

初期化

基本になるのが OSA::ITunes::Application クラスで、これを作って使う。ただ、あらかじめ iTune が起動していないと何もできず、さらに run というiTunesを起動するらしきメソッド自体が「あらかじめiTunesが起動していないと呼び出せない」という意味不明な制限があるみたいなので、手抜きな回避コードを入れてます……。

require 'rubygems'
require 'rbosa'

OSA.utf8_strings = true

app = OSA.app('iTunes')
app.run rescue system 'open -a iTunes'

utf_strings は文字列をUTF8でエンコードするかどうかのフラグで、日本語の楽曲名などを扱うならたぶん必須。ほかにもいくつか設定があるらしい。

ソースの取得

ソースというのは「ライブラリ」「iPod」「音楽CD」みたいなデータ元で、Application からはまずこれを取得する。

# 名前の列挙
app.sources.each {|s| puts s.name}

# 「ライブラリ」を取得
library = app.sources.find {|s| s.kind == OSA::ITunes::ESRC::LIBRARY}

ESRC はソースの種類。

プレイリストの取得

ソースの中にさらに複数のプレイリストがある、という階層構造になっている模様。

# ライブラリのすべてのプレイリストを、
# プレイリスト中の曲の合計サイズで降順ソートして表示
library.playlists.sort {|a, b| b.size <=> a.size}.each {|p| puts p.name}

# ライブラリの中の「ライブラリ」プレイリストを取得
library_plist = library.library_playlists[0]

# podcast を最初から再生
podcast_plist = library.playlists.find {|p| 'Podcast' == p.name}
podcast_plist.play

iTunes自体にそんなに詳しくないので知らないが、library_playlists は必ず1つあるのかどうか不明。
あと、試していないけどプレイリストは name= メソッドで名前変更もできるので、間違って p.name = 'Podcast' とかやると悲惨なことになるかも。

楽曲の追加・編集
# 「ライブラリ」に追加
test_track = app.add('/Users/hoge/Desktop/test.mp3')

# 追加したトラックのアーティスト名とコメントを設定
test_track.artist = 'Artist Name'
test_track.comment = 'テストです。'

# 第2引数でプレイリストを指定すると、直接追加できる
# (ライブラリにも勝手に追加される)
test_plist = library.playlists.find {|p| 'テスト' == p.name}
app.add('/Users/hoge/Desktop/test2.mp3', test_plist)

まとめてインポートしたファイルにコメントを追記したりも簡単にできそう。

おわり
app.quit