110 lines
2.4 KiB
Python
Executable File
110 lines
2.4 KiB
Python
Executable File
"""
|
|
Pydantic schemas for Video-Service API
|
|
"""
|
|
|
|
from datetime import datetime
|
|
from enum import Enum
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class VideoStatus(str, Enum):
|
|
"""Video processing status."""
|
|
|
|
PENDING = "pending"
|
|
UPLOADING = "uploading"
|
|
PROCESSING = "processing"
|
|
READY = "ready"
|
|
ERROR = "error"
|
|
|
|
|
|
class VideoQuality(str, Enum):
|
|
"""Available video qualities."""
|
|
|
|
Q360P = "360p"
|
|
Q720P = "720p"
|
|
Q1080P = "1080p"
|
|
|
|
|
|
class VideoMetadata(BaseModel):
|
|
"""Video metadata extracted from file."""
|
|
|
|
duration_seconds: float = 0
|
|
width: int = 0
|
|
height: int = 0
|
|
fps: float = 0
|
|
codec: str = ""
|
|
bitrate: int = 0
|
|
file_size_bytes: int = 0
|
|
|
|
|
|
class VideoUploadRequest(BaseModel):
|
|
"""Request to initiate video upload."""
|
|
|
|
kurs_id: int = Field(..., description="WordPress Kurs Post ID")
|
|
title: str = Field(..., min_length=1, max_length=255)
|
|
description: str | None = None
|
|
|
|
|
|
class VideoUploadResponse(BaseModel):
|
|
"""Response after initiating upload."""
|
|
|
|
video_id: str
|
|
upload_url: str
|
|
expires_at: datetime
|
|
|
|
|
|
class VideoStatusResponse(BaseModel):
|
|
"""Video status response."""
|
|
|
|
video_id: str
|
|
kurs_id: int
|
|
title: str
|
|
status: VideoStatus
|
|
progress: int = Field(0, ge=0, le=100)
|
|
metadata: VideoMetadata | None = None
|
|
thumbnail_url: str | None = None
|
|
available_qualities: list[VideoQuality] = []
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
error_message: str | None = None
|
|
|
|
|
|
class VideoListResponse(BaseModel):
|
|
"""List of videos response."""
|
|
|
|
videos: list[VideoStatusResponse]
|
|
total: int
|
|
|
|
|
|
class StreamTokenRequest(BaseModel):
|
|
"""Request for stream token."""
|
|
|
|
video_id: str
|
|
buchung_id: int
|
|
|
|
|
|
class WebhookPayload(BaseModel):
|
|
"""Payload sent to WordPress webhook."""
|
|
|
|
event: str # video.ready, video.error, video.progress
|
|
video_id: str
|
|
kurs_id: int
|
|
status: VideoStatus
|
|
progress: int = 0
|
|
metadata: VideoMetadata | None = None
|
|
thumbnail_url: str | None = None
|
|
error_message: str | None = None
|
|
timestamp: datetime
|
|
|
|
|
|
class HealthResponse(BaseModel):
|
|
"""Health check response."""
|
|
|
|
status: str
|
|
version: str
|
|
environment: str
|
|
redis_connected: bool
|
|
storage_writable: bool
|
|
ffmpeg_available: bool
|