]> kaliko git repositories - python-musicpd.git/blobdiff - mpd.py
Handles better lost connections
[python-musicpd.git] / mpd.py
diff --git a/mpd.py b/mpd.py
index 7305f7d94eba202796d147894c9ecb671cc1381a..373bd1672d835d6a0ecad229856d55cc3168d4f7 100644 (file)
--- a/mpd.py
+++ b/mpd.py
@@ -1,5 +1,6 @@
 # python-mpd: Python MPD client library
 # Copyright (C) 2008-2010  J. Alexander Treuman <jat@spatialrift.net>
+# Copyright (C)      2012  Kaliko Jack <kaliko@azylum.org>
 #
 # python-mpd is free software: you can redistribute it and/or modify
 # it under the terms of the GNU Lesser General Public License as published by
@@ -84,6 +85,7 @@ class MPDClient(object):
             "previous":           self._fetch_nothing,
             "seek":               self._fetch_nothing,
             "seekid":             self._fetch_nothing,
+            "seekcur":            self._fetch_nothing,
             "stop":               self._fetch_nothing,
             # Playlist Commands
             "add":                self._fetch_nothing,
@@ -124,6 +126,8 @@ class MPDClient(object):
             "listallinfo":        self._fetch_database,
             "lsinfo":             self._fetch_database,
             "search":             self._fetch_songs,
+            "searchadd":          self._fetch_nothing,
+            "searchaddpl":        self._fetch_nothing,
             "update":             self._fetch_item,
             "rescan":             self._fetch_item,
             # Sticker Commands
@@ -147,6 +151,12 @@ class MPDClient(object):
             "tagtypes":           self._fetch_list,
             "urlhandlers":        self._fetch_list,
             "decoders":           self._fetch_plugins,
+            # Client to Client
+            "subscribe":          self._fetch_nothing,
+            "unsubscribe":        self._fetch_nothing,
+            "channels":           self._fetch_list,
+            "readmessages":       self._fetch_messages,
+            "sendmessage":        self._fetch_nothing,
         }
 
     def __getattr__(self, attr):
@@ -226,6 +236,7 @@ class MPDClient(object):
     def _read_line(self):
         line = self._rfile.readline()
         if not line.endswith("\n"):
+            self.disconnect()
             raise ConnectionError("Connection lost while reading line")
         line = line.rstrip("\n")
         if line.startswith(ERROR_PREFIX):
@@ -352,6 +363,9 @@ class MPDClient(object):
     def _fetch_plugins(self):
         return self._fetch_objects(["plugin"])
 
+    def _fetch_messages(self):
+        return self._fetch_objects(["channel"])
+
     def _fetch_command_list(self):
         return self._wrap_iterator(self._read_command_list())
 
@@ -396,11 +410,12 @@ class MPDClient(object):
                 sock = socket.socket(af, socktype, proto)
                 sock.connect(sa)
                 return sock
-            except socket.error, err:
+            except socket.error as socket_err:
+                err = socket_err
                 if sock is not None:
                     sock.close()
         if err is not None:
-            raise err
+            raise ConnectionError(str(err))
         else:
             raise ConnectionError("getaddrinfo returns an empty list")
 
@@ -411,8 +426,8 @@ class MPDClient(object):
             self._sock = self._connect_unix(host)
         else:
             self._sock = self._connect_tcp(host, port)
-        self._rfile = self._sock.makefile("rb")
-        self._wfile = self._sock.makefile("wb")
+        self._rfile = self._sock.makefile("r")
+        self._wfile = self._sock.makefile("w")
         try:
             self._hello()
         except:
@@ -420,9 +435,15 @@ class MPDClient(object):
             raise
 
     def disconnect(self):
-        self._rfile.close()
-        self._wfile.close()
-        self._sock.close()
+        if isinstance(self._rfile, socket._fileobject):
+            print('closing r socket')
+            self._rfile.close()
+        if isinstance(self._wfile, socket._fileobject):
+            print('closing w socket')
+            self._wfile.close()
+        if isinstance(self._sock, socket.socket):
+            print('closing socket')
+            self._sock.close()
         self._reset()
 
     def fileno(self):