feat (ui): toevoegen van banner en series info - 01
This commit is contained in:
+107
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user