[macOS翻译]Idle Handler项目

124 阅读7分钟

本文由 简悦 SimpRead转码, 原文地址 dougscripts.com

下载 500 多个 AppleScript,与 Apple 的媒体应用程序配合使用,还可获取有关 writ...... 的提示和信息

我经常会收到这样的问题: "我怎样才能编写一个脚本,在 iTunes 上监视 [某件事情发生];当[某件事情发生]时,它会触发 [其他事情] 发生"。

你要做的就是编写一个包含空闲处理程序的 Stay-Open 脚本。空闲处理程序是脚本中的一个例程,它可以在系统空闲时定期检查 iTunes 的状况--此时系统没有做任何其他重要的事情。当 iTunes 正在播放时,Stay-Open 应用程序可以使用空闲处理程序实时处理数据。

这不是编写空闲处理程序的专家入门书(要阅读一些专家入门书,请点击此处),但我将尝试说明的内容相当简单,应该能让你了解这种脚本的威力。

保存为保持开放的脚本

空闲处理程序例程总是出现在on idle/end idle语句中。在脚本编辑器中键入或复制下面的脚本,然后从脚本编辑器的文件菜单中选择另存为。格式**选择 "应用程序"。现在勾选 "保持打开 "复选框。最后,随便给它起个名字,然后点击 "保存 "按钮。

on idle
    tell application "iTunes"
        copy name of current track to x
        beep
        return 3
    end tell
end idle

这是一个 Stay-Open 脚本。如果运行该脚本,它会将当前轨道的名称复制到变量 "x "中,并大约每隔三秒发出一次哔哔声,直到你点击菜单中的Quit为止。(之所以会有 "哔哔 "声,只是为了让你知道脚本正在执行某些操作)。

通过返回语句中的值,该脚本大约每 3 秒钟活动一次。这就是所谓的 idleInterval。如果不设置这个值,默认的 idleInterval 值将是 30 秒。在接下来的示例中,我将使用 10 秒的速度。我们不想占用处理器。

现在,我们来看看这个脚本要做什么:

  1. 检查 iTunes,查看正在播放的歌曲...
  2. 确定 "现在 "播放的歌曲与脚本上次空闲时检查的歌曲是相同还是不同...
  3. 如果是不同的歌曲(或如果是脚本第一次检查),则做一些事情。

检查 iTunes

我们需要存储当前歌曲的名称,以便在后续脚本检查时确定它是否已更改:

global latest_song
set latest_song to ""

on idle
    tell application "iTunes"
        copy name of current track to current_tracks_name
        if current_tracks_name is not latest_song then
            copy current_tracks_name to latest_song
        end if
        return 10
    end tell
end idle

第一次运行脚本时,latest_song 是空白的(我将它声明为全局变量,因为它必须能在空闲处理程序和隐式运行处理程序中使用--如果你不知道这意味着什么,it's OK)。当脚本执行空闲例程时,它会获取当前曲目的名称,将其复制到 current_tracks_name,然后与 latest_song进行比较。如果两个字符串不同(第一次和有新曲目播放时会不同),current_tracks_name 会被复制到 latest_song。然后,每隔十秒钟,脚本会再次检查 iTunes。

我们脚本的重点是 "if-then "语句;在这一点上,我们知道 iTunes 中的某些内容发生了变化,我们希望因这种变化而发生的任何事情都应在这一点上执行。例如,我们必须存储新曲目的名称,这样脚本才能正常运行。如果我们也弹出一个显示新曲目名称的对话框,持续两秒钟,会怎么样呢?

global latest_song
set latest_song to ""

on idle
    tell application "iTunes"
        copy name of current track to current_tracks_name
        if current_tracks_name is not latest_song then
            copy current_tracks_name to latest_song
            -- here's where you DO SOMETHING...
            display dialog current_tracks_name buttons {"*"} default button 1 giving up after 2
        end if
        return 10
    end tell
end idle

我们得到了一个 Stay-Open 脚本,它可以监视 iTunes,并在每首新曲目开始播放时(反正是在 10 秒钟的窗口内)执行一个小技巧。

完善它

下面是同样的 Stay-Open 脚本,其中添加了一个明确的运行处理程序

global latest_song

property okflag : false

on run
    tell application "System Events"
        if not (exists process "iTunes") then return
    end tell

    set latest_song to ""
end run

on idle
    tell application "iTunes"
        copy name of current track to current_tracks_name
        if current_tracks_name is not latest_song then
            copy current_tracks_name to latest_song
            display dialog current_tracks_name buttons {"*"} default button 1 giving up after 2
        end if
        return 10
    end tell
end idle

我在 "on run/end run "语句中创建了一个显式运行处理程序run 处理程序 可以执行启动所需的任何初始化例程。在这里,它会检查 iTunes 是否正在运行,如果 iTunes 没有运行,脚本就会退出(Leopard 及更高版本可以只使用 "if not (application "iTunes" is running) then...")。否则,如果 iTunes 在运行,脚本就可以继续运行并做任何事情,因为它可以保持打开状态。

关于空闲处理程序和 iTunes 的更多想法

  • 除了实时检查(或 "轮询")当前曲目之外,还有什么其他有用的方法?轮询播放器位置如何?任何超过 :30 秒的值都会播放下一首曲目。这就是脚本 Needle Drop的工作原理。你可以轮询播放器状态,只要 iTunes 停止,播放列表就会洗牌。通过对播放曲目的长度求和来制作睡眠计时器。你就明白了。

  • 在上述示例中,我使用曲目的名称作为变量来比较是否有新曲目开始播放。当然,两首或多首曲目有可能同名,两首或多首同名曲目也有可能连续播放。这种情况非常罕见,但也有可能发生。因此,最好使用一个唯一的标识符,如音轨的持久 ID数据库 ID,这两个标识符对每个音轨来说都是唯一的。

  • 用 "return value"语句结束空闲例程极为重要。否则,无论最后的结果是什么,都将作为 idleInterval 值返回(尽管非数值不会改变空闲率)。如果将其设置为 0,则空闲率保持不变。此外,不要将 idleInterval 设置得过低或过于频繁地执行复杂的例程。这会扰乱播放,并可能使其他进程 bumpy。Stay-Open 脚本应在后台安静运行。

  • 在某些情况下,运行中的空闲处理程序可能无法访问 iTunes 的某些属性。一些来信者指出,当 iTunes 的模式窗口打开时,AppleEvents 无法访问。模式窗口指的是类似 "查看选项窗口 "或 "信息窗口 "的窗口。这样做是为了让 iTunes 独家访问数据库,从而有效地将你锁在外面。因此,在此类窗口打开时,在 Stay-Open 脚本中使用空闲处理程序尝试获取玩家状态等属性的值可能会产生错误。换句话说,当 iTunes 在无人看管的情况下运行时,Stay-Open 脚本会更安全,并能更好地执行任务。让你知道更多

附注: 通讯员戴夫-桑德斯(Dave Saunders)建议使用try语句来忽略可能出现的错误,例如:

on idle
    tell application "iTunes"
        try
            if player state is not stopped then return 5
        on error
            return 5
        end try
    end tell
    -- do something here
    return 5
end idle

这个片段有点断章取义,不过你可以看到,通过使用try语句来检查玩家状态,正如 Dave 报告的那样,"实际上什么原因导致错误并不重要,如果有错误,只要离开那里,五秒钟后再试一次就可以了"。或者不管你的 idleInterval 是多少。

  • 我建议不要编写修改曲目或播放列表信息的 "Stay-Open "脚本除非你绝对确定你知道自己在做什么

  • 学习如何编写退出处理程序也会对你有所帮助,这些处理程序可以让 Stay-Open 脚本在退出之前执行一些内务管理或其他操作。有关退出处理程序的信息,请参阅下面的链接。

我就知道这么多。有什么发现请告诉我。

有关构建空闲处理程序的更多信息,请访问以下网站:

The AppleScript SourceBook: "Idle Thoughts"

unScripted:空闲处理程序

AppleScript 语言指南:保持开放的 AppleScript


www.deepl.com 翻译