Add AniList resolver as MAL fallback; fix SeriesGroup, tag formatting, empty-cache bug

This commit is contained in:
2026-05-23 22:35:08 +02:00
parent ec1342d146
commit b8f897fa2e
6 changed files with 730 additions and 72 deletions
+25 -11
View File
@@ -55,6 +55,7 @@ from ComicInfoBuilder import ComicInfoBuilder
from MangadexVolumeResolver import MangaDexVolumeResolver
from MangaBakaWorksResolver import MangaBakaWorksResolver
from MALResolver import MALResolver
from AniListResolver import AniListResolver
from KavitaPersonUpdater import KavitaPersonUpdater
@@ -133,14 +134,7 @@ def _clean_suwayomi_title(title: str) -> str:
def _mal_id_from_metadata(md: dict) -> "int | None":
"""
Extracts the MAL ID directly from a MangaBaka series dict.
MangaBaka stores tracker IDs in md["source"], e.g.:
{"myanimelist": {"id": 121480}, "mangadex": {"id": "..."}, ...}
Returns the integer MAL ID, or None if not present.
"""
"""Extracts the MAL ID from a MangaBaka series dict's source map."""
for raw_key, info in (md.get("source") or {}).items():
if re.sub(r"[^a-z0-9]", "", raw_key.lower()) in ("myanimelist", "mal"):
if isinstance(info, dict):
@@ -153,6 +147,20 @@ def _mal_id_from_metadata(md: dict) -> "int | None":
return None
def _al_id_from_metadata(md: dict) -> "int | None":
"""Extracts the AniList ID from a MangaBaka series dict's source map."""
for raw_key, info in (md.get("source") or {}).items():
if re.sub(r"[^a-z0-9]", "", raw_key.lower()) == "anilist":
if isinstance(info, dict):
al_id = info.get("id")
if al_id is not None:
try:
return int(al_id)
except (TypeError, ValueError):
pass
return None
def _extract_chapter_num(folder_name: str) -> "str | None":
"""
Fallback: extracts chapter number from the folder name.
@@ -239,6 +247,7 @@ class SuwayomiMover:
self._session = session
self._mal = MALResolver(request_timeout=request_timeout)
self._al = AniListResolver(request_timeout=request_timeout)
self._vol_resolver = MangaDexVolumeResolver(
request_timeout=request_timeout, session=session)
self._works_resolver = MangaBakaWorksResolver(
@@ -249,6 +258,7 @@ class SuwayomiMover:
self._person_updater = KavitaPersonUpdater(
kavita_base_url, kavita_api_key,
mal_resolver=self._mal,
al_resolver=self._al,
request_timeout=request_timeout)
# ------------------------------------------------------------------
@@ -333,6 +343,7 @@ class SuwayomiMover:
volume_resolver=self._vol_resolver,
works_resolver=self._works_resolver,
mal_resolver=self._mal,
al_resolver=self._al,
)
# Fetch MangaBaka metadata now to get the canonical title and MAL ID.
@@ -358,14 +369,17 @@ class SuwayomiMover:
print(f" Chapter {chapter_num}: {status}")
# Sync Kavita persons once per series.
# MAL ID comes directly from MangaBaka; no extra Jikan title search needed.
# Both MAL and AniList IDs come from MangaBaka's source map;
# AniList is used as fallback when MAL returns no characters/staff.
person_result: "dict | None" = None
if self._person_updater:
mal_id = (_mal_id_from_metadata(md) if md else None
or self._mal.find_mal_id(builder_title))
if mal_id:
al_id = _al_id_from_metadata(md) if md else None
if mal_id or al_id:
try:
person_result = self._person_updater.update_for_manga(mal_id)
person_result = self._person_updater.update_for_manga(
mal_id, al_manga_id=al_id)
print(f" Persons: chars={person_result['characters'].get('updated')} "
f"staff={person_result['staff'].get('updated')}")
except Exception as exc: