diff --git a/mopidy/frontends/http/__init__.py b/mopidy/frontends/http/__init__.py index 6d84b25b..d5f8f1bc 100644 --- a/mopidy/frontends/http/__init__.py +++ b/mopidy/frontends/http/__init__.py @@ -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): diff --git a/mopidy/frontends/http/actor.py b/mopidy/frontends/http/actor.py index 5e49d2cd..47602b33 100644 --- a/mopidy/frontends/http/actor.py +++ b/mopidy/frontends/http/actor.py @@ -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 diff --git a/mopidy/frontends/http/ext.conf b/mopidy/frontends/http/ext.conf index 04fb1aae..f3df5f1a 100644 --- a/mopidy/frontends/http/ext.conf +++ b/mopidy/frontends/http/ext.conf @@ -3,6 +3,8 @@ enabled = true hostname = 127.0.0.1 port = 6680 static_dir = +zeroconf_enabled = true +zeroconf_name = Mopidy [loglevels] cherrypy = warning diff --git a/mopidy/frontends/mpd/actor.py b/mopidy/frontends/mpd/actor.py index 66218593..b252ee2d 100644 --- a/mopidy/frontends/mpd/actor.py +++ b/mopidy/frontends/mpd/actor.py @@ -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( diff --git a/mopidy/frontends/mpd/ext.conf b/mopidy/frontends/mpd/ext.conf index 667aff24..d51c04f6 100644 --- a/mopidy/frontends/mpd/ext.conf +++ b/mopidy/frontends/mpd/ext.conf @@ -6,4 +6,4 @@ password = max_connections = 20 connection_timeout = 60 zeroconf_enabled = true -zeroconf_name = Mopidy +zeroconf_name = Mopidy (MPD) diff --git a/mopidy/utils/zeroconf.py b/mopidy/utils/zeroconf.py index d77738b4..4e802f7c 100644 --- a/mopidy/utils/zeroconf.py +++ b/mopidy/utils/zeroconf.py @@ -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,