2

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

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

通过 ScriptingBridge 在 iTunes 中获取特定曲目时,Arr MiHardies 表示他想出了一个解决方案并将发布它,但显然,他从来没有解决过这个问题。

4

1 回答 1

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 方法处理其他所有事情。

于 2012-03-09T19:38:07.430 回答