233 lines
8.6 KiB
Python
233 lines
8.6 KiB
Python
"""
|
|
SQLModel Table Models - GENERATED FILE
|
|
|
|
Do not edit directly. Regenerate using modelgen.
|
|
"""
|
|
|
|
from datetime import datetime
|
|
from enum import Enum
|
|
from typing import Any, Dict, List, Optional
|
|
from uuid import UUID, uuid4
|
|
|
|
from sqlmodel import SQLModel, Field, Column
|
|
from sqlalchemy import JSON
|
|
|
|
class AssetStatus(str, Enum):
|
|
PENDING = "pending"
|
|
READY = "ready"
|
|
ERROR = "error"
|
|
|
|
class JobStatus(str, Enum):
|
|
PENDING = "pending"
|
|
PROCESSING = "processing"
|
|
COMPLETED = "completed"
|
|
FAILED = "failed"
|
|
CANCELLED = "cancelled"
|
|
|
|
class ChunkJobStatus(str, Enum):
|
|
PENDING = "pending"
|
|
CHUNKING = "chunking"
|
|
PROCESSING = "processing"
|
|
COLLECTING = "collecting"
|
|
COMPLETED = "completed"
|
|
FAILED = "failed"
|
|
CANCELLED = "cancelled"
|
|
|
|
class DetectJobStatus(str, Enum):
|
|
PENDING = "pending"
|
|
RUNNING = "running"
|
|
PAUSED = "paused"
|
|
COMPLETED = "completed"
|
|
FAILED = "failed"
|
|
CANCELLED = "cancelled"
|
|
|
|
class RunType(str, Enum):
|
|
INITIAL = "initial"
|
|
REPLAY = "replay"
|
|
RETRY = "retry"
|
|
|
|
class BrandSource(str, Enum):
|
|
OCR = "ocr"
|
|
VLM = "local_vlm"
|
|
CLOUD = "cloud_llm"
|
|
MANUAL = "manual"
|
|
|
|
class SourceType(str, Enum):
|
|
CHUNK_JOB = "chunk_job"
|
|
UPLOAD = "upload"
|
|
DEVICE = "device"
|
|
STREAM = "stream"
|
|
|
|
class MediaAsset(SQLModel, table=True):
|
|
"""A video/audio file registered in the system."""
|
|
__tablename__ = "media_assets"
|
|
|
|
id: UUID = Field(default_factory=uuid4, primary_key=True)
|
|
filename: str
|
|
file_path: str
|
|
status: AssetStatus = "pending"
|
|
error_message: Optional[str] = None
|
|
file_size: Optional[int] = None
|
|
duration: Optional[float] = None
|
|
video_codec: Optional[str] = None
|
|
audio_codec: Optional[str] = None
|
|
width: Optional[int] = None
|
|
height: Optional[int] = None
|
|
framerate: Optional[float] = None
|
|
bitrate: Optional[int] = None
|
|
properties: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON, nullable=False, server_default='{}'))
|
|
comments: str = ""
|
|
tags: List[str] = Field(default_factory=list, sa_column=Column(JSON, nullable=False, server_default='[]'))
|
|
created_at: Optional[datetime] = Field(default_factory=datetime.utcnow)
|
|
updated_at: Optional[datetime] = Field(default_factory=datetime.utcnow)
|
|
|
|
class TranscodePreset(SQLModel, table=True):
|
|
"""A reusable transcoding configuration (like Handbrake presets)."""
|
|
__tablename__ = "transcode_presets"
|
|
|
|
id: UUID = Field(default_factory=uuid4, primary_key=True)
|
|
name: str
|
|
description: str = ""
|
|
is_builtin: bool = False
|
|
container: str = "mp4"
|
|
video_codec: str = "libx264"
|
|
video_bitrate: Optional[str] = None
|
|
video_crf: Optional[int] = None
|
|
video_preset: Optional[str] = None
|
|
resolution: Optional[str] = None
|
|
framerate: Optional[float] = None
|
|
audio_codec: str = "aac"
|
|
audio_bitrate: Optional[str] = None
|
|
audio_channels: Optional[int] = None
|
|
audio_samplerate: Optional[int] = None
|
|
extra_args: List[str] = Field(default_factory=list, sa_column=Column(JSON, nullable=False, server_default='[]'))
|
|
created_at: Optional[datetime] = Field(default_factory=datetime.utcnow)
|
|
updated_at: Optional[datetime] = Field(default_factory=datetime.utcnow)
|
|
|
|
class TranscodeJob(SQLModel, table=True):
|
|
"""A transcoding or trimming job in the queue."""
|
|
__tablename__ = "transcode_jobs"
|
|
|
|
id: UUID = Field(default_factory=uuid4, primary_key=True)
|
|
source_asset_id: UUID = Field(index=True)
|
|
preset_id: Optional[UUID] = None
|
|
preset_snapshot: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON, nullable=False, server_default='{}'))
|
|
trim_start: Optional[float] = None
|
|
trim_end: Optional[float] = None
|
|
output_filename: str = ""
|
|
output_path: Optional[str] = None
|
|
output_asset_id: Optional[UUID] = None
|
|
status: JobStatus = "pending"
|
|
progress: float = 0.0
|
|
current_frame: Optional[int] = None
|
|
current_time: Optional[float] = None
|
|
speed: Optional[str] = None
|
|
error_message: Optional[str] = None
|
|
celery_task_id: Optional[str] = None
|
|
execution_arn: Optional[str] = None
|
|
priority: int = 0
|
|
created_at: Optional[datetime] = Field(default_factory=datetime.utcnow)
|
|
started_at: Optional[datetime] = None
|
|
completed_at: Optional[datetime] = None
|
|
|
|
class ChunkJob(SQLModel, table=True):
|
|
"""A chunk pipeline job — splits a media file into chunks and processes them"""
|
|
__tablename__ = "chunk_jobs"
|
|
|
|
id: UUID = Field(default_factory=uuid4, primary_key=True)
|
|
source_asset_id: UUID = Field(index=True)
|
|
chunk_duration: float = 10.0
|
|
num_workers: int = 4
|
|
max_retries: int = 3
|
|
processor_type: str = "ffmpeg"
|
|
status: ChunkJobStatus = "pending"
|
|
progress: float = 0.0
|
|
total_chunks: int = 0
|
|
processed_chunks: int = 0
|
|
failed_chunks: int = 0
|
|
retry_count: int = 0
|
|
error_message: Optional[str] = None
|
|
throughput_mbps: Optional[float] = None
|
|
elapsed_seconds: Optional[float] = None
|
|
celery_task_id: Optional[str] = None
|
|
priority: int = 0
|
|
created_at: Optional[datetime] = Field(default_factory=datetime.utcnow)
|
|
started_at: Optional[datetime] = None
|
|
completed_at: Optional[datetime] = None
|
|
|
|
class DetectJob(SQLModel, table=True):
|
|
"""A detection pipeline job."""
|
|
__tablename__ = "detect_jobs"
|
|
|
|
id: UUID = Field(default_factory=uuid4, primary_key=True)
|
|
source_asset_id: UUID = Field(index=True)
|
|
video_path: str
|
|
profile_name: str = "soccer_broadcast"
|
|
parent_job_id: Optional[UUID] = Field(default=None, index=True)
|
|
run_type: RunType = "initial"
|
|
replay_from_stage: Optional[str] = None
|
|
config_overrides: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON, nullable=False, server_default='{}'))
|
|
status: DetectJobStatus = "pending"
|
|
current_stage: Optional[str] = None
|
|
progress: float = 0.0
|
|
error_message: Optional[str] = None
|
|
total_detections: int = 0
|
|
brands_found: int = 0
|
|
cloud_llm_calls: int = 0
|
|
estimated_cost_usd: float = 0.0
|
|
celery_task_id: Optional[str] = None
|
|
priority: int = 0
|
|
created_at: Optional[datetime] = Field(default_factory=datetime.utcnow)
|
|
started_at: Optional[datetime] = None
|
|
completed_at: Optional[datetime] = None
|
|
|
|
class StageCheckpoint(SQLModel, table=True):
|
|
"""A checkpoint saved after a pipeline stage completes."""
|
|
__tablename__ = "stage_checkpoints"
|
|
|
|
id: UUID = Field(default_factory=uuid4, primary_key=True)
|
|
job_id: UUID = Field(index=True)
|
|
stage: str
|
|
stage_index: int
|
|
frames_prefix: str = ""
|
|
frames_manifest: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON, nullable=False, server_default='{}'))
|
|
frames_meta: List[str] = Field(default_factory=list, sa_column=Column(JSON, nullable=False, server_default='[]'))
|
|
filtered_frame_sequences: List[int] = Field(default_factory=list, sa_column=Column(JSON, nullable=False, server_default='[]'))
|
|
stage_output_key: str = "" # s3 key: checkpoints/{job_id}/stages/{stage}.bson
|
|
stats: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON, nullable=False, server_default='{}'))
|
|
config_snapshot: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON, nullable=False, server_default='{}'))
|
|
config_overrides: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON, nullable=False, server_default='{}'))
|
|
video_path: str = ""
|
|
profile_name: str = ""
|
|
is_scenario: bool = False
|
|
scenario_label: str = ""
|
|
created_at: Optional[datetime] = Field(default_factory=datetime.utcnow)
|
|
|
|
class KnownBrand(SQLModel, table=True):
|
|
"""A brand discovered or registered in the system."""
|
|
__tablename__ = "known_brands"
|
|
|
|
id: UUID = Field(default_factory=uuid4, primary_key=True)
|
|
canonical_name: str = Field(index=True)
|
|
aliases: List[str] = Field(default_factory=list, sa_column=Column(JSON, nullable=False, server_default='[]'))
|
|
first_source: BrandSource = "ocr"
|
|
total_occurrences: int = 0
|
|
confirmed: bool = False
|
|
created_at: Optional[datetime] = Field(default_factory=datetime.utcnow)
|
|
updated_at: Optional[datetime] = Field(default_factory=datetime.utcnow)
|
|
|
|
class SourceBrandSighting(SQLModel, table=True):
|
|
"""A brand seen in a specific source (video/asset)."""
|
|
__tablename__ = "source_brand_sightings"
|
|
|
|
id: UUID = Field(default_factory=uuid4, primary_key=True)
|
|
source_asset_id: UUID = Field(index=True)
|
|
brand_id: UUID
|
|
brand_name: str
|
|
first_seen_timestamp: float = 0.0
|
|
last_seen_timestamp: float = 0.0
|
|
occurrences: int = 0
|
|
detection_source: BrandSource = "ocr"
|
|
avg_confidence: float = 0.0
|
|
created_at: Optional[datetime] = Field(default_factory=datetime.utcnow)
|