XML-RPC interface for Growl

Growl is a rather spiffy little notifier for OS X I've started using lately. Currently however, it's lacking a nice way to send messages over the network. Since a project I'm working on would be even slicker with a way to communicate updates, I quickly tacked a Python XML-RPC Server onto Growl using Growl's Python bindings.

In the future, Growl will have its own network interface, I've heard. Until then, this does the job quite nicely.

Please note: You will need to install the latest svn of Growl, the PyObjC bridge, and have Xcode 1.5 to get this working. Everything in ALL_CAPS should be changed as needed, this also assumes you want to use icons and they're in a myIcons dir.

#!/usr/bin/python

    import Growlimport SimpleXMLRPCServerfrom AppKit import NSImageimport sys, os.path

    iconPath = 'myIcons/'Icons = { 'MESSAGE_1' : 'MESSAGE_1.tiff', \
          'MESSAGE_2' : 'MESSAGE_2.tiff' }

    class MemberFunctions:
        def init(self,Icons):
            gn = Growl.GrowlNotifier()
            gn.applicationName = 'YOUR_APP_NAME'
            gn.applicationIcon = Icons['appIcon']
            gn.notifications = ['MESSAGE_1','MESSAGE_2']
            gn.register()
            self.gn = gn
            self.Icons = Icons

        def notify(self, ntype, title, description, sticky):
            gn = self.gn
            Icons = self.Icons
            nIcon = Icons['appIcon']
            if ntype  'MESSAGE_1':
                nIcon = Icons['MESSAGE_1']
            elif ntype  'MESSAGE_2':
                nIcon = Icons['MESSAGE_2']
            gn.notify(noteType=ntype,title=title,description=description,
                icon=nIcon, sticky=sticky)
            return 1

        def loadIcons(icons):
            global iconPath
            for icon in icons.keys():
                filename = icons[icon]
                nImagePath = os.path.abspath(iconPath+filename)
                nIcon = NSImage.alloc().initWithContentsOfFile_(nImagePath).autorelease()
                if not nIcon:
                    sys.stderr.write(“Couldn't load file %s\n” % nImagePath)
                icons[icon] = nIcon
            return icons

    Icons = loadIcons(Icons)

    # Make our XMLRPC Server, create our instance, and assign it
    server = SimpleXMLRPCServer.SimpleXMLRPCServer((“IP_TO_BIND_TO”, 7300))
    memfun = MemberFunctions(Icons)server.register_function(memfun.notify)

    # Start the server
    server.serve_forever()

If you'd like to see a running example of this, check out hellagrowler.py that this example is based heavily on.

Ben Bangert
Ben Bangert
Software Contriver

Code. Homebrew. Hike. Rollerblade.