Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos iTunes AppleScript:查询包含特定曲目的所有播放列表_Macos_Applescript_Itunes - Fatal编程技术网

Macos 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

正在为iTunes编写复杂的AppleScript。一项任务是累积包含给定曲目的所有播放列表的列表。我从其他地方得到了这个轨迹对象(选择或其他)

目前,我有一个类似这样的片段:

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