diff --git a/larigira/event.py b/larigira/event.py index ce1ea5b..8ef46ff 100644 --- a/larigira/event.py +++ b/larigira/event.py @@ -171,7 +171,7 @@ class Monitor(ParentedLet): while True: value = self.q.get() kind = value['kind'] - if kind == 'timer': + if kind in ('forcetick', 'timer'): gevent.spawn(self.on_tick) else: self.log.warning("Unknown message: %s" % str(value)) diff --git a/larigira/larigira.py b/larigira/larigira.py index 58ce116..5cad9ea 100644 --- a/larigira/larigira.py +++ b/larigira/larigira.py @@ -16,7 +16,6 @@ import gevent from gevent.wsgi import WSGIServer from .mpc import Controller, get_mpd_client -from .event import Monitor from .config import get_conf from .rpc import create_app @@ -31,18 +30,12 @@ class Larigira(object): self.log = logging.getLogger('larigira') self.conf = get_conf() self.controller = Controller(self.conf) - if 'DB_URI' in self.conf: - self.monitor = Monitor(self.controller.q, self.conf) - else: - self.monitor = None self.controller.link_exception(on_main_crash) self.http_server = WSGIServer(('', 5000), create_app(self.controller.q, self)) def start(self): self.controller.start() - if self.monitor is not None: - self.monitor.start() self.http_server.start() @@ -71,7 +64,8 @@ def main(): def sig(*args): print('invoked sig', args) larigira.controller.q.put(dict(kind='signal', args=args)) - gevent.signal(signal.SIGHUP, sig, signal.SIGHUP) + for signum in (signal.SIGHUP, signal.SIGALRM): + gevent.signal(signum, sig, signum) gevent.wait() if __name__ == '__main__': diff --git a/larigira/mpc.py b/larigira/mpc.py index b800185..4ffecef 100644 --- a/larigira/mpc.py +++ b/larigira/mpc.py @@ -1,10 +1,12 @@ from __future__ import print_function import logging +import signal import gevent from gevent.queue import Queue from mpd import MPDClient, ConnectionError, CommandError +from .event import Monitor from .eventutils import ParentedLet, Timer from .audiogen import audiogenerate @@ -96,8 +98,15 @@ class Controller(gevent.Greenlet): self.conf = conf self.q = Queue() self.player = Player(self.conf) + if 'DB_URI' in self.conf: + self.monitor = Monitor(self.q, self.conf) + self.monitor.parent_greenlet = self + else: + self.monitor = None def _run(self): + if self.monitor is not None: + self.monitor.start() mw = MpcWatcher(self.q, self.conf, client=None) mw.parent_greenlet = self mw.start() @@ -112,7 +121,8 @@ class Controller(gevent.Greenlet): # emitter = value['emitter'] kind = value['kind'] args = value['args'] - if kind == 'timer' or (kind == 'mpc' and args[0] in ('player', 'playlist')): + if kind == 'timer' or (kind == 'mpc' and + args[0] in ('player', 'playlist')): gevent.Greenlet.spawn(self.player.check_playlist) elif kind == 'mpc': pass @@ -122,6 +132,11 @@ class Controller(gevent.Greenlet): except AssertionError: raise except Exception: - self.log.exception("Error while adding to queue; bad audiogen output?") + self.log.exception("Error while adding to queue; " + "bad audiogen output?") + elif kind == 'signal' and args[0] == signal.SIGALRM: + # it's a tick! + self.monitor.q.put(dict(kind='forcetick')) + gevent.Greenlet.spawn(self.player.check_playlist) else: self.log.warning("Unknown message: %s" % str(value))