簡単な質問がありますが、正しい答えが見つかりません。このようなパスでデータベースに保存された曲のURLがあります。
aSound.path = [[item valueForProperty: MPMediaItemPropertyAssetURL] absoluteString];
曲名アーティストとアートワークを持つMPMediaItemオブジェクトに戻すにはどうすればよいですか?
出来ますか?
簡単な質問がありますが、正しい答えが見つかりません。このようなパスでデータベースに保存された曲のURLがあります。
aSound.path = [[item valueForProperty: MPMediaItemPropertyAssetURL] absoluteString];
曲名アーティストとアートワークを持つMPMediaItemオブジェクトに戻すにはどうすればよいですか?
出来ますか?
保存:
NSNumber* persistentID =
[mediaItem valueForProperty:MPMediaItemPropertyPersistentID];
読み込み中:
MPMediaPropertyPredicate * predicate =
[MPMediaPropertyPredicate
predicateWithValue:persistentID
forProperty:MPMediaItemPropertyPersistentID];
別の例: MPMediaItemPropertyPersistentIDのNSNumberをNSStringに変換し、再度元に戻す
どのDRM曲もnullURLを返すため、曲のURLは信頼できないことに注意してください
または、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];
}
これがどこでうまくいかないか、またはそれを改善する方法についてコメントをいただければ幸いです。複数のメディアソースがあり、そのすべてがURLを使用できるため、PersistentIDではなくURLを渡すことを好みます。PersistentIDを使用すると、多くの「これがメディアIDの場合はこれを実行し、そうでない場合はURLを使用して実行する」ことを意味します。