return self._dummy
def _dummy(*args):
- raise ConnectionError, "Not connected"
+ raise ConnectionError("Not connected")
class MPDClient(object):
def __init__(self):
self.iterate = False
self._reset()
self._commands = {
- # Admin Commands
- "disableoutput": self._getnone,
- "enableoutput": self._getnone,
- "kill": None,
- "update": self._getitem,
- # Informational Commands
+ # Status Commands
+ "clearerror": self._getnone,
+ "currentsong": self._getobject,
+ "idle": self._getlist,
+ "noidle": None,
"status": self._getobject,
"stats": self._getobject,
- "outputs": self._getoutputs,
- "commands": self._getlist,
- "notcommands": self._getlist,
- "tagtypes": self._getlist,
- "urlhandlers": self._getlist,
- # Database Commands
- "find": self._getsongs,
- "list": self._getlist,
- "listall": self._getdatabase,
- "listallinfo": self._getdatabase,
- "lsinfo": self._getdatabase,
- "search": self._getsongs,
- "count": self._getobject,
+ # Playback Option Commands
+ "crossfade": self._getnone,
+ "random": self._getnone,
+ "repeat": self._getnone,
+ "setvol": self._getnone,
+ "volume": self._getnone,
+ # Playback Control Commands
+ "next": self._getnone,
+ "pause": self._getnone,
+ "play": self._getnone,
+ "playid": self._getnone,
+ "previous": self._getnone,
+ "seek": self._getnone,
+ "seekid": self._getnone,
+ "stop": self._getnone,
# Playlist Commands
"add": self._getnone,
"addid": self._getitem,
"clear": self._getnone,
- "currentsong": self._getobject,
"delete": self._getnone,
"deleteid": self._getnone,
- "load": self._getnone,
- "rename": self._getnone,
"move": self._getnone,
"moveid": self._getnone,
"playlist": self._getplaylist,
- "playlistinfo": self._getsongs,
+ "playlistfind": self._getsongs,
"playlistid": self._getsongs,
+ "playlistinfo": self._getsongs,
+ "playlistsearch": self._getsongs,
"plchanges": self._getsongs,
"plchangesposid": self._getchanges,
- "rm": self._getnone,
- "save": self._getnone,
"shuffle": self._getnone,
"swap": self._getnone,
"swapid": self._getnone,
+ # Stored Playlist Commands
"listplaylist": self._getlist,
"listplaylistinfo": self._getsongs,
+ "listplaylists": self._getplaylists,
+ "load": self._getnone,
"playlistadd": self._getnone,
"playlistclear": self._getnone,
"playlistdelete": self._getnone,
"playlistmove": self._getnone,
- "playlistfind": self._getsongs,
- "playlistsearch": self._getsongs,
- # Playback Commands
- "crossfade": self._getnone,
- "next": self._getnone,
- "pause": self._getnone,
- "play": self._getnone,
- "playid": self._getnone,
- "previous": self._getnone,
- "random": self._getnone,
- "repeat": self._getnone,
- "seek": self._getnone,
- "seekid": self._getnone,
- "setvol": self._getnone,
- "stop": self._getnone,
- "volume": self._getnone,
- # Miscellaneous Commands
- "clearerror": self._getnone,
+ "rename": self._getnone,
+ "rm": self._getnone,
+ "save": self._getnone,
+ # Database Commands
+ "count": self._getobject,
+ "find": self._getsongs,
+ "list": self._getlist,
+ "listall": self._getdatabase,
+ "listallinfo": self._getdatabase,
+ "lsinfo": self._getdatabase,
+ "search": self._getsongs,
+ "update": self._getitem,
+ # Connection Commands
"close": None,
+ "kill": None,
"password": self._getnone,
"ping": self._getnone,
+ # Audio Output Commands
+ "disableoutput": self._getnone,
+ "enableoutput": self._getnone,
+ "outputs": self._getoutputs,
+ # Reflection Commands
+ "commands": self._getlist,
+ "notcommands": self._getlist,
+ "tagtypes": self._getlist,
+ "urlhandlers": self._getlist,
}
def __getattr__(self, attr):
try:
retval = self._commands[attr]
except KeyError:
- raise AttributeError, "'%s' object has no attribute '%s'" % \
- (self.__class__.__name__, attr)
+ raise AttributeError("'%s' object has no attribute '%s'" %
+ (self.__class__.__name__, attr))
return lambda *args: self._docommand(attr, args, retval)
def _docommand(self, command, args, retval):
if self._commandlist is not None and not callable(retval):
- raise CommandListError, "%s not allowed in command list" % command
+ raise CommandListError("%s not allowed in command list" % command)
self._writecommand(command, args)
if self._commandlist is None:
if callable(retval):
def _readline(self):
line = self._rfile.readline()
if not line.endswith("\n"):
- raise ConnectionError, "Connection lost while reading line"
+ raise ConnectionError("Connection lost while reading line")
line = line.rstrip("\n")
if line.startswith(ERROR_PREFIX):
error = line[len(ERROR_PREFIX):].strip()
- raise CommandError, error
+ raise CommandError(error)
if self._commandlist is not None:
if line == NEXT:
return
if line == SUCCESS:
- raise ProtocolError, "Got unexpected '%s'" % SUCCESS
+ raise ProtocolError("Got unexpected '%s'" % SUCCESS)
elif line == SUCCESS:
return
return line
return
item = line.split(separator, 1)
if len(item) < 2:
- raise ProtocolError, "Could not parse item: '%s'" % line
+ raise ProtocolError("Could not parse item: '%s'" % line)
return item
def _readitems(self, separator=": "):
for key, value in self._readitems():
if key != seen:
if seen is not None:
- raise ProtocolError, "Expected key '%s', got '%s'" % \
- (seen, key)
+ raise ProtocolError("Expected key '%s', got '%s'" %
+ (seen, key))
seen = key
yield value
raise StopIteration
def _getnone(self):
line = self._readline()
if line is not None:
- raise ProtocolError, "Got unexpected return value: '%s'" % line
+ raise ProtocolError("Got unexpected return value: '%s'" % line)
def _getitem(self):
items = list(self._readitems())
def _getsongs(self):
return self._getobjects(["file"])
+ def _getplaylists(self):
+ return self._getobjects(["playlist"])
+
def _getdatabase(self):
return self._getobjects(["file", "directory", "playlist"])
def _hello(self):
line = self._rfile.readline()
if not line.endswith("\n"):
- raise ConnectionError, "Connection lost while reading MPD hello"
+ raise ConnectionError("Connection lost while reading MPD hello")
line = line.rstrip("\n")
if not line.startswith(HELLO_PREFIX):
- raise ProtocolError, "Got invalid MPD hello: '%s'" % line
+ raise ProtocolError("Got invalid MPD hello: '%s'" % line)
self.mpd_version = line[len(HELLO_PREFIX):].strip()
def _reset(self):
def connect(self, host, port):
if self._sock:
- raise ConnectionError, "Already connected"
+ raise ConnectionError("Already connected")
msg = "getaddrinfo returns an empty list"
+ try:
+ flags = socket.AI_ADDRCONFIG
+ except AttributeError:
+ flags = 0
for res in socket.getaddrinfo(host, port, socket.AF_UNSPEC,
socket.SOCK_STREAM, socket.IPPROTO_TCP,
- socket.AI_ADDRCONFIG):
+ flags):
af, socktype, proto, canonname, sa = res
try:
self._sock = socket.socket(af, socktype, proto)
continue
break
if not self._sock:
- raise socket.error, msg
+ raise socket.error(msg)
self._rfile = self._sock.makefile("rb")
self._wfile = self._sock.makefile("wb")
try:
self._hello()
- except (socket.error, MPDError):
+ except:
self.disconnect()
raise
def command_list_ok_begin(self):
if self._commandlist is not None:
- raise CommandListError, "Already in command list"
+ raise CommandListError("Already in command list")
self._writecommand("command_list_ok_begin")
self._commandlist = []
def command_list_end(self):
if self._commandlist is None:
- raise CommandListError, "Not in command list"
+ raise CommandListError("Not in command list")
self._writecommand("command_list_end")
return self._getcommandlist()