import os import subprocess import sqlite3 from flask import Flask, render_template, request, redirect, url_for, g import config app = Flask(__name__) app.jinja_env.trim_blocks = True app.jinja_env.lstrip_blocks = True # Credits: http://flask.pocoo.org/docs/0.12/patterns/sqlite3/ def getDB(): db = getattr(g, "_database", None) if db is None: db = g._database = sqlite3.connect(config.db) db.row_factory = sqlite3.Row return db @app.teardown_appcontext def closeDBConnection(exception): db = getattr(g, "_database", None) if db is not None: db.close() def queryDB(query, args=(), one=False): cur = getDB().execute(query, args) result = cur.fetchall() cur.close() return (result[0] if result else None) if one else result @app.route("/") @app.route("/edit") @app.route("/play/") @app.route("/say/", methods=["POST"]) @app.route("/say/") def index(sound=None, text=None, video=None): sounds = [os.fsencode(file).decode() for file in os.listdir(config.path)] sounds = sorted(sounds) tags = queryDB("SELECT name FROM tag") 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], 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"]) if request.path == "/edit": edit = True else: edit = False return render_template("index.html", sounds=sounds, tags=tags, edit=edit) @app.route("/edit/", methods=["GET", "POST"]) def edit(sound): if request.method == "POST": # TODO: Store changes return redirect("/edit") return render_template("edit.html")