Files
main_backend/cpv3/modules/tasks/schemas.py
T
2026-02-04 02:19:50 +03:00

107 lines
3.5 KiB
Python

"""
Task request and response schemas.
"""
from __future__ import annotations
from datetime import datetime
from typing import Literal
from uuid import UUID
from pydantic import Field
from cpv3.common.schemas import Schema
TaskTypeEnum = Literal[
"MEDIA_PROBE",
"SILENCE_REMOVE",
"MEDIA_CONVERT",
"TRANSCRIPTION_GENERATE",
"CAPTIONS_GENERATE",
]
TaskStatusEnum = Literal["PENDING", "RUNNING", "FAILED", "CANCELLED", "DONE"]
# --- Request schemas ---
class MediaProbeRequest(Schema):
"""Request to probe media file metadata."""
file_key: str = Field(..., description="Storage key of the file to probe")
project_id: UUID | None = Field(default=None, description="Associated project ID")
class SilenceRemoveRequest(Schema):
"""Request to remove silence from media file."""
file_key: str = Field(..., description="Storage key of the input file")
out_folder: str = Field(..., description="Output folder for processed file")
project_id: UUID | None = Field(default=None, description="Associated project ID")
min_silence_duration_ms: int = Field(
default=200, description="Minimum silence duration in milliseconds"
)
silence_threshold_db: int = Field(
default=16, description="Silence threshold in decibels"
)
padding_ms: int = Field(
default=100, description="Padding around non-silent segments in milliseconds"
)
class MediaConvertRequest(Schema):
"""Request to convert media file to different format."""
file_key: str = Field(..., description="Storage key of the input file")
out_folder: str = Field(..., description="Output folder for converted file")
output_format: str = Field(default="mp4", description="Target output format")
project_id: UUID | None = Field(default=None, description="Associated project ID")
class TranscriptionGenerateRequest(Schema):
"""Request to generate transcription from audio/video file."""
file_key: str = Field(..., description="Storage key of the input file")
project_id: UUID | None = Field(default=None, description="Associated project ID")
engine: Literal["whisper", "google"] = Field(
default="whisper", description="Transcription engine to use"
)
language: str | None = Field(default=None, description="Language code (e.g., 'en')")
model: str = Field(default="base", description="Model size for whisper")
class CaptionsGenerateRequest(Schema):
"""Request to generate captions/subtitles video."""
video_s3_path: str = Field(..., description="S3 path to the video file")
folder: str = Field(..., description="Output folder for rendered video")
transcription_id: UUID = Field(..., description="ID of the transcription to use")
project_id: UUID | None = Field(default=None, description="Associated project ID")
# --- Response schemas ---
class TaskSubmitResponse(Schema):
"""Response after submitting a background task."""
job_id: UUID = Field(..., description="Job ID for tracking")
webhook_url: str = Field(..., description="Webhook URL for status updates")
status: TaskStatusEnum = Field(default="PENDING", description="Initial task status")
class TaskStatusResponse(Schema):
"""Response for task status query."""
job_id: UUID
status: TaskStatusEnum
job_type: TaskTypeEnum
progress_pct: float | None = None
current_message: str | None = None
error_message: str | None = None
output_data: dict | None = None
started_at: datetime | None = None
finished_at: datetime | None = None