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

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中,播放列表为空。

最佳答案

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

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错误(如应用程序iTunes.add(track, to=newPlaylist)或AppleScript add theTrack to newPlaylist都可以执行…)。

关于python - 如何使用Python和Scripting Bridge将轨道添加到iTunes播放列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12971306/

10-12 18:14