Воспроизвести конкретный заголовок в iTunes через ScriptingBridge - PullRequest
1 голос
/ 21 февраля 2012

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

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

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

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

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

1 Ответ

4 голосов
/ 22 февраля 2012

Это не так просто, как версия 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 *.Вы можете отредактировать заголовочный файл, чтобы избавиться от полученного предупреждения компилятора.

...