You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat: Add MyAnimeList as primary manga metadata provider (#113)
* feat: Add MyAnimeList as primary manga metadata provider
MAL provides better search coverage and metadata (titles, images,
synopsis, authors) while MangaDex continues to supply chapter data.
This hybrid approach significantly improves manga library scan match
rates (previously ~39/100+).
Backend:
- New MAL API v2 client (myanimelist.py) with search, details, rate limiting
- MangaDex cross-reference via find_by_mal_id() using links.mal field
- addMangaToDB_MAL() importer fetches MAL metadata + MangaDex chapters
- Service layer routes search/add through MAL when enabled, falls back to MangaDex
- Image proxy endpoint for MAL CDN covers (CORS/SSRF-safe allowlist)
- MangaDexID/MalID columns on comics table for cross-provider detection
- Improved fuzzy matching: normalize titles, SequenceMatcher + Jaccard + containment
- Fix NoneType crash in find_comic when ComicVine API key missing
Frontend:
- MAL settings UI (enable toggle + Client ID field) in API settings
- "MAL" source label badge on search results
- Helpful "Comic Vine API key required" message instead of generic error
- Search mode derived from URL params (fixes refresh defaulting to Comics)
- Delete series redirects to /series instead of /
- Fix horizontal overflow: min-w-0 on main layout, truncated series/author columns
- Remove redundant Library column from search results
- Column toggle button portaled next to sort controls
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: CI failures — ruff format mangasync.py, use callback ref for portal
- ruff format on mangasync.py (line length)
- Replace useRef with callback ref + state for column toggle portal
to satisfy react-hooks/refs lint rule (no ref access during render)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: Address code review findings (P1/P2 security, logic, standards)
Security:
- Image proxy: validate URL scheme (http/https only), reject userinfo
in URLs, pin Content-Type to image allowlist, disable redirects
- MAL Client ID: remove from safe_keys (use boolean indicator instead),
change settings field to password type
- Move `import requests` to module level in router.py
Logic:
- find_manga/add_manga gate on MAL_ENABLED || MANGADEX_ENABLED (not just MangaDex)
- MAL empty results no longer silently fall through to MangaDex
- Safe int conversion for num_chapters (int(float()) + try/except)
- isManga check includes mal- prefix on SeriesDetailPage
- mangaEnabled considers mal_enabled in useContentSources
- Validate URL type param instead of unsafe cast
- MAL settings visible independently of MangaDex toggle
Standards:
- bare except → except Exception as e with logging
- datetime import moved to module level in myanimelist.py
- Config type: add mal_enabled, mal_client_id, mal_client_id_set fields
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
0 commit comments