]> kaliko git repositories - python-musicpd.git/blobdiff - musicpd.py
Added tcp socket connection timeout
[python-musicpd.git] / musicpd.py
index 3aa4cb071ab8c5b21049b6adaa1547492fb5de98..e8f786324d5e24f9850512dccc5c2fdda51acab0 100644 (file)
@@ -30,6 +30,7 @@ SUCCESS = "OK"
 NEXT = "list_OK"
 VERSION = '0.4.4'
 
+CONNECTION_TIMEOUT = 5  # seconds before a tcp connection attempt times out
 
 def iterator_wrapper(func):
     """Decorator handling iterate option"""
@@ -204,14 +205,14 @@ class MPDClient:
             "rm":                 self._fetch_nothing,
             "save":               self._fetch_nothing,
             # Database Commands
-            #"albumart":           self._fetch_object,
+            "albumart":           self._fetch_composite,
             "count":              self._fetch_object,
             "find":               self._fetch_songs,
             "findadd":            self._fetch_nothing,
             "list":               self._fetch_list,
             "listall":            self._fetch_database,
             "listallinfo":        self._fetch_database,
-            "listfiles":          self._fetch_songs,
+            "listfiles":          self._fetch_database,
             "lsinfo":             self._fetch_database,
             "readcomments":       self._fetch_object,
             "search":             self._fetch_songs,
@@ -502,6 +503,17 @@ class MPDClient:
     def _fetch_neighbors(self):
         return self._fetch_objects(["neighbor"])
 
+    def _fetch_composite(self):
+        obj = {}
+        for key, value in self._read_pairs():
+            key = key.lower()
+            obj[key] = value
+            if key == 'binary':
+                break
+        by = self._read_line()
+        obj['data'] = by.encode(errors='surrogateescape')
+        return obj
+
     @iterator_wrapper
     def _fetch_command_list(self):
         return self._read_command_list()
@@ -545,7 +557,9 @@ class MPDClient:
             sock = None
             try:
                 sock = socket.socket(af, socktype, proto)
+                sock.settimeout(CONNECTION_TIMEOUT)
                 sock.connect(sa)
+                sock.settimeout(None)
                 return sock
             except socket.error as socket_err:
                 err = socket_err
@@ -594,7 +608,7 @@ class MPDClient:
             self._sock = self._connect_unix(host)
         else:
             self._sock = self._connect_tcp(host, port)
-        self._rfile = self._sock.makefile("r", encoding='utf-8')
+        self._rfile = self._sock.makefile("r", encoding='utf-8', errors='surrogateescape')
         self._wfile = self._sock.makefile("w", encoding='utf-8')
         try:
             self._hello()