X-Git-Url: https://git.kaliko.me/?p=python-musicpd.git;a=blobdiff_plain;f=musicpd.py;h=4ead39a86ca9de7e7e98dcded1b24c222e6ae093;hp=4980c270c641eda68993982db11b074ac14e1faa;hb=86a40a9a5a668399c6ca07022b3c38251686ed1d;hpb=8fec386e0991e20df8bbb0cc99f0bbf621b6d95c diff --git a/musicpd.py b/musicpd.py index 4980c27..4ead39a 100644 --- a/musicpd.py +++ b/musicpd.py @@ -1,6 +1,6 @@ # python-musicpd: Python MPD client library # Copyright (C) 2008-2010 J. Alexander Treuman -# Copyright (C) 2012-2013 Kaliko Jack +# Copyright (C) 2012-2014 Kaliko Jack # # 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 @@ -24,7 +24,7 @@ HELLO_PREFIX = "OK MPD " ERROR_PREFIX = "ACK " SUCCESS = "OK" NEXT = "list_OK" -VERSION = '0.4.0' +VERSION = '0.4.2' class MPDError(Exception): @@ -55,6 +55,8 @@ class Range: self._check() def __str__(self): + if len(self.tpl) == 0: + return ':' if len(self.tpl) == 1: return '{0}:'.format(self.tpl[0]) return '{0[0]}:{0[1]}'.format(self.tpl) @@ -65,8 +67,8 @@ class Range: 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]') + if len(self.tpl) not in [0, 1, 2]: + raise CommandError('length not in [0, 1, 2]') for index in self.tpl: try: index = int(index) @@ -90,7 +92,7 @@ class MPDClient: "clearerror": self._fetch_nothing, "currentsong": self._fetch_object, "idle": self._fetch_list, - "noidle": None, + #"noidle": None, "status": self._fetch_object, "stats": self._fetch_object, # Playback Option Commands @@ -130,9 +132,14 @@ class MPDClient: "playlistsearch": self._fetch_songs, "plchanges": self._fetch_songs, "plchangesposid": self._fetch_changes, + "prio": self._fetch_nothing, + "prioid": self._fetch_nothing, + "rangeid": self._fetch_nothing, "shuffle": self._fetch_nothing, "swap": self._fetch_nothing, "swapid": self._fetch_nothing, + "addtagid": self._fetch_nothing, + "cleartagid": self._fetch_nothing, # Stored Playlist Commands "listplaylist": self._fetch_list, "listplaylistinfo": self._fetch_songs, @@ -159,6 +166,11 @@ class MPDClient: "update": self._fetch_item, "rescan": self._fetch_item, "readcomments": self._fetch_object, + # Mounts and neighbors + "mount": self._fetch_nothing, + "unmount": self._fetch_nothing, + "listmounts": self._fetch_mounts, + "listneighbors": self._fetch_neighbors, # Sticker Commands "sticker get": self._fetch_item, "sticker set": self._fetch_nothing, @@ -190,6 +202,8 @@ class MPDClient: } def __getattr__(self, attr): + if attr == 'send_noidle': # have send_noidle to cancel idle as well as noidle + return self.noidle() if attr.startswith("send_"): command = attr.replace("send_", "", 1) wrapper = self._send @@ -403,6 +417,12 @@ class MPDClient: def _fetch_messages(self): return self._fetch_objects(["channel"]) + def _fetch_mounts(self): + return self._fetch_objects(["mount"]) + + def _fetch_neighbors(self): + return self._fetch_objects(["neighbor"]) + def _fetch_command_list(self): return self._wrap_iterator(self._read_command_list()) @@ -457,6 +477,14 @@ class MPDClient: else: raise ConnectionError("getaddrinfo returns an empty list") + 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') + del self._pending[0] + self._write_command("noidle") + return self._fetch_list() + def connect(self, host, port): if self._sock is not None: raise ConnectionError("Already connected")