from typing import Literal from pydantic import BaseModel, Field VideoReviewStatus = Literal["pending_review", "approved", "rejected"] class VideoItemResponse(BaseModel): id: str project_id: str generation_task_id: str name: str file_url: str file_size: int duration: float thumbnail_url: str | None = None width: int height: int fps: float status: str = "completed" review_status: str = "pending_review" generation_params: dict = Field(default_factory=dict) download_url: str | None = None generated_at: str = "" class ListVideosResponse(BaseModel): items: list[VideoItemResponse] total: int page: int page_size: int class UpdateVideoReviewRequest(BaseModel): review_status: VideoReviewStatus MAX_BATCH_DELETE_SIZE = 200 class BatchDeleteRequest(BaseModel): video_ids: list[str] = Field(..., min_length=1, max_length=MAX_BATCH_DELETE_SIZE, description="要删除的成片ID列表") class BatchOperationResponse(BaseModel): success_count: int = Field(..., ge=0, description="成功删除数量") failed_ids: list[str] = Field(default_factory=list, description="失败的ID列表") failed_details: dict[str, str] = Field(default_factory=dict, description="失败详情") class BatchDownloadRequest(BaseModel): video_ids: list[str] class BatchDownloadResponse(BaseModel): job_id: str status: str = "pending" download_url: str | None = None