Rendering code refactor
This commit is contained in:
@@ -5,3 +5,5 @@ from .sessio import *
|
||||
from .sessions import *
|
||||
from .tema import *
|
||||
from .temes import *
|
||||
|
||||
__all__ = ["router"]
|
||||
|
||||
@@ -1,9 +1,15 @@
|
||||
from typing import Annotated
|
||||
|
||||
from fastapi import Form, Request
|
||||
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
|
||||
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
|
||||
|
||||
@@ -197,3 +203,27 @@ def set_tema_new(
|
||||
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()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import datetime
|
||||
from typing import Annotated, Optional
|
||||
from typing import Annotated
|
||||
|
||||
from fastapi import Form, Request
|
||||
from folkugat_web.api import router
|
||||
|
||||
@@ -48,6 +48,12 @@ def contingut(request: Request, logged_in: auth.LoggedIn, tema_id: int):
|
||||
|
||||
@router.delete("/api/tema/{tema_id}")
|
||||
def delete_tema(_: auth.RequireLogin, tema_id: int):
|
||||
tema = temes_q.get_tema_by_id(tema_id)
|
||||
if not tema:
|
||||
raise HTTPException(status_code=404, detail="Could not find tune")
|
||||
tema = temes_q.tema_compute_stats(tema=tema)
|
||||
if tema.stats:
|
||||
raise HTTPException(status_code=400, detail="Can't delete a tune that has been played in a set!")
|
||||
temes_w.delete_tema(tema_id=tema_id)
|
||||
files_service.clean_orphan_files()
|
||||
return HTMLResponse(headers={
|
||||
|
||||
@@ -7,11 +7,11 @@ from fastapi.responses import HTMLResponse
|
||||
from folkugat_web.api import router
|
||||
from folkugat_web.fragments import temes
|
||||
from folkugat_web.fragments.tema import scores as scores_fragments
|
||||
from folkugat_web.services import auth, files, lilypond
|
||||
from folkugat_web.services.temes import properties as properties_service
|
||||
from folkugat_web.services.temes import query as temes_q
|
||||
from folkugat_web.services import auth, files
|
||||
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.utils import FnChain
|
||||
|
||||
|
||||
@router.get("/api/tema/{tema_id}/score/{score_id}")
|
||||
@@ -36,10 +36,19 @@ async def set_score(
|
||||
if not score:
|
||||
raise HTTPException(status_code=404, detail="Could not find lyric!")
|
||||
|
||||
full_source = scores_service.build_single_tune_full_source(tema_id=tema_id, source=source)
|
||||
pdf_filename = files.create_tema_filename(tema_id=tema_id)
|
||||
pdf_filename, errors = await lilypond.render(source=full_source, fmt="pdf", output_filename=pdf_filename)
|
||||
if errors:
|
||||
tune = lilypond_build.tune_from_tema_id(tema_id=tema_id, score_source=source)
|
||||
tune_source = lilypond_source.tune_source(tune=tune)
|
||||
pdf_result, png_result = await render_tune(tune_source=tune_source, tema_id=tema_id)
|
||||
if errors := pdf_result.error:
|
||||
new_score = dataclasses.replace(
|
||||
score,
|
||||
source=source,
|
||||
title=title,
|
||||
errors=errors,
|
||||
)
|
||||
elif png_result is None:
|
||||
raise RuntimeError(f"Received empty png_result with pdf_result: {pdf_result}")
|
||||
elif errors := png_result.error:
|
||||
new_score = dataclasses.replace(
|
||||
score,
|
||||
source=source,
|
||||
@@ -47,21 +56,43 @@ async def set_score(
|
||||
errors=errors,
|
||||
)
|
||||
else:
|
||||
png_filename = files.create_tema_filename(tema_id=tema_id)
|
||||
png_filename, errors = await lilypond.render(source=full_source, fmt="png", output_filename=png_filename)
|
||||
pdf_file = pdf_result.result
|
||||
png_file = png_result.result
|
||||
new_score = dataclasses.replace(
|
||||
score,
|
||||
source=source,
|
||||
title=title,
|
||||
pdf_url=files.get_db_file_path(pdf_filename) if pdf_filename else None,
|
||||
img_url=files.get_db_file_path(png_filename) if png_filename else None,
|
||||
errors=errors,
|
||||
pdf_url=files.get_db_file_path(pdf_file) if pdf_file else None,
|
||||
img_url=files.get_db_file_path(png_file) if png_file else None,
|
||||
errors=[],
|
||||
)
|
||||
scores_service.update_score(score=new_score)
|
||||
files.clean_orphan_files()
|
||||
return scores_fragments.score(request=request, logged_in=logged_in, score=new_score)
|
||||
|
||||
|
||||
async def render_tune(
|
||||
tune_source: str,
|
||||
tema_id: int,
|
||||
) -> tuple[lilypond_render.RenderResult, lilypond_render.RenderResult | None]:
|
||||
async with files.tmp_file(content=tune_source) as source_file:
|
||||
pdf_file = files.create_tema_filename(tema_id=tema_id)
|
||||
pdf_result = await lilypond_render.render_file(
|
||||
input_file=source_file,
|
||||
output=lilypond_render.RenderOutput.PDF,
|
||||
output_file=pdf_file,
|
||||
)
|
||||
if pdf_result.error:
|
||||
return pdf_result, None
|
||||
png_file = files.create_tema_filename(tema_id=tema_id)
|
||||
png_result = await lilypond_render.render_file(
|
||||
input_file=source_file,
|
||||
output=lilypond_render.RenderOutput.PNG_CROPPED,
|
||||
output_file=png_file,
|
||||
)
|
||||
return pdf_result, png_result
|
||||
|
||||
|
||||
@router.post("/api/tema/{tema_id}/score")
|
||||
def add_score(
|
||||
request: Request,
|
||||
@@ -108,13 +139,17 @@ async def render(
|
||||
score_id: int,
|
||||
source: Annotated[str, Form()],
|
||||
):
|
||||
full_source = scores_service.build_single_tune_full_source(tema_id=tema_id, source=source)
|
||||
output_filename, errors = await lilypond.render(source=full_source, fmt="png")
|
||||
if output_filename:
|
||||
tune = lilypond_build.tune_from_tema_id(tema_id=tema_id, score_source=source)
|
||||
full_source = lilypond_source.tune_source(tune=tune)
|
||||
png_result = await lilypond_render.render(
|
||||
source=full_source,
|
||||
output=lilypond_render.RenderOutput.PNG_CROPPED,
|
||||
)
|
||||
if output_filename := png_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)
|
||||
else:
|
||||
return temes.score_render(request=request, score_id=score_id, errors=errors)
|
||||
return temes.score_render(request=request, score_id=score_id, errors=png_result.error)
|
||||
|
||||
|
||||
@router.put("/api/tema/{tema_id}/score/{score_id}/show")
|
||||
|
||||
Reference in New Issue
Block a user