self.host = 'localhost'
self.pwd = None
self.port = os.getenv('MPD_PORT', '6600')
- mpd_host_env = os.getenv('MPD_HOST')
- if mpd_host_env:
- # If password is set:
- # mpd_host_env = ['pass', 'host'] because MPD_HOST=pass@host
- mpd_host_env = mpd_host_env.split('@')
- mpd_host_env.reverse()
- self.host = mpd_host_env[0]
- if len(mpd_host_env) > 1 and mpd_host_env[1]:
- self.pwd = mpd_host_env[1]
+ if os.getenv('MPD_HOST'):
+ # If password is set: MPD_HOST=pass@host
+ if '@' in os.getenv('MPD_HOST'):
+ mpd_host_env = os.getenv('MPD_HOST').split('@', 1)
+ if mpd_host_env[0]:
+ # A password is actually set
+ self.pwd = mpd_host_env[0]
+ self.host = mpd_host_env[1]
+ else:
+ # No password set but leading @ is an abstract socket
+ self.host = '@'+mpd_host_env[1]
+ else:
+ # MPD_HOST is a plain host
+ self.host = os.getenv('MPD_HOST')
else:
# Is socket there
xdg_runtime_dir = os.getenv('XDG_RUNTIME_DIR', '/run')
if not hasattr(socket, "AF_UNIX"):
raise ConnectionError(
"Unix domain sockets not supported on this platform")
+ # abstract socket
+ if path.startswith('@'):
+ path = '\0'+path[1:]
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.connect(path)
return sock
self.port = port
if self._sock is not None:
raise ConnectionError("Already connected")
- if host.startswith("/"):
+ if host[0] in ['/', '@']:
self._sock = self._connect_unix(host)
else:
self._sock = self._connect_tcp(host, port)
client = musicpd.MPDClient()
self.assertEqual(client.host, '/unix/sock')
+ # Test plain abstract socket extraction
+ os.environ['MPD_HOST'] = '@abstract'
+ client = musicpd.MPDClient()
+ self.assertEqual(client.host, '@abstract')
+
+ # Test password and abstract socket extraction
+ os.environ['MPD_HOST'] = 'pass@@abstract'
+ client = musicpd.MPDClient()
+ self.assertEqual(client.pwd, 'pass')
+ self.assertEqual(client.host, '@abstract')
+
# Test unix socket fallback
os.environ.pop('MPD_HOST', None)
os.environ.pop('MPD_PORT', None)