URL to MPMediaItem

后端 未结 2 1819
心在旅途
心在旅途 2021-02-03 12:43

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: MP         


        
相关标签:
2条回答
  • 2021-02-03 13:21

    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

    0 讨论(0)
  • 2021-02-03 13:24

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

    0 讨论(0)
提交回复
热议问题