RubyCocoa で Skype に iTunes で再生してる曲を表示

December 24th, 2006

AppleScript で書いたやつの続き。RubyCocoa から Skype.framework と NSDistributedNotificationCenter を使っている。apple-unstable の RubyCocoa で動きます。

書いたのはちょっと前で、実行すると

% ruby a.rb
/Library/Frameworks/RubyCocoa.framework/Versions/A/Resources/ruby/osx/objc/oc_wrapper.rb:17: [BUG] Bus Error
ruby 1.8.5 (2006-08-25) [powerpc-darwin8.8.0]

zsh: abort      ruby a.rb

と、なぜか落ちるので放置していたのだけど、ひ日誌(2006-12-22) で読んだ addRubyMethod_withType を足してみたら落ちなくなった。

require 'osx/cocoa'
OSX.require_framework 'Skype'

class Server < OSX::NSObject
  def onPlayerInfo(n)
    s = "#{n.userInfo['Name']} / #{n.userInfo['Artist']}"
    OSX::SkypeAPI.sendSkypeCommand("SET PROFILE MOOD_TEXT #{s}")
  end

  def clientApplicationName
    'NowPlayingOnSkype'
  end

  addRubyMethod_withType 'skypeAttachResponse:', 'v@:i'
  def skypeAttachResponse(status)
    return if status != 1

    center = OSX::NSDistributedNotificationCenter.defaultCenter
    center.addObserver_selector_name_object_(self,
                                             'onPlayerInfo:',
                                             'com.apple.iTunes.playerInfo',
                                             'com.apple.iTunes.player')
  end
end


server = Server.alloc.init

OSX::SkypeAPI.setSkypeDelegate(server)
OSX::SkypeAPI.connect

OSX::NSRunLoop.currentRunLoop.run