89 lines
2.1 KiB
Python
89 lines
2.1 KiB
Python
import time
|
|
import logging
|
|
|
|
import eventlet
|
|
import flask
|
|
from flask import g, jsonify, request
|
|
from flask_cors import CORS
|
|
from flask_socketio import SocketIO
|
|
|
|
import snowmix
|
|
|
|
logging.basicConfig(level=logging.INFO)
|
|
|
|
eventlet.monkey_patch()
|
|
|
|
app = flask.Flask('snowmix-apiserver')
|
|
cors = CORS(app)
|
|
socketio = SocketIO(app)
|
|
|
|
app.snowmix = snowmix.SnowmixClient('snowmix')
|
|
app.snowmix.sem = eventlet.Semaphore()
|
|
|
|
state = {}
|
|
|
|
def start_updater(name, func, interval=1.0):
|
|
def updater():
|
|
global state
|
|
|
|
while True:
|
|
try:
|
|
data = func()
|
|
|
|
if state.get(name) != data:
|
|
state[name] = data
|
|
socketio.emit(name, data, broadcast=True)
|
|
except:
|
|
logging.exception('Oops?')
|
|
|
|
time.sleep(interval)
|
|
|
|
socketio.start_background_task(updater)
|
|
|
|
start_updater('scenes', (lambda: [app.snowmix.scene_info(s) for s in app.snowmix.scene_list()]), 0.3)
|
|
start_updater('feeds', (lambda: app.snowmix.feed_list()), 3.0)
|
|
start_updater('images', (lambda: app.snowmix.image_list()), 5.0)
|
|
|
|
@app.route('/api/1/scenes/')
|
|
def scenes():
|
|
return jsonify([
|
|
app.snowmix.scene_info(s)
|
|
for s in app.snowmix.scene_list()
|
|
])
|
|
|
|
@app.route('/api/1/scenes/<int:scene_id>')
|
|
def scene_info(scene_id):
|
|
return jsonify(app.snowmix.scene_info(scene_id))
|
|
|
|
@app.route('/api/1/scenes/<int:scene_id>', methods=['PATCH'])
|
|
def scene_patch(scene_id):
|
|
req = request.json
|
|
|
|
if 'alpha' in req:
|
|
app.snowmix.scene_alpha(scene_id, req['alpha'], -1)
|
|
if 'text_alpha' in req:
|
|
app.snowmix.scene_alpha(scene_id, req['text_alpha'], -2)
|
|
if 'background_alpha' in req:
|
|
app.snowmix.scene_alpha(scene_id, req['text_alpha'], -3)
|
|
return 'OK'
|
|
|
|
@app.route('/api/1/feeds/')
|
|
def feeds():
|
|
return jsonify(app.snowmix.feed_list())
|
|
|
|
@app.route('/api/1/images/')
|
|
def images():
|
|
return jsonify(app.snowmix.image_list())
|
|
|
|
@socketio.on('connect')
|
|
def on_connect():
|
|
for k, v in state.items():
|
|
socketio.emit(k, v)
|
|
|
|
@socketio.on('command')
|
|
def command(cmd):
|
|
pass
|
|
|
|
if __name__ == "__main__":
|
|
socketio.run(app, host='0.0.0.0')
|