I have a simple question but I can't find the right answer. I have a song url saved to my database in a path like this.
aSound.path = [[item valueForProperty: MPMediaItemPropertyAssetURL] absoluteString];
How to convert back to a MPMediaItem object which has songname artist and artwork?
Is it possible?
Saving:
NSNumber* persistentID =
[mediaItem valueForProperty:MPMediaItemPropertyPersistentID];
Loading:
MPMediaPropertyPredicate * predicate =
[MPMediaPropertyPredicate
predicateWithValue:persistentID
forProperty:MPMediaItemPropertyPersistentID];
Another example: NSNumber for MPMediaItemPropertyPersistentID to NSString and back again
Note song URLs are are unreliable because any DRM song returns a null url
Alternatively, a nasty hack that Works For Me (tm).
- (MPMediaItem *)getMediaItemForURL:(NSURL *)url {
// We're going to assume that the last query value in the URL is the media item's persistent ID and query off that.
NSString *queryString = [url query];
if (queryString == nil) // shouldn't happen
return nil;
NSArray *components = [queryString componentsSeparatedByString:@"="];
if ([components count] < 2) // also shouldn't happen
return nil;
id trackId = [components objectAtIndex:1];
MPMediaQuery *query = [[MPMediaQuery alloc] init];
[query addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:trackId forProperty:MPMediaItemPropertyPersistentID]];
NSArray *items = [query items];
if ([items count] < 1) // still shouldn't happen
return nil;
return [items objectAtIndex:0];
}
Comments appreciated for where this might go wrong or how to improve it. I prefer to pass the URL around instead of the PersistentID as I have multiple media sources, all of which can use URLs. Using the PersistentID would mean a lot of "if this is a media ID, do this, otherwise, do that with the URL".
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With