1
# adopted from http://stackp.online.fr/?p=35
5
import select, sys, traceback
7
class Zeroconf(object):
8
"""A simple class to publish a network service with zeroconf using
9
avahi or pybonjour, preferring pybonjour.
13
def __init__(self, name, port, **kwargs):
16
self.stype = kwargs.get('stype', "_http._tcp")
17
self.domain = kwargs.get('domain', '')
18
self.host = kwargs.get('host', '')
19
self.text = kwargs.get('text', '')
21
class Pybonjour(Helper):
24
#records as in mt-daapd
25
txtRecord=pybonjour.TXTRecord()
26
txtRecord['txtvers'] = '1'
27
txtRecord['iTSh Version'] = '131073' #'196609'
28
txtRecord['Machine Name'] = self.name
29
txtRecord['Password'] = '0' # 'False' ?
30
#txtRecord['Database ID'] = '' # 16 hex digits
31
#txtRecord['Version'] = '196616'
32
#txtRecord['iTSh Version'] =
33
#txtRecord['Machine ID'] = '' # 12 hex digits
34
#txtRecord['Media Kinds Shared'] = '0'
35
#txtRecord['OSsi'] = '0x1F6' #?
36
#txtRecord['MID'] = '0x3AA6175DD7155BA7', = database id - 2 ?
37
#txtRecord['dmv'] = '131077'
39
def register_callback(sdRef, flags, errorCode, name, regtype, domain):
42
self.sdRef = pybonjour.DNSServiceRegister(name = self.name,
43
regtype = "_daap._tcp",
45
callBack = register_callback,
49
ready = select.select([self.sdRef], [], [])
50
if self.sdRef in ready[0]:
51
pybonjour.DNSServiceProcessResult(self.sdRef)
60
bus = dbus.SystemBus()
61
server = dbus.Interface(
64
avahi.DBUS_PATH_SERVER),
65
avahi.DBUS_INTERFACE_SERVER)
67
self.group = dbus.Interface(
68
bus.get_object(avahi.DBUS_NAME,
69
server.EntryGroupNew()),
70
avahi.DBUS_INTERFACE_ENTRY_GROUP)
72
self.group.AddService(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC,dbus.UInt32(0),
73
self.name, self.stype, self.domain, self.host,
74
dbus.UInt16(self.port), self.text)
80
def __init__(self, *args, **kwargs):
83
self.helper = Zeroconf.Pybonjour(*args, **kwargs)
85
traceback.print_exc(file=sys.stdout)
88
self.helper = Zeroconf.Avahi(*args, **kwargs)
90
traceback.print_exc(file=sys.stdout)
94
if self.helper != None:
98
if self.helper != None:
99
self.helper.unpublish()