我以这个例子为基础,很想检索有关当前曲目的更多信息。例如,轨道的当前时间是多少(“播放头”在哪里)以及总轨道长度是多少。
2 回答
获取有关应用程序脚本属性信息的正确方法是通过 AppleScript 编辑器打开其字典。这会在适当的上下文中显示所有内容以及文档。
但是,有时我们并不关心做事的正确方式,我们只想要一种Python方式,嗯?.__dict__
而且,在 Python(通过 PyObjC)中,您可以在运行时使用和等工具检查大量类dir
。因此,您可以将 iTunes 应用程序对象的属性与 vanillaSBApplication
对象进行比较,或者将任何随机脚本事物的属性与 vanilla 进行比较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']
碰巧的是,“播放器头”是应用程序的一个属性(一次只能播放一首歌曲)而不是当前曲目(这实际上是相同的“曲目”对象,即使它不是正在播放的那个,仅代表元数据,而不是播放状态)。它和曲目的“持续时间”属性都以秒为单位,因此您可以计算(例如)歌曲的百分比,如下所示:
>>> "{0:0.0f}%".format((iTunes.playerPosition() / iTunes.currentTrack().duration()) * 100)
如果您想开始使用 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
对象的各种属性。列出的一个是:
播放器位置(整数):播放器在当前播放曲目中的位置,以秒为单位。
另一个是:
播放器状态(停止/播放/暂停/快进/倒带,r/o):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'