I would like to know if an MPMediaItem that represents a music track is for a Fairplay/DRM-protected item. Any way to do this?
7 Answers
Here's how I do it:
MPMediaItem* item;
NSURL* assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL];
NSString *title=[item valueForProperty:MPMediaItemPropertyTitle];
if (!assetURL) {
/*
* !!!: When MPMediaItemPropertyAssetURL is nil, it typically means the file
* in question is protected by DRM. (old m4p files)
*/
NSLog(@"%@ has DRM",title);
}

- 243
- 3
- 9
-
1Hi Guys, Could you please suggest how can we play these DRM protected files using AVPlayer? – Sekhar Bhetalam Feb 28 '12 at 06:02
-
1AVPlayer cannot play old DRM. You need to get the user to upgrade the audio files with iTunes Plus to convert the tracks to open DRM which is what all songs are sold as now. – Brennan Mar 16 '12 at 17:15
-
I checked a few songs I bought from iTunes in the last year and they exhibit the same problem -- MPMediaItemPropertyAssetURL returns (null). The files are shown in iTunes as "Purchased AAC audio file" and have an extension of .m4a. So it seems like this problem still exists, or went away and came back again since the comments above...? – arlomedia Jan 24 '14 at 02:00
-
To your comment on DRM, I've also seen MPMediaItemPropertyAssetURL return nil for tracks that were not completely downloaded from iTunes/iCloud. Fixed it by forcing the download in the Apple Music app. – Dan Loughney Mar 29 '14 at 18:14
-
1This is not the correct way to check because `MPMediaItemPropertyAssetURL` is **not nil** on **iOS 11** at least for songs saved offline via _Apple Music_ but they are definitely **DRM protected** and `AVPlayer` too is unable to play them. Please check my answer below for details on this. – Mohit Singh Dec 07 '17 at 11:57
Since iOS 4.2 there is a way. There may be a more effective way then the example here (but for my app I needed to create AVPlayerItems anyway).
MPMediaItem item;
NSURL *assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL];
AVPlayerItem *avItem = [[AVPlayerItem alloc] initWithURL:assetURL];
BOOL fairplayed = avItem.asset.hasProtectedContent;

- 3,678
- 1
- 29
- 32
-
2Since [item valueForProperty:MPMediaItemPropertyAssetURL] returns nil for a DRM, your AVPlayerItem will be created with nil ? – ıɾuǝʞ Dec 12 '11 at 09:45
-
Possibly. Is it a safe assumption that the asset url returned is _always_ nil for protected content? – voidStern Dec 19 '11 at 10:35
-
I got the issue by not checking if assetURL is nil, an with a device with iOS > 4.2 (4.3.4 exactly) – ıɾuǝʞ Dec 20 '11 at 16:50
-
5Unprotected items which are not currently playable will also return nil. Most commonly items in iTunes Match which are not local to the device. – TurqMage Jan 04 '12 at 00:38
-
1This is the correct way to check. Also, `MPMediaItemPropertyAssetURL` is **not nil** on **iOS 11** at least for songs saved offline via _Apple Music_ but `AVPlayer` is unable to play them since they are **DRM protected**. Check my answer below for details on this. – Mohit Singh Dec 07 '17 at 11:54
From iOS 4.2 the AVAsset
class has a property hasProtectedContent
so you can check:
NSURL *assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL];
AVAsset *asset = [AVAsset assetWithURL:assetURL];
if ([asset hasProtectedContent] == NO) {..do your stuff..}
-
3Note that this hasProtectedContent call is relatively slowing; calling it on about 100 non-DRMed songs was taking around 4 seconds on an iphone 4S. – JosephH Aug 01 '12 at 15:11
-
Of course but that is only way to make it work. Adding that code in background queue solves the problem and you can display progress bar so user can know that operation will last a little bit longer that other operations. – Josip B. Aug 13 '12 at 18:18
MPMediaItemPropertyAssetURL
is not nil on iPhone X running iOS 11 for songs saved offline via Apple Music but AVPlayer
is unable to play them since they are DRM protected. The same song returns MPMediaItemPropertyAssetURL
nil on iOS 9.
MPMediaItemPropertyAssetURL
returns nil for songs added to Library via Apple Music but not available offline - both on iOS 9 & 11.
Thus, @voidStern's answer (and not Justin Kent's) is the correct way to test for DRM-protected asset.
Swift 4 version of voidStern's answer (works perfectly for me on iOS 9 to 11):
let itemUrl = targetMPMediaItem?.value(forProperty: MPMediaItemPropertyAssetURL) as? URL
if itemUrl != nil {
let theAsset = AVAsset(url: itemUrl!)
if theAsset.hasProtectedContent {
//Asset is protected
//Must be played only via MPPlayer
} else {
//Asset is not protected
//Can be played both via AVPlayer & MPPlayer\
}
} else {
//probably the asset is not avilable offline
//Must be played only via MPPlayer
}
Another correct way of checking for DRM-protected asset is by making use of protectedAsset
property of MPMediaItem
- an answer by @weirdyu. But, this property is available only on iOS 9.2 and above.
Swift 4 solution for this method (works perfectly for me on iOS 9.2 and above):
if #available(iOS 9.2, *) {
if (targetMPMediaItem?.hasProtectedAsset)! {
//asset is protected
//Must be played only via MPMusicPlayer
} else {
//asset is not protected
//Can be played both via AVPlayer & MPMusicPlayer
}
} else {
//Fallback on earlier versions
//Probably use the method explained earlier
}

- 1,452
- 1
- 18
- 27
iOS9.2+: Please use MPMediaItem "protectedAsset" property
iOS9.2-: Judge MPMediaItem"assetURL"property is nil or not

- 294
- 1
- 9
Justin Kents' solution works great. I recommend using blocks though or else the UX will suffer if you deal with a bunch of songs:
-(void)checkDRMprotectionForItem:(MPMediaItem*)item OnCompletion:(void (^)(BOOL drmProtected))completionBlock
{
dispatch_async(_drmCheckQueue, ^{
BOOL drmStatus;
NSURL* assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL];
if (!assetURL) {
drmStatus = YES;
}
dispatch_async(dispatch_get_main_queue(), ^{
if (completionBlock) {
completionBlock(drmStatus);
}
});
});
}

- 160
- 12
Now I'm building on swift 2 for ios 9, I found my code broken using hasProtectedContent or using nil url test. I've found the following code work:
let playerItem = AVPlayerItem(URL: mpMediaItem.assetURL!)
playableByAVPlayer = (playerItem.status == .ReadyToPlay) ? true : false
If the item is not playable by AV Player, then it's a DRM item and should be played by iPod Player (now called SystemMusicPlayer).

- 115
- 3