X-Git-Url: https://git.kaliko.me/?a=blobdiff_plain;f=musicpd.py;h=1a64271399d4716b3be42ac5c7991941faefde80;hb=01b08f482300d79edfe799b2f18caf50f34c57f5;hp=3425a6f7f84fd9d37f3ffdd1a749d24b19dacbc0;hpb=fe692d6437980c2a691b03fc85a23230ef128c38;p=python-musicpd.git diff --git a/musicpd.py b/musicpd.py index 3425a6f..1a64271 100644 --- a/musicpd.py +++ b/musicpd.py @@ -1,5 +1,5 @@ # python-musicpd: Python MPD client library -# Copyright (C) 2012-2020 kaliko +# Copyright (C) 2012-2021 kaliko # Copyright (C) 2019 Naglis Jonaitis # Copyright (C) 2019 Bart Van Loon # Copyright (C) 2008-2010 J. Alexander Treuman @@ -28,9 +28,10 @@ HELLO_PREFIX = "OK MPD " ERROR_PREFIX = "ACK " SUCCESS = "OK" NEXT = "list_OK" -VERSION = '0.4.5' -#: seconds before a tcp connection attempt times out -CONNECTION_TIMEOUT = 5 +VERSION = '0.6.0' +#: seconds before a tcp connection attempt times out (overriden by MPD_TIMEOUT env. var.) +CONNECTION_TIMEOUT = 30 + def iterator_wrapper(func): @@ -173,6 +174,7 @@ class MPDClient: "random": self._fetch_nothing, "repeat": self._fetch_nothing, "setvol": self._fetch_nothing, + "getvol": self._fetch_object, "single": self._fetch_nothing, "replay_gain_mode": self._fetch_nothing, "replay_gain_status": self._fetch_item, @@ -225,6 +227,7 @@ class MPDClient: # Database Commands "albumart": self._fetch_composite, "count": self._fetch_object, + "getfingerprint": self._fetch_object, "find": self._fetch_songs, "findadd": self._fetch_nothing, "list": self._fetch_list, @@ -233,6 +236,7 @@ class MPDClient: "listfiles": self._fetch_database, "lsinfo": self._fetch_database, "readcomments": self._fetch_object, + "readpicture": self._fetch_composite, "search": self._fetch_songs, "searchadd": self._fetch_nothing, "searchaddpl": self._fetch_nothing, @@ -254,6 +258,7 @@ class MPDClient: "kill": None, "password": self._fetch_nothing, "ping": self._fetch_nothing, + "binarylimit": self._fetch_nothing, "tagtypes": self._fetch_list, "tagtypes disable": self._fetch_nothing, "tagtypes enable": self._fetch_nothing, @@ -263,6 +268,8 @@ class MPDClient: "partition": self._fetch_nothing, "listpartitions": self._fetch_list, "newpartition": self._fetch_nothing, + "delpartition": self._fetch_nothing, + "moveoutput": self._fetch_nothing, # Audio Output Commands "disableoutput": self._fetch_nothing, "enableoutput": self._fetch_nothing, @@ -292,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 @@ -304,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 @@ -542,6 +554,10 @@ class MPDClient: obj[key] = value if key == 'binary': break + if not obj: + # If the song file was recognized, but there is no picture, the + # response is successful, but is otherwise empty. + return obj amount = int(obj['binary']) try: obj['data'] = self._read_binary(amount) @@ -600,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 @@ -631,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`