diff --git a/mpc.py b/mpc.py index 71ac52c..db1ebaa 100644 --- a/mpc.py +++ b/mpc.py @@ -6,12 +6,12 @@ import logging logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s', datefmt='%H:%M:%S') -from subprocess import check_output +import signal import gevent from gevent.queue import Queue from gevent.wsgi import WSGIServer - +from mpd import MPDClient from eventutils import ParentedLet, CeleryTask, Timer from task import create as create_continous @@ -19,12 +19,20 @@ import rpc class MpcWatcher(ParentedLet): - def __init__(self, queue): + def __init__(self, queue, client=None): ParentedLet.__init__(self, queue) + if client is None: + self.client = MPDClient() + # TODO: use config values + self.client.connect("localhost", 6600) + else: + self.client = client # assume it is already connected def do_business(self): while True: - status = check_output(['mpc', 'idle']).decode('utf-8').strip() + # status = check_output(['mpc', 'idle']).decode('utf-8').strip() + status = self.client.idle()[0] + logging.info(status) yield ('mpc', status) @@ -35,17 +43,18 @@ class Player(gevent.Greenlet): self.q = Queue() def check_playlist(self): - out = check_output(['mpc', 'playlist']).decode('utf-8').strip() - songs = out.split('\n') + mpd_client = MPDClient() + # TODO: use config values + mpd_client.connect("localhost", 6600) + songs = mpd_client.playlist() if(len(songs) >= self.min_playlist_length): - return logging.info('need to add new songs') CeleryTask(create_continous, self.q).start() CeleryTask(create_continous, self.q).start() def _run(self): - MpcWatcher(self.q).start() + MpcWatcher(self.q, client=None).start() Timer(6000, self.q).start() http_server = WSGIServer(('', 5000), rpc.create_app(self.q)) http_server.start() @@ -65,7 +74,19 @@ class Player(gevent.Greenlet): logging.info(str(value)) +def on_player_crash(*args, **kwargs): + print('A crash occurred in "main" greenlet. Aborting...') + import sys + sys.exit(1) + + if __name__ == '__main__': p = Player() p.start() + p.link_exception(on_player_crash) + + def sig(*args): + print('invoked sig', args) + p.q.put('signal', *args) + gevent.signal(signal.SIGHUP, sig, signal.SIGHUP) gevent.wait() diff --git a/requirements.txt b/requirements.txt index 6009fb5..194273c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,7 @@ +Flask==0.10.1 +Jinja2==2.7.3 +MarkupSafe==0.23 +Werkzeug==0.9.6 amqp==1.4.6 anyjson==0.3.3 billiard==3.3.0.18 @@ -5,10 +9,12 @@ celery==3.1.16 eventlet==0.15.2 gevent==1.0.1 greenlet==0.4.5 +itsdangerous==0.24 kombu==3.0.23 py==1.4.26 pyinotify==0.9.4 pytest==2.6.4 +python-mpd2==0.5.3 pytz==2014.7 redis==2.10.3 wsgiref==0.1.2 diff --git a/rpc.py b/rpc.py index 1e4f670..99cd867 100644 --- a/rpc.py +++ b/rpc.py @@ -5,6 +5,7 @@ rpc = Blueprint('rpc', __name__, url_prefix='/api') def send_to_parent(kind, *args): + '''similar to the behaviour of a ParentedLet''' if not hasattr(current_app, 'queue'): logging.debug('no parent queue; aborting send') return