- Add FastAPI server for video metadata registration - PostgreSQL database models for videos, video_streams, audio_streams, subtitle_streams - Batch registration script for .probe.json files - RESTful API endpoints for CRUD operations - Search functionality by title, artist, codec, resolution
104 lines
3.0 KiB
Python
104 lines
3.0 KiB
Python
from datetime import datetime
|
|
from uuid import UUID
|
|
from typing import Optional, List
|
|
from pydantic import BaseModel, ConfigDict
|
|
|
|
|
|
class VideoStreamSchema(BaseModel):
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
stream_index: Optional[int] = None
|
|
codec_name: Optional[str] = None
|
|
codec_long_name: Optional[str] = None
|
|
profile: Optional[str] = None
|
|
level: Optional[int] = None
|
|
width: Optional[int] = None
|
|
height: Optional[int] = None
|
|
coded_width: Optional[int] = None
|
|
coded_height: Optional[int] = None
|
|
aspect_ratio: Optional[str] = None
|
|
pix_fmt: Optional[str] = None
|
|
field_order: Optional[str] = None
|
|
frame_rate: Optional[str] = None
|
|
start_time: Optional[float] = None
|
|
duration: Optional[float] = None
|
|
bit_rate: Optional[int] = None
|
|
nb_frames: Optional[int] = None
|
|
color_range: Optional[str] = None
|
|
color_space: Optional[str] = None
|
|
has_b_frames: Optional[int] = None
|
|
sample_aspect_ratio: Optional[str] = None
|
|
|
|
|
|
class AudioStreamSchema(BaseModel):
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
stream_index: Optional[int] = None
|
|
codec_name: Optional[str] = None
|
|
codec_long_name: Optional[str] = None
|
|
profile: Optional[str] = None
|
|
channels: Optional[int] = None
|
|
channel_layout: Optional[str] = None
|
|
sample_rate: Optional[int] = None
|
|
sample_fmt: Optional[str] = None
|
|
bit_rate: Optional[int] = None
|
|
duration: Optional[float] = None
|
|
language: Optional[str] = None
|
|
|
|
|
|
class SubtitleStreamSchema(BaseModel):
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
stream_index: Optional[int] = None
|
|
codec_name: Optional[str] = None
|
|
language: Optional[str] = None
|
|
|
|
|
|
class VideoSchema(BaseModel):
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: UUID
|
|
file_path: str
|
|
file_name: str
|
|
file_extension: Optional[str] = None
|
|
file_size: Optional[int] = None
|
|
format_name: Optional[str] = None
|
|
format_long_name: Optional[str] = None
|
|
duration: Optional[float] = None
|
|
bit_rate: Optional[int] = None
|
|
nb_streams: Optional[int] = None
|
|
start_time: Optional[float] = None
|
|
title: Optional[str] = None
|
|
artist: Optional[str] = None
|
|
description: Optional[str] = None
|
|
probed_at: Optional[datetime] = None
|
|
registered_at: Optional[datetime] = None
|
|
created_at: Optional[datetime] = None
|
|
updated_at: Optional[datetime] = None
|
|
video_streams: List[VideoStreamSchema] = []
|
|
audio_streams: List[AudioStreamSchema] = []
|
|
subtitle_streams: List[SubtitleStreamSchema] = []
|
|
|
|
|
|
class VideoListResponse(BaseModel):
|
|
total: int
|
|
videos: List[VideoSchema]
|
|
|
|
|
|
class VideoSearchQuery(BaseModel):
|
|
title: Optional[str] = None
|
|
artist: Optional[str] = None
|
|
codec_name: Optional[str] = None
|
|
min_width: Optional[int] = None
|
|
max_width: Optional[int] = None
|
|
min_height: Optional[int] = None
|
|
max_height: Optional[int] = None
|
|
format_name: Optional[str] = None
|
|
skip: int = 0
|
|
limit: int = 20
|
|
|
|
|
|
class RegisterRequest(BaseModel):
|
|
probe_json_path: str
|
|
absolute_file_path: str
|