From 8afeb618d3b15bbce0aa63a0a284208dae38f651 Mon Sep 17 00:00:00 2001 From: Jakob Moser Date: Sun, 22 Jun 2025 15:15:54 +0200 Subject: [PATCH] Add very basic Flask implementation --- karaokatalog/ui/serve/__main__.py | 32 ++++++++++++++++++++++++++ karaokatalog/ui/serve/get_flask_app.py | 16 +++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 karaokatalog/ui/serve/__main__.py create mode 100644 karaokatalog/ui/serve/get_flask_app.py diff --git a/karaokatalog/ui/serve/__main__.py b/karaokatalog/ui/serve/__main__.py new file mode 100644 index 0000000..5b4f8d4 --- /dev/null +++ b/karaokatalog/ui/serve/__main__.py @@ -0,0 +1,32 @@ +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) diff --git a/karaokatalog/ui/serve/get_flask_app.py b/karaokatalog/ui/serve/get_flask_app.py new file mode 100644 index 0000000..c19569c --- /dev/null +++ b/karaokatalog/ui/serve/get_flask_app.py @@ -0,0 +1,16 @@ +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