Am using Apple MediaPlayer framework and AppleMusicAPI to play songs in mobile app.
API call (with search term parameter):
https://api.music.apple.com/v1/catalog/{id}/search
Successfully returns a Song type object that is playable with the MPMusicPlayerController.applicationMusicPlayer
API call:
https://api.music.apple.com/v1/me/library/songs
Successfully returns a LibrarySong type object but will not play with MPMusicPlayerController.applicationMusicPlayer.
I am playing this way:
self.cloudPlayer = MPMusicPlayerController.applicationMusicPlayer
self.cloudPlayer?.setQueue(with: [trackId])
Async.main {
self.cloudPlayer?.prepareToPlay {error in
if let error = error {
logger.debug("Not Loaded, Prepare to Play Error: \(error)")
} else {
logger.debug("Loaded, start playing")
self.cloudPlayer?.play()
}
}
}
but keep receiving this error when playing all LibrarySong entries only:
Not Loaded, Prepare to Play Error:
Error Domain=MPMusicPlayerControllerErrorDomain Code=6 "Failed to prepare to play" UserInfo={NSDebugDescription=Failed to prepare to play}
does this player play both types of songs?
is there an additional step to play a LibrarySong?
the Library song id format id is : "id" : "i.ZOMrKR9tv1xP989"
and the Song format id is: "id" : "1442890811"
For LibrarySongs, I ended up using the catalogId in playParams for playback.
For LibrarySongs that don't have a catalogId only a purchasedId, I made another call to get the catalogId for playback