使用ScriptingBridge和Python,我可以从当前播放的曲目中获得哪些属性?

时间:2011-11-29 03:19:21

标签: python itunes scripting-bridge

我使用this示例作为基础,并希望检索有关当前曲目的更多信息。例如,轨道的当前时间是什么(“播放头”的位置)以及总轨道长度是多少。

2 个答案:

答案 0 :(得分:1)

正确获取有关应用程序脚本属性的信息的方法是通过AppleScript编辑器打开其字典。这将在适当的上下文中提供所有内容以及文档。

但是,有时候我们并不关心正确做事的方式,我们只想要 Python 方式,嗯?而且,在Python中(通过PyObjC),您可以使用.__dict__dir等工具在运行时检查许多类。因此,您可以将iTunes应用程序对象的属性与vanilla SBApplication对象进行比较,或将任何随机脚本事物的属性与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)

答案 1 :(得分:-1)

如果您想使用Python和AppleEvent脚本,我强烈建议您使用py-appscript而不是Scripting Bridge。应用程序脚本非常强大,并且由其独立开发人员维护得很好,而Scripting Bridge似乎不再是Apple的雷达。 Python 2和Python 3也支持py-appscript

您可以使用appscript提供的ASDictionary工具来探索脚本化应用程序提供的脚本字典。或者,您可以在Apple的AppleScript Editor.app(以前称为Script Editor)中查看字典并手动翻译语法。在这种情况下,在您的一个Python实例中安装py-appscript之后,它非常简单。在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'