Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

URL to MPMediaItem

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?

like image 935
flatronka Avatar asked Mar 27 '12 13:03

flatronka


2 Answers

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

like image 108
amleszk Avatar answered Nov 03 '22 17:11

amleszk


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".

like image 35
Ian Howson Avatar answered Nov 03 '22 17:11

Ian Howson