Added tune previews

This commit is contained in:
marc
2025-04-27 17:00:04 +02:00
parent 695e0b54bf
commit bc3d98aba2
14 changed files with 123 additions and 131 deletions

View File

@@ -35,64 +35,12 @@ async def set_score(
score = scores_service.get_score_by_id(score_id=score_id, tema_id=tema_id)
if not score:
raise HTTPException(status_code=404, detail="Could not find lyric!")
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,
title=title,
errors=errors,
)
else:
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_file) if pdf_file else None,
img_url=files.get_db_file_path(png_file) if png_file else None,
errors=[],
)
new_score = await scores_service.render_score(score=score, title=title, source=source)
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,