X-Git-Url: http://git.kaliko.me/?a=blobdiff_plain;f=musicpd.py;h=6146a7a3be1bcc8dc959813d541610105519fbf7;hb=56b72eaeb273c06cb17c54e980954e6c82be2346;hp=f72353e762d066d2f263cb95a6b934424c12d8d1;hpb=0304a10fe76deb1dfcdb5672958877ff2b2e6212;p=python-musicpd.git diff --git a/musicpd.py b/musicpd.py index f72353e..6146a7a 100644 --- a/musicpd.py +++ b/musicpd.py @@ -2,6 +2,7 @@ # Copyright (C) 2008-2010 J. Alexander Treuman # Copyright (C) 2012-2019 Kaliko Jack # Copyright (C) 2019 Naglis Jonaitis +# Copyright (C) 2019 Bart Van Loon # # 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 @@ -28,7 +29,8 @@ HELLO_PREFIX = "OK MPD " ERROR_PREFIX = "ACK " SUCCESS = "OK" NEXT = "list_OK" -VERSION = '0.4.4' +VERSION = '0.4.5' +CONNECTION_TIMEOUT = 5 # seconds before a tcp connection attempt times out def iterator_wrapper(func): @@ -168,7 +170,7 @@ class MPDClient: "seekid": self._fetch_nothing, "seekcur": self._fetch_nothing, "stop": self._fetch_nothing, - # Playlist Commands + # Queue Commands "add": self._fetch_nothing, "addid": self._fetch_item, "clear": self._fetch_nothing, @@ -204,19 +206,21 @@ class MPDClient: "rm": self._fetch_nothing, "save": self._fetch_nothing, # Database Commands + "albumart": self._fetch_composite, "count": self._fetch_object, "find": self._fetch_songs, "findadd": self._fetch_nothing, "list": self._fetch_list, "listall": self._fetch_database, "listallinfo": self._fetch_database, + "listfiles": self._fetch_database, "lsinfo": self._fetch_database, + "readcomments": self._fetch_object, "search": self._fetch_songs, "searchadd": self._fetch_nothing, "searchaddpl": self._fetch_nothing, "update": self._fetch_item, "rescan": self._fetch_item, - "readcomments": self._fetch_object, # Mounts and neighbors "mount": self._fetch_nothing, "unmount": self._fetch_nothing, @@ -233,6 +237,11 @@ class MPDClient: "kill": None, "password": self._fetch_nothing, "ping": self._fetch_nothing, + "tagtypes": self._fetch_list, + "tagtypes disable": self._fetch_nothing, + "tagtypes enable": self._fetch_nothing, + "tagtypes clear": self._fetch_nothing, + "tagtypes all": self._fetch_nothing, # Partition Commands "partition": self._fetch_nothing, "listpartitions": self._fetch_list, @@ -242,11 +251,11 @@ class MPDClient: "enableoutput": self._fetch_nothing, "toggleoutput": self._fetch_nothing, "outputs": self._fetch_outputs, + "outputset": self._fetch_nothing, # Reflection Commands "config": self._fetch_object, "commands": self._fetch_list, "notcommands": self._fetch_list, - "tagtypes": self._fetch_list, "urlhandlers": self._fetch_list, "decoders": self._fetch_plugins, # Client to Client @@ -495,6 +504,17 @@ class MPDClient: def _fetch_neighbors(self): return self._fetch_objects(["neighbor"]) + def _fetch_composite(self): + obj = {} + for key, value in self._read_pairs(): + key = key.lower() + obj[key] = value + if key == 'binary': + break + by = self._read_line() + obj['data'] = by.encode(errors='surrogateescape') + return obj + @iterator_wrapper def _fetch_command_list(self): return self._read_command_list() @@ -538,7 +558,9 @@ class MPDClient: sock = None try: sock = socket.socket(af, socktype, proto) + sock.settimeout(CONNECTION_TIMEOUT) sock.connect(sa) + sock.settimeout(None) return sock except socket.error as socket_err: err = socket_err @@ -587,7 +609,7 @@ class MPDClient: self._sock = self._connect_unix(host) else: self._sock = self._connect_tcp(host, port) - self._rfile = self._sock.makefile("r", encoding='utf-8') + self._rfile = self._sock.makefile("r", encoding='utf-8', errors='surrogateescape') self._wfile = self._sock.makefile("w", encoding='utf-8') try: self._hello()