Обнаружение iTunes Scripting Bridge не работает
-
19-09-2019 - |
Вопрос
Следующий код должен отображать определенный трек в iTunes:
NSString* iTunesPath = [[NSWorkspace sharedWorkspace] absolutePathForAppBundleWithIdentifier:@"com.apple.iTunes"];
iTunesApplication *iTunes = nil;
if ( iTunesPath ) {
iTunes = [[SBApplication alloc] initWithURL:[NSURL fileURLWithPath:iTunesPath]];
[iTunes setDelegate:self];
}
iTunesSource *librarySource = nil;
NSArray *sources = [iTunes sources];
for (iTunesSource *source in sources) {
if ([source kind] == iTunesESrcLibrary) {
librarySource = source;
break;
}
}
SBElementArray *libraryPlaylist = [librarySource libraryPlaylists];
iTunesLibraryPlaylist *iTLibPlaylist = nil;
if ([libraryPlaylist count] > 0) {
iTLibPlaylist = [libraryPlaylist objectAtIndex:0];
}
SBElementArray *fileTracks = [iTLibPlaylist fileTracks];
iTunesFileTrack *track = [fileTracks objectAtIndex:4];
NSLog(@"Try to reveal track: %@ at path :%@",[track description],[[track location] path]);
[track reveal];
Выход:
Try to reveal track: <ITunesFileTrack @0x1364ed20: ITunesFileTrack 4 of ITunesLibraryPlaylist 0 of ITunesSource 0 of application "iTunes" (2474)> at path :/Users/...
Но совсем замечание случается.Что я делаю не так?(Версия для iTunes:9.0.3)
Решение
Список воспроизведения библиотеки больше не существует в пользовательском интерфейсе;он присутствует в модели, поэтому отображается в AppleScript, но попытка раскрыть его или что-либо в нем не приведет ни к чему в пользовательском интерфейсе, как вы видели.Вы также можете воспроизвести это в AppleScript (reveal track 5 of library playlist 1 of source 1
).
Решение состоит в том, чтобы обращаться к плейлисту «Музыка», а не к плейлисту «Библиотека».«Музыка» — второй плейлист.playlist 2
в AppleScript, [[librarySource playlists] objectAtIndex:1]
в Какао.
Если вы хотите показать воспроизводимый элемент в любом плейлисте, в котором он воспроизводится, используйте reveal current track
(что должно быть [[iTunes currentTrack] reveal]
, хотя я это не проверял).
Другие советы
Это помогло мне решить связанная проблема.Спасибо.
Я бы рекомендовал не использовать [[librarySource playlists] objectAtIndex:1]
чтобы получить список воспроизведения.Это слишком похоже на догадки.Вам также следует избегать перебора массивов из Scripting Bridge с помощью for
петля.
Этот пример решает обе проблемы:
iTunesApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
iTunesSource *library = [[[[iTunes sources] get] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"kind == %i", iTunesESrcLibrary]] objectAtIndex:0];
iTunesLibraryPlaylist *lp = [[[[library playlists] get] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"specialKind == %i", iTunesESpKMusic]] objectAtIndex:0];
[[library playlists] objectWithName:@"Music"]
также работает, но я не уверен, зависит ли это от локали (и имя может измениться в будущем обновлении).
Чтобы добавить к ответу Роба МакБрума, было бы еще лучше использовать firstObject вместо objectAtIndex:0.Это предотвратит исключение в случае сбоя вашего запроса и возврата пустого массива.Это произойдет, если вы ищете источник интернет-радио (вид == iTunesESrcRadioTuner) и библиотека интернет-радио отключена в настройках.
iTunesApplication* iTunesApp = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
iTunesSource* radioTunerSource = [[[[iTunesApp sources] get] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"kind == %i", iTunesESrcRadioTuner]] firstObject];