from enum import Enum from typing import List, Union, Any, Optional from pydantic import BaseModel, Field, field_validator, ConfigDict from src.cluster.ffmpeg_worker.model import FFMpegSliceSegment from src.cluster.video_downloader.model import MediaSource, MediaSources class SentryTransactionHeader(BaseModel): x_trace_id: Optional[str] = Field(description="Sentry Transaction ID", default=None) x_baggage: Optional[str] = Field(description="Sentry Transaction baggage", default=None) class SentryTransactionInfo(BaseModel): x_trace_id: str = Field(description="Sentry Transaction ID") x_baggage: str = Field(description="Sentry Transaction baggage") class FFMPEGSliceRequest(BaseModel): media: MediaSource = Field(description="FFMPEG Slice Media Source") markers: List[FFMpegSliceSegment] = Field(description="FFMPEG Slice Marker List") @field_validator('media', mode='before') @classmethod def parse_inputs(cls, v: Union[str, MediaSource]): if isinstance(v, str): return MediaSource.from_str(v) elif isinstance(v, MediaSource): return v else: raise TypeError(v) class FFMPEGSliceTaskStatusRequest(BaseModel): taskId: str = Field(description="任务Id") class ModalTaskResponse(BaseModel): success: bool = Field(description="任务接受成功") taskId: str = Field(description="任务Id") class TaskStatus(str, Enum): running = "running" failed = "failed" success = "success" expired = "expired" class BaseFFMPEGTaskStatusResponse(BaseModel): taskId: str = Field(description="任务Id") status: TaskStatus = Field(description="任务运行状态") error: Optional[str] = Field(description="任务错误原因", default=None) model_config = ConfigDict(extra='ignore') class FFMPEGSliceTaskStatusResponse(BaseFFMPEGTaskStatusResponse): result: Optional[List[str]] = Field(default=None, description="任务运行结果") class FFMPEGConcatTaskStatusResponse(BaseFFMPEGTaskStatusResponse): result: Optional[str] = Field(default=None, description="任务运行结果")