mirror of
https://github.com/myronblair/kino-app
synced 2026-07-27 21:18:43 -05:00
auto-commit for 14921357-f5e2-4aba-b4c1-a07a52c800cc
This commit is contained in:
+90
-5
@@ -29,22 +29,55 @@ class UserPublic(BaseModel):
|
||||
created_at: str
|
||||
|
||||
|
||||
# ---------- Profiles ("Who's Watching") ----------
|
||||
RATING_ORDER = ["G", "PG", "PG-13", "R", "NR"]
|
||||
|
||||
|
||||
class ProfileCreate(BaseModel):
|
||||
name: str
|
||||
avatar_color: str = "#D9381E"
|
||||
is_kids: bool = False
|
||||
max_rating: str = "NR" # one of RATING_ORDER
|
||||
|
||||
|
||||
class ProfileUpdate(BaseModel):
|
||||
name: Optional[str] = None
|
||||
avatar_color: Optional[str] = None
|
||||
is_kids: Optional[bool] = None
|
||||
max_rating: Optional[str] = None
|
||||
|
||||
|
||||
class Profile(BaseModel):
|
||||
model_config = ConfigDict(extra="ignore")
|
||||
id: str = Field(default_factory=lambda: str(uuid.uuid4()))
|
||||
user_id: str
|
||||
name: str
|
||||
avatar_color: str = "#D9381E"
|
||||
is_kids: bool = False
|
||||
max_rating: str = "NR"
|
||||
created_at: str = Field(default_factory=_now_iso)
|
||||
|
||||
|
||||
# ---------- Movies ----------
|
||||
class MovieBase(BaseModel):
|
||||
title: str
|
||||
description: str = ""
|
||||
year: int = 2024
|
||||
duration_minutes: int = 0
|
||||
rating: str = "NR" # G / PG / PG-13 / R / NR
|
||||
rating: str = "NR"
|
||||
genres: List[str] = []
|
||||
cast: List[str] = []
|
||||
director: str = ""
|
||||
poster_url: str = ""
|
||||
backdrop_url: str = ""
|
||||
video_url: str = ""
|
||||
storage_type: str = "external" # "external" or "local"
|
||||
storage_type: str = "external" # external | local | radarr
|
||||
storage_path: Optional[str] = None
|
||||
featured: bool = False
|
||||
tmdb_id: Optional[int] = None
|
||||
radarr_id: Optional[int] = None
|
||||
hls_path: Optional[str] = None
|
||||
hls_status: Optional[str] = None # pending|running|done|failed
|
||||
|
||||
|
||||
class MovieCreate(MovieBase):
|
||||
@@ -66,6 +99,7 @@ class MovieUpdate(BaseModel):
|
||||
storage_type: Optional[str] = None
|
||||
storage_path: Optional[str] = None
|
||||
featured: Optional[bool] = None
|
||||
tmdb_id: Optional[int] = None
|
||||
|
||||
|
||||
class Movie(MovieBase):
|
||||
@@ -74,16 +108,28 @@ class Movie(MovieBase):
|
||||
created_at: str = Field(default_factory=_now_iso)
|
||||
|
||||
|
||||
# ---------- Watchlist ----------
|
||||
# ---------- Subtitles ----------
|
||||
class Subtitle(BaseModel):
|
||||
model_config = ConfigDict(extra="ignore")
|
||||
id: str = Field(default_factory=lambda: str(uuid.uuid4()))
|
||||
movie_id: str
|
||||
language: str = "en" # ISO code
|
||||
label: str = "English"
|
||||
storage_path: str # filename inside MEDIA_ROOT/subtitles
|
||||
is_default: bool = False
|
||||
created_at: str = Field(default_factory=_now_iso)
|
||||
|
||||
|
||||
# ---------- Watchlist / Progress (now profile-scoped) ----------
|
||||
class WatchlistItem(BaseModel):
|
||||
model_config = ConfigDict(extra="ignore")
|
||||
id: str = Field(default_factory=lambda: str(uuid.uuid4()))
|
||||
profile_id: str
|
||||
user_id: str
|
||||
movie_id: str
|
||||
added_at: str = Field(default_factory=_now_iso)
|
||||
|
||||
|
||||
# ---------- Progress (Continue Watching) ----------
|
||||
class ProgressUpsert(BaseModel):
|
||||
movie_id: str
|
||||
position_seconds: float
|
||||
@@ -92,6 +138,7 @@ class ProgressUpsert(BaseModel):
|
||||
|
||||
class Progress(BaseModel):
|
||||
model_config = ConfigDict(extra="ignore")
|
||||
profile_id: str
|
||||
user_id: str
|
||||
movie_id: str
|
||||
position_seconds: float
|
||||
@@ -107,7 +154,7 @@ class RequestCreate(BaseModel):
|
||||
|
||||
|
||||
class RequestUpdate(BaseModel):
|
||||
status: str # pending | fulfilled | rejected
|
||||
status: str
|
||||
|
||||
|
||||
class MovieRequest(BaseModel):
|
||||
@@ -122,8 +169,46 @@ class MovieRequest(BaseModel):
|
||||
created_at: str = Field(default_factory=_now_iso)
|
||||
|
||||
|
||||
# ---------- App Settings (admin) ----------
|
||||
class AppSettings(BaseModel):
|
||||
model_config = ConfigDict(extra="ignore")
|
||||
tmdb_api_key: str = ""
|
||||
radarr_url: str = ""
|
||||
radarr_api_key: str = ""
|
||||
|
||||
|
||||
class AppSettingsPublic(BaseModel):
|
||||
"""Settings visible to admin UI (does not redact, since admin already has access)."""
|
||||
tmdb_configured: bool = False
|
||||
radarr_configured: bool = False
|
||||
tmdb_api_key: str = ""
|
||||
radarr_url: str = ""
|
||||
radarr_api_key: str = ""
|
||||
|
||||
|
||||
# ---------- Auth Tokens ----------
|
||||
class TokenResponse(BaseModel):
|
||||
access_token: str
|
||||
token_type: str = "bearer"
|
||||
user: UserPublic
|
||||
|
||||
|
||||
# ---------- TMDB / Radarr DTOs ----------
|
||||
class TMDBSearchResult(BaseModel):
|
||||
tmdb_id: int
|
||||
title: str
|
||||
year: Optional[int] = None
|
||||
overview: str = ""
|
||||
poster_url: str = ""
|
||||
backdrop_url: str = ""
|
||||
|
||||
|
||||
class RadarrMovieDTO(BaseModel):
|
||||
radarr_id: int
|
||||
title: str
|
||||
year: Optional[int] = None
|
||||
overview: str = ""
|
||||
has_file: bool = False
|
||||
file_path: Optional[str] = None
|
||||
poster_url: str = ""
|
||||
tmdb_id: Optional[int] = None
|
||||
|
||||
Reference in New Issue
Block a user