Как получить конкретный экземпляр iTunesTrack из iTunes через мост сценариев, используя persistenID? - PullRequest
2 голосов
/ 09 марта 2012

Используя интерфейс iTunes Scripting Bridge, мне нужно получить конкретный iTunesTrack по его persistentID. Я внимательно изучил заголовочный файл, созданный sdp / sdef, но похоже, что в существующем интерфейсе нет метода для выполнения какого-либо запроса для трека на основе какого-либо параметра. Следующей моей идеей было перечислить все треки, проверяя каждый на соответствие.

Подразумевается, что это будет медленно; чем больше целевая библиотека, тем хуже производительность. Мне интересно, есть ли у кого-нибудь проверенное решение этой проблемы, которое не включает проверку каждого трека, возвращаемого из скриптового моста, по одному?

На получить конкретный трек в itunes через ScriptingBridge , Арр Михардис заявляет, что он придумал решение и опубликует его, но, очевидно, он так и не нашел его.

1 Ответ

0 голосов
/ 09 марта 2012

Хитрость заключается в том, чтобы получить всю библиотеку iTunes в виде массива, а затем использовать фильтрацию NSPredicate Cocoa, чтобы найти то, что вы хотите.

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 для всего остального.

...