from typing import Annotated from fastapi import Form, HTTPException, Request from fastapi.responses import HTMLResponse from folkugat_web.api import router from folkugat_web.fragments import live, sessio from folkugat_web.services import auth, files from folkugat_web.services import playlists as playlists_service from folkugat_web.services.lilypond import build as lilypond_build from folkugat_web.services.lilypond import render as lilypond_render from folkugat_web.services.lilypond import source as lilypond_source from folkugat_web.services.temes import scores as scores_service from folkugat_web.services.temes import write as temes_service from folkugat_web.templates import templates @router.get("/sessio/{session_id}") def page( request: Request, logged_in: auth.LoggedIn, session_id: int, ): return templates.TemplateResponse( "index.html", { "request": request, "page_title": "Folkugat", "content": f"/api/content/sessio/{session_id}", "logged_in": logged_in, } ) @router.get("/api/content/sessio/{session_id}") def contingut( request: Request, logged_in: auth.LoggedIn, session_id: int, ): return sessio.pagina(request, session_id, logged_in) @router.put("/api/sessio/{session_id}/live") def set_live( request: Request, _: auth.RequireLogin, session_id: int, ): return live.start_live_session(request=request, session_id=session_id) @router.delete("/api/sessio/{session_id}/live") def stop_live( request: Request, _: auth.RequireLogin, session_id: int, ): return live.stop_live_session(request=request, session_id=session_id) @router.post("/api/sessio/{session_id}/set") def add_set( request: Request, logged_in: auth.RequireLogin, session_id: int, ): return sessio.add_set(request=request, session_id=session_id, logged_in=logged_in) @router.get("/api/sessio/{session_id}/set/{set_id}") def get_set( request: Request, logged_in: auth.LoggedIn, session_id: int, set_id: int, ): return sessio.get_set(request=request, session_id=session_id, set_id=set_id, logged_in=logged_in) @router.delete("/api/sessio/{session_id}/set/{set_id}") def delete_set( _: auth.RequireLogin, session_id: int, set_id: int, ): return sessio.delete_set(session_id=session_id, set_id=set_id) @router.post("/api/sessio/{session_id}/set/{set_id}") def add_tema( request: Request, logged_in: auth.RequireLogin, session_id: int, set_id: int, ): return sessio.add_tema(request=request, session_id=session_id, set_id=set_id, logged_in=logged_in) @router.get("/api/sessio/{session_id}/set/{set_id}/tema/{entry_id}") def get_tema( request: Request, logged_in: auth.RequireLogin, session_id: int, set_id: int, entry_id: int, ): return sessio.get_tema( request=request, session_id=session_id, set_id=set_id, entry_id=entry_id, logged_in=logged_in) @router.get("/api/sessio/{session_id}/set/{set_id}/tema/{entry_id}/editor") def get_tema_editor( request: Request, logged_in: auth.RequireLogin, session_id: int, set_id: int, entry_id: int, ): return sessio.get_tema_editor( request=request, session_id=session_id, set_id=set_id, entry_id=entry_id, logged_in=logged_in) @router.delete("/api/sessio/{session_id}/set/{set_id}/tema/{entry_id}") def delete_tema( _: auth.RequireLogin, session_id: int, set_id: int, entry_id: int, ): return sessio.delete_tema(session_id=session_id, set_id=set_id, entry_id=entry_id) @router.get("/api/sessio/{session_id}/set/{set_id}/tema/{entry_id}/busca") def busca_tema( request: Request, _: auth.RequireLogin, session_id: int, set_id: int, entry_id: int, query: str, ): return sessio.busca_tema( request=request, session_id=session_id, set_id=set_id, entry_id=entry_id, query=query, ) @router.put("/api/sessio/{session_id}/set/{set_id}/tema/{entry_id}") def set_tema( request: Request, logged_in: auth.RequireLogin, session_id: int, set_id: int, entry_id: int, tema_id: Annotated[int, Form()], ): return sessio.set_tema( request=request, logged_in=logged_in, session_id=session_id, set_id=set_id, entry_id=entry_id, tema_id=tema_id, ) @router.put("/api/sessio/{session_id}/set/{set_id}/tema/{entry_id}/unknown") def set_tema_unknown( request: Request, logged_in: auth.RequireLogin, session_id: int, set_id: int, entry_id: int, ): return sessio.set_tema( request=request, logged_in=logged_in, session_id=session_id, set_id=set_id, entry_id=entry_id, tema_id=None, ) @router.post("/api/sessio/{session_id}/set/{set_id}/tema/{entry_id}") def set_tema_new( request: Request, logged_in: auth.RequireLogin, session_id: int, set_id: int, entry_id: int, title: Annotated[str, Form()], ): new_tema = temes_service.create_tema(title=title) return sessio.set_tema( request=request, logged_in=logged_in, session_id=session_id, set_id=set_id, entry_id=entry_id, tema_id=new_tema.id, ) @router.get("/api/sessio/{session_id}/set/{set_id}/score") async def render( request: Request, _: auth.RequireLogin, session_id: int, set_id: int, ): set_entry = playlists_service.get_set(session_id=session_id, set_id=set_id) if not set_entry: raise HTTPException(status_code=404, detail="Could not find set!") tune_set = lilypond_build.set_from_set(set_entry=set_entry) set_source = lilypond_source.set_source(tune_set=tune_set) pdf_result = await lilypond_render.render( source=set_source, output=lilypond_render.RenderOutput.PDF, ) if output_filename := pdf_result.result: score_render_url = files.get_db_file_path(output_filename) # return temes.score_render(request=request, score_id=score_id, score_render_url=score_render_url) return HTMLResponse(content=score_render_url) else: return HTMLResponse()