File size: 2,272 Bytes
c6abe34
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
"""
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
    # Do not expose local filesystem paths to clients
    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