40 lines
1.2 KiB
Python
40 lines
1.2 KiB
Python
"""
|
|
/fingering/generate - MusicXML to annotated MusicXML with finger numbers
|
|
"""
|
|
import logging
|
|
|
|
from fastapi import APIRouter, HTTPException
|
|
from fastapi.responses import JSONResponse
|
|
from pydantic import BaseModel
|
|
|
|
logger = logging.getLogger(__name__)
|
|
router = APIRouter()
|
|
|
|
MAX_MUSICXML_BYTES = 10 * 1024 * 1024 # 10 MB - large scores are ~500 KB
|
|
|
|
|
|
class FingeringRequest(BaseModel):
|
|
musicxml: str
|
|
|
|
|
|
@router.post("/generate")
|
|
async def generate_fingering(req: FingeringRequest):
|
|
"""Run pianoplayer Parncutt algorithm on MusicXML, returns annotated MusicXML."""
|
|
if len(req.musicxml.encode()) > MAX_MUSICXML_BYTES:
|
|
raise HTTPException(status_code=413, detail="MusicXML payload too large (max 10 MB)")
|
|
try:
|
|
from services.pianoplayer_svc import annotate_fingering
|
|
annotated = await annotate_fingering(req.musicxml)
|
|
return JSONResponse(
|
|
{"musicxml": annotated},
|
|
headers={"Cache-Control": "no-store"},
|
|
)
|
|
except HTTPException:
|
|
raise
|
|
except Exception:
|
|
logger.exception("generate_fingering failed")
|
|
raise HTTPException(
|
|
status_code=500,
|
|
detail="Fingering generation failed. Please try again.",
|
|
)
|