music-lab: 가사 저장/수정/삭제 CRUD API 추가
- saved_lyrics 테이블 (id, title, text, prompt, created_at, updated_at) - GET /api/music/lyrics/library — 저장된 가사 목록 조회 - POST /api/music/lyrics/library — 가사 저장 - PUT /api/music/lyrics/library/:id — 가사 수정 - DELETE /api/music/lyrics/library/:id — 가사 삭제 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -10,6 +10,7 @@ from .db import (
|
||||
create_task, get_task,
|
||||
get_all_tracks, add_track, delete_track, get_track_file_path, get_track_by_task_id,
|
||||
update_track_duration,
|
||||
get_all_lyrics, add_lyrics, update_lyrics, delete_lyrics,
|
||||
)
|
||||
from .local_provider import run_local_generation
|
||||
from .suno_provider import (
|
||||
@@ -332,3 +333,47 @@ def vocal_removal(req: VocalRemovalRequest, background_tasks: BackgroundTasks):
|
||||
create_task(task_id, params, provider="suno")
|
||||
background_tasks.add_task(run_vocal_removal, task_id, params)
|
||||
return {"task_id": task_id, "provider": "suno"}
|
||||
|
||||
|
||||
# ── 저장된 가사 CRUD API ────────────────────────────────────────────────────
|
||||
|
||||
class LyricsSave(BaseModel):
|
||||
title: str = ""
|
||||
text: str = ""
|
||||
prompt: str = ""
|
||||
|
||||
|
||||
class LyricsUpdate(BaseModel):
|
||||
title: Optional[str] = None
|
||||
text: Optional[str] = None
|
||||
prompt: Optional[str] = None
|
||||
|
||||
|
||||
@app.get("/api/music/lyrics/library")
|
||||
def list_saved_lyrics():
|
||||
"""저장된 가사 목록 전체 조회 (생성일 내림차순)."""
|
||||
return {"lyrics": get_all_lyrics()}
|
||||
|
||||
|
||||
@app.post("/api/music/lyrics/library", status_code=201)
|
||||
def save_lyrics(req: LyricsSave):
|
||||
"""가사 저장."""
|
||||
return add_lyrics(req.model_dump())
|
||||
|
||||
|
||||
@app.put("/api/music/lyrics/library/{lyrics_id}")
|
||||
def edit_lyrics(lyrics_id: int, req: LyricsUpdate):
|
||||
"""가사 수정."""
|
||||
data = {k: v for k, v in req.model_dump().items() if v is not None}
|
||||
result = update_lyrics(lyrics_id, data)
|
||||
if not result:
|
||||
raise HTTPException(status_code=404, detail="Lyrics not found")
|
||||
return result
|
||||
|
||||
|
||||
@app.delete("/api/music/lyrics/library/{lyrics_id}")
|
||||
def remove_lyrics(lyrics_id: int):
|
||||
"""가사 삭제."""
|
||||
if not delete_lyrics(lyrics_id):
|
||||
raise HTTPException(status_code=404, detail="Lyrics not found")
|
||||
return {"ok": True}
|
||||
|
||||
Reference in New Issue
Block a user