matches.json changed image from full res to low res
Build and Deploy / build (push) Successful in 22s
Build and Deploy / deploy (push) Successful in 38s

This commit is contained in:
2026-05-26 21:09:31 +02:00
parent 79d64d7ed5
commit 7887892737
3 changed files with 37 additions and 5 deletions
+33 -1
View File
@@ -400,7 +400,7 @@ class ComicInfoBuilder:
title, title,
mangabaka_id=series.get("id"), mangabaka_id=series.get("id"),
mangabaka_name=series.get("title") or "", mangabaka_name=series.get("title") or "",
image_url=_pick_cover_url(series.get("cover")), image_url=_pick_thumbnail_url(series.get("cover")),
) )
return series return series
@@ -1053,6 +1053,38 @@ def _pick_cover_url(cover) -> "str | None":
return 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: def _guess_extension(url: str, content_type: str) -> str:
url_ext = Path(url.split("?")[0]).suffix.lower() url_ext = Path(url.split("?")[0]).suffix.lower()
if url_ext in _IMAGE_EXTS: if url_ext in _IMAGE_EXTS:
+2 -2
View File
@@ -29,7 +29,7 @@ import threading
from flask import Flask, jsonify, request, Response from flask import Flask, jsonify, request, Response
from MatchesCache import MatchesCache from MatchesCache import MatchesCache
from ComicInfoBuilder import _pick_cover_url from ComicInfoBuilder import _pick_thumbnail_url
_INDEX_HTML = """<!doctype html> _INDEX_HTML = """<!doctype html>
@@ -427,7 +427,7 @@ class MatchesWebApp:
f"MangaBaka has no series with id {new_id}", f"MangaBaka has no series with id {new_id}",
status=404) status=404)
new_name = series.get("title") or "" 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( entry = cache.upsert(
title, title,
+2 -2
View File
@@ -51,7 +51,7 @@ from pathlib import Path
import requests 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 MangadexVolumeResolver import MangaDexVolumeResolver
from MangaBakaWorksResolver import MangaBakaWorksResolver from MangaBakaWorksResolver import MangaBakaWorksResolver
from MALResolver import MALResolver from MALResolver import MALResolver
@@ -438,7 +438,7 @@ class SuwayomiMover:
builder_title, builder_title,
mangabaka_id=series.get("id"), mangabaka_id=series.get("id"),
mangabaka_name=series.get("title") or "", 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: except Exception as exc:
print(f" [warn] search failed for {builder_title!r}: {exc}") print(f" [warn] search failed for {builder_title!r}: {exc}")