Verified Commit 8afeb618 authored by Jakob Moser's avatar Jakob Moser
Browse files

Add very basic Flask implementation

parent ee8215e7
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
import json
import logging

from karaokatalog.get_parser import get_parser
from karaokatalog.Library import Library
from karaokatalog.ui.serve.get_flask_app import get_flask_app

logging.basicConfig(
    format="%(asctime)s [%(levelname)s] %(message)s", level=logging.INFO
)


if __name__ == "__main__":
    args = get_parser(
        "ui.serve", "Serve a web UI to browse the Karaokatalog"
    ).parse_args()

    songs_json_path = args.library_path / "songs.json"

    if songs_json_path.exists():
        logging.info(f"Loading {songs_json_path}")
        with songs_json_path.open("r", encoding="utf-8") as f:
            songs = json.load(f)
    else:
        logging.info("Loading library")
        library = Library.from_dir(args.library_path)
        logging.info("Library loaded")
        songs = [song.as_dict() for song in library.songs]

    logging.info("Starting UI")
    app = get_flask_app(songs)
    app.run(port=5657)
+16 −0
Original line number Diff line number Diff line
from collections.abc import Sequence

from flask import Flask


def get_flask_app(songs: Sequence[dict[str, str]]) -> Flask:
    app = Flask("karaokatalog.ui", static_url_path="/")

    # This is only to make the type checker happy.
    songs_list = list(songs)

    @app.get("/api/songs")
    def get_songs() -> list[dict[str, str]]:
        return songs_list

    return app