]> kaliko git repositories - mpd-sima.git/commitdiff
Deal with lost connection (Closes #53)
authorkaliko <kaliko@azylum.org>
Thu, 30 Sep 2021 17:15:10 +0000 (19:15 +0200)
committerkaliko <kaliko@azylum.org>
Thu, 30 Sep 2021 17:15:10 +0000 (19:15 +0200)
doc/Changelog
setup.py
sima/core.py
sima/mpdclient.py

index 5bc357e70c5c2e2dfc9e4b6ce77d46b9cfc85732..2639ee6d87f714fceea66259126cf19523a32f2e 100644 (file)
@@ -7,8 +7,10 @@ MPD_sima v0.18.0.dev1
  simadb_cli executable is removed.
  * Removed obsolete --create-db and --generate-config options
  * Fixed crash when setting XDG_CONFIG_HOME (closes #50)
- * Add abstract unix socket support for MPD connection (need at least
- python-musicpd 0.6.0)
+ * Add abstract unix socket support for MPD connection
+ * Better MPD connection management.
+ * Need at least python-musicpd 0.7.0.
+   Abstract socket in v0.6.0 and socket timeout in v0.7.0
 
  -- kaliko <kaliko@azylum.org>  Wed, 28 Apr 2021 17:21:39 +0200
 
index d46a831cf1b3e82bb071a5c53b00d71af9d3cd03..8c86cc2bfcf5b93b69cb896fa4dce4840cf06d1f 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -42,7 +42,7 @@ setup(name='MPD_sima',
       keywords='MPD',
       long_description=DESCRIPTION,
       classifiers=classifiers,
-      install_requires=['python-musicpd>=0.4.1', 'requests>= 2.20.0'],
+      install_requires=['python-musicpd>=0.7.0', 'requests>= 2.20.0'],
       packages=find_packages(exclude=["tests"]),
       include_package_data=True,
       data_files=data_files,
index 7f3631cfb610c03346218c032da5d95e9ce143ad..ed4e0e1115ef93a96b96048ef8b83780fc61ae21 100644 (file)
@@ -145,10 +145,12 @@ class Sima(Daemon):
         """
         self.log.warning('Starting shutdown.')
         # Cleaning pending command
-        self.player.clean()
-        self.foreach_plugin('shutdown')
-        self.player.disconnect()
-
+        try:
+            self.player.clean()
+            self.foreach_plugin('shutdown')
+            self.player.disconnect()
+        except PlayerError as err:
+            self.log.error('Player error during shutdown: %s', err)
         self.log.info('The way is shut, it was made by those who are dead. '
                       'And the dead keep it…')
         self.log.info('bye...')
index ebf39a787c6be6905a7bd2f1fdca023ed21a6a26..d528b96bb25aa4dff2260e3475cf380ce050ac1a 100644 (file)
@@ -20,6 +20,7 @@
 from difflib import get_close_matches
 from functools import wraps
 from logging import getLogger
+from select import select
 
 # external module
 from musicpd import MPDClient, MPDError as PlayerError
@@ -106,6 +107,7 @@ class MPD(MPDClient):
 
     def __init__(self, config):
         super().__init__()
+        self.socket_timeout = 10
         self.use_mbid = True
         self.log = getLogger('sima')
         self.config = config
@@ -229,12 +231,22 @@ class MPD(MPDClient):
             * skipped   current track skipped
         """
         curr = self.current
-        ret = self.idle('database', 'playlist', 'player', 'options')
-        if self._skipped_track(curr):
-            ret.append('skipped')
-        if 'database' in ret:
-            self._reset_cache()
-        return ret
+        select_timeout = 5
+        while True:
+            self.send_idle('database', 'playlist', 'player', 'options')
+            _read, _, _ = select([self], [], [], select_timeout)
+            if _read:  # tries to read response
+                ret = self.fetch_idle()
+                if self._skipped_track(curr):
+                    ret.append('skipped')
+                if 'database' in ret:
+                    self._reset_cache()
+                return ret
+            else:
+                try:  # noidle cmd does not go through __getattr__, need to catch OSError then
+                    self.noidle()
+                except OSError as err:
+                    raise PlayerError(err)
 
     def clean(self):
         """Clean blocking event (idle) and pending commands