# You should have received a copy of the GNU Lesser General Public License
# along with python-musicpd. If not, see <http://www.gnu.org/licenses/>.
+# pylint: disable=C0111
+
import socket
ERROR_PREFIX = "ACK "
SUCCESS = "OK"
NEXT = "list_OK"
-VERSION = '0.3.1b'
+VERSION = '0.4.0pr2'
class MPDError(Exception):
class IteratingError(MPDError):
pass
+class Range:
+
+ def __init__(self, tpl):
+ self.tpl = tpl
+ self._check()
+
+ def __str__(self):
+ if len(self.tpl) == 1:
+ return '{0}:'.format(self.tpl[0])
+ return '{0[0]}:{0[1]}'.format(self.tpl)
+
+ def __repr__(self):
+ return 'Range({0})'.format(self.tpl)
+
+ def _check(self):
+ if not isinstance(self.tpl, tuple):
+ raise CommandError('Wrong type, provide a tuple')
+ if len(self.tpl) not in [1, 2]:
+ raise CommandError('length not in [1, 2]')
+ for index in self.tpl:
+ try:
+ index = int(index)
+ except (TypeError, ValueError):
+ raise CommandError('Not a tuple of int')
+
-class _NotConnected(object):
+class _NotConnected:
def __getattr__(self, attr):
return self._dummy
def _dummy(*args):
raise ConnectionError("Not connected")
-class MPDClient(object):
+class MPDClient:
def __init__(self):
self.iterate = False
self._reset()
"searchaddpl": self._fetch_nothing,
"update": self._fetch_item,
"rescan": self._fetch_item,
+ "readcomments": self._fetch_object,
# Sticker Commands
"sticker get": self._fetch_item,
"sticker set": self._fetch_nothing,
# Audio Output Commands
"disableoutput": self._fetch_nothing,
"enableoutput": self._fetch_nothing,
+ "toggleoutput": self._fetch_nothing,
"outputs": self._fetch_outputs,
# Reflection Commands
"commands": self._fetch_list,
def _write_command(self, command, args=[]):
parts = [command]
for arg in args:
- parts.append('"%s"' % escape(str(arg)))
+ if isinstance(arg, tuple):
+ parts.append('{0!s}'.format(Range(arg)))
+ else:
+ parts.append('"%s"' % escape(str(arg)))
self._write_line(" ".join(parts))
def _read_line(self):
self.mpd_version = line[len(HELLO_PREFIX):].strip()
def _reset(self):
+ # pylint: disable=w0201
self.mpd_version = None
self._iterating = False
self._pending = []
self._rfile.close()
if hasattr(self._wfile, 'close'):
self._wfile.close()
- if isinstance(self._sock, socket.socket):
+ if hasattr(self._sock, 'close'):
self._sock.close()
self._reset()