feat: add force option to project generation for reprocessing completed segments

This commit is contained in:
2026-03-12 17:19:37 +08:00
parent 7f25dd09f6
commit afb6830a6d
5 changed files with 21 additions and 8 deletions

View File

@@ -457,12 +457,13 @@ async def generate_project(
from core.database import SessionLocal
chapter_index = data.chapter_index
force = data.force
async def run_generation():
async_db = SessionLocal()
try:
db_user = crud.get_user_by_id(async_db, current_user.id)
await _generate(project_id, db_user, async_db, chapter_index=chapter_index)
await _generate(project_id, db_user, async_db, chapter_index=chapter_index, force=force)
finally:
async_db.close()

View File

@@ -536,7 +536,7 @@ async def _bootstrap_character_voices(segments, user, backend, backend_type: str
logger.error(f"Failed to bootstrap voice for design_id={design.id}: {e}", exc_info=True)
async def generate_project(project_id: int, user: User, db: Session, chapter_index: Optional[int] = None, cancel_event: Optional[asyncio.Event] = None) -> None:
async def generate_project(project_id: int, user: User, db: Session, chapter_index: Optional[int] = None, cancel_event: Optional[asyncio.Event] = None, force: bool = False) -> None:
project = db.query(AudiobookProject).filter(AudiobookProject.id == project_id).first()
if not project:
return
@@ -551,6 +551,11 @@ async def generate_project(project_id: int, user: User, db: Session, chapter_ind
crud.update_audiobook_project_status(db, project_id, "generating")
segments = crud.list_audiobook_segments(db, project_id, chapter_index=chapter_index)
if force:
for s in segments:
if s.status == "done":
crud.update_audiobook_segment_status(db, s.id, "pending")
segments = crud.list_audiobook_segments(db, project_id, chapter_index=chapter_index)
pending_segments = [s for s in segments if s.status in ("pending", "error")]
if not pending_segments:
if chapter_index is None:

View File

@@ -58,6 +58,7 @@ class AudiobookAnalyzeRequest(BaseModel):
class AudiobookGenerateRequest(BaseModel):
chapter_index: Optional[int] = None
force: bool = False
class AudiobookCharacterUpdate(BaseModel):