major refactor
This commit is contained in:
59
core/schema/models/media.py
Normal file
59
core/schema/models/media.py
Normal file
@@ -0,0 +1,59 @@
|
||||
"""
|
||||
MediaAsset Schema Definition
|
||||
|
||||
Source of truth for media asset data model.
|
||||
"""
|
||||
|
||||
from dataclasses import dataclass, field
|
||||
from datetime import datetime
|
||||
from enum import Enum
|
||||
from typing import Any, Dict, List, Optional
|
||||
from uuid import UUID
|
||||
|
||||
|
||||
class AssetStatus(str, Enum):
|
||||
"""Status of a media asset after probing."""
|
||||
|
||||
PENDING = "pending"
|
||||
READY = "ready"
|
||||
ERROR = "error"
|
||||
|
||||
|
||||
@dataclass
|
||||
class MediaAsset:
|
||||
"""
|
||||
A video/audio file registered in the system.
|
||||
|
||||
Metadata is populated asynchronously via ffprobe after registration.
|
||||
"""
|
||||
|
||||
id: UUID
|
||||
filename: str
|
||||
file_path: str
|
||||
|
||||
# Status
|
||||
status: AssetStatus = AssetStatus.PENDING
|
||||
error_message: Optional[str] = None
|
||||
|
||||
# File info
|
||||
file_size: Optional[int] = None
|
||||
|
||||
# Media metadata (populated by ffprobe)
|
||||
duration: Optional[float] = None # seconds
|
||||
video_codec: Optional[str] = None
|
||||
audio_codec: Optional[str] = None
|
||||
width: Optional[int] = None
|
||||
height: Optional[int] = None
|
||||
framerate: Optional[float] = None
|
||||
bitrate: Optional[int] = None # bits per second
|
||||
|
||||
# Full ffprobe output and custom metadata
|
||||
properties: Dict[str, Any] = field(default_factory=dict)
|
||||
|
||||
# User annotations
|
||||
comments: str = ""
|
||||
tags: List[str] = field(default_factory=list)
|
||||
|
||||
# Timestamps
|
||||
created_at: Optional[datetime] = None
|
||||
updated_at: Optional[datetime] = None
|
||||
Reference in New Issue
Block a user