使用Python和Scripting Bridge在iTunes中创建播放列表

时间:2012-10-18 22:31:03

标签: python cocoa itunes scripting-bridge

如何使用Python和Scripting Bridge创建播放列表?

到目前为止,我有:

from Foundation import *
from ScriptingBridge import *

iTunes = SBApplication.applicationWithBundleIdentifier_("com.apple.iTunes")
newPlaylist = iTunes.iTunesPlaylist()

这显然不起作用。

我见过Ruby和Objective C的东西,但我真的不懂语言。

1 个答案:

答案 0 :(得分:6)

这实际上是the Scripting Bridge documentation中的一个例子。请参见清单2,“在PyObjC代码中将对象添加到可编写脚本的应用程序”:

from Foundation import *
from ScriptingBridge import *

iTunes = SBApplication.applicationWithBundleIdentifier_("com.apple.iTunes")
p = {'name':'Testing'}
playlist = iTunes.classForScriptingClass_("playlist").alloc().initWithProperties_(p)
iTunes.sources()[0].playlists().insertObject_atIndex_(playlist, 0)

如果这对你没有意义,可以解释一些不同的丑陋事物......

首先,SBApplication没有任何成员iTunesPlaylist,它是SBObject的一个不错的子类。如果你已经生成了静电胶,ITApplication可能有这样的东西......但是你不想使用静电胶。因此,您必须动态创建类对象iTunesPlaylist。有几种不同的方法可以做到这一点,但简单的方法(假设你知道它在Applescript中称为playlist)是classForScriptingClass_

接下来,ScriptingBridge实际上并不是AE的本机Python桥接器;它是通往AE的ObjC桥的Python桥。所以iTunesPlaylist实际上是一个包装好的ObjC类,而不是Python类。这意味着您无法将其实例化为iTunesPlaylist(),您必须说iTunesPlaylist.alloc().init()

调用initWithProperties_(p)是在不同步骤中初始化和设置属性的一个很好的快捷方式。

最后,AE对象模型的工作方式,你不能只是“创建一个对象”,你已经在某个位置创建一个对象 。 ScriptingBridge试图将此隐藏起来,但它并没有做得很好。您创建的playlist对象实际上并不代表iTunes中的任何内容 - 实际上,如果您查看其typerepr,您会看到它是“未来的iTunesPlaylist” 。你需要找到一个合适的SBElementArray来插入它,然后它将成为一个真正的播放列表。

ScriptingBridge中的所有内容都不是很糟糕。但有些甚至更糟。等到你遇到iTunes'脚本字典错误的一个区域......

如果您可以避免使用ScriptingBridge,则iTunes AE界面本身非常好用。有三种方法,虽然它们可能对您没有帮助。

首先,appscript(文档here)。这是一个不同的Python-> AE桥,它比SB好得多。这是同样的事情(依赖默认iTunes具有播放列表的默认位置 - 在第一个库源中的播放列表列表的末尾):

from appscript import *

iTunes = app('iTunes')
p = {'name':'Testing'}
playlist = iTunes.make(new=k.playlist, with_properties=p)

如果您无法弄清楚如何做您想做的事情,但可以找到AppleScript示例代码(例如,在dougscripts),您可以使用ASTranslate工具编写等效的appscript。

不幸的是,appscript的作者取消了该项目。并且有充分的理由 - 它依赖于Apple可以在10.9中删除的旧版API(或者引用拒绝您从App Store中删除)。目前,它仍然可以正常工作,并且有一些人在上面的github回购中保持它活着,但是有一天,它将不得不死于真实。因此,除非这是一个个人的,短期的或学习的项目,否则它可能不是一个好的解决方案。 (另外,特定于iTunes:10.6.3有一个影响appscript的错误,但不影响其他网桥,除非您远程使用它们。如果您需要使用该版本,请参阅itunesterms获取一个解决方案。)

当然,总会有明显的选择:在AppleScript中执行:

tell application "iTunes"
    make new playlist with properties {name:"Testing4"}
end tell

AppleScript的问题在于,除了谈论AEOM之外,它对于所有来说都是一种可怕的语言,它与Python的标准库相当,只有5%的深度和宽度。但是你总是可以用两种方式使用双语解决方案。您可以通过ASOC从AppleScript连接到其他Cocoa代码(例如,Python与PyObjC)。或者,您也可以使用NSAppleScript和朋友从PyObjC / etc运行脚本。

后者可能是最痛苦的答案,但它有一个巨大的优势:如果您在Mountain Lion中使用新的API,并且您的用例属于某个窄带,您可以编写一个沙盒应用程序来编写iTunes而不用需要临时例外权利,这意味着您可以在App Store中出售它。