【问题标题】:iTunes Plugin Programming: Intercept EventsiTunes 插件编程:拦截事件
【发布时间】:2009-11-16 07:24:28
【问题描述】:

有什么好的解决方案可以从 iTunes 中捕获事件吗?

我想构建一个位于 iTunes 内的插件,并响应特定歌曲的评分变化。对于 Windows,他们有一个我尚未深入研究的 SDK,但我也想为 Mac 找到一些东西。

有什么建议吗?

【问题讨论】:

    标签: macos plugins itunes


    【解决方案1】:

    据我所知,Apple 为 OS X 和 Windows 的iTunes 提供了一个免费(零成本)SDK 的视觉插件。如果您无法通过它获得所需的内容,您可以始终使用 iTunes Apple Events 脚本接口,通过使用 OSA 兼容接口(例如 AppleScript 或 appscript)从另一个 OS X 应用程序轮询进行监控使用 Python、Ruby 或 Objective-C。这可能不是您想要的,但它已记录在案并得到支持。

    例如,使用 py-appscript,以下是访问当前曲目和最近播放的智能列表中的曲目的方法:

    >>> from appscript import *
    >>> it = app('iTunes')
    >>> it.current_track.rating()  # 40 == 2 stars
    40
    >>> len(it.playlists['Recently Played'].tracks())
    80
    >>> it.playlists['Recently Played'].tracks[1].rating()
    40
    >>> it.playlists['Recently Played'].tracks[1].rating.set(to=100)
    >>> it.playlists['Recently Played'].tracks[1].rating()  # 100 = 5 stars
    100
    

    还可以过滤各种元数据字段(在 AppleScript 脚本编辑器中打开 iTunes.app 脚本定义进行浏览):

    >>> import datetime
    >>> an_hour_ago = datetime.datetime.now() - datetime.timedelta(hours=1)
    >>> it.playlists['Library'].tracks[its.modification_date >= an_hour_ago]()
    [app(u'/Applications/iTunes.app').sources.ID(45).library_playlists.ID(49347).file_tracks.ID(72017)]
    

    但请注意,评级的更改似乎不会影响修改日期。

    【讨论】:

      【解决方案2】:

      Mac iTunes 会发出有关曲目更改和其他一些重要事件的分布式通知。但是,我怀疑它会发送有关跟踪信息的细微更改的通知。正如 Ned 所说,iTunes 的插件支持仅限于可视化工具,因此您的其他选择是:

      1. 从外部进程定期轮询,但如果用户的播放列表很大,这将花费您和 iTunes 的费用

      2. 也许考虑使用 PreFab UI 操作来锁定 iTunes 的 UI 小部件并触发 AppleScripts

      3. 查看您是否可以将 FSEvent 通知附加到 iTunes 保存在用户音乐库文件夹中的 iTunes Music Library.xml 文件中。假设 iTunes 会在设置更改时立即更新该文件,您可能会从那里找出自上次以来发生了什么变化。

      这些都不是理想的,但是您所说的那种基于插件的可扩展性在 Mac 应用程序中确实非常少见,因此您可能不得不以一种或另一种方式来解决它,或者重新考虑您的需要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-15
        • 2015-11-05
        • 2021-06-27
        • 2019-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多