Mac の iTunes を Ruby で操作する。

うちがお外で開発するときは、Parallels Desktop の Windows をフルスクリーンで立ち上げるのですが、Mac OS X のアプリケーションにフォーカスを移そうとすると、結構固まったりするんです。iTunes の操作や現在聴いてる曲を知りたくなったときに不便だったのでなんとかしようと思いたった。

Mac 側の共有設定でリモートログインを入れておけば、PoderosaからMacのシェルにログインできるので、iTunes の操作をするスクリプトを書けばよさそう。そういうわけで、RubyAppleScript ブリッジ、RubyOSA で操作するスクリプトを書くことにしました。

準備

まずは、RubyOSA が必要なのでインストールする。

$ sudo gem install rubyosa

rubygems と rbosa を require し、OSA.app でオブジェクトを生成。

irb> require 'rubygems'
irb> require 'rbosa'
irb> itunes = OSA.app('iTunes')

再生中の曲を取得する

current_track プロパティに現在の曲の情報を表すオブジェクトが入っている。ここから、name、artist、album がとれる。うちの環境だとどうも化けるっぽいので、kconv を取り込んで toutf8 した。

irb> require 'kconv'
irb> itunes.current_track.name.toutf8
=> "そらのうた"
irb> itunes.current_track.artist.toutf8
=> "和来"

再生とかのコントロール

こんなメソッドが使えます。

irb> itunes.play
irb> itunes.stop
irb> itunes.pause
irb> itunes.next_track
irb> itunes.previous_track

ちょっと使いづらかったので

以上、一通り動かしたところでよく使う次の曲へ移るとか、現在のトラック情報とかメソッド名長かったりしてちょっと面倒だったので、クラス定義してみた。

require 'rubygems'
require 'rbosa' # gem install rubyosa
require 'kconv'
require 'forwardable'

class ItunesMusicControl
  extend Forwardable
  
  def initialize
    @itunes = OSA.app('iTunes')
  end

  def track_info
    track  = @itunes.current_track
    name   = track.name.to_s.toutf8
    artist = track.artist.to_s.toutf8
    album  = track.album.to_s.toutf8
    puts "#{name} / #{artist} (#{album})"
  end

  def_delegator  :@itunes, :next_track,     :next
  def_delegator  :@itunes, :previous_track, :prev
  def_delegators :@itunes, :play, :stop, :pause
end

puts 'input "itunes = ItunesMusicControl.new"'

あとは、irbからこんなかんじで操作できる。

irb> require 'iTunesControl'
irb> itunes = ItunesMusicControl.new
irb> itunes.track_info
そらのうた / 和来 (らくえんのうた)
irb> itunes.next

Parallelsからウィンドウ切り替えるのは非常に時間がかかるので、これだけでも十分楽になりました。

その他

基本的に、AppleScript でできることのうち、かなりのことはできそう。

どんなオブジェクトがあって、どんなメソッドが使えるかはスクリプトエディタのライブラリを見ればよさそう。