All pastes #211551 Raw Edit

Untitled

public text v1 · immutable
#211551 ·published 2006-10-20 11:24 UTC
rendered paste body
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()