如何在Mac上监听iTunes通知(使用NSDistributedNotificationCenter)

5 投票
2 回答
3080 浏览
提问于 2025-04-15 17:12

我在寻找一些帮助、教程或者示例代码,想用Python来监听Mac上应用程序发出的分布式通知。我知道py-objc库是Python和Mac/Cocoa类之间的桥梁,而Foundation库可以用来添加观察者,但我想找一些具体的例子或教程,看看怎么用它来监控iTunes。

2 个回答

4

GrowlTunes的源代码可能会给你一些线索。你需要把它从Objective-C转换成PyObjC,不过没关系,随便啦。 :)

GrowlTurnesController.m (或者你可以下载整个Growl的源代码,然后找到GrowlTunes,这样你就能看到它的实际运行情况了。: 这里有获取源代码的说明链接

12

如果有人看到这个问题,我找到了如何监听的方法,下面的代码可以正常工作。不过,访问属性的方式似乎和标准的Python属性访问不太一样。

更新:你不能像在Python中那样访问属性,也就是不能用(.x)的方式,下面的代码已经更新,现在生成了一个叫做song_details的字典。

更新3:代码又更新了,现在是子类化NSObject,去掉了从类中添加addObserver的部分。会在github上保持代码更新,这里就不再更新了。

import Foundation
from AppKit import *
from PyObjCTools import AppHelper

class GetSongs(NSObject):
    def getMySongs_(self, song):
        song_details = {}
        ui = song.userInfo()
        for x in ui:
            song_details[x] = ui.objectForKey_(x)
        print song_details

nc = Foundation.NSDistributedNotificationCenter.defaultCenter()
GetSongs = GetSongs.new()
nc.addObserver_selector_name_object_(GetSongs, 'getMySongs:', 'com.apple.iTunes.playerInfo',None)

NSLog("Listening for new tunes....")
AppHelper.runConsoleEventLoop()

撰写回答