如何使用Python和Scripting Bridge将曲目添加到iTunes播放列表

时间:2012-10-19 09:31:23

标签: python cocoa itunes scripting-bridge

我学会了如何在上一个问题中创建播放列表,但现在我无法弄清楚如何为其添加曲目。现在我有:

tracks.sort(key=lambda tup: tup[0])
i = 0
for trackList in generatePlaylists(tracks,10):
    i += 1
    playlistname = str(i)
    p = {'name': playlistname}
    playlist = iTunes.classForScriptingClass_("playlist").alloc().initWithProperties_(p)
    iTunes.sources()[0].playlists().insertObject_atIndex_(playlist, 0)

    # Find the playlist I just made
    for playlist in iTunes.sources()[0].playlists():
        if playlist.name() == playlistname:
            newPlaylist = playlist

    # Add the tracks to it
    for track in trackList:
        print track[1].name()
        iTunes.add_to_(track[1],newPlaylist)

我的曲目位于元组tracks的列表中,其中元组的第一个元素是分数,第二个元素是实际的跟踪对象。 generatePlaylists是一个迭代器,它将所有库轨道拆分为10个列表。

上面的代码运行没有错误,但在iTunes中播放列表为空。

1 个答案:

答案 0 :(得分:6)

首先,这是简短的回答:

track.duplicateTo_(newPlaylist)

问题是iTunes.add_to_发送add命令,该命令接收文件(别名)并将其导入播放列表;您想发送duplicate命令,该命令接受任何对象并生成该对象的另一个副本。你没有文件,你有一个轨道。 (您可以通过track.location()获取文件,但不想重新导入文件,只需将曲目复制过来。)

此外,在这种情况下,您需要在轨道上调用该方法,而不是在应用程序上调用它并将其传递给轨道。

如果没有对iTunes对象模型(以及它下面的AE模型)的深入理解,上半部分很难解释。但你真的不需要理解它。在大多数情况下,通过查看iTunes脚本字典(在AppleScript编辑器中)和反复试验(在AppleScript编辑器中或使用py-appscript),您可以找到您想要的内容。 (只需确保您正在处理废品库,或者备份......)在这种情况下,唯一可能的命令是addcopyduplicate或者move,所以只需尝试一下,看看他们做了什么。或者,或者,转到dougscripts并下载一堆样本,找到一个符合你想要的样本。

下半部分,弄清楚如何翻译成ScriptingBridge ......好吧,我不能解释它而不会对SB进行长时间的咆哮(如果你想阅读一个,那么这比我好多了)。但基本原则如下:就iTunes而言,duplicate是一个命令。如果你给它一个直接的对象(tell application "iTunes" to duplicate theTrack to thePlaylist),它会使用它;如果没有,你要求主题自我复制(tell theTrack to duplicate to thePlaylist)。它与英语完全一样。但是SB坚持使用面向对象的模型,其中duplicate是某个对象的方法。因此,这两种形式中只有一种能够发挥作用。一般情况下,您只需查看dir(iTunes)dir(track)即可确定哪个方法看起来像是您想要的命令。

正如你从上面所说的那样,如果你想做任何复杂的事情,你就会有很多试验和错误。祝你好运,并继续问。

PS,我不知道为什么你的代码会无声地失败。 add_to_方法应该转换为命令的明显方式应该会引发-1708错误(如appscript iTunes.add(track, to=newPlaylist)或AppleScript add theTrack to newPlaylist都会...}。