Initial commit - Video Service for Coolify

This commit is contained in:
2025-12-17 10:07:44 +01:00
commit baa1675738
46 changed files with 2386 additions and 0 deletions

109
app/models/schemas.py Executable file
View 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