From fc18b9718b60e7d0570993cb85e1acb119ca3590 Mon Sep 17 00:00:00 2001 From: kodi Date: Mon, 9 Mar 2026 09:46:10 +0100 Subject: [PATCH] feat (ui): toevoegen van banner en series info - afgerond --- app/api/tvdb.py | 66 +++++++++++++++++++++++++++++-------- data/session_state.sqlite3 | Bin 69632 -> 69632 bytes 2 files changed, 52 insertions(+), 14 deletions(-) diff --git a/app/api/tvdb.py b/app/api/tvdb.py index c972356..78b863e 100644 --- a/app/api/tvdb.py +++ b/app/api/tvdb.py @@ -107,9 +107,34 @@ def _status_name(value) -> str | None: return None -def _pick_banner_url(artworks: list[dict]) -> str | None: - banner_candidates = [] - fallback_candidates = [] +def _fetch_artwork_type_labels(client: TvdbClient) -> dict[int, str]: + payload = client.get("/artwork/types") + items = payload.get("data", []) if isinstance(payload, dict) else [] + labels: dict[int, str] = {} + + for item in items: + if not isinstance(item, dict): + continue + type_id = item.get("id") + try: + type_id = int(type_id) + except (TypeError, ValueError): + continue + label = ( + item.get("slug") + or item.get("name") + or "" + ) + label = label.lower().strip() if isinstance(label, str) else "" + labels[type_id] = label + + return labels + + +def _pick_banner_url(artworks: list[dict], artwork_type_labels: dict[int, str]) -> str | None: + strict_banner_candidates = [] + wide_fallback_candidates = [] + generic_wide_candidates = [] for artwork in artworks: if not isinstance(artwork, dict): @@ -133,19 +158,31 @@ def _pick_banner_url(artworks: list[dict]) -> str | None: ratio = (width / height) if width > 0 and height > 0 else 0.0 record = (score, width, image.strip()) + type_label = "" + try: + artwork_type = int(artwork.get("type")) + type_label = artwork_type_labels.get(artwork_type, "") + except (TypeError, ValueError): + type_label = "" - if ratio >= 1.4: - banner_candidates.append(record) - else: - fallback_candidates.append(record) + if "banner" in type_label: + strict_banner_candidates.append(record) + elif any(token in type_label for token in ("fanart", "background", "landscape")): + wide_fallback_candidates.append(record) + elif ratio >= 1.4: + generic_wide_candidates.append(record) - if banner_candidates: - banner_candidates.sort(key=lambda x: (x[0], x[1]), reverse=True) - return banner_candidates[0][2] + if strict_banner_candidates: + strict_banner_candidates.sort(key=lambda x: (x[0], x[1]), reverse=True) + return strict_banner_candidates[0][2] - if fallback_candidates: - fallback_candidates.sort(key=lambda x: (x[0], x[1]), reverse=True) - return fallback_candidates[0][2] + if wide_fallback_candidates: + wide_fallback_candidates.sort(key=lambda x: (x[0], x[1]), reverse=True) + return wide_fallback_candidates[0][2] + + if generic_wide_candidates: + generic_wide_candidates.sort(key=lambda x: (x[0], x[1]), reverse=True) + return generic_wide_candidates[0][2] return None @@ -162,8 +199,9 @@ def get_series_summary(series_id: int): artworks = extended_data.get("artworks") artworks = artworks if isinstance(artworks, list) else [] + artwork_type_labels = _fetch_artwork_type_labels(client) - banner_url = _pick_banner_url(artworks) + banner_url = _pick_banner_url(artworks, artwork_type_labels) poster_url = ( base_data.get("image") or extended_data.get("image") diff --git a/data/session_state.sqlite3 b/data/session_state.sqlite3 index 3ef3d5b4ac51e97963458f60504af91ff1e0e4aa..0194c4a6dd65daca9f475d214c0758b457af1b72 100644 GIT binary patch delta 260 zcmZozz|ydQWr8$g#Y7or#)^#z^Yu9lxfmE2RJp`9vm5YpNlUSqb1;@>>KdAx8ylFI znwuM1nwsjGm|2<_ZZ@>K%*w3FWxbi*!GudrlGz-GLXga4#m%Cd^Sq|HGK(_yPG+B= z#n`)XVl<;pqrV{=gE>c2DONkGl`>P5tQ0KFEDekd%_kR4wwatiUCF~EH76%uQAtNZ zDKWDs6{JGR2&h2U&_LI~93-5Rn3S3W5)L*nbTu$i&{cqF0Wy#j)^3iUw6GQc6oEk= delta 81 zcmV-X0IvUlpag)R1dtm6caa=J0e7)rpDzJ0l3-G^QZU2`k)Rv1F*?%)lLT;1vr<6m n36Y>0lRHWZlV5rdvu;Y3MFSK9Uy}!rDgkP-ku3tVUy`AHvn(Bu