Browse Source

REST API to set CONTINOUS_AUDIOSPEC runtime

fix #22
boyska 7 năm trước cách đây
mục cha
commit
fb00a714a5
2 tập tin đã thay đổi với 38 bổ sung3 xóa
  1. 11 1
      larigira/mpc.py
  2. 27 2
      larigira/rpc.py

+ 11 - 1
larigira/mpc.py

@@ -50,12 +50,22 @@ class Player:
         self.conf = conf
         self.log = logging.getLogger(self.__class__.__name__)
         self.min_playlist_length = 10
+        self._continous_audiospec = self.conf['CONTINOUS_AUDIOSPEC']
 
     def _get_mpd(self):
         mpd_client = MPDClient(use_unicode=True)
         mpd_client.connect(self.conf['MPD_HOST'], self.conf['MPD_PORT'])
         return mpd_client
 
+    @property
+    def continous_audiospec(self):
+        return self._continous_audiospec
+
+    @continous_audiospec.setter
+    def continous_audiospec(self, spec):
+        self._continous_audiospec = self.conf['CONTINOUS_AUDIOSPEC'] \
+                if spec is None else spec
+
     def check_playlist(self):
         mpd_client = self._get_mpd()
         songs = mpd_client.playlist()
@@ -65,7 +75,7 @@ class Player:
             return
         self.log.info('need to add new songs')
         picker = gevent.Greenlet(audiogenerate,
-                                 self.conf['CONTINOUS_AUDIOSPEC'])
+                                 self.continous_audiospec)
 
         def add(greenlet):
             uris = greenlet.value

+ 27 - 2
larigira/rpc.py

@@ -1,10 +1,10 @@
-from __future__ import print_function
 import logging
 import gc
 from copy import deepcopy
 
 from greenlet import greenlet
-from flask import current_app, Blueprint, Flask, jsonify, render_template
+from flask import current_app, Blueprint, Flask, jsonify, render_template, \
+        request, abort
 from flask_bootstrap import Bootstrap
 
 from .dbadmin import db
@@ -42,6 +42,31 @@ def rpc_refresh():
     return jsonify(dict(status='ok'))
 
 
+@rpc.route('/audiospec', methods=['GET'])
+def get_audiospec():
+    return jsonify(current_app.larigira.controller.player.continous_audiospec)
+
+
+@rpc.route('/audiospec', methods=['PUT'])
+def change_audiospec():
+    player = current_app.larigira.controller.player
+    if request.json is None:
+        abort(400, "Must send application/json data")
+    if 'spec' not in request.json or type(request.json['spec']) is not dict:
+        abort(400, "Object must have a key 'spec' whose value is an object")
+    player.continous_audiospec = request.json['spec']
+    if 'kind' not in request.json['spec']:
+        abort(400, "invalid audiospec")
+    return jsonify(player.continous_audiospec)
+
+
+@rpc.route('/audiospec', methods=['DELETE'])
+def reset_audiospec():
+    player = current_app.larigira.controller.player
+    player.continous_audiospec = None
+    return jsonify(player.continous_audiospec)
+
+
 def get_scheduled_audiogen():
     larigira = current_app.larigira
     running = larigira.controller.monitor.running