From 72c3f57ce7971bb440ca3591d99b7638efa3547b Mon Sep 17 00:00:00 2001 From: Kaliko Jack Date: Wed, 17 Feb 2021 12:26:38 +0100 Subject: [PATCH] Honor MPD_TIMEOUT environment variables (closes #11) MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Default timeout is now 30s as suggested by musicpd.org Client Developer’s Manual Move to os.getenv instead of os.environ dict API to enforce str type https://www.musicpd.org/doc/html/client.html --- CHANGES.txt | 2 ++ musicpd.py | 21 +++++++++++++++------ test.py | 11 +++++++++++ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index e7e02c7..110b69d 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -8,6 +8,8 @@ Changes in 0.6.0 UNRELEASED considers only gztar and zip) * Add binarylimit command * Add getvol command +* Honor MPD_TIMEOUT environment variables +* Default connection timeout is now 30s (previously 5s) Changes in 0.5.1 diff --git a/musicpd.py b/musicpd.py index 82a6085..1a64271 100644 --- a/musicpd.py +++ b/musicpd.py @@ -29,8 +29,9 @@ ERROR_PREFIX = "ACK " SUCCESS = "OK" NEXT = "list_OK" VERSION = '0.6.0' -#: seconds before a tcp connection attempt times out -CONNECTION_TIMEOUT = 5 +#: seconds before a tcp connection attempt times out (overriden by MPD_TIMEOUT env. var.) +CONNECTION_TIMEOUT = 30 + def iterator_wrapper(func): @@ -298,8 +299,8 @@ class MPDClient: """ self.host = 'localhost' self.pwd = None - self.port = os.environ.get('MPD_PORT', '6600') - mpd_host_env = os.environ.get('MPD_HOST') + 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 @@ -310,10 +311,15 @@ class MPDClient: self.pwd = mpd_host_env[1] else: # Is socket there - xdg_runtime_dir = os.environ.get('XDG_RUNTIME_DIR', '/run') + xdg_runtime_dir = os.getenv('XDG_RUNTIME_DIR', '/run') rundir = os.path.join(xdg_runtime_dir, 'mpd/socket') if os.path.exists(rundir): self.host = rundir + self.mpd_timeout = os.getenv('MPD_TIMEOUT') + if self.mpd_timeout and self.mpd_timeout.isdigit(): + self.mpd_timeout = int(self.mpd_timeout) + else: # Use 30s default even is MPD_TIMEOUT carries gargage + self.mpd_timeout = CONNECTION_TIMEOUT def __getattr__(self, attr): if attr == 'send_noidle': # have send_noidle to cancel idle as well as noidle @@ -610,7 +616,7 @@ class MPDClient: sock = None try: sock = socket.socket(af, socktype, proto) - sock.settimeout(CONNECTION_TIMEOUT) + sock.settimeout(self.mpd_timeout) sock.connect(sa) sock.settimeout(None) return sock @@ -641,6 +647,9 @@ class MPDClient: The connect method honors MPD_HOST/MPD_PORT environment variables. + The underlying tcp socket also honors MPD_TIMEOUT environment variable + and defaults to :py:obj:`musicpd.CONNECTION_TIMEOUT`. + .. note:: Default host/port If host evaluate to :py:obj:`False` diff --git a/test.py b/test.py index 37b47bb..79a2693 100755 --- a/test.py +++ b/test.py @@ -70,6 +70,17 @@ class testEnvVar(unittest.TestCase): client = musicpd.MPDClient() self.assertEqual(client.host, '/run/user/1000/mpd/socket') + os.environ.pop('MPD_TIMEOUT', None) + client = musicpd.MPDClient() + self.assertEqual(client.mpd_timeout, 30) + os.environ['MPD_TIMEOUT'] = 'garbage' + client = musicpd.MPDClient() + self.assertEqual(client.mpd_timeout, 30) + os.environ['MPD_TIMEOUT'] = '42' + client = musicpd.MPDClient() + self.assertEqual(client.mpd_timeout, 42) + + class TestMPDClient(unittest.TestCase): longMessage = True -- 2.39.2