]> kaliko git repositories - python-musicpd.git/commitdiff
Add suport for environment variables MPD_HOST/MPD_PORT/XDG_RUNTIME_DIR
authorKaliko Jack <kaliko@azylum.org>
Thu, 1 Nov 2018 16:47:06 +0000 (17:47 +0100)
committerKaliko Jack <kaliko@azylum.org>
Thu, 1 Nov 2018 16:47:06 +0000 (17:47 +0100)
CHANGES.txt
README.rst
musicpd.py
setup.py
test.py

index c0d5d50b04cd4de9a9bbacc41a2bb8fceb381206..ada64270c1731d733bc7307995288a73e8190e18 100644 (file)
@@ -5,6 +5,10 @@ Changes in 0.4.3 UNRELEASED
 ---------------------------
 
 * Use setuptools
+* Add sensible defaults and honor environment variables
+  Use MPD_HOST/MPD_PORT (honor password setting in MPD_HOST)
+  If MPD_HOST is not set, tries to find a socket in
+  ${XDG_RUNTIME_DIR:-/run}/mpd/socket
 
 Changes in 0.4.2
 ----------------
index 61b305fec96b4ec1277c1bdd06ce4b266e5a0390..95e6ff5b19fb653a57aa7636aa44bcaf145233dd 100644 (file)
@@ -35,7 +35,10 @@ Using the client library
 The client library can be used as follows::
 
     client = musicpd.MPDClient()       # create client object
-    client.connect('localhost', 6600)  # connect to localhost:6600
+    client.connect()                   # use MPD_HOST/MPD_PORT if set else
+                                       #   test ${XDG_RUNTIME_DIR}/mpd/socket for existence
+                                       #   fallback to localhost:6600
+                                       # `connect` support host/port argument as well
     print client.mpd_version           # print the mpd version
     print client.cmd('one', 2)         # print result of the command "cmd one 2"
     client.close()                     # send the close command
index 855ff5f9718020a4da6fd9bb8b9aaffa6cc7bf70..10b15cbabec174e42ea22a151ca4ffe4100b4b65 100644 (file)
@@ -1,6 +1,6 @@
 # python-musicpd: Python MPD client library
 # Copyright (C) 2008-2010  J. Alexander Treuman <jat@spatialrift.net>
-# Copyright (C) 2012-2014  Kaliko Jack <kaliko@azylum.org>
+# Copyright (C) 2012-2018  Kaliko Jack <kaliko@azylum.org>
 #
 # python-musicpd is free software: you can redistribute it and/or modify
 # it under the terms of the GNU Lesser General Public License as published by
@@ -18,6 +18,8 @@
 # pylint: disable=missing-docstring
 
 import socket
+import os
+
 from functools import wraps
 
 
@@ -219,6 +221,32 @@ class MPDClient:
             "readmessages":       self._fetch_messages,
             "sendmessage":        self._fetch_nothing,
         }
+        self._get_envvars()
+
+    def _get_envvars(self):
+        """
+        Retrieve MPD env. var. to overrides "localhost:6600"
+            Use MPD_HOST/MPD_PORT if set
+            else use MPD_HOST=${XDG_RUNTIME_DIR:-/run/}/mpd/socket if file exists
+        """
+        self.host = 'localhost'
+        self.password = None
+        self.port = os.environ.get('MPD_PORT', '6600')
+        mpd_host_env = os.environ.get('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.password = mpd_host_env[1]
+        else:
+            # Is socket there
+            xdg_runtime_dir = os.environ.get('XDG_RUNTIME_DIR', '/run')
+            rundir = os.path.join(xdg_runtime_dir, 'mpd/socket')
+            if os.path.exists(rundir):
+                self.host = rundir
 
     def __getattr__(self, attr):
         if attr == 'send_noidle':  # have send_noidle to cancel idle as well as noidle
@@ -494,7 +522,11 @@ class MPDClient:
         self._write_command("noidle")
         return self._fetch_list()
 
-    def connect(self, host, port):
+    def connect(self, host=None, port=None):
+        if not host:
+            host = self.host
+        if not port:
+            port = self.port
         if self._sock is not None:
             raise ConnectionError("Already connected")
         if host.startswith("/"):
index 8ed1c023c82029002f498cea5b82a4c239725dd6..afcbf23d382383f40a5ef8edbaacbf1b6283ff87 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -24,7 +24,7 @@ CLASSIFIERS = [
 
 LICENSE = """\
 Copyright (C) 2008-2010  J. Alexander Treuman <jat@spatialrift.net>
-Copyright (C) 2012-2015  Kaliko Jack <kaliko@azylum.org>
+Copyright (C) 2012-2018  Kaliko Jack <kaliko@azylum.org>
 
 python-musicpd is free software: you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
diff --git a/test.py b/test.py
index 7086bcda43845867c8ca918c786aa262560e48d8..4b08902cb98fdb8ba4feb729b1849fe393a78bd7 100755 (executable)
--- a/test.py
+++ b/test.py
@@ -8,6 +8,7 @@ Test suite highly borrowed^Wsteal from python-mpd2 [0] project.
 
 
 import itertools
+import os
 import sys
 import types
 import unittest
@@ -31,6 +32,43 @@ warnings.simplefilter('default')
 TEST_MPD_HOST, TEST_MPD_PORT = ('example.com', 10000)
 
 
+class testEnvVar(unittest.TestCase):
+
+    def test_envvar(self):
+        os.environ.pop('MPD_HOST', None)
+        os.environ.pop('MPD_PORT', None)
+        client = musicpd.MPDClient()
+        self.assertEqual(client.host, 'localhost')
+        self.assertEqual(client.port, '6600')
+
+        os.environ['MPD_HOST'] = 'pa55w04d@example.org'
+        client = musicpd.MPDClient()
+        self.assertEqual(client.password, 'pa55w04d')
+        self.assertEqual(client.host, 'example.org')
+        self.assertEqual(client.port, '6600')
+
+        os.environ.pop('MPD_HOST', None)
+        os.environ['MPD_PORT'] = '6666'
+        client = musicpd.MPDClient()
+        self.assertEqual(client.password, None)
+        self.assertEqual(client.host, 'localhost')
+        self.assertEqual(client.port, '6666')
+
+        # Test unix socket fallback
+        os.environ.pop('MPD_HOST', None)
+        os.environ.pop('MPD_PORT', None)
+        os.environ.pop('XDG_RUNTIME_DIR', None)
+        with mock.patch('os.path.exists', return_value=True):
+            client = musicpd.MPDClient()
+            self.assertEqual(client.host, '/run/mpd/socket')
+
+        os.environ.pop('MPD_HOST', None)
+        os.environ.pop('MPD_PORT', None)
+        os.environ['XDG_RUNTIME_DIR'] = '/run/user/1000/'
+        with mock.patch('os.path.exists', return_value=True):
+            client = musicpd.MPDClient()
+            self.assertEqual(client.host, '/run/user/1000/mpd/socket')
+
 class TestMPDClient(unittest.TestCase):
 
     longMessage = True