From 78878927378a08646f83a2f2675384ed686440df Mon Sep 17 00:00:00 2001 From: JohannesBOT Date: Tue, 26 May 2026 21:09:31 +0200 Subject: [PATCH] matches.json changed image from full res to low res --- src/ComicInfoBuilder.py | 34 +++++++++++++++++++++++++++++++++- src/MatchesWebApp.py | 4 ++-- src/SuwayomiMover.py | 4 ++-- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/ComicInfoBuilder.py b/src/ComicInfoBuilder.py index 6f1eb3b..9336db7 100644 --- a/src/ComicInfoBuilder.py +++ b/src/ComicInfoBuilder.py @@ -400,7 +400,7 @@ class ComicInfoBuilder: title, mangabaka_id=series.get("id"), mangabaka_name=series.get("title") or "", - image_url=_pick_cover_url(series.get("cover")), + image_url=_pick_thumbnail_url(series.get("cover")), ) return series @@ -1053,6 +1053,38 @@ def _pick_cover_url(cover) -> "str | None": return None +def _pick_thumbnail_url(cover) -> "str | None": + """ + Picks a small cover variant suitable for a UI thumbnail. + + Order of preference: x150@x2 > x150@x1 > x150@x3 > x250@x2 > x250@x1 > + x250@x3 > x350@x2 > x350@x1 > x350@x3 > raw. x150@x2 is roughly 300px + wide — sharp on HiDPI displays at the ~90px thumbnail size used in + the matches table, while still being a fraction of the raw image + weight (often 50KB vs. several MB). + + Falls back to `_pick_cover_url` if no thumbnail variant is available. + """ + if not cover: + return None + if isinstance(cover, str): + return cover + if not isinstance(cover, dict): + return None + + for size_key in ("x150", "x250", "x350"): + variant = cover.get(size_key) + if isinstance(variant, dict): + for density in ("x2", "x1", "x3"): + url = variant.get(density) + if isinstance(url, str) and url: + return url + elif isinstance(variant, str) and variant: + return variant + + return _pick_cover_url(cover) + + def _guess_extension(url: str, content_type: str) -> str: url_ext = Path(url.split("?")[0]).suffix.lower() if url_ext in _IMAGE_EXTS: diff --git a/src/MatchesWebApp.py b/src/MatchesWebApp.py index 1884da0..a69a194 100644 --- a/src/MatchesWebApp.py +++ b/src/MatchesWebApp.py @@ -29,7 +29,7 @@ import threading from flask import Flask, jsonify, request, Response from MatchesCache import MatchesCache -from ComicInfoBuilder import _pick_cover_url +from ComicInfoBuilder import _pick_thumbnail_url _INDEX_HTML = """ @@ -427,7 +427,7 @@ class MatchesWebApp: f"MangaBaka has no series with id {new_id}", status=404) new_name = series.get("title") or "" - new_image = _pick_cover_url(series.get("cover")) or "" + new_image = _pick_thumbnail_url(series.get("cover")) or "" entry = cache.upsert( title, diff --git a/src/SuwayomiMover.py b/src/SuwayomiMover.py index fe44a35..33cba4d 100644 --- a/src/SuwayomiMover.py +++ b/src/SuwayomiMover.py @@ -51,7 +51,7 @@ from pathlib import Path import requests -from ComicInfoBuilder import ComicInfoBuilder, _pick_cover_url, _SEARCH_TYPES +from ComicInfoBuilder import (ComicInfoBuilder, _pick_cover_url, _pick_thumbnail_url, _SEARCH_TYPES) from MangadexVolumeResolver import MangaDexVolumeResolver from MangaBakaWorksResolver import MangaBakaWorksResolver from MALResolver import MALResolver @@ -438,7 +438,7 @@ class SuwayomiMover: builder_title, mangabaka_id=series.get("id"), mangabaka_name=series.get("title") or "", - image_url=_pick_cover_url(series.get("cover")), + image_url=_pick_thumbnail_url(series.get("cover")), ) except Exception as exc: print(f" [warn] search failed for {builder_title!r}: {exc}")