【问题标题】:Selecting all tracks in iTunes with AppleScript使用 AppleScript 选择 iTunes 中的所有曲目
【发布时间】:2011-06-04 23:47:43
【问题描述】:

我有一个非常基本的 AppleScript,我正尝试在我的 Mac 上运行它来删除 iTunes 中所有歌曲的评分:

tell application "iTunes"
    set sel to every track in library playlist
    repeat with i from 1 to the count of sel
        set rating of track i in sel to 0
    end repeat
end tell

我以前从未用 AppleScript 写过任何东西,但我想我会试一试(因为它应该如此直观)。不幸的是,当我尝试运行脚本时收到此错误:

error "Can’t get every track of library playlist." number -1728 
from every «class cTrk» of «class cLiP»

这是什么错误?是否有另一种选择 iTunes 中曲目的方法?感谢您的帮助。

【问题讨论】:

    标签: macos applescript itunes rating


    【解决方案1】:

    您被误导了:AppleScript 不是很直观,主要是因为它观察到的大部分行为是由每个应用程序对其对象模型的实现决定的。虽然它可能非常强大,但您通常只需要进行试验,直到找到适用于特定应用的正确咒语。

    在这种情况下,您需要选择播放列表的第一项。注意区别:

    get library playlist
        Result:
            library playlist  -- the class
    get library playlists
        Result:
            {library playlist id 51776 of source id 67 of application "iTunes"} -- a list
    get first library playlist
        Result:
            library playlist id 51776 of source id 67 of application "iTunes" -- first item
    

    但你可能想要做的是更像这样的事情:

    tell application "iTunes"
        repeat with tr in every track in first Library playlist
            set rating of tr to 60  -- values are 0 to 100
        end repeat
    end tell
    

    如果您有一个大型库,您可能想先尝试使用较小的播放列表,例如,在测试播放列表中选择一个曲目,然后在 repeat 语句中替换 in current playlist

    【讨论】:

    • 感谢脚本返回的不同结果的解释。我接受另一个答案只是因为它是我测试中最简洁和最快的。干杯!
    • 我发现 AppleScript 常常让人感觉像是一种“只读”语言——最终工作的东西通常都是可读的,但如果没有经验,很难做到。
    • 我看到两个主要问题: 1. 各种应用程序的 Apple 事件和对象模型接口的不一致和不可预测的行为; 2. AppleScript 语言本身的怪癖。用户对前者无能为力(尽管 Cocoa 提供的内置脚本功能在一定程度上有助于在应用程序之间提供更一致的体验)。对于后者,我首选的解决方案是避免使用 AppleScript 编写程序,而是使用 py-appscript,它提供了更丰富的语言和库 python(还有 rb-appscript 用于 Ruby)。
    【解决方案2】:

    我不完全知道为什么,但答案是库播放列表实际上并不包含曲目。奇怪,我知道,但既然你只想在每条轨道上运行它,还有一个更简单的解决方案。而不是every track of library,只需使用every track;这将得到应用程序中的每一个轨道,这就是你想要做的。再加上一些其他的简化,这就变成了

    tell application "iTunes" to set the rating of every track to 0
    

    tell application "iTunes" to ... 语法就像一个普通的tell 块,但它只有一个语句长并且不需要end tell。您可以一次自动对列表中的每个条目运行set 命令,这就是您所需要的。通常,您很少需要通过索引进行枚举;例如,对于更接近您的解决方案的东西,有等价的

    tell application "iTunes"
      repeat with t in every track
        set the rating of t to 0
      end repeat
    end tell
    

    这避免了索引,并且也可能更快(尽管单行可能最快,如果有区别)。

    【讨论】:

    • 感谢简洁的回答和解释。非常感谢!
    猜你喜欢
    • 2017-05-30
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    相关资源
    最近更新 更多