从 iTunes 中捕获事件有什么好的解决方案吗?
我想构建一个位于 iTunes 内的插件,并响应特定歌曲的评分变化。对于 Windows,他们有一个我尚未深入研究的 SDK,但我也想为 Mac 找到一些东西。
有什么建议么?
据我所知,Apple 为OS X 和 Windows的Visual Plug-Ins 提供了一个免费的(如零成本) SDK 。iTunes
如果你不能通过它获得你需要的东西,你总是可以使用 iTunes Apple Events 脚本接口通过使用 OSA 兼容接口(例如 AppleScript 或带有 Python、Ruby 或 Objective-C 的appscript )从另一个 OS X 应用程序进行轮询来监控. 这可能不是您想要的,但它已被记录和支持。
例如,使用 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)]
但请注意,评级的变化似乎不会影响修改日期。
Mac iTunes 会发出有关曲目更改和其他一些重要事件的分布式通知。但是,我怀疑它会发送有关跟踪信息的细微更改的通知。正如 Ned 所说,iTunes 的插件支持仅限于可视化工具,因此您的其他选择是:
定期从外部进程轮询,但如果用户的播放列表很大,这将花费您和 iTunes
可能会考虑使用 PreFab UI 操作来锁定 iTunes 的 UI 小部件并触发 AppleScripts
查看是否可以将 FSEvent 通知附加到 iTunes 保存在用户音乐库文件夹中的 iTunes Music Library.xml 文件中。假设 iTunes 在设置更改时立即更新该文件,您可能会从那里找出自上次以来发生了什么变化。
这些都不是理想的,但是您所谈论的那种基于插件的可扩展性在 Mac 应用程序中确实非常罕见,因此您可能不得不以一种或另一种方式对其进行组合,或者重新考虑您的需求。