| """ |
| Pydantic models for video-related schemas. |
| """ |
| from enum import Enum |
| from datetime import datetime |
| from typing import Optional, List |
| from uuid import UUID |
| from pydantic import BaseModel, Field |
|
|
|
|
| class VideoStatus(str, Enum): |
| """Video processing status.""" |
| PENDING = "pending" |
| PROCESSING = "processing" |
| COMPLETED = "completed" |
| FAILED = "failed" |
|
|
|
|
| class AnalysisMode(str, Enum): |
| """Analysis mode for video processing.""" |
| TEAM = "team" |
| PERSONAL = "personal" |
|
|
|
|
| class VideoUpload(BaseModel): |
| """Request schema for video upload metadata.""" |
| title: Optional[str] = Field(None, max_length=200) |
| description: Optional[str] = Field(None, max_length=1000) |
| analysis_mode: AnalysisMode |
| organization_id: Optional[UUID] = Field(None, description="Required for TEAM analysis") |
|
|
|
|
| class VideoBase(BaseModel): |
| """Base video fields.""" |
| title: Optional[str] = None |
| description: Optional[str] = None |
| analysis_mode: AnalysisMode |
| status: VideoStatus = VideoStatus.PENDING |
|
|
|
|
| class Video(VideoBase): |
| """Complete video model returned from API.""" |
| id: UUID |
| uploader_id: UUID |
| |
| download_url: Optional[str] = None |
| annotated_download_url: Optional[str] = None |
| has_annotated: Optional[bool] = None |
| duration_seconds: Optional[float] = None |
| frame_count: Optional[int] = None |
| fps: Optional[float] = None |
| width: Optional[int] = None |
| height: Optional[int] = None |
| file_size_bytes: Optional[int] = None |
| organization_id: Optional[UUID] = None |
| error_message: Optional[str] = None |
| created_at: datetime |
| updated_at: Optional[datetime] = None |
| completed_at: Optional[datetime] = None |
| |
| class Config: |
| from_attributes = True |
|
|
|
|
| class VideoStatusResponse(BaseModel): |
| """Response schema for video processing status.""" |
| id: UUID |
| status: VideoStatus |
| progress_percent: Optional[float] = Field(None, ge=0, le=100) |
| current_step: Optional[str] = None |
| error_message: Optional[str] = None |
| estimated_completion: Optional[datetime] = None |
|
|
|
|
| class VideoListResponse(BaseModel): |
| """Response schema for listing videos.""" |
| videos: List[Video] |
| total: int |
| page: int |
| page_size: int |
|
|