iTunes 10.6.3 меняет интерфейс AppleScript?

У меня есть простой скрипт на Ruby, который использует гем rb-appscript для управления iTunes, и теперь, когда я обновился до iTunes 10.6.3, он, похоже, не работает.

До 10.6.3 этот фрагмент кода работал бы так, как ожидалось, чтобы получить текущие выбранные треки:

Appscript.app('iTunes').selection.get()

Теперь выдает следующую ошибку:

RuntimeError: Unknown property, element or command: 'selection'

Изменить: только что подтвердил, что это также не работает в py-appscript, поэтому он не изолирован для rb-appscript.

Что странно, потому что следующая часть фактического AppleScript все еще работает:

tell application "iTunes" to get selection

Подобные примеры, такие как Appscript.app('Finder').desktop.files.get() все еще работают.

Я не смог найти никакой информации, которая объяснила бы, если или почему это было изменено или что я мог сделать, чтобы обновить мой сценарий. Я предполагаю, что это как-то связано с изменениями Mountain Lion.

3 ответа

Решение

Похоже, iTunes 10.6.3 был выпущен с песочницей, которая идет с Mountain Lion. Вот статья, рассказывающая об этом (читайте также комментарии) http://www.leancrew.com/all-this/2012/06/the-first-nail-in-the-coffin-of-python-appscript/

Вероятно, начнет происходить гораздо больше (если не со всем), как от Mountain Lion

Я предоставил исправление для этой проблемы здесь:

https://github.com/mattneub/appscript/tree/master/rb-appscript

Да, они определенно сломали это. Вы МОЖЕТЕ использовать rb-appscript с приложением "Системные события" для условной проверки дочерних элементов различных элементов пользовательского интерфейса, чтобы узнать, является ли атрибут "selected" истинным.... например:

i = 0
row_exists = true
selected_row = nil
while row_exists && !selected_row
    i += 1
    row_exists = app("System Events").application_processes["iTunes"].windows["iTunes"].scroll_areas[3].outlines[1].rows[i].exists
    if row_exists 
        if (app("System Events").application_processes["iTunes"].windows["iTunes"].scroll_areas[3].outlines[1].rows[i].attributes["AXSelected"].value.get == true)
            selected_row = app("System Events").application_processes["iTunes"].windows["iTunes"].scroll_areas[3].outlines[1].rows[i]
        end
    end 
end

Затем вы можете извлечь необходимую информацию из дочерних элементов выбранной строки. Это было бы довольно раздражающим способом пойти об этом, все же.

Другие вопросы по тегам