С помощью ScriptingBridge и Python какие свойства я могу получить от трека, который воспроизводится в данный момент? - PullRequest
1 голос
/ 29 ноября 2011

Я использую этот пример в качестве основы и хотел бы получить немного больше информации о текущем треке. Например, каково текущее время трека (где находится «точка воспроизведения») и какова общая длина трека.

Ответы [ 2 ]

1 голос
/ 28 ноября 2012

Способ вправо для получения информации о свойствах сценариев приложения - открыть его словарь с помощью редактора AppleScript.Это представляет все в соответствующем контексте, вместе с документацией.

Однако иногда нам не важен правильный способ сделать что-то, мы просто хотим Python Кстати, хм?А в Python (через PyObjC) вы можете проверять множество классов во время выполнения с помощью таких инструментов, как .__dict__ и dir.Таким образом, вы можете сравнить атрибуты объекта приложения iTunes с ванильным SBApplication объектом или атрибуты любого случайного сценария с ванильным SBObject, и вот что вы получите:

>>> from ScriptingBridge import SBObject, SBApplication
>>> iTunes = SBApplication.applicationWithBundleIdentifier_("com.apple.iTunes")
>>> (list(set(dir(iTunes)) - set(dir(SBApplication))))
['fullScreen', 'selection', 'mute', 'visuals', 'setSoundVolume_',
# ...
'setVisualSize_', 'currentStreamURL', 'setFixedIndexing_']
>>> (list(set(dir(iTunes.currentTrack())) - set(dir(SBObject))))
['rating', 'databaseID', 'setUnplayed_', 'lyrics', 'show', 'releaseDate',
# ...
'setSkippedCount_', 'skippedCount', 'setSeasonNumber_', 'sampleRate']

Как оказалось, «голова игрока» является атрибутом приложения (вы можете воспроизводить только одну песню за раз), а не текущей дорожкой (которая фактически является тем же объектом «дорожки», который вы получили бы, даже если быt тот, который воспроизводился, просто представлял метаданные, а не состояние воспроизведения).И it, и атрибут «duration» трека выражены в секундах, поэтому вы можете вычислить (например) процентное содержание песни:

>>> "{0:0.0f}%".format((iTunes.playerPosition() / iTunes.currentTrack().duration()) * 100)
0 голосов
/ 29 ноября 2011

Если вы хотите использовать скрипты Python и AppleEvent, я настоятельно рекомендую вам использовать py-appscript вместо Scripting Bridge. appscript надежен и хорошо поддерживается независимым разработчиком, в то время как Scripting Bridge, похоже, больше не находится на радаре в Apple. py-appscript также поддерживается на Python 2 и Python 3.

Вы можете использовать инструмент ASDictionary, предоставляемый appscript, для изучения словарей сценариев, предоставляемых приложениями с поддержкой сценариев. Или вы можете просмотреть словарь в Apple AppleScript Editor.app (ранее известный как Script Editor) и вручную перевести синтаксис. В этом случае после установки py-appscript в одном из ваших экземпляров Python это довольно просто. В определении словаря сценариев для iTunes для объекта application перечислены различные свойства. Один из перечисленных:

позиция игрока (целое число): позиция игрока в текущей воспроизводимой дорожке в секундах.

Другое:

состояние игрока (остановлен / ‌ воспроизводится / ‌ приостанавливается / ‌ быстрая перемотка вперед / ‌ перемотка назад, назад / назад): iTunes остановлен, приостановлен или воспроизводится?

Чтобы сделать допустимые имена Python, py-appscript автоматически заменяет любые пробелы символом подчеркивания:

>>> from appscript import *
>>> it = app('iTunes')   # the "application" object
>>> it.player_state()    # access properties of the "application" object
k.playing
>>> it.player_position() #   (calling the property "( )" implies a "get" action)
1958
>>> it.player_position()
1961
>>> it.current_track.artist()
u'Bavarian Radio Symphony Orchestra'
...