49
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

iTunesで聴いている曲をSlackに通知するアプリをswiftで書いた

iTunesで聴いている曲をSlackに通知するアプリをElectronで作った という素敵な記事をみつけ、そういえば最近似たようなやつを作ったなぁと思って記事にしてみました。

ただの紹介記事だと面白くないので、どうやって Apple Music に対応したのかをついでに記そうと思います。

SlackMood.png

もっとも簡単に作るなら Apple Script が便利です。私もつい最近までは、単純に再生中の曲を slack に流すだけでよかったので、 ruby + osascript コマンドで実装していました。

Apple Script で iTunes の情報を取る

だいたいこんなコードで再生中の曲自体は取れます。

OSX をお使いの方は「アプリケーション - その他 - スクリプトエディタ」などで次のファイルを作成してみてください。

getTrack.scpt
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 で取り扱える情報を調べるにはスクリプトエディタの「用語説明」を使います。

how_to_get.png

「ファイル - 用語説明を開く」をクリックすることで、Apple Script でアクセス可能なアプリケーションのリファレンスを開くことができます。

dictionary.png

この中から iTunes を選ぶと次のようなリファレンスが提示されます。

itunes_refs.png

この中を調べても、やっぱり Apple Music の情報は取れなさそうだ とわかります。

それでも Apple Music の再生情報を取りたい!

なぜ Apple Music の曲情報が取れないかというと、アクセス権がないから(一応ネットワーク上の情報なので。マイミュージックに追加をすると、ローカルからのアクセス権がつくので、AppleScript などでアクセスできるようになります)なのですが、それでも、slack に投稿するために曲情報、欲しいですよね?

そこで、別のアプローチを試します。

そう、通知センターです。

notification.png

こんな風に再生情報が表示できる以上、何らかの方法を使えば同じだけの情報は取れるはずです!

結論から言えば、 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 を作ってみてください!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
49
Help us understand the problem. What are the problem?