X-Git-Url: http://git.kaliko.me/?a=blobdiff_plain;f=musicpd.py;h=3aa4cb071ab8c5b21049b6adaa1547492fb5de98;hb=9e3563b9b6ef05e97e54d90d1149409a3669f0a5;hp=192f6f342c78a7bd349d2ad17aa8653ac853d2ef;hpb=31b25f597c7e572317fbf27ededeed70dfd974b9;p=python-musicpd.git diff --git a/musicpd.py b/musicpd.py index 192f6f3..3aa4cb0 100644 --- a/musicpd.py +++ b/musicpd.py @@ -1,6 +1,7 @@ # python-musicpd: Python MPD client library # Copyright (C) 2008-2010 J. Alexander Treuman -# Copyright (C) 2012-2018 Kaliko Jack +# Copyright (C) 2012-2019 Kaliko Jack +# Copyright (C) 2019 Naglis Jonaitis # # 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 @@ -27,7 +28,7 @@ HELLO_PREFIX = "OK MPD " ERROR_PREFIX = "ACK " SUCCESS = "OK" NEXT = "list_OK" -VERSION = '0.4.3' +VERSION = '0.4.4' def iterator_wrapper(func): @@ -38,6 +39,7 @@ def iterator_wrapper(func): if not instance.iterate: return list(generator) instance._iterating = True + def iterator(gen): try: for item in gen: @@ -51,24 +53,31 @@ def iterator_wrapper(func): class MPDError(Exception): pass + class ConnectionError(MPDError): pass + class ProtocolError(MPDError): pass + class CommandError(MPDError): pass + class CommandListError(MPDError): pass + class PendingCommandError(MPDError): pass + class IteratingError(MPDError): pass + class Range: def __init__(self, tpl): @@ -96,14 +105,18 @@ class Range: except (TypeError, ValueError): raise CommandError('Not a tuple of int') + class _NotConnected: + def __getattr__(self, attr): return self._dummy def _dummy(*args): raise ConnectionError("Not connected") + class MPDClient: + """MPDClient instance will look for ``MPD_HOST``/``MPD_PORT``/``XDG_RUNTIME_DIR`` environment variables and set instance attribute ``host``, ``port`` and ``pwd`` accordingly. @@ -155,7 +168,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, @@ -191,19 +204,21 @@ class MPDClient: "rm": self._fetch_nothing, "save": self._fetch_nothing, # Database Commands + #"albumart": self._fetch_object, "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_songs, "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, @@ -220,6 +235,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, @@ -229,11 +249,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 @@ -321,13 +341,13 @@ class MPDClient: raise IteratingError("Cannot execute '%s' while iterating" % command) if self._pending: - raise PendingCommandError("Cannot execute '%s' with " - "pending commands" % command) + raise PendingCommandError( + "Cannot execute '%s' with pending commands" % command) retval = self._commands[command] if self._command_list is not None: if not callable(retval): - raise CommandListError("'%s' not allowed in command list" % - command) + raise CommandListError( + "'%s' not allowed in command list" % command) self._write_command(command, args) self._command_list.append(retval) else: @@ -506,8 +526,8 @@ class MPDClient: def _connect_unix(self, path): if not hasattr(socket, "AF_UNIX"): - raise ConnectionError("Unix domain sockets not supported " - "on this platform") + raise ConnectionError( + "Unix domain sockets not supported on this platform") sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) sock.connect(path) return sock @@ -539,7 +559,8 @@ class MPDClient: def noidle(self): # noidle's special case if not self._pending or self._pending[0] != 'idle': - raise CommandError('cannot send noidle if send_idle was not called') + raise CommandError( + 'cannot send noidle if send_idle was not called') del self._pending[0] self._write_command("noidle") return self._fetch_list()