X-Git-Url: http://git.kaliko.me/?p=python-musicpd.git;a=blobdiff_plain;f=mpd.py;h=e2ef2e82ca7e8c63c9e53a15adaf0675d0edfe63;hp=384f856f522d44214c444179c2f5ba586d48e4f2;hb=8ec145e72766913295c842c0622952c0e50a73a7;hpb=74eff57815a3308a1fafd14c1ebbcdb8714bec75 diff --git a/mpd.py b/mpd.py index 384f856..e2ef2e8 100644 --- a/mpd.py +++ b/mpd.py @@ -51,75 +51,83 @@ class MPDClient(object): 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 + "consume": self._getnone, + "crossfade": self._getnone, + "random": self._getnone, + "repeat": self._getnone, + "setvol": self._getnone, + "single": 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): @@ -259,6 +267,9 @@ class MPDClient(object): def _getsongs(self): return self._getobjects(["file"]) + def _getplaylists(self): + return self._getobjects(["playlist"]) + def _getdatabase(self): return self._getobjects(["file", "directory", "playlist"]) @@ -287,29 +298,41 @@ class MPDClient(object): self._rfile = _NotConnected() self._wfile = _NotConnected() - def connect(self, host, port): - if self._sock: - raise ConnectionError("Already connected") - msg = "getaddrinfo returns an empty list" + def _unix_connect(self, path): + sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + sock.connect(path) + return sock + + def _tcp_connect(self, host, port): try: flags = socket.AI_ADDRCONFIG except AttributeError: flags = 0 + msg = "getaddrinfo returns an empty list" for res in socket.getaddrinfo(host, port, socket.AF_UNSPEC, socket.SOCK_STREAM, socket.IPPROTO_TCP, flags): af, socktype, proto, canonname, sa = res try: - self._sock = socket.socket(af, socktype, proto) - self._sock.connect(sa) + sock = socket.socket(af, socktype, proto) + sock.connect(sa) except socket.error, msg: - if self._sock: - self._sock.close() - self._sock = None + if sock: + sock.close() + sock = None continue break - if not self._sock: + if not sock: raise socket.error(msg) + return sock + + def connect(self, host, port): + if self._sock: + raise ConnectionError("Already connected") + if host.startswith("/"): + self._sock = self._unix_connect(host) + else: + self._sock = self._tcp_connect(host, port) self._rfile = self._sock.makefile("rb") self._wfile = self._sock.makefile("wb") try: