0
votes

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"

1

1 Answers

0
votes

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

https://api.music.apple.com/v1/catalog/us/songs?ids=\(purchasedId)