feat: Implement segment update and regeneration features in Audiobook API and frontend
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user