feat (ui): toevoegen van banner en series info - 01

This commit is contained in:
kodi
2026-03-09 09:32:28 +01:00
parent 1e946f675b
commit d3cf97d56d
3 changed files with 155 additions and 9 deletions
+107
View File
@@ -97,6 +97,113 @@ def _fetch_aired_episodes(client: TvdbClient, series_id: int) -> list[dict]:
)
def _status_name(value) -> str | None:
if isinstance(value, dict):
name = value.get("name")
if isinstance(name, str) and name.strip():
return name.strip()
if isinstance(value, str) and value.strip():
return value.strip()
return None
def _pick_banner_url(artworks: list[dict]) -> str | None:
banner_candidates = []
fallback_candidates = []
for artwork in artworks:
if not isinstance(artwork, dict):
continue
image = artwork.get("image") or artwork.get("thumbnail")
if not isinstance(image, str) or not image.strip():
continue
width = artwork.get("width")
height = artwork.get("height")
score = artwork.get("score") or 0
try:
width = int(width) if width is not None else 0
height = int(height) if height is not None else 0
except (TypeError, ValueError):
width, height = 0, 0
try:
score = float(score)
except (TypeError, ValueError):
score = 0.0
ratio = (width / height) if width > 0 and height > 0 else 0.0
record = (score, width, image.strip())
if ratio >= 1.4:
banner_candidates.append(record)
else:
fallback_candidates.append(record)
if banner_candidates:
banner_candidates.sort(key=lambda x: (x[0], x[1]), reverse=True)
return banner_candidates[0][2]
if fallback_candidates:
fallback_candidates.sort(key=lambda x: (x[0], x[1]), reverse=True)
return fallback_candidates[0][2]
return None
@router.get("/series/{series_id}/summary")
def get_series_summary(series_id: int):
client = TvdbClient()
try:
extended_payload = client.get(f"/series/{series_id}/extended")
base_payload = client.get(f"/series/{series_id}")
extended_data = extended_payload.get("data", {}) if isinstance(extended_payload, dict) else {}
base_data = base_payload.get("data", {}) if isinstance(base_payload, dict) else {}
artworks = extended_data.get("artworks")
artworks = artworks if isinstance(artworks, list) else []
banner_url = _pick_banner_url(artworks)
poster_url = (
base_data.get("image")
or extended_data.get("image")
or None
)
first_aired = (
extended_data.get("firstAired")
or base_data.get("firstAired")
or None
)
network = (
extended_data.get("latestNetwork", {}).get("name")
if isinstance(extended_data.get("latestNetwork"), dict)
else None
) or extended_data.get("network") or base_data.get("network")
status = _status_name(extended_data.get("status")) or _status_name(base_data.get("status"))
overview = (
extended_data.get("overview")
or base_data.get("overview")
or None
)
slug = extended_data.get("slug") or base_data.get("slug")
tvdb_id = extended_data.get("id") or base_data.get("id") or series_id
return {
"id": tvdb_id,
"banner_url": banner_url,
"poster_url": poster_url,
"first_aired": first_aired,
"network": network,
"status": status,
"overview": overview,
"slug": slug,
"tvdb_url": f"https://www.thetvdb.com/series/{slug}" if slug else None,
}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.get("/series/{series_id}/episodes")
def get_series_episodes(
series_id: int,