]> kaliko git repositories - mpd-sima.git/commitdiff
Use client2client to detect other instance
authorkaliko <kaliko@azylum.org>
Mon, 16 Jun 2014 15:02:41 +0000 (17:02 +0200)
committerkaliko <kaliko@azylum.org>
Mon, 16 Jun 2014 15:02:41 +0000 (17:02 +0200)
sima/core.py
sima/launch.py
sima/lib/plugin.py
sima/plugins/core/uniq.py [new file with mode: 0644]

index 634db4b1cc06c83e651e99f88a9c0c23fd949afa..cf011c7e11edad3606e4a0679d6ce362829e8d77 100644 (file)
@@ -46,6 +46,7 @@ class Sima(Daemon):
         self.plugins = list()
         self.player = self.__get_player()  # Player client
         try:
+            self.log.info('Connecting MPD: {0}:{1}'.format(*self.player._mpd))
             self.player.connect()
         except (PlayerError, PlayerUnHandledError) as err:
             self.log.warning('Player: {}'.format(err))
@@ -63,7 +64,7 @@ class Sima(Daemon):
         self.short_history.appendleft(self.player.current)
 
     def register_plugin(self, plugin_class):
-        """Registers plubin in Sima instance..."""
+        """Registers plugin in Sima instance..."""
         self.plugins.append(plugin_class(self))
 
     def foreach_plugin(self, method, *args, **kwds):
@@ -130,8 +131,8 @@ class Sima(Daemon):
         """General shutdown method
         """
         self.log.warning('Starting shutdown.')
-        self.player.disconnect()
         self.foreach_plugin('shutdown')
+        self.player.disconnect()
 
         self.log.info('The way is shut, it was made by those who are dead. '
                       'And the dead keep it…')
index 733d237e2f12b3f0714c9c2ae2214aac6b977963..b03a41d65e78d85f675378b310bbd747e58d7174 100644 (file)
@@ -41,6 +41,7 @@ from .utils.utils import exception_log, SigHup
  # core plugins
 from .plugins.core.history import History
 from .plugins.core.mpdoptions import MpdOptions
+from .plugins.core.uniq import Uniq
 ##
 
 
@@ -102,8 +103,10 @@ def start(sopt, restart=False):
     sima = core.Sima(config)
 
     # required core plugins
-    sima.register_plugin(History)
-    sima.register_plugin(MpdOptions)
+    core_plugins = [History, MpdOptions, Uniq]
+    for cplgn in core_plugins:
+        logger.debug('Register core {name} ({doc})'.format(**cplgn.info()))
+        sima.register_plugin(cplgn)
 
     #  Loading internal plugins
     load_plugins(sima, 'internal')
index 5f709422410754a5be0a3d0dcfbcd5142bd92f22..755aadf93efbfd514c39daad003bd5b71cb23f16 100644 (file)
@@ -26,8 +26,8 @@ class Plugin:
     First non-empty line of the docstring is used as description
     Rest of the docstring at your convenience.
 
-    The plugin Name MUST be the same as the module (file name), case
-    insensitive: for instance plugin.py → Plugin
+    The lowercased plugin Name MUST be the same as the module (file name),
+    for instance Plugin → plugin.py
     It eases plugins discovery and simplifies the code to handle them,
     IMHO, it's a fair trade-off.
     """
diff --git a/sima/plugins/core/uniq.py b/sima/plugins/core/uniq.py
new file mode 100644 (file)
index 0000000..969af6c
--- /dev/null
@@ -0,0 +1,78 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2013, 2014 Jack Kaliko <kaliko@azylum.org>
+#
+#  This file is part of sima
+#
+#  sima is free software: you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation, either version 3 of the License, or
+#  (at your option) any later version.
+#
+#  sima is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with sima.  If not, see <http://www.gnu.org/licenses/>.
+#
+#
+"""
+    Deal with MPD options ‑ idle and repeat mode
+"""
+
+# standard library import
+from os import  getpid
+from socket import getfqdn
+
+# third parties components
+
+# local import
+from ...lib.plugin import Plugin
+
+
+class Uniq(Plugin):
+    """
+    Publish presence on the MPD host message bus
+    """
+
+    def __init__(self, daemon):
+        Plugin.__init__(self, daemon)
+        self.capable = False
+        self.chan = 'mpd_sima:{0}.{1}'.format(getfqdn(), getpid())
+        self.channels = []
+        self.uniq = True
+        self.is_capable()
+        if not self.capable:
+            return
+        self.is_uniq()
+        self.sub_chan()
+
+    def is_capable(self):
+        if 'channels' in self.player.commands():
+            self.capable = True
+            return
+        self.log.warning('MPD does not provide client to client')
+
+    def get_channels(self):
+        return [chan for chan in self.player.channels() if
+                chan.startswith('mpd_sima') and chan != self.chan]
+
+    def is_uniq(self):
+        channels = self.get_channels()
+        if channels:
+            self.log.warning('Another instance is queueing on this MPD host')
+            self.log.warning(' '.join(channels))
+            self.uniq = False
+
+    def sub_chan(self):
+        self.log.debug('Registering as {}'.format(self.chan))
+        self.player.subscribe(self.chan)
+
+    def callback_need_track(self):
+        if self.capable:
+            self.is_uniq()
+
+
+# VIM MODLINE
+# vim: ai ts=4 sw=4 sts=4 expandtab