我在上一个问题中学习了如何创建播放列表,但是现在我不知道如何向其中添加轨道。现在我有:
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),您可以弄清楚所需的内容。 (只需确保您正在使用剪贴簿库或进行备份...)在这种情况下,唯一的命令可能是
add
,copy
,duplicate
或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错误(如应用程序iTunes.add(track, to=newPlaylist)
或AppleScript add theTrack to newPlaylist
都可以执行…)。关于python - 如何使用Python和Scripting Bridge将轨道添加到iTunes播放列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12971306/