import dbus import avahi class AvahiMonitor: def __init__(self): self.bus = dbus.SystemBus() self.server = dbus.Interface(self.bus.get_object(avahi.DBUS_NAME, avahi.DBUS_PATH_SERVER), avahi.DBUS_INTERFACE_SERVER) stype = '_daap._tcp' domain = 'local' obj = self.bus.get_object(avahi.DBUS_NAME, self.server.ServiceBrowserNew(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC, stype, domain, dbus.UInt32(0))) self.browser = dbus.Interface(obj, avahi.DBUS_INTERFACE_SERVICE_BROWSER) def start(self): self.browser.connect_to_signal('ItemNew', self.new_service) self.browser.connect_to_signal('ItemRemove', self.remove_service) def stop(self): self.bus.close() def refresh(self): self.bus._connection.dispatch() self.bus._connection.flush() def new_service(self, interface, protocol, name, type, domain, flags): print protocol, interface service = self.server.ResolveService(interface, protocol, name, type, domain, avahi.PROTO_UNSPEC, dbus.UInt32(0)) address, port = service[-4:-2] def remove_service(self, interface, protocol, name, type, domain): service = self.server.ResolveService(interface, protocol, name, type, domain, avahi.PROTO_UNSPEC, dbus.UInt32(0)) address, port = service[-4:-2] if __name__ == '__main__': from twisted.internet import glib2reactor glib2reactor.install() from twisted.internet import reactor, task monitor = AvahiMonitor() monitor.start() call = task.LoopingCall(monitor.refresh) call.start(1.0 / 30) reactor.run()