abr*_*hof 5 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)
Run Code Online (Sandbox Code Playgroud)
我的轨道位于元组列表中,元组tracks
的第一个元素是分数,第二个元素是实际的轨道对象. generatePlaylists
是一个迭代器,它将所有库轨道分成10个列表.
上面的代码运行没有错误,但在iTunes中播放列表是空的.
首先,这是简短的回答:
track.duplicateTo_(newPlaylist)
Run Code Online (Sandbox Code Playgroud)
问题是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
都做...).
归档时间: |
|
查看次数: |
1344 次 |
最近记录: |