From 5adf0b495521a6f15f208474a026c088476e5018 Mon Sep 17 00:00:00 2001 From: kaliko Date: Fri, 20 Jun 2014 19:41:41 +0200 Subject: [PATCH] Plugins init call happen before player is connected --- sima/client.py | 6 +++--- sima/core.py | 16 ++++++++++------ sima/launch.py | 1 + sima/lib/plugin.py | 7 +++++++ sima/plugins/core/uniq.py | 19 ++++++++++--------- 5 files changed, 31 insertions(+), 18 deletions(-) diff --git a/sima/client.py b/sima/client.py index 8481f5c..9eae523 100644 --- a/sima/client.py +++ b/sima/client.py @@ -96,7 +96,7 @@ class PlayerClient(Player): TODO: handle exception in command not going through _client_wrapper() (ie. remove…) """ - database = None # sima database (history, blaclist) + database = None # sima database (history, blacklist) def __init__(self, host="localhost", port="6600", password=None): super().__init__() @@ -308,7 +308,7 @@ class PlayerClient(Player): self.log.warning('pending commands: {}'.format(self._client._pending)) def remove(self, position=0): - self._client.delete(position) + self.delete(position) def add(self, track): """Overriding MPD's add method to accept add signature with a Track @@ -321,7 +321,7 @@ class PlayerClient(Player): @property def state(self): - return str(self._client.status().get('state')) + return str(self.status().get('state')) @property def current(self): diff --git a/sima/core.py b/sima/core.py index 7a17c5f..3532c88 100644 --- a/sima/core.py +++ b/sima/core.py @@ -45,11 +45,6 @@ class Sima(Daemon): self.log = getLogger('sima') 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)) self.short_history = deque(maxlen=60) def __get_player(self): @@ -113,13 +108,15 @@ class Sima(Daemon): time.sleep(tmp) try: self.player.connect() - except PlayerError: + except PlayerError as err: + self.log.debug(err) continue except PlayerUnHandledError as err: #TODO: unhandled Player exceptions self.log.warning('Unhandled player exception: %s' % err) self.log.info('Got reconnected') break + self.foreach_plugin('start') def hup_handler(self, signum, frame): self.log.warning('Caught a sighup!') @@ -145,6 +142,13 @@ class Sima(Daemon): def run(self): """ """ + 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)) + self.reconnect_player() + self.foreach_plugin('start') while 42: try: self.loop() diff --git a/sima/launch.py b/sima/launch.py index b03a41d..03baa4f 100644 --- a/sima/launch.py +++ b/sima/launch.py @@ -113,6 +113,7 @@ def start(sopt, restart=False): # Loading contrib plugins load_plugins(sima, 'contrib') + # Run as a daemon if config.getboolean('daemon', 'daemon'): if restart: diff --git a/sima/lib/plugin.py b/sima/lib/plugin.py index 755aadf..3424ce3 100644 --- a/sima/lib/plugin.py +++ b/sima/lib/plugin.py @@ -64,6 +64,13 @@ class Plugin: # self.log.debug('Got config for {0}: {1}'.format(self, # self.plugin_conf)) + def start(self): + """ + Called when the daemon().run() is called. + ie. right after the player has connected successfully. + """ + pass + def callback_player(self): """ Called on player changes, stopped, paused, skipped diff --git a/sima/plugins/core/uniq.py b/sima/plugins/core/uniq.py index 969af6c..b61afa6 100644 --- a/sima/plugins/core/uniq.py +++ b/sima/plugins/core/uniq.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2013, 2014 Jack Kaliko +# Copyright (c) 2014 Jack Kaliko # # This file is part of sima # @@ -18,7 +18,9 @@ # # """ - Deal with MPD options ‑ idle and repeat mode + Publish presence on the MPD host message bus + + Notifies when concurrent instance run on the same host. """ # standard library import @@ -38,21 +40,20 @@ class Uniq(Plugin): 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: + + def start(self): + if not self.is_capable(): + self.log.warning('MPD does not provide client to client') 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') + return True def get_channels(self): return [chan for chan in self.player.channels() if @@ -70,7 +71,7 @@ class Uniq(Plugin): self.player.subscribe(self.chan) def callback_need_track(self): - if self.capable: + if self.is_capable(): self.is_uniq() -- 2.39.2