Flesh out API

This commit is contained in:
Evan Walsh 2019-12-25 14:09:26 -05:00
parent 5eed388677
commit 4797322ed4
2 changed files with 61 additions and 12 deletions

View File

@ -1,4 +1,4 @@
from flask import Flask, render_template, request, jsonify, url_for from flask import Flask, render_template, request, jsonify
from .controller import Controller from .controller import Controller
@ -14,8 +14,9 @@ controller = Controller()
@app.route("/api/connect") @app.route("/api/connect")
def connect(): def connect():
host: str = request.args.get("host", "0.0.0.0") host: str = request.args.get("host", "0.0.0.0")
port: int = int(request.args.get("port", 5800)) port: int = int(request.args.get("port", 9800))
controller.connect(host, port)
return controller.connect(host, port)
@app.route("/api/soundfonts") @app.route("/api/soundfonts")
@ -29,7 +30,29 @@ def instruments():
return jsonify(controller.get_instruments(font)) return jsonify(controller.get_instruments(font))
@app.route("/", defaults={"path": ""}) @app.route("/api/select")
def select():
channel: int = int(request.args.get("channel", 0))
instrument: int = int(request.args.get("instrument", 0))
bank: int = int(request.args.get("bank", 0))
program: int = int(request.args.get("program", 0))
return jsonify(controller.select(channel, instrument, bank, program))
@app.route("/api/gain")
def gain():
amount: int = int(request.args.get("gain", 3))
return jsonify(controller.set_gain(amount))
@app.route("/")
@app.route("/<path:path>") @app.route("/<path:path>")
def index(path: str): def index(path: str = ""):
print(f"PATH: {path}")
return render_template("index.html")
@app.errorhandler(404)
def not_found(*args, **kwargs):
return render_template("index.html") return render_template("index.html")

View File

@ -1,24 +1,50 @@
import re
from telnetlib import Telnet from telnetlib import Telnet
class Controller(object): class Controller(object):
timeout = 30 TIMEOUT = 30
SUCCESS_RESPONSE = {"success": True}
FONT_MATCHER = re.compile("(?P<id>[0-9]+)\\s(?P<name>.*)", re.MULTILINE)
INSTRUMENT_MATCHER = re.compile(
"(?P<bank>[0-9]+)-(?P<program>[0-9]+)\\s(?P<name>.*)", re.MULTILINE
)
def connect(self, host: str = "0.0.0.0", port: int = 5800): def connect(self, host: str = "0.0.0.0", port: int = 5800):
self.connection = Telnet(host=host, port=port, timeout=Controller.timeout) self.connection = Telnet(host=host, port=port, timeout=Controller.TIMEOUT)
return Controller.SUCCESS_RESPONSE
def execute(self, command: str): def execute(self, command: str):
self.connection.write(command.encode("ascii") + b"\r\n") self.connection.write(command.encode("ascii") + b"\r\n")
output = self.connection.read_until(b"END OF IT", timeout=2) output = self.connection.read_until(match=b"OK", timeout=1)
return output.decode("ascii") return output.decode("ascii")
def get_soundfonts(self): def get_soundfonts(self):
self.execute("fonts") output = self.execute("fonts")
fonts = Controller.FONT_MATCHER.findall(output)
return {} print(fonts)
return [{"id": int(f[0]), "name": f[1]} for f in fonts]
def get_instruments(self, font: int): def get_instruments(self, font: int):
self.execute(f"inst {font}") output = self.execute(f"inst {font}")
instruments = Controller.INSTRUMENT_MATCHER.findall(output)
return {} print(instruments)
return [
{"bank": int(i[0]), "program": int(i[1]), "name": i[2]} for i in instruments
]
def select(self, channel: int, instrument: int, bank: int, program: int):
self.execute(f"select {channel} {instrument} {bank} {program}")
return Controller.SUCCESS_RESPONSE
def set_gain(self, amount: int):
self.execute(f"gain {amount}")
return Controller.SUCCESS_RESPONSE