[MusicKit] Check for availability of songs

Songs can be unavailable (greyed out) in Apple Music. How can I check if a song is unavailable via the MusicKit framework? Obviously the playback will fail with MPMusicPlayerControllerErrorDomain Code=6 "Failed to prepare to play" but how can I know that in advance? I need to check the availability of hundreds of albums and therefore initiating a playback for each of them is not an option.

Things I have tried:

  • Checking if the release date property is set to a future date. This filters out all future releases but doesn't solve the problem for already released songs.
  • Checking if the duration is 0. This does not work since the duration of unavailable songs does not have to be 0.
  • Initiating a playback and checking for the "Failed to prepare to play" error. This is not suitable for a huge amount of Albums.

I couldn't find a solution yet but somehow other third-party-apps are able ignore/don't shows these albums. I believe the Apple Music app is only displaying albums where at least one song is available.

I am using this function to fetch all albums of an artist.

private func fetchAlbumsFor(_ artist: Artist) async throws -> [Album] {
        let artistWithAlbums = try await artist.with(.albums)
        
        var allAlbums = [Album]()
        
        guard var currentBadge = artistWithAlbums.albums else {
            return []
        }
        allAlbums.append(contentsOf: currentBadge)
        while currentBadge.hasNextBatch {
            if let nextBatch = try await currentBadge.nextBatch() {
                currentBadge = nextBatch
                allAlbums.append(contentsOf: nextBatch)
            } else {
                break
            }
        }
        return allAlbums
    }

Here is an example album where I am unable to detect its unavailability (at least in Germany): https://music.apple.com/de/album/die-haferhorde-immer-den-n%C3%BCstern-nach-h%C3%B6rspiel-zu-band-3/1755774804 Furthermore I was unable to navigate to this album via the Apple Music app directly.

Thanks for any help

Edit: Apparently this album is not included in an apple music subscription but can be bought seperately. The question remains: How can I check that?

Answered by Engineer in 824251022

Hello @FPST, thank you for your post. You can check that using the playParameters property of Song:

song.playParameters == nil
Accepted Answer

Hello @FPST, thank you for your post. You can check that using the playParameters property of Song:

song.playParameters == nil
[MusicKit] Check for availability of songs
 
 
Q