我有一个简单的问题,但我找不到正确的答案。我有一个歌曲网址以这样的路径保存到我的数据库中。
aSound.path = [[item valueForProperty: MPMediaItemPropertyAssetURL] absoluteString];
如何转换回具有歌曲名艺术家和艺术品的 MPMediaItem 对象?
可能吗?
我有一个简单的问题,但我找不到正确的答案。我有一个歌曲网址以这样的路径保存到我的数据库中。
aSound.path = [[item valueForProperty: MPMediaItemPropertyAssetURL] absoluteString];
如何转换回具有歌曲名艺术家和艺术品的 MPMediaItem 对象?
可能吗?
保存:
NSNumber* persistentID =
[mediaItem valueForProperty:MPMediaItemPropertyPersistentID];
加载:
MPMediaPropertyPredicate * predicate =
[MPMediaPropertyPredicate
predicateWithValue:persistentID
forProperty:MPMediaItemPropertyPersistentID];
另一个示例: 将 MPMediaItemPropertyPersistentID 的 NSNumber 转换为 NSString 并再次返回
注意歌曲 URL 不可靠,因为任何 DRM 歌曲都返回空 url
或者,一个对我有用的讨厌的黑客(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];
}
评论感谢这可能出错的地方或如何改进它。我更喜欢传递 URL 而不是 PersistentID,因为我有多个媒体源,所有这些都可以使用 URL。使用 PersistentID 意味着很多“如果这是媒体 ID,则执行此操作,否则,使用 URL 执行此操作”。