はじめに
現在再生中の楽曲リストを知りたいことってあると思います。setQueueした後ならqueueAsQueryから取得できますが、新しく取得し直した MPMusicPlayerControllerからはqueueAsQueryでは取得できません。
というわけでこれを取得しようというのが今回のお話です。
発見までのお話
https://developer.apple.com/reference/mediaplayer/mpmusicplayercontroller
こちらがApple公式リファレンスのMPMusicPlayerControllerのページです。
再生中の楽曲の情報を取得するのはnowPlayingItem、とそのインデックスを取得するのはindexOfNowPlayingItemでできますが、再生中のリストを取得するようなメソッドが一切見当たりません。
「本当にないのかなー、何か使えそうなメソッドないかなー」とMPMusicPlayerControllerをdirしていたら「nowPlayingItemAtIndex」というメソッドを見つけました。ネーミングがわかりづらすぎて一回スルーしてしまいました。
Appleの公式リファレンスに載っていないメソッドも見つけることができます。そうPythonistaならね。
というか既にやってた
そんな経緯で発見したのですが、実はstackoverflowに同じようなことやってる人がいました。
http://stackoverflow.com/questions/10092589/ios-get-programatically-queue-of-items-currently-playing
あとからnowPlayingItemAtIndexでググったら見つけました。まぁこれのPythonista版だと思ってください。
本編
def getPlayer(): return ObjCClass('MPMusicPlayerController').systemMusicPlayer() def getNowPlayingList(): p = getPlayer() q = [] for i in range(p.numberOfItems()): q.append(p.nowPlayingItemAtIndex(i)) return q
該当箇所のみです。全ソースコード欲しい人はgitから拾ってください。ハッシュは0e80a13c7b127a3a232e06e7deba985d6f01b474で、MPUtils.pyに入ってます。
今回はnowPlayingItemAtIndexを使ってリストを作るだけなので特に解説要らないと思います。
numberOfItemsで再生リストの曲数がわかるので、for文で回しながらnowPlayingItemAtIndexに渡せば、該当インデックスの曲が貰えます。
地味にnumberOfItemsもリファレンスには載ってません。注意してください。
おわりに
こんな感じで現在の再生リストが取得できます。Apple公式リファレンスに載ってないものでも覗いてみると案外有用なものがあったりするので暇な時に覗いてみるといいかもしれません。iOSのバージョンアップでメソッド追加されてたりとかもあるかもしれません。
というか公式のリファレンスに載ってないってどうなんでしょうね。APIなのに使わせる気がないんですか。誰のためのAPIなんですか。そもそもリストを直接くれればいいのに、インデックス指定してそこの曲だけ欲しい場面ってそんなにあるんですかね。リスト全部くれるなら曲ごとの情報とかこっちで勝手にやりますし余計なことしないでほしいです。大体内部でリストで持ってるであろうものをばらばらにして返してこっちでリストにまとめるって非効率的すぎます。リストで管理していないんだったらもっとアホでしょう。このAPIのユースケース考えた人どうかしてるんじゃないですか。
以上です(ニッコリ)。