iTunesで聴いている曲をSlackに通知するアプリをElectronで作った という素敵な記事をみつけ、そういえば最近似たようなやつを作ったなぁと思って記事にしてみました。
ただの紹介記事だと面白くないので、どうやって Apple Music に対応したのかをついでに記そうと思います。
もっとも簡単に作るなら Apple Script が便利です。私もつい最近までは、単純に再生中の曲を slack に流すだけでよかったので、 ruby + osascript コマンドで実装していました。
Apple Script で iTunes の情報を取る
だいたいこんなコードで再生中の曲自体は取れます。
OSX をお使いの方は「アプリケーション - その他 - スクリプトエディタ」などで次のファイルを作成してみてください。
tell application "iTunes"
set trackName to name of current track
set trackArtist to artist of current track
return trackName & " - " & trackArtist
end tell
ファイルを作成・保存したら、スクリプトエディタで直接実行してもいいですし、コンソールから
$ osascript path/to/getTrack.scpt
してもよいです。
標準出力に、再生中の曲が表示されたのがわかるかと思いますので、あとは slackcat するなり、直接 curl
あたりで post するなり自由にできます。
しかし、この方法で Apple Music の情報は取れません 。
Apple Script で取り扱える情報について
Apple Script で取り扱える情報を調べるにはスクリプトエディタの「用語説明」を使います。
「ファイル - 用語説明を開く」をクリックすることで、Apple Script でアクセス可能なアプリケーションのリファレンスを開くことができます。
この中から iTunes を選ぶと次のようなリファレンスが提示されます。
この中を調べても、やっぱり Apple Music の情報は取れなさそうだ とわかります。
それでも Apple Music の再生情報を取りたい!
なぜ Apple Music の曲情報が取れないかというと、アクセス権がないから(一応ネットワーク上の情報なので。マイミュージックに追加をすると、ローカルからのアクセス権がつくので、AppleScript などでアクセスできるようになります)なのですが、それでも、slack に投稿するために曲情報、欲しいですよね?
そこで、別のアプローチを試します。
そう、通知センターです。
こんな風に再生情報が表示できる以上、何らかの方法を使えば同じだけの情報は取れるはずです!
結論から言えば、 NSDistributedNotificationCenter.defaultCenter
に "com.apple.iTunes.playerInfo" のオブザーバを登録することで Apple Music の音楽も曲情報が取得できます
NSNotificationCenter はプロセス間通信を非常にやりやすくしたもので、アプリケーションは任意のメッセージを Listen できますし、通知センターに任意のメッセージを送信できます。
詳細は
http://www15.plala.or.jp/NovemberKou/programming/columnHome/column/whatIsNotification.html
などが詳しいかと思います。
感想
そもそも swift を使うつもりは全然なかったのですが、一番簡単に NotificationCenter のオブザーバを用意する方法がこれだったので、仕方なく Cocoa アプリケーションとして実装されています。
Electron は大変よくできていると思うので、 Electron での通知センターのオブザーバー実装に皆さんも挑戦してみてはいかがでしょうか?
また、SlackMood の実装はものすごく簡単です。
任意のメッセージを受け取って、決めうちの slack api に post するだけにすぎません。
Listen するメッセージの切り替えや、post先の切り替えは、ソースコードを書き換えるだけですぐに実現できるかと思いますので、ぜひ適当に fork して、あなただけの mood message publisher を作ってみてください!