feat: Implement segment update and regeneration features in Audiobook API and frontend

This commit is contained in:
2026-03-12 15:48:35 +08:00
parent a1ee476e0f
commit bb6ad9b0a3
13 changed files with 485 additions and 31 deletions

View File

@@ -20,6 +20,7 @@ from schemas.audiobook import (
AudiobookChapterResponse,
AudiobookCharacterEdit,
AudiobookSegmentResponse,
AudiobookSegmentUpdate,
AudiobookGenerateRequest,
AudiobookAnalyzeRequest,
)
@@ -543,6 +544,89 @@ async def get_segments(
return result
@router.put("/projects/{project_id}/segments/{segment_id}", response_model=AudiobookSegmentResponse)
async def update_segment(
project_id: int,
segment_id: int,
data: AudiobookSegmentUpdate,
current_user: User = Depends(get_current_user),
db: Session = Depends(get_db),
):
project = crud.get_audiobook_project(db, project_id, current_user.id)
if not project:
raise HTTPException(status_code=404, detail="Project not found")
seg = db.query(AudiobookSegment).filter(
AudiobookSegment.id == segment_id,
AudiobookSegment.project_id == project_id,
).first()
if not seg:
raise HTTPException(status_code=404, detail="Segment not found")
seg = crud.update_audiobook_segment(db, segment_id, data.text, data.emo_text, data.emo_alpha)
char_name = seg.character.name if seg.character else None
return AudiobookSegmentResponse(
id=seg.id,
project_id=seg.project_id,
chapter_index=seg.chapter_index,
segment_index=seg.segment_index,
character_id=seg.character_id,
character_name=char_name,
text=seg.text,
emo_text=seg.emo_text,
emo_alpha=seg.emo_alpha,
audio_path=seg.audio_path,
status=seg.status,
)
@router.post("/projects/{project_id}/segments/{segment_id}/regenerate", response_model=AudiobookSegmentResponse)
async def regenerate_segment(
project_id: int,
segment_id: int,
current_user: User = Depends(get_current_user),
db: Session = Depends(get_db),
):
project = crud.get_audiobook_project(db, project_id, current_user.id)
if not project:
raise HTTPException(status_code=404, detail="Project not found")
seg = db.query(AudiobookSegment).filter(
AudiobookSegment.id == segment_id,
AudiobookSegment.project_id == project_id,
).first()
if not seg:
raise HTTPException(status_code=404, detail="Segment not found")
from core.audiobook_service import generate_single_segment
from core.database import SessionLocal
async def run():
async_db = SessionLocal()
try:
db_user = crud.get_user_by_id(async_db, current_user.id)
await generate_single_segment(segment_id, db_user, async_db)
finally:
async_db.close()
asyncio.create_task(run())
char_name = seg.character.name if seg.character else None
return AudiobookSegmentResponse(
id=seg.id,
project_id=seg.project_id,
chapter_index=seg.chapter_index,
segment_index=seg.segment_index,
character_id=seg.character_id,
character_name=char_name,
text=seg.text,
emo_text=seg.emo_text,
emo_alpha=seg.emo_alpha,
audio_path=seg.audio_path,
status="generating",
)
@router.get("/projects/{project_id}/segments/{segment_id}/audio")
async def get_segment_audio(
project_id: int,