拆镜复刻片段重试切片API | 真人/虚拟素材库上传API
This commit is contained in:
@@ -2,6 +2,7 @@ from __future__ import annotations
|
||||
|
||||
import uuid
|
||||
from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
from fastapi import HTTPException
|
||||
@@ -29,6 +30,7 @@ from app.schemas.shot_replicate import (
|
||||
ShotSegmentDeleteOut,
|
||||
ShotSegmentDetailOut,
|
||||
ShotSegmentListOut,
|
||||
ShotSegmentSplitRetryOut,
|
||||
ShotReanalyzeOut,
|
||||
ShotSegmentOut,
|
||||
ShotSplitByAIOut,
|
||||
@@ -500,6 +502,97 @@ async def create_segments_by_ai(
|
||||
)
|
||||
|
||||
|
||||
async def prepare_retry_split_segment(
|
||||
db: AsyncSession,
|
||||
*,
|
||||
current_user: User,
|
||||
segment_id: str,
|
||||
force: bool = False,
|
||||
reason: str | None = None,
|
||||
) -> ShotSegmentSplitRetryOut:
|
||||
"""重置失败切片片段,commit 成功后由 API 投递现有 split_one_segment 任务。"""
|
||||
segment = await get_segment_for_user(db, segment_id=segment_id, user=current_user, for_update=True)
|
||||
task_set = await get_task_set_for_user(db, task_set_id=segment.task_set_id, user=current_user, for_update=True)
|
||||
from_split_status = segment.split_status
|
||||
allowed = {ShotSplitStatusEnum.FAILED.value, ShotSplitStatusEnum.RETRY_WAITING.value}
|
||||
|
||||
reject_reason: str | None = None
|
||||
if task_set.deleted_at is not None or task_set.status == ShotTaskSetStatusEnum.DELETED.value:
|
||||
reject_reason = "拆镜总任务集已删除,不能重试切片"
|
||||
elif segment.deleted_at is not None:
|
||||
reject_reason = "拆镜片段已删除,不能重试切片"
|
||||
elif from_split_status == ShotSplitStatusEnum.PROCESSING.value:
|
||||
reject_reason = "拆镜片段正在切片处理中,不能重复投递"
|
||||
elif from_split_status == ShotSplitStatusEnum.COMPLETED.value:
|
||||
reject_reason = "拆镜片段已切片完成,不支持重切,避免旧切片资源覆盖"
|
||||
elif from_split_status not in allowed and not force:
|
||||
reject_reason = "仅允许失败或等待重试的切片片段重新投递"
|
||||
elif not task_set.video_path:
|
||||
reject_reason = "原视频本地路径为空,不能重试切片"
|
||||
elif not Path(str(task_set.video_path)).exists():
|
||||
reject_reason = "原视频本地文件不存在,不能重试切片"
|
||||
|
||||
if reject_reason:
|
||||
log_module_event_file(
|
||||
module=MODULE,
|
||||
event_type=ShotReplicateLogEventEnum.SEGMENT_SPLIT_RETRY_REJECTED.value,
|
||||
project_id=task_set.id,
|
||||
step_id=segment.id,
|
||||
status="rejected",
|
||||
message=reject_reason,
|
||||
detail={
|
||||
"segment_id": segment.id,
|
||||
"task_set_id": task_set.id,
|
||||
"from_split_status": from_split_status,
|
||||
"force": force,
|
||||
"reason": reason,
|
||||
},
|
||||
)
|
||||
raise HTTPException(status_code=400, detail=reject_reason)
|
||||
|
||||
now = _now()
|
||||
segment.split_status = ShotSplitStatusEnum.PENDING.value
|
||||
segment.split_enqueued_at = now
|
||||
segment.split_started_at = None
|
||||
segment.split_lease_until = None
|
||||
segment.split_next_retry_at = None
|
||||
segment.split_retry_count = 0
|
||||
segment.split_last_error = None
|
||||
segment.split_celery_task_id = f"shot-split:{uuid.uuid4().hex}"
|
||||
task_set.split_error_message = None
|
||||
|
||||
await refresh_task_set_split_summary(db, task_set.id)
|
||||
await db.flush()
|
||||
|
||||
log_module_event_file(
|
||||
module=MODULE,
|
||||
event_type=ShotReplicateLogEventEnum.SEGMENT_SPLIT_RETRY_RECEIVED.value,
|
||||
project_id=task_set.id,
|
||||
step_id=segment.id,
|
||||
status="pending",
|
||||
message="拆镜片段切片失败重试已重置,等待投递 Celery",
|
||||
detail={
|
||||
"segment_id": segment.id,
|
||||
"task_set_id": task_set.id,
|
||||
"from_split_status": from_split_status,
|
||||
"to_split_status": segment.split_status,
|
||||
"force": force,
|
||||
"reason": reason,
|
||||
"source_path": task_set.video_path,
|
||||
"celery_task_name": "shot_replicate.split_one_segment",
|
||||
"queue": "gen_result_download",
|
||||
},
|
||||
)
|
||||
|
||||
return ShotSegmentSplitRetryOut(
|
||||
message="切片重试已提交,正在重新切割视频片段",
|
||||
task_set_id=task_set.id,
|
||||
segment_id=segment.id,
|
||||
split_status=segment.split_status,
|
||||
celery_task_name="shot_replicate.split_one_segment",
|
||||
)
|
||||
|
||||
|
||||
async def create_custom_segment(
|
||||
db: AsyncSession,
|
||||
*,
|
||||
|
||||
Reference in New Issue
Block a user