refactor(api): standardize responses and restore media config contracts

This commit is contained in:
jxxghp
2026-08-12 23:15:13 +08:00
parent 0ac641c05d
commit baf8850d63
100 changed files with 4422 additions and 1286 deletions
+185 -6
View File
@@ -1,8 +1,185 @@
from typing import Optional
from pydantic import BaseModel, Field
class ServarrVersion(BaseModel):
"""Servarr 兼容接口使用的版本号结构。"""
major: int = 0
minor: int = 0
build: int = 0
revision: int = 0
majorRevision: int = 0
minorRevision: int = 0
class ServarrSystemStatus(BaseModel):
"""Servarr 系统状态响应。"""
appName: str
instanceName: str
version: str
buildTime: str
isDebug: bool
isProduction: bool
isAdmin: bool
isUserInteractive: bool
startupPath: str
appData: str
osName: str
osVersion: str
isNetCore: bool
isLinux: bool
isOsx: bool
isWindows: bool
isDocker: bool
mode: str
branch: str
databaseType: str
databaseVersion: ServarrVersion
authentication: str
migrationVersion: int
urlBase: str
runtimeVersion: ServarrVersion
runtimeName: str
startTime: str
packageVersion: str
packageAuthor: str
packageUpdateMechanism: str
packageUpdateMechanismMessage: str
class ServarrQuality(BaseModel):
"""Servarr 质量定义。"""
id: int
name: str
source: str
resolution: int
class ServarrQualityProfileItem(BaseModel):
"""Servarr 质量配置中的可选质量项。"""
id: int
name: str
quality: ServarrQuality
items: list[str] = Field(default_factory=list)
allowed: bool
class ServarrFormatItem(BaseModel):
"""Servarr 自定义格式评分项。"""
id: int
format: int
name: str
score: int
class ServarrQualityProfile(BaseModel):
"""Servarr 质量配置响应项。"""
id: int
name: str
upgradeAllowed: bool
cutoff: int
items: list[ServarrQualityProfileItem] = Field(default_factory=list)
minFormatScore: int
cutoffFormatScore: int
formatItems: list[ServarrFormatItem] = Field(default_factory=list)
class ServarrRootFolder(BaseModel):
"""Servarr 根目录响应项。"""
id: int
path: str
accessible: bool
freeSpace: int
unmappedFolders: list[str] = Field(default_factory=list)
class ServarrTag(BaseModel):
"""Servarr 标签响应项。"""
id: int
label: str
class ServarrLanguage(BaseModel):
"""Servarr 语言定义。"""
id: int
name: str
class ServarrLanguageProfileItem(BaseModel):
"""Servarr 语言配置中的可选语言项。"""
id: int
language: ServarrLanguage
allowed: bool
class ServarrLanguageProfile(BaseModel):
"""Servarr 语言配置响应项。"""
id: int
name: str
upgradeAllowed: bool
cutoff: ServarrLanguage
languages: list[ServarrLanguageProfileItem] = Field(default_factory=list)
class ServarrIdResponse(BaseModel):
"""Servarr 新增资源后返回的资源标识。"""
id: int
class ServarrImage(BaseModel):
"""Servarr 媒体图片。"""
coverType: Optional[str] = None
url: Optional[str] = None
remoteUrl: Optional[str] = None
class SonarrStatistics(BaseModel):
"""Sonarr 剧集或季度统计信息。"""
seasonCount: Optional[int] = None
episodeFileCount: Optional[int] = None
episodeCount: Optional[int] = None
totalEpisodeCount: Optional[int] = None
sizeOnDisk: Optional[int] = None
releaseGroups: list[str] = Field(default_factory=list)
percentOfEpisodes: Optional[float] = None
nextAiring: Optional[str] = None
previousAiring: Optional[str] = None
class SonarrSeason(BaseModel):
"""Sonarr 季度监控信息。"""
seasonNumber: Optional[int] = None
monitored: bool = False
statistics: Optional[SonarrStatistics] = None
images: list[ServarrImage] = Field(default_factory=list)
class SonarrRatings(BaseModel):
"""Sonarr 剧集评分信息。"""
votes: Optional[int] = None
value: Optional[float] = None
class RadarrMovie(BaseModel):
"""Radarr 兼容接口的电影结构。"""
id: Optional[int] = None
title: Optional[str] = None
year: Optional[str | int] = None
@@ -20,6 +197,8 @@ class RadarrMovie(BaseModel):
class SonarrSeries(BaseModel):
"""Sonarr 兼容接口的剧集结构。"""
id: Optional[int] = None
title: Optional[str] = None
sortTitle: Optional[str] = None
@@ -28,9 +207,9 @@ class SonarrSeries(BaseModel):
overview: Optional[str] = None
network: Optional[str] = None
airTime: Optional[str] = None
images: list = Field(default_factory=list)
images: list[ServarrImage] = Field(default_factory=list)
remotePoster: Optional[str] = None
seasons: list = Field(default_factory=list)
seasons: list[SonarrSeason] = Field(default_factory=list)
year: Optional[str | int] = None
path: Optional[str] = None
profileId: Optional[int] = None
@@ -49,11 +228,11 @@ class SonarrSeries(BaseModel):
cleanTitle: Optional[str] = None
titleSlug: Optional[str] = None
certification: Optional[str] = None
genres: list = Field(default_factory=list)
tags: list = Field(default_factory=list)
genres: list[str] = Field(default_factory=list)
tags: list[int] = Field(default_factory=list)
added: Optional[str] = None
ratings: Optional[dict] = None
ratings: Optional[SonarrRatings] = None
qualityProfileId: Optional[int] = None
statistics: dict = Field(default_factory=dict)
statistics: SonarrStatistics = Field(default_factory=SonarrStatistics)
isAvailable: Optional[bool] = False
hasFile: Optional[bool] = False