Воспроизвести определенный заголовок в iTunes через ScriptingBridge

Я пытаюсь написать приложение, которое взаимодействует с iTunes через ScriptingBridge. У меня пока работает хорошо, но возможности этого метода кажутся очень ограниченными.

Я хочу воспроизвести песню с заданным именем, но похоже, что у меня нет возможности сделать это. Ничего подобного в iTunes.h не нашел…

В AppleScript это всего три строчки кода:

tell application "iTunes"
    play (some file track whose name is "Yesterday")
end tell

И тут iTunes начинает играть классическую песню Beatles. Могу ли я сделать это с помощью ScriptingBridge или мне нужно запускать этот AppleScript из моего приложения?


person Chris    schedule 21.02.2012    source источник


Ответы (1)


Это не так просто, как версия AppleScript, но, безусловно, возможно.

Метод первый

Получите указатель на библиотеку iTunes:

iTunesApplication *iTunesApp = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
SBElementArray *iTunesSources = [iTunesApp 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];    

Затем отфильтруйте массив, чтобы найти треки с искомым названием.

NSArray *tracksWithOurTitle = [musicTracks filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"%K == %@", @"name", @"Yesterday"]];   
// Remember, there might be several tracks with that title; you need to figure out how to find the one you want. 
iTunesTrack *rightTrack = [tracksWithOurTitle objectAtIndex:0];
[rightTrack playOnce:YES];

Метод второй

Получите указатель на библиотеку iTunes, как указано выше. Затем используйте метод Scripting Bridge searchFor: only::

SBElementArray *tracksWithOurTitle = [library searchFor:@"Yesterday" only:kSrS];
// This returns every song whose title *contains* "Yesterday" ...
// You'll need a better way to than this to pick the one you want.
iTunesTrack *rightTrack = [tracksWithOurTitle objectAtIndex:0];
[rightTrack playOnce:YES];

Предостережение по поводу второго метода: файл iTunes.h неверно утверждает, что метод searchFor: only: возвращает iTunesTrack *, тогда как на самом деле (по очевидным причинам) он возвращает SBElementArray *. Вы можете отредактировать файл заголовка, чтобы избавиться от появившегося предупреждения компилятора.

person Gabriel Roth    schedule 22.02.2012
comment
Да, это не так просто, как версия AppleScript, но работает отлично! Спасибо! - person Chris; 23.02.2012
comment
Обратите внимание на следующий метод два, что (по крайней мере, с моим iTunes.h) библиотека должна быть libraryPlayList, а kSrS должен быть в одинарных кавычках или, что еще лучше, использовать перечисление, определенное itunes.h: iTunesESrASongs - person mackworth; 26.05.2013