130 lines
4.2 KiB
Python
130 lines
4.2 KiB
Python
from enum import Enum
|
||
from typing import List, Union, Optional
|
||
from pydantic import BaseModel, Field, field_validator, ConfigDict, HttpUrl
|
||
from .ffmpeg_worker_model import FFMpegSliceSegment
|
||
from .media_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 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 ErrorCode(int, Enum):
|
||
SUCCESS = 0
|
||
PARAM_ERROR = 10001
|
||
NOT_FOUND = 10002
|
||
UNAUTHORIZED = 10003
|
||
FORBIDDEN = 10004
|
||
BUSINESS_ERROR = 10005
|
||
SYSTEM_ERROR = 99999
|
||
|
||
|
||
class WebhookMethodEnum(str, Enum):
|
||
GET = "get"
|
||
POST = "post"
|
||
|
||
|
||
class WebhookNotify(BaseModel):
|
||
endpoint: HttpUrl = Field(description="Webhook回调端点", examples=["https://webhook.example.com"])
|
||
method: WebhookMethodEnum = Field(description="Webhook回调请求方法", examples=["get", "post"])
|
||
authentication: Optional[str] = Field(description="Webhook authentication回调请求降权token,如不需要鉴权则不填",
|
||
examples=["Bearer 123456"])
|
||
|
||
|
||
class BaseFFMPEGTaskRequest(BaseModel):
|
||
webhook: Optional[WebhookNotify] = Field(description="Task webhook", default=None)
|
||
|
||
|
||
class BaseFFMPEGTaskStatusResponse(BaseModel):
|
||
taskId: str = Field(description="任务Id")
|
||
status: TaskStatus = Field(description="任务运行状态")
|
||
error: Optional[str] = Field(description="任务错误原因", default=None)
|
||
code: Optional[int] = Field(description="任务错误原因代码", default=None)
|
||
|
||
model_config = ConfigDict(extra='ignore')
|
||
|
||
|
||
class FFMPEGSliceRequest(BaseFFMPEGTaskRequest):
|
||
media: MediaSource = Field(description="待切割的媒体源")
|
||
markers: List[FFMpegSliceSegment] = Field(description="切割标记数组")
|
||
|
||
@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 FFMPEGSliceTaskStatusResponse(BaseFFMPEGTaskStatusResponse):
|
||
result: Optional[List[str]] = Field(default=None, description="任务运行结果")
|
||
|
||
|
||
class FFMPEGConcatRequest(BaseFFMPEGTaskRequest):
|
||
medias: MediaSources = Field(description="待合并的媒体源")
|
||
|
||
|
||
class FFMPEGConcatTaskStatusResponse(BaseFFMPEGTaskStatusResponse):
|
||
result: Optional[str] = Field(default=None, description="任务运行结果")
|
||
|
||
|
||
class FFMPEGExtractAudioRequest(BaseFFMPEGTaskRequest):
|
||
media: MediaSource = Field(description="待提取音频的媒体源")
|
||
|
||
@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 FFMPEGExtractAudioTaskStatusResponse(BaseFFMPEGTaskStatusResponse):
|
||
result: Optional[str] = Field(default=None, description="任务运行结果")
|
||
|
||
|
||
class FFMPEGCornerMirrorRequest(BaseFFMPEGTaskRequest):
|
||
media: MediaSource = Field(description="")
|
||
|
||
@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 FFMPEGCornerMirrorTaskStatusResponse(BaseFFMPEGTaskStatusResponse):
|
||
result: Optional[str] = Field(default=None, description="任务运行结果")
|