2010-03-10 2 views
0

Следующий код должен показать определенный трек в ITunes:ITunes Scripting Bridge выявить не работает

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 Version: 9.0.3)

ответ

3

Плейлист библиотеки больше не существует в пользовательском интерфейсе; он присутствует в модели, поэтому он появляется в AppleScript, но попытка выявить его или что-то в нем ничего не будет делать в пользовательском интерфейсе, как вы видели. Вы можете воспроизвести это и в AppleScript (reveal track 5 of library playlist 1 of source 1).

Решение состоит в том, чтобы поговорить с плейлистом Music, а не с плейлистом в Библиотеке. «Музыка» - это второй плейлист-playlist 2 в AppleScript, [[librarySource playlists] objectAtIndex:1] в какао.

Если вы хотите открыть игровой элемент в любом плейлисте, в котором он играет, используйте reveal current track (который должен быть [[iTunes currentTrack] reveal], хотя я не тестировал это).

+0

решена моя проблема. Большое спасибо! – V1ru8

2

Это помогло мне решить related issue. Благодарю.

Я бы порекомендовал против использования [[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

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

iTunesApplication* iTunesApp = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"]; 
iTunesSource* radioTunerSource = [[[[iTunesApp sources] get] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"kind == %i", iTunesESrcRadioTuner]] firstObject]; 
Смежные вопросы