From 4414e379aa08c465416d5f2bdbc4e9292170f6d8 Mon Sep 17 00:00:00 2001 From: kaliko Date: Mon, 16 Jun 2014 17:02:41 +0200 Subject: [PATCH] Use client2client to detect other instance --- sima/core.py | 5 ++- sima/launch.py | 7 +++- sima/lib/plugin.py | 4 +- sima/plugins/core/uniq.py | 78 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 88 insertions(+), 6 deletions(-) create mode 100644 sima/plugins/core/uniq.py diff --git a/sima/core.py b/sima/core.py index 634db4b..cf011c7 100644 --- a/sima/core.py +++ b/sima/core.py @@ -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…') diff --git a/sima/launch.py b/sima/launch.py index 733d237..b03a41d 100644 --- a/sima/launch.py +++ b/sima/launch.py @@ -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') diff --git a/sima/lib/plugin.py b/sima/lib/plugin.py index 5f70942..755aadf 100644 --- a/sima/lib/plugin.py +++ b/sima/lib/plugin.py @@ -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 index 0000000..969af6c --- /dev/null +++ b/sima/plugins/core/uniq.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2013, 2014 Jack Kaliko +# +# 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 . +# +# +""" + 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 -- 2.39.5