Changelog
Check out what changed recently in AIO Webtoon Downloader.
📖 Changelog
All notable changes to AIO Webtoon & Light Novel Downloader are documented here. Only the latest entry is shown in the README; the full history lives in this file.
05.24.26
Merged Thundia2's fork with Electron UI:
- Added the Electron desktop UI under
UI-source/, including Download, Search, Queue, Logs, Library, and Settings tabs, Vite development tooling, Electron packaging scripts, installer resources, and synced in-app docs. - Added cross-site search, multi-source chapter fallback, official-publisher detection, image-quality source ranking, and the supporting CLI/config utilities (
aio_search_cli.py,aio_config.py,aio_config.json,sites/search_orchestrator.py,sites/chapter_merger.py,sites/quality_seed.json).
Site handlers and download engine:
- Added or integrated handlers and helpers for KappaBeast, Line Webtoon, MangaGo, MangaFire async VRF batching, shared image IO, publisher metadata, and expanded Madara/MangaThemesia site support.
- Integrated the merged May 2026 site fixes: dedicated KappaBeast Strapi API support, reduced zendriver browser spawning for KingOfShojo-style sites,
browser.stop()timeout protection, and updated site status notes for MangaBuddy, RageScans, ManhwaRead/MGRead, and ZeroScans. - Removed the committed KappaBeast API key; the handler now uses the public Strapi API by default and dynamically discovers the frontend
X-API-Keyonly if the API starts rejecting unauthenticated requests. - Updated core downloader, REST API, library state, and existing handlers for search metadata, chapter merging, source fallback, image quality data, and current site behavior.
Docs, tests, and release tooling:
- Added GitHub workflows, development requirements, pytest configuration, merge regression tests, search/handler tests, and download test harnesses.
- Updated README, supported-sites docs, NSFW docs, requirements, packaging assets, icons, and migration/metadata CLI utilities for the merged feature set.
05.09.26
Atsumaru (sites/atsumaru.py):
- Fixed chapters 11–33 being silently skipped on adult manga with more than 20 chapters (e.g.
csh9). The/api/manga/pageendpoint only returns the newest 10 and oldest 10 chapters in its initial response, hiding the middle ones behind a "Show All" button. - The downloader now uses the
/api/manga/allChaptersendpoint as the primary fallback, which returns every chapter in a single response without pagination gaps. The previousindex-based pagination through/api/manga/pageis retained as a last resort.
MangaFire VRF (sites/mangafire_vrf_simple.py):
- Fixed
It looks like you are using Playwright Sync API inside the asyncio looperror that occurred when the MangaFire VRF generator was used after zendriver's CF cookie solver (crawlee_utils.get_cf_session) ran in the same process. The asyncio running-loop reference is now cleared before every VRF call, not just on first initialization.
05.08.26
Comix (sites/comix.py):
- Fixed a bug where
comix.tofailed to download chapters because of an API shift fromv2tov1. The scraper now natively cascades from v1 to v2 endpoints across context fetching, chapter listing, and image parsing. - Refactored API status code matching to accept either integer
200or string"ok", and abstracted group parsing schema definitions to correctly parse bothgroupandscanlation_groupdynamically from either API version. - Image fetching now relies natively on the new
/api/v1/chapters/{id}endpoint to extract page URLs dynamically rather than depending on regex extraction from the chapter HTML, while retaining the robust HTML regex fallback forv2endpoints.
05.07.26
ManhwaRead Support (sites/manhwaread.py, sites/__init__.py):
- Added a dedicated
ManhwaReadHandlerto handlemanhwaread.com's unique Base64-encoded image data structure. - Implemented automatic Base64 padding correction to resolve "Incorrect padding" errors on certain chapters.
- Optimized title and chapter list extraction with site-specific selectors.
Image Downloader & Referer Fix (aio-dl.py):
- Modified the image download logic to pass the
Refererheader from the main scraper session to the individual image requests. This resolves 403 Forbidden errors on CDNs likemanread.xyzthat enforce hotlink protection.
Atsumaru (sites/atsumaru.py):
- Fixed a bug where adult-content manga would fail with "No chapters selected" because the dedicated
/api/manga/chaptersendpoint returns an empty list without an authenticated session. - The downloader now uses a two-stage fallback: it extracts the first batch of chapters embedded in the
/api/manga/pageresponse, and pages through the rest using theindexoffset parameter. - Handled edge cases where adult chapters return non-numeric titles instead of chapter numbers, preventing them from being silently skipped during filtering.
Bug Fixes (aio-dl.py, gui.py):
- Fixed a crash (
Invalid size format: NONE) that occurred when resuming or updating series with blank split settings; the GUI no longer accidentally translates empty parameters into the literal string"None". - Improved parameter loading in
gui.pyto correctly handlenullJSON values across all inputs (split, site, cookies). - Added strict fallback safeguards to
aio-dl.pyparsers (parse_size,parse_aspect_ratio) so they explicitly ignore"NONE"strings to prevent similar edge-case crashes.
04.14.26
Volume downloading (sites/, aio-dl.py, gui.py, api.py):
- Added a
--download-volumesflag to the CLI and a matching checkbox in the GUI to fetch volumes instead of chapters on supported sites (like MangaFire) - The existing
--chaptersrange filter applies natively to volumes when this mode is toggled (e.g.--chapters 1-5downloads volumes 1-5) - Expanded the
/api/chaptersREST endpoint to support an optional?type=volumeparameter
Hindsight metadata editing (metadata_editor.py, metadata_dialog.py, gui.py):
- Added an "Edit Metadata" button to the GUI Library tab, enabling retroactive metadata modification for previously downloaded series
- Included a dedicated metadata editor script to safely rewrite internal metadata for CBZ (
ComicInfo.xml), EPUB (content.opf), and PDF (pypdfDocument Properties) in place - Added support for seamlessly replacing the cover image inside downloaded archives (injecting into ZIP or prepending as a new PDF page)
- Provided a toggle to instantly apply the new metadata and cover across all individual chapters and volumes in a series folder
- Implemented an animated indeterminate progress wheel to visually indicate background save operations
04.09.26
Group selection safety (sites/base.py, aio-dl.py):
- Normalized scanlation-group matching so case, spacing, punctuation, and common
officiallabel variants no longer cause false mismatches - If a requested scanlation group is not present for a chapter, the downloader now falls back to the highest-upvoted available release and reports the affected chapters at the end instead of switching silently
- Added
--no-group-fallbackfor users who want strict group-only downloads with skipped missing chapters - Updated
--mix-by-upvoteso it only compares releases from the groups explicitly allowed by the user - Added verbose reporting plus an end-of-run notice for chapters that fell back to another scanlation group
Tests & docs:
- Added focused unit tests covering normalized group matching,
officialaliases, fallback behavior, strict no-fallback behavior, andmix-by-upvotefiltering - Updated CLI/README help text to document both the default fallback behavior and the new strict no-fallback option
04.04.26
New features:
- REST API (
api.py): Implemented FastAPI-based REST backend allowing users to retrieve comic metadata, active chapters, and image contents programmatically. Includes auto-cleanup logic and Cloudflare bypass capability sharing. (Thanks to @norphiil!) - Comix token capture & API fix: Resolved the "0 chapters" download failure by implementing a Playwright-based URL token capture. This automatically bypasses
comix.to's newly obfuscated JavaScript API requirements by generating the correcttimeand_query parameters, ensuring chapter lists and images load reliably again.
Fixes:
- MangaFire VRF: Fixed a crash caused by stale running event loops blocking Playwright's Sync API initialization in the
mangafire_vrf_simple.pygenerator. (Thanks to XCSTech!)
03.21.26
AsuraScans (sites/asura.py) — full rewrite:
- Rewrote handler for the new asurascans.com site structure; added
asurascans.comdomain - Switched URL path from
/series/to/comics/; oldself.__next_f.pushflight-data parsing removed - Chapter list now extracted from HTML
<a>tags; images from embedded RSC (React Server Components) props JSON with regex CDN fallback - Verified image extraction matches Chrome browser (21, 17, 14 images across 3 test chapters — all exact matches)
zendriver Cloudflare cookie fix (sites/crawlee_utils.py):
- Fixed
KeyError: 'sameParty'crash in zendriver's CDP cookie retrieval — Chrome removed the deprecatedsamePartyfield, but zendriver'sCookie.from_json()still required it. This causedbrowser.cookies.get_all()to silently hang, returning zero cookies and leaving the Chrome process open indefinitely - Added module-level monkey-patch for
Cookie.from_jsonthat defaultssamePartytoFalse - Added overall
asyncio.wait_fortimeout (45s) and Chrome process force-kill to_solve_cf_asyncto prevent abandoned browser windows
Comix (sites/comix.py):
- Fixed "No chapters selected" bug — the language filter used
item.get("language") != language, which silently dropped chapters that had nolanguagefield (sinceNone != "en") - Language comparison is now case-insensitive and matches long-form names (e.g.
"English"matches"en") - Added CF-aware requests (
_cf_aware_request) — all API and page fetches now auto-fall back to a zendriver CF session on Cloudflare 403, since comix.to added Cloudflare protection
03.08.26
Anti-bot infrastructure (sites/crawlee_utils.py — new module):
- Added
fetch_html_impit()— Chrome/Firefox TLS impersonation viaimpit; handles zstd/brotli compression transparently without launching a browser - Added
get_cf_session()— zendriver-based Cloudflare challenge solver; launches visible Chrome once, solves CF Managed Challenge, capturescf_clearancecookie (~10s), then reuses a lightweightrequests.Sessionfor all subsequent calls (cached per domain, 25-min TTL) - Added
fetch_html_with_cf_cookies()— convenience wrapper aroundget_cf_sessionfor one-shot HTML fetches - Added
impitandzendrivertorequirements.txt
Cloudflare bypass rollout:
- Madara (
madara.py):MadaraSiteHandler.__init__now acceptsuse_zendriver=True; all three fetch paths (fetch_comic_context,_parse_chapters/_load_ajax_chapters,get_chapter_images) transparently route throughget_cf_sessionwhen enabled; added automatic CF-detection fallback for non-zendriver sites (short HTML, "just a moment" strings, 403/429/503 status) - MangaThemesia (
mangathemesia.py): addeduse_zendriverparameter mirroring the Playwright path; all three fetch points usefetch_html_with_cf_cookies;_fetch_series_metadata_via_apiuses CF session whenuse_zendriver=True - WebtoonXYZ (
webtoonxyz.py): switched from the plain Madara entry inmadara_extra_sites.pyto the dedicatedWebtoonXYZSiteHandlerwithuse_zendriver=True; removed the duplicate generic Madara entry that was shadowing the custom handler - KingOfShojo, KappaBeast, RageScans (
mangathemesia_sites.py): addeduse_zendriver: Trueto their site configs - LikeManga (
likemanga.py): all three fetch paths now go directly throughfetch_html_with_cf_cookies/get_cf_session; removed the old cloudscraper-based paths - MangaFire (
mangafire.py):fetch_comic_contextusesfetch_html_with_cf_cookies; chapter-list and image AJAX calls useget_cf_session-backed session instead ofmake_request __init__.py: forwardsuse_zendriverfrom site config dict toMangaThemesiaSiteHandler; removed duplicateMangaFireSiteHandlerimport
Site handler rewrites & fixes:
- ZeroScans (
zeroscans.py): full rewrite from REST API (zscans.com) to HTML scraping on the new domainzeroscann.com; HTML pagination replaces API pagination; chapter links scraped from<a href*="/chapter-">anchors; image extraction from<img>tags filtered by CDN URL pattern - Manganato (
manganato.py): added_impit_get()helper for Chrome-impersonated fetches;fetch_comic_contextandget_chapter_imagesnow use impit with cloudscraper fallback; added_fetch_chapters_api()using the/api/manga/{slug}/chapters?limit=-1JSON endpoint as primary chapter source (handles zstd); HTML fallback retained for legacy domains - WeebCentral (
weebcentral.py): chapter-list and image-list fetches now fall back tofetch_html_impitwhen cloudscraper returns 403/429/503 or raises (zstd compression fix) - AssortedScans (
assortedscans.py): primary image fetch path usesfetch_html_impitfor all per-page requests; cloudscraper loop retained as fallback - Kagane (
kagane.py): updated API base toyuzuki.kagane.org, endpoint paths to/api/v2/; added integrity-token fetch (/api/integrity) andx-integrity-tokenheader injection into DRM challenge POST; updated thumbnail URL template - ErosScans (
mangathemesia_sites.py): migrated primary domain fromerosvoid.xyztoerosxsun.xyz
MangaThemesia enhancements:
- Added
/read/+chapter-anchor fallback for sites (e.g. nikatoons) that place chapter links outside standard MangaThemesia containers; deduplication by chapter number applied - Added
img[src*='/uploads/']fallback image selector for Next.js-injected pages (e.g. nikatoons) - Extended reader selectors to include
#readerArea(capital A) variant - Removed stale
import re/from urllib.parse import urljoininline imports; moved to top-level
Removals:
- Deleted
sites/batoto.pyandsites/bato_mirrors.py(bato.to and all mirrors shut down permanently) - Deleted
sites/mangapark.py(mangapark domain bounces endlessly; confirmed offline) - Removed
BatoToSiteHandlerandMangaParkSiteHandlerfrom__init__.py
03.07.26
New features:
- GUI (
gui.py): full Tkinter-based graphical interface with Download, Library, and Output tabs; shows chapter counts, file sizes, and cover images; supports triggering updates from the UI - Parallel batch downloads (
--jobs N): download multiple series concurrently across coordinated worker processes with shared request pacing, stall detection, and automatic retry - Multi-URL CLI:
comic_urlnow accepts multiple URLs in a single invocation --prompt-urls: enter URLs interactively on stdin- Library auto-update (
--save-params+--update-all): save download settings per series and later update all tracked series in one command - Output directory control:
-o/--output-dir,--epub-dir,--temp-dirfor flexible file placement - Missed chapter retry: automatic end-of-run retry for failed chapters (
--missed-retries,--no-retry-missed-chapters,--missed-log) - Hardened rate limiting (
sites/hardening.py): per-domain configurable request throttling (page, AJAX, image), Cloudflare challenge detection, exponential backoff with jitter - HTTP tuning flags:
--http-timeout,--http-max-retries,--http-backoff-base,--http-backoff-cap - Cross-process coordination flags:
--coord-dir,--net-min-gap,--job-stall-timeout,--job-hard-timeout,--job-retries,--job-spawn-gap - Open-ended chapter ranges:
--chapters "50-"(ch 50 to latest) or--chapters "-10"(up to ch 10) - Safe series folder allocation: prevents parallel workers from mixing files for same-titled series via
.series_hidmarkers
Site fixes & improvements:
- Removed bato.to and mangapark.net (both shut down); added
mpark.tomirror - Asura: per-domain throttling to reduce Cloudflare Turnstile triggers
- FlameComics: fixed image dict ordering, improved build-ID refresh error handling
- Madara-based sites: fallback
ajax/chapters/POST for sites that render chapter links ashref="#"(e.g. utoon.net) - Mangafire: improvements prototyped by Thundia2
- Manhuaplus, Manhuaus, Mangadex: various fixes
- Fixed cookie passthrough
