60 lines
2.2 KiB
Python
60 lines
2.2 KiB
Python
from __future__ import annotations
|
|
|
|
from fastapi import APIRouter, HTTPException
|
|
|
|
from ..db import db_session
|
|
from ..models import Lyrics, Project
|
|
|
|
router = APIRouter(prefix="/projects/{project_id}/lyrics", tags=["lyrics"])
|
|
|
|
|
|
@router.get("")
|
|
def get_lyrics(project_id: str) -> dict:
|
|
with db_session() as session:
|
|
project = session.query(Project).filter_by(id=project_id).one_or_none()
|
|
if project is None:
|
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Project not found")
|
|
|
|
lyrics = session.query(Lyrics).filter_by(project_id=project_id).one_or_none()
|
|
if lyrics is None:
|
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Lyrics not found")
|
|
|
|
return {
|
|
"project_id": lyrics.project_id,
|
|
"source": lyrics.source,
|
|
"raw_text": lyrics.raw_text,
|
|
"timed_lines": lyrics.timed_lines or [],
|
|
"timed_words": lyrics.timed_words or [],
|
|
"created_at": lyrics.created_at,
|
|
"updated_at": lyrics.updated_at,
|
|
}
|
|
|
|
|
|
@router.put("")
|
|
def update_lyrics(project_id: str, payload: dict) -> dict:
|
|
new_text = payload.get("raw_text")
|
|
if not isinstance(new_text, str) or not new_text.strip():
|
|
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="raw_text must be provided")
|
|
|
|
with db_session() as session:
|
|
project = session.query(Project).filter_by(id=project_id).one_or_none()
|
|
if project is None:
|
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Project not found")
|
|
|
|
lyrics = session.query(Lyrics).filter_by(project_id=project_id).one_or_none()
|
|
if lyrics is None:
|
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Lyrics not found")
|
|
|
|
lyrics.raw_text = new_text.strip()
|
|
session.commit()
|
|
|
|
return {
|
|
"project_id": lyrics.project_id,
|
|
"source": lyrics.source,
|
|
"raw_text": lyrics.raw_text,
|
|
"timed_lines": lyrics.timed_lines or [],
|
|
"timed_words": lyrics.timed_words or [],
|
|
"created_at": lyrics.created_at,
|
|
"updated_at": lyrics.updated_at,
|
|
}
|