"""Flask server for the voicegardens back-end.""" import os.path from pathlib import Path from flask import Flask, render_template, request, send_from_directory, jsonify from flask_cors import CORS from werkzeug.utils import secure_filename ALLOWED_UPLOAD_EXTENSIONS = {"wav"} UPLOAD_DIRECTORY = Path(__file__).parent / "archive" MAXIMUM_FILE_SIZE = 16 * 1024 * 1024 # 16 MB app = Flask(__name__) app.config["UPLOAD_FOLDER"] = UPLOAD_DIRECTORY app.config["MAX_CONTENT_LENGTH"] = MAXIMUM_FILE_SIZE CORS(app) @app.route("/") def root(): """Serve the main homepage.""" return render_template("index.html") def allowed_file(filename): """Validate uploaded file extensions.""" extension = filename.rsplit(".", 1)[1].lower() return "." in filename and extension in ALLOWED_UPLOAD_EXTENSIONS @app.route("/add-to-archive", methods=["POST"]) def add_to_archive(): """Archive recordings sent from the front-end.""" try: file = request.files["file"] except KeyError: return ("Missing file for upload", 400) if not allowed_file(file.filename): return ("File extension not allowed", 400) secured = secure_filename(file.filename) file.save(os.path.join(app.config["UPLOAD_FOLDER"], secured)) return ("file archived successfully", 201) @app.route("/archives/") def uploaded_file(filename): """Retrieve an uploaded recording.""" return send_from_directory(app.config["UPLOAD_FOLDER"], filename) @app.route("/archive") def archive(): """Serve the archive listing.""" listing = os.listdir(UPLOAD_DIRECTORY) filenames = filter(lambda f: f.endswith(".wav"), listing) return jsonify([ "{}archives/{}".format(request.url_root, filename) for filename in filenames ]) @app.route("/about") def about(): return render_template('about.html')