An online landscape, built as a tool to explore the many aspects of the human voice.
https://voicegardens.org
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.8 KiB
69 lines
1.8 KiB
"""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/<filename>")
|
|
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')
|
|
|