我正在尝试检查哪些曲目位于我的iTunes资料库目录中,哪些曲目未使用AppleScript。
以下脚本实际上慢每个曲目大约需要2秒钟(图书馆中大约有8000个曲目):
#!/usr/bin/osascript
tell application "iTunes"
repeat with l in (location of every file track)
set fileName to (POSIX path of l)
if fileName does not start with "/Users/user/Music/iTunes/iTunes Media/" then
log fileName
end if
end repeat
end tell
还尝试了以下内容,但性能相同:
#!/usr/bin/osascript
tell application "iTunes"
repeat with l in (location of every file track)
POSIX path of l does not start with "/Users/user/Music/iTunes/iTunes Media/"
end repeat
end tell
同时iTunes变得反应迟钝。
必须做些傻事但却无法弄清楚是什么。
这是在OS 27 El Capitan的2015年27'iMac。
任何帮助表示感谢。
干杯
答案 0 :(得分:0)
您可以使用关键字get
repeat with l in (get location of every file track)
区别在于:
get
在每次迭代中检索列表get
列表将被检索一次答案 1 :(得分:0)
两个问题:
发送大量Apple活动费用昂贵。 repeat with l in (location of every file track)
为每首曲目(get
,get location of file track 1
,...)发送单独的get location of file track 2
个事件。首先获取所有位置的列表,然后迭代它。
由于实施蹩脚,获取AppleScript列表项所需的时间随着列表的长度线性增加;因此,当迭代大型列表时,性能会进入槽中(O(n*n)
而不是O(n)
效率)。您可以使用讨厌的黑客将其降低到O(n)
,通过引用引用列表项(例如,将列表粘贴在脚本对象属性中,然后引用它)。
示例:
set iTunesFolder to POSIX path of (path to music folder) & "iTunes/iTunes Media/"
tell application "iTunes"
script
property fileLocations : location of every file track
end script
end tell
repeat with l in fileLocations of result
set fileName to (POSIX path of l)
if fileName does not start with iTunesFolder then log fileName
end repeat