60 lines
1.4 KiB
Python
60 lines
1.4 KiB
Python
"""
|
|
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
|