我学会了如何在上一个问题中创建播放列表,但现在我无法弄清楚如何为其添加曲目。现在我有:
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中播放列表为空。
答案 0 :(得分:6)
首先,这是简短的回答:
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错误(如appscript iTunes.add(track, to=newPlaylist)
或AppleScript add theTrack to newPlaylist
都会...}。