Вопрос

Следующий код должен отображать определенный трек в 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];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top