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

abr*_*hof 3 python cocoa itunes scripting-bridge

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

到目前为止,我有:

from Foundation import *
from ScriptingBridge import *

iTunes = SBApplication.applicationWithBundleIdentifier_("com.apple.iTunes")
newPlaylist = iTunes.iTunesPlaylist()
Run Code Online (Sandbox Code Playgroud)

这显然不起作用.

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

aba*_*ert 6

这实际上是Scripting Bridge文档一个示例.请参见清单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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

并非ScriptingBridge中的所有内容都非常糟糕.但有些甚至更糟.等到你遇到iTunes'脚本字典错误的区域之一......

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

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

from appscript import *

iTunes = app('iTunes')
p = {'name':'Testing'}
playlist = iTunes.make(new=k.playlist, with_properties=p)
Run Code Online (Sandbox Code Playgroud)

如果您无法弄清楚如何做您想做的事情,但可以找到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
Run Code Online (Sandbox Code Playgroud)

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

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