我有两种情况。给定歌曲的曲目ID,将等级设置为某个整数。第二个是相同的,除了我给出了一组轨道ID。我知道我可以使用ScriptingBridge根据歌曲的名称搜索iTunesTrack对象,但有没有办法根据曲目ID来获取它?有点像:
iTunesApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
NSInteger *rating;
NSInteger *id;
if ( [iTunes isRunning] ) {
iTunesTrack *track = [ iTunes trackForDatabaseID:id ];
[ track setValue:rating forkey:@"rating" ];
}
对于第二种情况,有没有办法在给定一系列轨道ID的情况下检索iTunesTrack的SBElementArray对象?类似的东西:
iTunesApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
NSArray *ids; //array of NSIntegers
if ( [iTunes isRunning] ) {
SBElementArray *tracks = [ iTunes tracksForDatabaseIDs:ids ];
[ tracks setValue:rating forkey:@"rating" ];
}
我相信这比基于歌曲名称迭代搜索库更有效。
答案 0 :(得分:0)
我最近这样做了。这样的事情对你有用。您需要询问库播放列表(在此示例中名为libraryPlaylist
)而不是应用程序。
NSArray *trackIDs = blah; // the ids you're searching for
NSString *searchFilter = @"databaseID == %@";
NSMutableArray *filters = [NSMutableArray arrayWithCapacity:[trackIDs count]];
for (int i = 0; i < [trackIDs count]; i++) {
[filters addObject:searchFilter];
}
searchFilter = [filters componentsJoinedByString:@" OR "];
NSArray *trackResult = [[libraryPlaylist tracks] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:searchFilter argumentArray:trackIDs]];
如果trackIDs
数组只包含一个项目,那就可以正常工作,因此不需要为该情况编写特殊代码。