streaming-docker/api/apiserver.py

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')