Macos iTunes AppleScript:查询包含特定曲目的所有播放列表
正在为iTunes编写复杂的AppleScript。一项任务是累积包含给定曲目的所有播放列表的列表。我从其他地方得到了这个轨迹对象(选择或其他) 目前,我有一个类似这样的片段:Macos iTunes AppleScript:查询包含特定曲目的所有播放列表,macos,applescript,itunes,Macos,Applescript,Itunes,正在为iTunes编写复杂的AppleScript。一项任务是累积包含给定曲目的所有播放列表的列表。我从其他地方得到了这个轨迹对象(选择或其他) 目前,我有一个类似这样的片段: on containingPlaylists(theTrack) tell application "iTunes" set librarySource to the source named "Library" set candidateLists to every user p
on containingPlaylists(theTrack)
tell application "iTunes"
set librarySource to the source named "Library"
set candidateLists to every user playlist in librarySource
set candidateId to (get id of theTrack)
set matchLists to {}
repeat with candidateList in candidateLists
set matchTracks to (file tracks in candidateList whose id = candidateId)
if (count of matchTracks) > 0 then
copy candidateList to end of matchLists
end if
end repeat
return matchLists
end tell
end containingPlaylists
这是可行的,但是循环中每个播放列表需要一个苹果事件,这很昂贵(perf),并且会丢弃中间结果。我更愿意做的是一个查询:
set matchLists to every playlist in librarySource whose file tracks contain theTrack
但这当然不起作用(特别的错误是“处理程序只处理单个对象”,但不确定这是否有洞察力)。我真的不确定语言/应用程序是否支持这样的查询
有人能证实/否认/提供任何见解吗?谢谢 我也希望能使用像这样的WHERS子句。但是,唉。其他人可能会想出一个更好的计划,但我很确定这就是我找到包含所选曲目的播放列表的方式(可能是最有效的):
然后我可以在下一步中使用这些ID。当然,这包括像“最近添加”这样的播放列表,它们可能是您想要的,也可能不是您想要的;你必须在那里再加一个步骤来“过滤”出这样的结果。我也希望能使用像这样的WHERS子句。但是,唉。其他人可能会想出一个更好的计划,但我很确定这就是我找到包含所选曲目的播放列表的方式(可能是最有效的): 然后我可以在下一步中使用这些ID。当然,这包括像“最近添加”这样的播放列表,它们可能是您想要的,也可能不是您想要的;您必须在其中添加另一个步骤以“过滤”出这样的结果。您可以使用此选项(在iTunes上使用)11和12): 更新-- 在AppleScript字典中: 艺术品 n[inh.item]:轨道内的一件艺术品| 元素:包含在曲目中。所以这首歌的
作品
作品
跟踪 n[inh.item]:可播放音频源|
元素:包含艺术品;包含在播放列表中。因此,此曲目的播放列表
起作用,您可以使用此曲目的用户播放列表
在iTunes.h中(ObjC脚本桥):
@接口iTunesTrack:iTunesItem
-(SBElementArray*)艺术品;
这是不可能的,因为播放列表不在SBElementArray的列表中
但是我不知道为什么AppleScript字典和iTunes.h文件之间会有区别。您可以使用它(在iTunes上使用11和12):
更新--
在AppleScript字典中:
艺术品 n[inh.item]:轨道内的一件艺术品|
元素:包含在曲目中。所以这首歌的作品
作品
跟踪 n[inh.item]:可播放音频源|
元素:包含艺术品;包含在播放列表中。因此,此曲目的播放列表
起作用,您可以使用此曲目的用户播放列表
在iTunes.h中(ObjC脚本桥):
@接口iTunesTrack:iTunesItem
-(SBElementArray*)艺术品;
这是不可能的,因为播放列表不在SBElementArray的列表中
但是我不知道为什么AppleScript字典和iTunes.h文件之间有区别。谢谢。在播放列表的数量上,这似乎是相同的执行大纲-O(n)次往返。我将在你的语法中偷取一些我不知道的技巧。注意:如果你想要iTunes库中每个曲目对象都有一个唯一的标识符,并且在库的生命周期中永远不会改变,请使用
持久ID
。如果要确定哪些轨迹对象指向同一音调,请使用数据库ID
。当您需要可用于构建新的按id引用的内容时,请使用id
,例如playlist id
。此外,如果存在重复循环,请将重复循环更改为使用(数据库id为dbID的p的曲目),然后将playlistwithit的结束设置为(p的id)
。这应该更有效率。如果您不希望结果列表包含重复的播放列表id,请将和p的id不在播放列表中也添加到条件测试中。谢谢。在播放列表的数量上,这似乎是相同的执行大纲-O(n)次往返。我将在你的语法中偷取一些我不知道的技巧。注意:如果你想要iTunes库中每个曲目对象都有一个唯一的标识符,并且在库的生命周期中永远不会改变,请使用持久ID
。如果要确定哪些轨迹对象指向同一音调,请使用数据库ID
。当您需要可用于构建新的按id引用的内容时,请使用id
,例如playlist id
。此外,如果存在重复循环,请将重复循环更改为使用(数据库id为dbID的p的曲目),然后将playlistwithit的结束设置为(p的id)
。这应该更有效率。如果您不希望结果列表包含重复的播放列表id,则将和p的id不在播放列表中也添加到条件测试中。单行查询的逻辑错误:您需要使用的数据库id检查两个曲目引用的数据是否相同。但从结构上来说,这很好;只是iTunes脚本模型陈旧而粗糙,在处理更复杂的查询方面有点垃圾。不过,我不会太担心发送几十个AE,因为那没什么;正是在发送成千上万的邮件时,AE的开销才起作用。如果您不需要曲目引用列表,请使用exists
而不是get
来减少工作量,但在解决大型库(50K+曲目?)上的查询时,iTunes的性能将始终受到影响。@foo:谢谢。你能帮我构造这样一个查询吗?(在本例中,简单地替换“theTrack的数据库ID”也有同样的问题。)我正在寻找包含tr的播放列表的结果
set persisID to persistent ID of selection
set pp to playlists
set playListsWithIt to {}
repeat with p in pp
set tt to (tracks of p whose persistent ID is persisID)
if tt ≠ {} then set playListsWithIt to (playListsWithIt & (id of p))
end repeat
tell application "iTunes"
set theTrack to item 1 of (get selection)
return user playlists of theTrack
end tell