iTunes Scripting Bridge не работает - PullRequest
0 голосов
/ 10 марта 2010

Следующий код должен показывать определенный трек в 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)

Ответы [ 3 ]

3 голосов
/ 11 марта 2010

Список воспроизведения библиотеки больше не существует в пользовательском интерфейсе; он есть в модели, поэтому он отображается в 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], хотя я этого не проверял).

2 голосов
/ 19 января 2012

Это помогло мне решить связанную проблему . Спасибо.

Я бы рекомендовал не использовать [[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"] также работает, но я не уверен, зависит ли это от локали (и имя может измениться в будущем обновлении).

1 голос
/ 14 февраля 2014

Просто чтобы добавить ответ Роба МакБрума, было бы еще лучше использовать firstObject вместо objectAtIndex: 0.Это предотвратит исключение в случае сбоя вашего запроса и возврата пустого массива.Это произойдет, когда вы будете искать источник интернет-радио (kind == iTunesESrcRadioTuner) и в настройках отключена библиотека интернет-радио.

...