# 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.0'
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,
self._wfile.write("%s\n" % line)
self._wfile.flush()
- def _write_command(self, command, args=[]):
+ def _write_command(self, command, args=None):
+ if args is None:
+ 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):
yield value
def _read_playlist(self):
- for key, value in self._read_pairs(":"):
+ for _, value in self._read_pairs(":"):
yield value
- def _read_objects(self, delimiters=[]):
+ def _read_objects(self, delimiters=None):
obj = {}
+ if delimiters is None:
+ delimiters = []
for key, value in self._read_pairs():
key = key.lower()
if obj:
self.mpd_version = line[len(HELLO_PREFIX):].strip()
def _reset(self):
+ # pylint: disable=w0201
self.mpd_version = None
self._iterating = False
self._pending = []
for res in socket.getaddrinfo(host, port, socket.AF_UNSPEC,
socket.SOCK_STREAM, socket.IPPROTO_TCP,
flags):
- af, socktype, proto, canonname, sa = res
+ af, socktype, proto, _, sa = res
sock = None
try:
sock = socket.socket(af, socktype, proto)