如何使用persistenID通过Scripting Bridge从iTunes获取特定的iTunesTrack实例?

时间:2012-03-09 19:34:11

标签: cocoa itunes scripting-bridge

使用iTunes Scripting Bridge界面,我需要通过其persistentID获取特定的iTunesTrack。我仔细检查了生成sdp / sdef的头文件,但看起来现有界面中没有方法可以根据任何参数对轨道执行任何类型的查询。我的下一个想法是枚举所有的轨道,检查每一个匹配。

这意味着这会很慢;目标库越大,性能越差。我想知道是否有人对此问题有一个经过验证的解决方案,不涉及检查从脚本桥返回的每个轨道,一次一个?

get a specific track in itunes via ScriptingBridge,Arr MiHardies表示他提出了一个解决方案并将其发布但显然,他从未接触过它。

1 个答案:

答案 0 :(得分:0)

诀窍是将整个iTunes库作为一个数组,然后使用Cocoa的NSPredicate过滤来找到你想要的东西。

iTunesApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
SBElementArray *iTunesSources = [iTunes sources];
iTunesSource *library;
for (iTunesSource *thisSource in iTunesSources) {
    if ([thisSource kind] == iTunesESrcLibrary) {
        library = thisSource;
        break;
    }
}
SBElementArray *libraryPlaylists = [library libraryPlaylists];
iTunesLibraryPlaylist *libraryPlaylist = [libraryPlaylists objectAtIndex:0];
SBElementArray *musicTracks = [self.libraryPlaylist fileTracks];    
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"persistentID == %@", persistentID];
[musicTracks filterUsingPredicate:predicate];

一般来说,使用Scripting Bridge方法尽可能少地做一个很好的经验法则 - 使用它们来获取数据,然后使用普通的Cocoa方法来处理其他所有方法。