soundboard/soundboard.py
2017-10-23 21:22:14 +02:00

75 lines
2.4 KiB
Python

import os
import shutil
import subprocess
import tempfile
import requests
from flask import Flask, render_template, request, redirect, url_for, send_from_directory
import config
app = Flask(__name__)
app.jinja_env.trim_blocks = True
app.jinja_env.lstrip_blocks = True
processlist = []
@app.route("/")
@app.route("/play/<sound>")
@app.route("/say/", methods=["POST"])
@app.route("/say/<text>")
def index(sound=None, text=None, video=None):
sounds = [os.fsencode(file).decode() for file in os.listdir(config.path)]
sounds = sorted(sounds)
if sound is not None and sound in sounds:
subprocess.Popen(["omxplayer", os.path.join(config.path, sound).encode("utf-8")], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
if text is None:
text = request.form.get("text")
if text is not None:
voice = request.form.get("voice", default="")
voice = voice if voice.strip() != "" else "DE"
speed = request.form.get("speed", default="")
speed = speed if speed.strip() != "" else "160"
pitch = request.form.get("pitch", default="")
pitch = pitch if pitch.strip() != "" else "50"
subprocess.Popen(["espeak", "-v", voice, "-s", speed, "-p", pitch, text.encode("utf-8")], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
return redirect("/")
video = request.args.get("video")
if video is not None:
url = subprocess.check_output(["youtube-dl", "-g", "-f", "mp4", video]).decode()
subprocess.Popen(["omxplayer", url.split("\n")[1]])
subprocess.Popen(["omxplayer", "-b", url.split("\n")[0]])
killvideo = request.args.get("killvideo")
if killvideo is not None and killvideo in ["1", "true", "yes"]:
subprocess.Popen(["pkill", "-f", "omxplayer"])
return render_template("index.html", sounds=sounds)
@app.route("/sounds/<path:name>")
def sounds(name):
return send_from_directory(config.path, name)
@app.route("/image/")
def image(imageurl=None):
if not imageurl:
return False
with tempfile.NamedTemporaryFile(mode="wb", buffering=True) as tmp:
image = requests.get(imageurl, stream=True)
if not image.ok:
return False
shutil.copyfileobj(image.raw, tmp)
subprocess.Popen(["killall", "pngview"])
subprocess.Popen(["/opt/raspidmx/pngview/pngview", "-b", "0", "-d", "0", "-n", tmp.name])
@app.route("/kill/images")
def killImages():
subprocess.Popen(["killall", "pngview"])