Add AniList resolver as MAL fallback; fix SeriesGroup, tag formatting, empty-cache bug
This commit is contained in:
+25
-11
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user