Initial commit - Video Service for Coolify
This commit is contained in:
109
app/models/schemas.py
Executable file
109
app/models/schemas.py
Executable file
@@ -0,0 +1,109 @@
|
||||
"""
|
||||
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
|
||||
Reference in New Issue
Block a user