X-Git-Url: https://git.kaliko.me/?a=blobdiff_plain;f=sima%2Fcore.py;h=83c5e910a54adae79fc860b199a6c9913792bbdd;hb=774e755d4a4fb985548cd3d17703c1f700687ff3;hp=695a18ca3ca621293164cefef6c1fe088a5af7d7;hpb=b28f13f997df47e9e0618a2251ac69000aa483cc;p=mpd-sima.git diff --git a/sima/core.py b/sima/core.py index 695a18c..83c5e91 100644 --- a/sima/core.py +++ b/sima/core.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2009-2015, 2020 kaliko +# Copyright (c) 2009-2015, 2020, 2021 kaliko # # This file is part of sima # @@ -26,7 +26,7 @@ from collections import deque from logging import getLogger from .mpdclient import MPD as PlayerClient -from .mpdclient import PlayerError, MPDError +from .mpdclient import PlayerError from .lib.simadb import SimaDB from .lib.daemon import Daemon from .utils.utils import SigHup @@ -37,7 +37,7 @@ class Sima(Daemon): """ def __init__(self, conf): - ## Set daemon + # Set daemon Daemon.__init__(self, conf.get('daemon', 'pidfile')) self.enabled = True self.config = conf @@ -48,6 +48,7 @@ class Sima(Daemon): self._core_plugins = list() self.player = PlayerClient(conf) # MPD client self.short_history = deque(maxlen=60) + self.changed = None def add_history(self): """Handle local, in memory, short history""" @@ -80,7 +81,8 @@ class Sima(Daemon): @property def plugins(self): - return [plugin[1] for plugin in sorted(self._plugins, key=lambda pl: pl[0], reverse=True)] + return [plugin[1] for plugin in + sorted(self._plugins, key=lambda pl: pl[0], reverse=True)] def need_tracks(self): """Is the player in need for tracks""" @@ -115,6 +117,8 @@ class Sima(Daemon): cycle : 5s 10s 1m 5m 20m 1h """ sleepfor = [5, 10, 60, 300, 1200, 3600] + # reset change + self.changed = None while True: tmp = sleepfor.pop(0) sleepfor.append(tmp) @@ -125,9 +129,6 @@ class Sima(Daemon): except PlayerError as err: self.log.debug(err) continue - except MPDError as err: - #TODO: unhandled Player exceptions - self.log.warning('Unhandled player exception: %s', err) self.log.info('Got reconnected') break self.foreach_plugin('start') @@ -145,10 +146,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...') @@ -160,26 +163,25 @@ class Sima(Daemon): self.log.info('Connecting MPD: %(host)s:%(port)s', self.config['MPD']) self.player.connect() self.foreach_plugin('start') - except (PlayerError, MPDError) as err: + except PlayerError as err: self.log.warning('Player: %s', err) self.reconnect_player() while 42: try: self.loop() - except (PlayerError, MPDError) as err: + except PlayerError as err: self.log.warning('Player error: %s', err) self.reconnect_player() - del self.changed def loop(self): """Dispatching callbacks to plugins """ # hanging here until a monitored event is raised in the player - if getattr(self, 'changed', False): # first iteration exception - self.changed = self.player.monitor() - else: # first iteration goes through else + if self.changed is None: # first iteration goes through else self.changed = ['playlist', 'player', 'skipped'] - self.log.debug('changed: %s', ', '.join(self.changed)) + else: # Wait for a change + self.changed = self.player.monitor() + self.log.debug('changed: %s', ', '.join(self.changed)) if 'playlist' in self.changed: self.foreach_plugin('callback_playlist') if 'player' in self.changed or 'options' in self.changed: