Advertise HTTP with Avahi

This commit is contained in:
David Eisner 2013-11-05 16:23:58 +00:00
parent c4281339b6
commit 697bff81cd
6 changed files with 36 additions and 7 deletions

View File

@ -21,6 +21,8 @@ class Extension(ext.Extension):
schema['hostname'] = config.Hostname()
schema['port'] = config.Port()
schema['static_dir'] = config.Path(optional=True)
schema['zeroconf_enabled'] = config.Boolean()
schema['zeroconf_name'] = config.String()
return schema
def validate_environment(self):

View File

@ -28,10 +28,13 @@ class HttpFrontend(pykka.ThreadingActor, CoreListener):
self._setup_logging(app)
def _setup_server(self):
self.config_section = self.config['http']
self.hostname = self.config_section['hostname']
self.port = self.config_section['port']
cherrypy.config.update({
'engine.autoreload_on': False,
'server.socket_host': self.config['http']['hostname'],
'server.socket_port': self.config['http']['port'],
'server.socket_host': self.hostname,
'server.socket_port': self.port,
})
def _setup_websocket_plugin(self):
@ -87,11 +90,30 @@ class HttpFrontend(pykka.ThreadingActor, CoreListener):
logger.debug('Starting HTTP server')
cherrypy.engine.start()
logger.info('HTTP server running at %s', cherrypy.server.base())
try:
if self.config_section['zeroconf_enabled']:
name = self.config_section['zeroconf_name']
from mopidy.utils.zeroconf import Zeroconf
self.service = Zeroconf(
stype="_http._tcp",
name=name, port=self.port, host=self.hostname,
text=["path=/"])
self.service.publish()
logger.info('Registered with Avahi as %s', name)
except Exception as e:
logger.warning('Avahi registration failed (%s)', e)
def on_stop(self):
logger.debug('Stopping HTTP server')
cherrypy.engine.exit()
logger.info('Stopped HTTP server')
try:
if self.service:
self.service.unpublish()
except Exception as e:
logger.warning('Avahi unregistration failed (%s)', e)
def on_event(self, name, **data):
event = data

View File

@ -3,6 +3,8 @@ enabled = true
hostname = 127.0.0.1
port = 6680
static_dir =
zeroconf_enabled = true
zeroconf_name = Mopidy
[loglevels]
cherrypy = warning

View File

@ -17,7 +17,7 @@ class MpdFrontend(pykka.ThreadingActor, CoreListener):
super(MpdFrontend, self).__init__()
hostname = network.format_hostname(config['mpd']['hostname'])
port = config['mpd']['port']
self.config = config
self.config_section = config['mpd']
self.hostname = hostname
self.port = port
@ -41,8 +41,8 @@ class MpdFrontend(pykka.ThreadingActor, CoreListener):
def on_start(self):
try:
if self.config['mpd']['zeroconf_enabled']:
name = self.config['mpd']['zeroconf_name']
if self.config_section['zeroconf_enabled']:
name = self.config_section['zeroconf_name']
from mopidy.utils.zeroconf import Zeroconf
self.service = Zeroconf(

View File

@ -6,4 +6,4 @@ password =
max_connections = 20
connection_timeout = 60
zeroconf_enabled = true
zeroconf_name = Mopidy
zeroconf_name = Mopidy (MPD)

View File

@ -14,7 +14,7 @@ class Zeroconf:
"""
def __init__(self, name, port, stype="_http._tcp",
domain="", host="", text=""):
domain="", host="", text=[]):
self.name = name
self.stype = stype
self.domain = domain
@ -39,6 +39,9 @@ class Zeroconf:
server.EntryGroupNew()),
"org.freedesktop.Avahi.EntryGroup")
if self.text:
self.text = [[dbus.Byte(ord(c)) for c in s] for s in self.text]
g.AddService(avahi_IF_UNSPEC, avahi_PROTO_UNSPEC,
dbus.UInt32(avahi_PublishFlags_None),
self.name, self.stype, self.domain, self.host,