使用ScriptingBridge和Python,如何获取当前播放曲目的哪些属性?
我正在使用这个例子作为基础,想要获取一些关于当前音乐曲目的更多信息。例如,想知道当前曲目的播放时间(也就是“播放头”所在的位置)和这首曲目的总长度。
2 个回答
获取一个应用程序脚本属性的正确方法是通过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']
实际上,“播放器头”是应用程序的一个属性(你一次只能播放一首歌),而不是当前曲目(即使不是正在播放的曲目,它也是同一个“曲目”对象,只是表示元数据,而不是播放状态)。它和曲目的“时长”属性都是以秒为单位的,所以你可以这样计算(例如)歌曲的播放百分比:
>>> "{0:0.0f}%".format((iTunes.playerPosition() / iTunes.currentTrack().duration()) * 100)
如果你想开始使用Python和AppleEvent脚本,我强烈建议你使用py-appscript
,而不是Scripting Bridge。因为appscript功能强大,而且由独立开发者维护得很好,而Scripting Bridge在苹果那边似乎已经不太受重视了。py-appscript
也支持Python 2和Python 3。
你可以使用appscript
提供的ASDictionary工具来查看可脚本化应用程序提供的脚本字典。或者,你也可以在苹果的AppleScript Editor.app
(以前叫Script Editor
)中查看字典,并手动翻译语法。安装好py-appscript
后,这个过程相对简单。在iTunes的脚本字典定义中,有很多属性列在application
对象下。其中一个属性是:
player position(整数):表示播放器在当前播放曲目中的位置,单位是秒。
另一个属性是:
player state(停止/播放/暂停/快进/倒带,读/写):表示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'