3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AppleMusic連携で曲の固有のIDからMPMediaItemを取得したり曲を再生する時の知見

Last updated at Posted at 2020-08-23

Media Player のFrameworkを使ってAppleMusic連携のアプリを作りたい。
しかしこんなんドキュメント見ても分からんだろっていう落とし穴があったりするので、いろいろ試してわかった知見を書く。

曲固有のID

単一の曲を表すMPMediaItemにはいろいろとプロパティがあるが、曲を区別するためのIDは次の二つがある。似ているようで役割が違う。

persistentID

自分のライブラリ内の固有のID(と思われる)
このIDがあれば、MPMediaItemは取得できる。

次のように、MPMediaPropertyPredicate,MPMediaQueryを使ってpersistentIDからMPMediaItemを取得する。
MPMediaItemPropertyPersistentID というプロパティを使って絞り込もう。

private func findMPMediaItem(persistentIDString: String) -> MPMediaItem? {
        let predicate = MPMediaPropertyPredicate(value: persistentIDString, forProperty: MPMediaItemPropertyPersistentID)
        let songQuery = MPMediaQuery()
        songQuery.addFilterPredicate(predicate)
        
        if let items = songQuery.items {
            return items.first
        } else {
            return nil
        }
}

playbackStoreID

こちらはApple MusicやiTunes全体で固有のID(と思われる)

iTuneSearchAPIを例にすると、このようにAPIを叩けば曲の情報が取得できる。

$ curl "https://itunes.apple.com/lookup?id=1513201190" | jq

また、Apple Music APIでも曲の情報を取得できるが、こちらはtokenが必要だったりするので省略する。

ただしこのIDからMPMediaItemは取得できない!!😩

↑わたしが調べる限り2020年8月時点では不可能っぽい。使えるようになったら教えてほしい。🙏

MPMediaItemPropertyPlaybackStoreIDといういかにも使えそうなプロパティはあるのだが、使うと次のようなエラーで怒られるぞ。stackoverflowにある通り、現状は取得する手段がない。

"MPMediaPropertyPredicate cannot filter using the playbackStoreID property"

曲を再生したい場合は?

persistentIDを使う場合

曲を再生する時はMPMusicPlayerControllerのこれをつかう

 open func setQueue(with itemCollection: MPMediaItemCollection)

次のようにMPMediaItemからMPMediaItemCollectionを作って、セットすれば再生できる

//itemsは↑みたいな方法で取得しとく
let mediaItemCollection = MPMediaItemCollection(items: items)
let musicPlayer: MPMusicPlayerController = MPMusicPlayerController.systemMusicPlayer
musicPlayer.setQueue(with: mediaItemCollection)

playbackStoreIDを使う場合

こちらの場合、MPMediaItemは取得できない

しかし曲の再生はできる。
MPMusicPlayerControllerのこれをつかう

open func setQueue(with storeIDs: [String])

次のように書けばok

let musicPlayer: MPMusicPlayerController = MPMusicPlayerController.systemMusicPlayer
musicPlayer.setQueue(with: ["1513201190"])

まとめ

persistentIDは自分のライブラリ固有のIDで、MPMediaItemを取得できる。
playbackStoreIDはApple MusicやiTunes全体で固有のIDで、API利用して曲の情報を取得できる。

Apple Music APIを使ったアプリを作りたい時はplaybackStoreIDを使うと良さそう。
Swiftでネイティブアプリを作りたい時は、persistentIDplaybackStoreIDどう使うか考えると良さそう。

参考

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?