Files
goyomi/docs/phase4-standalone.md
T
achmad 71ef2d24fa fix: update HTTP client to flare for Batch 4 sources
Based on Kotlin reference verification:
- madtheme, mangabox, mangacatalog, mangahub → flare

Also updated phase4-standalone.md with project requirement for
checking HTTP client type when porting sources from Kotlin
2026-05-13 21:35:10 +07:00

673 lines
18 KiB
Markdown
Executable File

# Phase 4 — Standalone Sources
Complete port checklist. Check a box when the source passes a basic smoke test
(popular/latest list returns ≥1 result, or detail+pages resolve for a known URL).
Reference:
- `/Users/achmad/Documents/Belajar/Android/extensions-source/src/all/`
- `/Users/achmad/Documents/Belajar/Android/extensions-source/src/en/`
Detailed implementation notes for complex sources are in the **Notes** section at the bottom.
---
## `sources/all/` — 125 sources
- [ ] `all/ahottie`
- [ ] `all/akuma`
- [ ] `all/allporncomicsco`
- [ ] `all/asmhentai`
- [ ] `all/baobua`
- [ ] `all/beauty3600000`
- [ ] `all/buondua`
- [ ] `all/comicfury`
- [ ] `all/comicgrowl`
- [ ] `all/comicklive`
- [ ] `all/comicskingdom`
- [ ] `all/comicsvalley`
- [ ] `all/comikey`
- [ ] `all/commitstrip`
- [ ] `all/coomer`
- [ ] `all/coronaex`
- [ ] `all/cosplaytele`
- [ ] `all/cubari`
- [ ] `all/danbooru` ⚠️ see notes
- [ ] `all/deviantart`
- [ ] `all/dragonballmultiverse`
- [ ] `all/e621` ⚠️ see notes
- [ ] `all/elitebabes`
- [ ] `all/everiaclub`
- [ ] `all/everiaclubcom`
- [ ] `all/femjoyhunter`
- [ ] `all/foamgirl`
- [ ] `all/foolslidecustomizable`
- [ ] `all/fourkhd`
- [ ] `all/ftvhunter`
- [ ] `all/fuwayomi`
- [ ] `all/globalcomix` ⚠️ see notes
- [ ] `all/grabberzone`
- [ ] `all/hdoujin`
- [ ] `all/hennojin`
- [ ] `all/hentai3`
- [ ] `all/hentaicosplay`
- [ ] `all/hentaienvy`
- [ ] `all/hentaiera`
- [ ] `all/hentaifox`
- [x] `all/hentaihand`
- [ ] `all/hentairox`
- [ ] `all/hentaizap`
- [ ] `all/hniscantrad`
- [ ] `all/holonometria`
- [ ] `all/honeytoon`
- [ ] `all/imhentai`
- [ ] `all/izneo`
- [ ] `all/jjcos`
- [ ] `all/joymiihub`
- [ ] `all/junmeitu`
- [x] `all/kemono` ⚠️ see notes
- [ ] `all/kiutaku`
- [ ] `all/kodokustudio`
- [ ] `all/koharu`
- [ ] `all/komga` ⚠️ see notes
- [ ] `all/lanraragi`
- [ ] `all/leagueoflegends`
- [ ] `all/lunaranime`
- [ ] `all/luscious` ⚠️ see notes
- [ ] `all/magicaltranslators`
- [ ] `all/manga18me`
- [ ] `all/mangaball`
- [ ] `all/mangacrazy`
- [ ] `all/mangadex` ⚠️ see notes
- [ ] `all/mangadraft`
- [ ] `all/mangafire`
- [ ] `all/mangaforfree`
- [ ] `all/mangaplus` ⚠️ see notes
- [ ] `all/mangapluscreators`
- [x] `all/mangataro`
- [ ] `all/mangatoon`
- [ ] `all/mangaup`
- [ ] `all/mango`
- [ ] `all/manhuarm`
- [ ] `all/manhwa18cc`
- [ ] `all/manhwa18net`
- [ ] `all/manhwa18uncensored`
- [ ] `all/manhwaclubnet`
- [ ] `all/manhwadashraw`
- [ ] `all/mayotune`
- [ ] `all/metarthunter`
- [ ] `all/miauscan`
- [ ] `all/misskon`
- [ ] `all/mitaku`
- [ ] `all/myreadingmanga`
- [ ] `all/namicomi`
- [ ] `all/nhentaicom` ⚠️ see notes
- [ ] `all/nhentaixxx`
- [ ] `all/niadd`
- [ ] `all/ninemanga`
- [ ] `all/novelcool`
- [ ] `all/ososedki`
- [ ] `all/pandachaika`
- [ ] `all/peppercarrot`
- [ ] `all/photos18`
- [ ] `all/pixiv` ⚠️ see notes
- [ ] `all/playmatehunter`
- [ ] `all/pornpics`
- [ ] `all/projectsuki`
- [ ] `all/qtoon`
- [ ] `all/rokuhentai`
- [ ] `all/sakuramanhwa`
- [ ] `all/sandraandwoo`
- [ ] `all/seraphicdeviltry`
- [ ] `all/simplycosplay`
- [ ] `all/simplyhentai`
- [ ] `all/stashapp` ⚠️ see notes
- [ ] `all/taddyink`
- [ ] `all/tappytoon`
- [ ] `all/thelibraryofohara`
- [ ] `all/thunderscans`
- [ ] `all/toomics`
- [ ] `all/twicomi`
- [ ] `all/uncensoredmanhwa`
- [ ] `all/vinnieVeritas`
- [ ] `all/webtoons` ⚠️ see notes
- [ ] `all/xarthunter`
- [ ] `all/xasiatalbums`
- [ ] `all/xgmn`
- [ ] `all/xinmeitulu`
- [ ] `all/xiutaku`
- [ ] `all/xkcd`
- [ ] `all/yabai`
- [ ] `all/yaoimangaonline`
- [ ] `all/yellownote`
- [ ] `all/yskcomics`
---
## `sources/en/` — 430 sources
- [ ] `en/akaicomic`
- [ ] `en/alandal`
- [ ] `en/allanime` ⚠️ see notes
- [ ] `en/allporncomic`
- [ ] `en/allporncomicio`
- [ ] `en/anisascans`
- [ ] `en/apcomics`
- [ ] `en/aquamanga`
- [ ] `en/arcrelight`
- [ ] `en/arenascans`
- [ ] `en/armageddon`
- [ ] `en/artlapsa`
- [ ] `en/arvencomics`
- [ ] `en/arvenscans`
- [ ] `en/aryascans`
- [ ] `en/asiatoon`
- [ ] `en/asmotoon`
- [ ] `en/assortedscans`
- [ ] `en/asurascans` ⚠️ see notes
- [ ] `en/athreascans`
- [ ] `en/atsumaru`
- [ ] `en/aurora`
- [ ] `en/azcomic`
- [ ] `en/azuki`
- [ ] `en/baektoons`
- [x] `en/bakkin` ⚠️ see notes
- [ ] `en/bakkinselfhosted`
- [ ] `en/batcave`
- [ ] `en/battleinfivesecondsaftermeeting`
- [ ] `en/beehentai`
- [ ] `en/bookwalker` ⚠️ see notes
- [ ] `en/boratscans`
- [ ] `en/boxmanhwa`
- [ ] `en/broccolisoup`
- [ ] `en/bunmanga`
- [ ] `en/buttsmithy`
- [ ] `en/clonemanga`
- [ ] `en/clowncorps`
- [ ] `en/cmanhua`
- [ ] `en/cocomic`
- [ ] `en/coffeemanga`
- [ ] `en/collectedcurios`
- [ ] `en/comicasura`
- [ ] `en/comiccx`
- [ ] `en/comichubfree`
- [ ] `en/comickfan`
- [ ] `en/comickiba`
- [ ] `en/comicland`
- [ ] `en/comicsland`
- [ ] `en/comix`
- [ ] `en/crowscans`
- [ ] `en/cucumbermanga`
- [ ] `en/culturedworks`
- [ ] `en/cutiecomics`
- [ ] `en/dankefurslesen`
- [ ] `en/darklegacycomics`
- [ ] `en/darkscans`
- [ ] `en/darkscience`
- [ ] `en/darthsdroids`
- [ ] `en/deathtollscans`
- [ ] `en/decadencescans`
- [ ] `en/dflowscans`
- [ ] `en/digitalcomicmuseum`
- [x] `en/divascans`
- [ ] `en/doujinio`
- [ ] `en/doujins`
- [ ] `en/dragontea`
- [ ] `en/drakescans`
- [ ] `en/dynasty`
- [ ] `en/eggporncomics`
- [ ] `en/egscomics`
- [ ] `en/eighteenporncomic`
- [ ] `en/eightmuses`
- [ ] `en/elanschool`
- [ ] `en/elftoon`
- [ ] `en/epicmanga`
- [ ] `en/erisscans`
- [ ] `en/ero18x`
- [ ] `en/erofus`
- [ ] `en/erosscans`
- [ ] `en/evascans`
- [ ] `en/evilflowers`
- [ ] `en/existentialcomics`
- [ ] `en/explosm`
- [ ] `en/ezmanga`
- [ ] `en/fablescans`
- [ ] `en/fairyscans`
- [ ] `en/firescans`
- [ ] `en/flamecomics`
- [ ] `en/frierenonline`
- [ ] `en/gakamangas`
- [ ] `en/galaxydegenscans`
- [ ] `en/galaxymanga`
- [ ] `en/gedecomix`
- [ ] `en/gingertoon`
- [ ] `en/goda`
- [ ] `en/gourmetscans`
- [ ] `en/greedscans`
- [ ] `en/grimscans`
- [ ] `en/grrlpower`
- [ ] `en/gunnerkriggcourt`
- [x] `en/guya` ⚠️ see notes
- [ ] `en/gwtb`
- [ ] `en/hachirumi`
- [ ] `en/hadesscans`
- [ ] `en/harimanga`
- [ ] `en/hentai3zcc`
- [ ] `en/hentai4free`
- [ ] `en/hentaidex`
- [ ] `en/hentaihere`
- [ ] `en/hentaikun`
- [ ] `en/hentainexus`
- [ ] `en/hentairead`
- [ ] `en/hentaireadio`
- [ ] `en/hentaisco`
- [ ] `en/hentaixcomic`
- [ ] `en/hentaixdickgirl`
- [ ] `en/hentaixyuri`
- [ ] `en/hentara`
- [ ] `en/heytoon`
- [x] `en/hijalascans`
- [ ] `en/hiperdex`
- [ ] `en/hiveworks`
- [ ] `en/hm2d`
- [ ] `en/honkaiimpact`
- [ ] `en/hotcomics`
- [ ] `en/hyakuro`
- [ ] `en/infernalvoidscans`
- [ ] `en/infinityscans`
- [ ] `en/irovedout`
- [ ] `en/isekaiscantop`
- [ ] `en/jinmangas`
- [ ] `en/jnovel`
- [ ] `en/kagane`
- [x] `en/kaizenscan`
- [ ] `en/kaliscancom`
- [ ] `en/kaliscanio`
- [ ] `en/kaliscanme`
- [ ] `en/kappabeast`
- [ ] `en/kaynscans`
- [ ] `en/keenspot`
- [ ] `en/kenscans`
- [x] `en/kewnscans`
- [ ] `en/killsixbilliondemons`
- [ ] `en/kingcomix`
- [ ] `en/kingofshojo`
- [ ] `en/kissmangain`
- [ ] `en/kmanga`
- [ ] `en/kodansha`
- [ ] `en/ksgroupscans`
- [ ] `en/kunmanga`
- [ ] `en/kuramanga`
- [ ] `en/lagoonscans`
- [ ] `en/leslievictims`
- [ ] `en/lhtranslation`
- [ ] `en/likemanga`
- [ ] `en/likemangain`
- [ ] `en/lilymanga`
- [ ] `en/linkmanga`
- [ ] `en/loadingartist`
- [ ] `en/luascans`
- [ ] `en/luminaretranslations`
- [x] `en/lunatoons`
- [ ] `en/madaradex`
- [ ] `en/madarascans`
- [ ] `en/madokami`
- [ ] `en/magusmanga`
- [ ] `en/mahouirexnohentaikarte`
- [ ] `en/manga18club`
- [ ] `en/manga18free`
- [ ] `en/manga18fx`
- [ ] `en/manga18x`
- [ ] `en/mangabat`
- [ ] `en/mangablaze`
- [ ] `en/mangabolt`
- [ ] `en/mangabtt`
- [ ] `en/mangabuddy`
- [ ] `en/mangabuddyme`
- [ ] `en/mangaclash`
- [ ] `en/mangacloud`
- [ ] `en/mangacute`
- [ ] `en/mangadass`
- [ ] `en/mangade`
- [ ] `en/mangademon`
- [ ] `en/mangadia`
- [ ] `en/mangadistrict`
- [ ] `en/mangadotnet`
- [ ] `en/mangadrama`
- [ ] `en/mangafab`
- [ ] `en/mangaforest`
- [ ] `en/mangaforfreecom`
- [ ] `en/mangafox`
- [ ] `en/mangafoxfun`
- [ ] `en/mangafreak`
- [ ] `en/mangafree`
- [ ] `en/mangagg`
- [ ] `en/mangago`
- [ ] `en/mangagofun`
- [ ] `en/mangahe`
- [ ] `en/mangahen`
- [ ] `en/mangahentai`
- [ ] `en/mangahere`
- [ ] `en/mangahereonl`
- [ ] `en/mangahubio`
- [ ] `en/mangaka`
- [ ] `en/mangakakalot`
- [ ] `en/mangakakalotfun`
- [ ] `en/mangakatana`
- [ ] `en/mangakiss`
- [ ] `en/mangamaniacs`
- [ ] `en/mangamo`
- [ ] `en/mangamob`
- [ ] `en/mangamonk`
- [ ] `en/manganel`
- [ ] `en/manganelo`
- [ ] `en/manganow`
- [ ] `en/mangaonlinefun`
- [ ] `en/mangaowlio`
- [ ] `en/mangapandaonl`
- [ ] `en/mangapill`
- [ ] `en/mangapuma`
- [ ] `en/mangarawclub`
- [ ] `en/mangaread`
- [ ] `en/mangareadercc`
- [ ] `en/mangareadersite`
- [ ] `en/mangareadorg`
- [ ] `en/mangasaga`
- [ ] `en/mangasect`
- [ ] `en/mangaspin`
- [ ] `en/mangasushi`
- [ ] `en/mangatellers`
- [ ] `en/mangatoday`
- [ ] `en/mangatown`
- [ ] `en/mangatrend`
- [ ] `en/mangatx`
- [ ] `en/mangaxyz`
- [ ] `en/manhuafast`
- [ ] `en/manhuafastnet`
- [ ] `en/manhuahot`
- [ ] `en/manhuanext`
- [ ] `en/manhuanow`
- [ ] `en/manhuaplus`
- [ ] `en/manhuaplusorg`
- [ ] `en/manhuarush`
- [ ] `en/manhuascanus`
- [ ] `en/manhuasite`
- [ ] `en/manhuatop`
- [ ] `en/manhuaus`
- [ ] `en/manhuazonghe`
- [ ] `en/manhwa18`
- [ ] `en/manhwa18org`
- [ ] `en/manhwa68`
- [ ] `en/manhwabuddy`
- [ ] `en/manhwaclan`
- [ ] `en/manhwacomics`
- [ ] `en/manhwaden`
- [ ] `en/manhwaget`
- [ ] `en/manhwahub`
- [ ] `en/manhwajoy`
- [ ] `en/manhwalike`
- [ ] `en/manhwalover`
- [ ] `en/manhwamanhua`
- [ ] `en/manhwaread`
- [ ] `en/manhwareads`
- [ ] `en/manhwatoon`
- [ ] `en/manhwatop`
- [ ] `en/manhwax`
- [ ] `en/manhwaxxl`
- [ ] `en/manhwaz`
- [ ] `en/manhwazone`
- [ ] `en/manta`
- [ ] `en/megatokyo`
- [ ] `en/mehgazone`
- [ ] `en/meitoon`
- [ ] `en/mgjinx`
- [ ] `en/mgreadio`
- [ ] `en/milftoon`
- [x] `en/mistscans`
- [ ] `en/mlbblore`
- [ ] `en/monochromecustom`
- [ ] `en/monochromescans`
- [ ] `en/multporn`
- [ ] `en/murimscan`
- [ ] `en/myhentaicomics`
- [ ] `en/myhentaigallery`
- [x] `en/necroscans`
- [ ] `en/newmanhwa`
- [ ] `en/nexcomic`
- [ ] `en/nikatoons`
- [ ] `en/nineanime`
- [ ] `en/ninehentai`
- [ ] `en/ninekon`
- [ ] `en/novel24h`
- [ ] `en/novelcrow`
- [ ] `en/noxenscans`
- [ ] `en/nuxscans`
- [x] `en/nyanukafe`
- [ ] `en/nyrascans`
- [x] `en/nyxscans`
- [ ] `en/octopusmanga`
- [ ] `en/oglaf`
- [ ] `en/ohjoysextoy`
- [ ] `en/omegascans`
- [ ] `en/onemangaco`
- [ ] `en/onemangainfo`
- [ ] `en/onepunchmanonline`
- [ ] `en/onlythebesthentai`
- [ ] `en/oots`
- [ ] `en/oppaistream`
- [ ] `en/orchisasia`
- [x] `en/orionscans`
- [ ] `en/paradisescans`
- [ ] `en/paragonscans`
- [ ] `en/paritehaber`
- [ ] `en/patchfriday`
- [ ] `en/pawmanga`
- [ ] `en/petrotechsociety`
- [ ] `en/philiascans`
- [ ] `en/plutoscans`
- [ ] `en/pmscans`
- [ ] `en/porncomix`
- [ ] `en/qiscans`
- [ ] `en/questionablecontent`
- [ ] `en/ragescans`
- [ ] `en/randowiz`
- [ ] `en/ravenscans`
- [ ] `en/razure`
- [ ] `en/rdscans`
- [ ] `en/readallcomicscom`
- [ ] `en/readattackontitanshingekinokyojinmanga`
- [ ] `en/readberserkmanga`
- [ ] `en/readblackclovermangaonline`
- [ ] `en/readbokunoheroacademiamyheroacademiamanga`
- [ ] `en/readchainsawmanmangaonline`
- [ ] `en/readcomiconline`
- [ ] `en/readcomicsonline`
- [ ] `en/readfairytailedenszeromangaonline`
- [ ] `en/readhaikyuumangaonline`
- [ ] `en/readjujutsukaisenmangaonline`
- [ ] `en/readkingdommangaonline`
- [ ] `en/readnanatsunotaizai7deadlysinsmangaonline`
- [ ] `en/readnarutoborutosamurai8mangaonline`
- [ ] `en/readonepiecemangaonline`
- [ ] `en/readonepunchmanmangaonlinetwo`
- [ ] `en/readsololevelingmangamanhwaonline`
- [ ] `en/readtokyoghoulretokyoghoulmangaonline`
- [ ] `en/readvagabondmanga`
- [ ] `en/reallifecomics`
- [ ] `en/reimanga`
- [x] `en/renascans`
- [ ] `en/resetscans`
- [ ] `en/restscans`
- [ ] `en/retsu`
- [ ] `en/revivalscans`
- [ ] `en/rinkocomics`
- [ ] `en/ritharscans`
- [ ] `en/rizzcomic`
- [ ] `en/rizzcomicunoriginal`
- [ ] `en/rokaricomics`
- [ ] `en/roliascan`
- [ ] `en/rosesquadscans`
- [ ] `en/ryumanga`
- [ ] `en/s2manga`
- [x] `en/sanascans`
- [ ] `en/saturdaymorningbreakfastcomics`
- [ ] `en/schlockmercenary`
- [ ] `en/setsuscans`
- [ ] `en/shibamanga`
- [ ] `en/shojoscans`
- [x] `en/sirenscans`
- [ ] `en/skymanga`
- [ ] `en/sleepytranslations`
- [ ] `en/solarandsundry`
- [ ] `en/spmanhwa`
- [ ] `en/spyfakku`
- [ ] `en/stonescape`
- [ ] `en/sunshinebutterflyscans`
- [ ] `en/supermega`
- [ ] `en/suryascans`
- [ ] `en/swordscomic`
- [ ] `en/tapastic`
- [ ] `en/tcbscans`
- [ ] `en/tcbscansunoriginal`
- [ ] `en/teamshadowi`
- [ ] `en/templescan`
- [ ] `en/theblank`
- [ ] `en/theduckwebcomics`
- [ ] `en/thepropertyofhate`
- [ ] `en/timelesstoons`
- [ ] `en/todaymanga`
- [ ] `en/toon18`
- [ ] `en/toongod`
- [ ] `en/toonily`
- [ ] `en/toonilyme`
- [ ] `en/toonitube`
- [ ] `en/toonizy`
- [ ] `en/topmanhua`
- [ ] `en/topmanhuafan`
- [ ] `en/topmanhuanet`
- [ ] `en/tritiniascans`
- [ ] `en/utoon`
- [ ] `en/valirscans`
- [x] `en/vanillascans`
- [ ] `en/vgperson`
- [ ] `en/vizshonenjump`
- [ ] `en/voyceme`
- [ ] `en/vyvymanga`
- [ ] `en/vyvymangaorg`
- [ ] `en/warforrayuba`
- [ ] `en/wearehunger`
- [ ] `en/webcomics`
- [ ] `en/webdexscans`
- [ ] `en/webnovel`
- [ ] `en/webtoonscan`
- [ ] `en/webtoonxyz`
- [ ] `en/weebcentral`
- [ ] `en/whalemanga`
- [ ] `en/witchscans`
- [ ] `en/woopread`
- [ ] `en/writerscans`
- [ ] `en/wuxiaworld`
- [ ] `en/xlecx`
- [ ] `en/xomanga`
- [ ] `en/xoxocomics`
- [ ] `en/yakshacomics`
- [ ] `en/yaoihot`
- [ ] `en/yaoihub`
- [ ] `en/yaoiscan`
- [ ] `en/yaoitoon`
- [ ] `en/yorai`
- [ ] `en/zazamanga`
- [ ] `en/zinchanmanga`
- [ ] `en/zinchanmangacom`
- [ ] `en/zinmanga`
- [ ] `en/zinmanganet`
---
## Notes — Complex Sources
### Project Requirement: HTTP Client Selection
When porting sources from Kotlin to Go, ALWAYS check the Kotlin reference to determine whether the source needs:
- **Normal HTTP client** (`goyomi/internal/httpclient`) - for REST APIs returning JSON
- **FlareSolverr client** (`goyomi/internal/httpclient/flare`) - for JavaScript-rendered pages (uses `network.cloudflareClient` in Kotlin)
Check in Kotlin: `override val client = network.cloudflareClient` or `network.cloudflareClient.newBuilder()` → needs FlareSolverr
### `all/mangadex` ⚠️
- Rate limit: 5 req/s (`golang.org/x/time/rate`)
- `GetPopularManga``GET /manga?order[rating]=desc&includes[]=cover_art&limit=20&offset={(n-1)*20}`
- `GetLatestUpdates``GET /manga?order[updatedAt]=desc&includes[]=cover_art`
- `GetSearchManga` — tag filters (`includedTags[]`, `excludedTags[]`), demographic, content rating, status, sort
- `GetMangaDetails``GET /manga/{id}?includes[]=cover_art&includes[]=author&includes[]=artist`; cover URL from relationships
- `GetChapterList``GET /manga/{id}/feed?translatedLanguage[]=en&limit=500`; paginate until all chapters fetched
- `GetPageList``GET /at-home/server/{chapterId}``{baseUrl}/{quality}/{hash}/{filename}`; quality = `data` or `data-saver`
- `GetFilterList``GET /manga/tag`; cache tag list
- Language configurable via `MANGADEX_LANG` env var (default `en`)
### `all/nhentaicom` ⚠️
- FlareSolverr required
- `GetPageList` — extract JSON blob from `document.getElementById(...)` in `<script>` tag; reconstruct URLs as `{imageServer}/galleries/{mediaId}/{pageNum}.{ext}`
### `all/kemono` ⚠️
- FlareSolverr required
- Service + creator = manga; posts = chapters; attachment files = pages
- File URLs: prefix relative paths with `{base}/data`
- `GetChapterList` — paginate in 50-post increments via `?o={offset}`
### `all/komga` ⚠️
- Self-hosted; `KOMGA_BASE_URL`, `KOMGA_USERNAME`, `KOMGA_PASSWORD` env vars; Basic Auth
- Series = manga; Books = chapters; pages via `GET /api/v1/books/{bookId}/pages/{n}/thumbnail`
### `all/e621` ⚠️
- Optional Basic Auth (`E621_USERNAME`, `E621_API_KEY`); required for Gold content
- Pools = manga; posts = pages; `GET /pools.json`, `GET /posts.json?tags=pool:{id}`
### `all/danbooru` ⚠️
- Optional Basic Auth; free accounts limited to 2 tags per search
- Pools = manga; pool post_ids = pages; image URL from `file_url` field
### `all/pixiv` ⚠️
- Auth: `PIXIV_PHPSESSID` env var → Cookie header
- `GetPageList``GET /ajax/illust/{illustId}/pages`; extract `urls.original`
- **Must set `Referer: https://www.pixiv.net/`** on all image requests or get 403
### `all/luscious` ⚠️
- GraphQL POST to `https://members.luscious.net/graphql/playground`
- Albums = manga; `SearchAlbumPictures` paginated for page list
### `all/mangaplus` ⚠️
- JSON endpoint: `GET https://jumpg-webapi.tokyo-cdn.com/api/title_detail?title_id={id}`
- `GetPageList` — XOR page URL decryption using per-page `encryptionKey` (hex string); implement in `GetImageURL`
- Required header: `Origin: https://mangaplus.shueisha.co.jp`
### `all/stashapp` ⚠️
- Self-hosted; `STASHAPP_BASE_URL`, `STASHAPP_API_KEY` env vars
- GraphQL POST to `{base}/graphql`; `ApiKey` header
### `all/globalcomix` ⚠️
- Signed CDN URLs with short expiry — **do NOT cache `image_url` in DB**; always fetch fresh page URLs
### `all/webtoons` ⚠️
- HMAC-SHA256 `Sec-Webtoon-Client-Data` header: `HMAC-SHA256(fixedKey, "{url}_{timestamp}")` → base64; fixed key in extension source
- Web API: `https://global.apis.naver.com/webtoonSvc/v1/...`
### `en/allanime` ⚠️
- GraphQL POST to `https://api.allanime.day/api`
- Episode-based chapters; `episodeString` used as chapter number
- Multiple CDN quality tiers in page response; pick highest
### `en/asurascans` ⚠️
- FlareSolverr required
- Page selector varies by layout version; check extension source for current selector
### `en/bakkin` ⚠️
- No list/search; all manga from a single JSON URL; enumerate from object keys
- `GetSearchManga` does client-side title filtering only
### `en/bookwalker` ⚠️
- DRM-protected; metadata only
- `GetPageList` returns empty slice; pages not accessible without purchase
### `en/guya` ⚠️
- `GET {base}/api/get_all_series/` returns all manga at once; no pagination
- Scanlation group filter applied client-side in response parsing