【发布时间】:2009-11-16 07:24:28
【问题描述】:
有什么好的解决方案可以从 iTunes 中捕获事件吗?
我想构建一个位于 iTunes 内的插件,并响应特定歌曲的评分变化。对于 Windows,他们有一个我尚未深入研究的 SDK,但我也想为 Mac 找到一些东西。
有什么建议吗?
【问题讨论】:
有什么好的解决方案可以从 iTunes 中捕获事件吗?
我想构建一个位于 iTunes 内的插件,并响应特定歌曲的评分变化。对于 Windows,他们有一个我尚未深入研究的 SDK,但我也想为 Mac 找到一些东西。
有什么建议吗?
【问题讨论】:
据我所知,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)]
但请注意,评级的更改似乎不会影响修改日期。
【讨论】:
Mac iTunes 会发出有关曲目更改和其他一些重要事件的分布式通知。但是,我怀疑它会发送有关跟踪信息的细微更改的通知。正如 Ned 所说,iTunes 的插件支持仅限于可视化工具,因此您的其他选择是:
从外部进程定期轮询,但如果用户的播放列表很大,这将花费您和 iTunes 的费用
也许考虑使用 PreFab UI 操作来锁定 iTunes 的 UI 小部件并触发 AppleScripts
查看您是否可以将 FSEvent 通知附加到 iTunes 保存在用户音乐库文件夹中的 iTunes Music Library.xml 文件中。假设 iTunes 会在设置更改时立即更新该文件,您可能会从那里找出自上次以来发生了什么变化。
这些都不是理想的,但是您所说的那种基于插件的可扩展性在 Mac 应用程序中确实非常少见,因此您可能不得不以一种或另一种方式来解决它,或者重新考虑您的需要。
【讨论】: