5

我在上一个问题中学习了如何创建播放列表,但现在我不知道如何向其中添加曲目。现在我有:

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 中播放列表是空的。

4

1 回答 1

6

首先,这是一个简短的答案:

track.duplicateTo_(newPlaylist)

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

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

如果不深入了解 iTunes 对象模型(以及它下面的 AE 模型),前半部分很难解释。但你并不需要真正理解它。在大多数情况下,通过查看 iTunes 脚本字典(在 AppleScript 编辑器中)和反复试验(在 AppleScript 编辑器中或使用 py-appscript),您可以弄清楚您想要什么。(只要确保您正在使用废品库,或者有备份……)在这种情况下,它可能的唯一命令是addcopyduplicatemove,所以只需尝试所有这些命令,看看它们会做什么。或者,或者,去 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 错误(就像 appscriptiTunes.add(track, to=newPlaylist)或 AppleScriptadd theTrack to newPlaylist一样......)。

于 2012-10-19T18:47:43.420 回答