1e6d72b046
5 bases: HTML scraping, static JSON index, Japanese viewer API, album-stack crawl, and JSON REST. 35/68 bases done.
10 KiB
10 KiB
Phase 3 — Base Source Implementations
Complete port checklist for all 68 bases in /Users/achmad/Documents/Belajar/Android/extensions-source/lib-multisrc/.
Each base goes into sources/base/{name}/. Check a box when the base compiles and
at least one derived source passes a smoke test.
Detailed implementation notes for complex bases are in the Notes section at the bottom.
All Bases — 68 total
base/bakkin⚠️ see notesbase/colorlibanimebase/comicasobase/comiciviewerbase/eromusebase/ezmanhwabase/fansubscatbase/fmreader⚠️ see notesbase/foolslide⚠️ see notesbase/fuzzydoodlebase/galleryadultsbase/gattsubase/gigaviewer⚠️ see notesbase/gmanga⚠️ see notesbase/godabase/gravurebloggerbase/greenshitbase/grouple⚠️ see notesbase/guya⚠️ see notesbase/heancms⚠️ see notesbase/hentaihand⚠️ see notesbase/hotcomicsbase/iken⚠️ see notesbase/initmangabase/kemono⚠️ see notesbase/keyoappbase/lectormoe⚠️ see notesbase/libgroup⚠️ see notesbase/liliana⚠️ see notesbase/madara⚠️ see notesbase/madtheme⚠️ see notesbase/manga18base/mangaboxbase/mangacatalogbase/mangadventure⚠️ see notesbase/mangahub⚠️ see notesbase/mangareader⚠️ see notesbase/mangatarobase/mangathemesia⚠️ see notesbase/mangaworkbase/mangaworld⚠️ see notesbase/mangotheme⚠️ see notesbase/manhwazbase/masonrybase/mccmsbase/mmlook⚠️ see notesbase/mmrcms⚠️ see notesbase/monochromebase/multichanbase/natsuidbase/oceanwpbase/paprikabase/peachscanbase/pizzareader⚠️ see notesbase/raijinscansbase/scanrbase/scanreader⚠️ see notesbase/senkuro⚠️ see notesbase/sinmhbase/spicythemebase/stalkercmsbase/uzaymangabase/vercomicsbase/wpcomics⚠️ see notesbase/yuyubase/zeistmangabase/zmanga⚠️ see notes
Notes — Complex Bases
base/heancms ⚠️
- Config struct:
BaseURL,APIURL,Lang,DateFormat GetPopularManga—GET {api}/series?page={n}&order=viewsGetLatestUpdates—GET {api}/series?page={n}&order=latestGetSearchManga—GET {api}/series?page={n}&query={q}GetMangaDetails—GET {api}/series/{slug}GetChapterList—GET {api}/chapter/query?series_slug={s}&limit=9999GetPageList—GET {api}/chapter/{slug}→ extract image array- Parse
has_next_pagefield from list responses
base/hentaihand ⚠️
- Config struct:
BaseURL,Lang GetPopularManga—GET {base}/api/comics?page={n}&order_by=popularityGetLatestUpdates—GET {base}/api/comics?page={n}&order_by=dateGetPageList—GET {base}/api/comics/{slug}/chapters/{n}→ images array
base/pizzareader ⚠️
- Config struct:
APIURL,Lang GetPageList—GET {api}/comics/{comic}/{chapter}→ page URLs- FlareSolverr mode (CF=Yes): inject cookies from clearance
base/gmanga ⚠️
GetPopularManga—GET {base}/api/releases?page={n}GetSearchManga—POST {base}/api/mangas/searchwith JSON body{q, page}GetPageList— extract chapter page data (may require resolving CDN token)- Handle Arabic/RTL title fields
base/mangadventure ⚠️
- Django manga reader REST API
GET {base}/api/v2/series/— list;GET {base}/api/v2/series/{slug}/— detailGET {base}/api/v2/chapters/?series={slug}— chapters;GET {base}/api/v2/chapters/{vol}/{num}/— pages
base/madara ⚠️
- Config struct:
BaseURL,Lang,DateFormat, overridable CSS selectors GetPopularManga—POST {base}/wp-admin/admin-ajax.phpwithaction=madara_load_more,vars[paged]={n}GetLatestUpdates— same AJAX withvars[meta_key]=_latest_updateGetSearchManga—GET {base}/?s={q}&post_type=wp-mangaGetMangaDetails—GET {url}→ parse.post-title,.author-content,.genres-content,.manga-summary,.post-image imgGetChapterList—POST {url}/ajax/chapters/→ parse chapter list HTMLGetPageList—GET {chapter_url}→ parsediv.reading-content img- FlareSolverr required; configurable selectors struct (child sources override individual selectors)
- Date parsing: relative ("X days ago") + absolute ("MMMM dd, yyyy") formats
base/mangathemesia ⚠️
- Config struct:
BaseURL,Lang,MangaDir(e.g. "manga"/"manhwa"), overridable selectors GetPopularManga—GET {base}/{dir}/?page={n}&order=popularGetChapterList— parse#chapterlist lielementsGetPageList— extractts_reader.run({...})JS JSON blob, parsesources[].images- FlareSolverr required
base/madtheme ⚠️
- All list types via
GET {base}/search?page={n}&sort=... GetPageList— parse JSON blob in<script>tag containing image array- FlareSolverr required
base/wpcomics ⚠️
- Config struct:
BaseURL,Lang,PopularPath(default "tim-kiem"),DateFormat GetPopularManga—GET {base}/{popularPath}?page={n}- FlareSolverr required
base/fmreader ⚠️
- Config struct:
BaseURL,Lang,RequestPath, overridable selectors GetPopularManga—GET {base}/{requestPath}?page={n}&sort=views- FlareSolverr required
base/mmrcms ⚠️
GetPopularManga—GET {base}/filterList?page={n}&sortBy=views&asc=falseGetSearchManga—POST {base}/advSearchFilterwith form data- JSON response; no FlareSolverr required
base/mangareader ⚠️
- Config struct:
BaseURL,Lang,TypeParam(comic/manga/manhwa) GetPopularManga—GET {base}/?page={n}&type={t}&status=all&order=popular- FlareSolverr required
base/zmanga ⚠️
GetPopularManga—GET {base}/advanced-search/page/{n}/?order=popular- FlareSolverr required
base/mangaworld ⚠️
GetPopularManga—GET {base}/archive?sort=most_read&page={n}- FlareSolverr required
base/grouple ⚠️
GetPopularManga—GET {base}/list?sortType=rate&offset={50*(n-1)}- No FlareSolverr
base/foolslide ⚠️
GetPopularManga—GET {base}/directory/{n}/GetChapterList— JSON API:GET {base}/api/reader/chapters?comic={slug}GetPageList— JSON API:GET {base}/api/reader/images?chapter={id}- No FlareSolverr
base/liliana ⚠️
GetPopularManga—GET {base}/ranking/week/{n}- FlareSolverr required
base/scanreader ⚠️
GetPopularManga—GET {base}/bibliotheque/page/{n}/?sort=views- No FlareSolverr
base/gigaviewer ⚠️
GET {base}/seriesreturns all manga at once; no pagination (HasNextPagealways false)GetLatestUpdates= same request as popular (no separate endpoint)- FlareSolverr required; client-side filtering replicated in Go
base/mangahub ⚠️ (GraphQL)
- Cookie acquisition:
GETto any chapter URL to setmhub_accesscookie, then reuse for GraphQL - All operations via GraphQL POST to
{api}/graphql GetPopularManga—searchManga(x:POPULAR, genre:"all", page:N)GetPageList—chapter(mangaId:N, number:N)→ extract pages- Inject
mhub_accesscookie header on all GraphQL requests
base/senkuro ⚠️ (GraphQL)
- Config struct:
APIURL(configurable per source preferences) - Standard GraphQL list/detail/chapter/page queries
- No CF requirement
base/mangotheme ⚠️ (encrypted)
- JSON list + detail (standard REST)
- Page URL decryption: extract encryption key from embedded JS, then XOR/AES decrypt each page URL
- Use
crypto/aesor manual XOR depending on algorithm found in extension source
base/mmlook ⚠️ (encrypted + CF)
- Same page URL decryption as mangotheme
- FlareSolverr required
base/guya ⚠️
GET {base}/api/get_all_series/returns all manga as a map; no paginationHasNextPagealways false- Scanlation group filter applied client-side
base/bakkin ⚠️
- No list/search; all manga from a single JSON URL; enumerate from object keys
GetSearchMangadoes client-side title filtering only
base/iken ⚠️
- CF-protected; FlareSolverr required for cookie acquisition
- JSON REST after clearance
base/lectormoe ⚠️
- CF-protected; Token auth required
- Obtain token via FlareSolverr session
base/libgroup ⚠️
- FlareSolverr required to acquire WebView auth token
GET {api}/api/latest-updates,GET {api}/api/auth/me- Store acquired token in
source_metatable for reuse
base/kemono ⚠️
GET {base}/api/v1/creators— all creators (= manga list)GET {base}/api/v1/{service}/{creator}/posts?o={offset}— paginate in 50-post increments- File URLs: prefix relative paths with
{base}/data - FlareSolverr required
Shared Helpers (implement once in sources/base/util/)
parseRelativeDate(s string) int64— "2 days ago" → unix msparseAbsoluteDate(s, format string) int64— "January 01, 2024" → unix msslugFromURL(url string) string— trailing path segmentcleanText(s string) string— HTML entity decode + whitespace normalizestatusFromString(s string) int— "ongoing"/"completed"/etc. → int constantextractNextDataJSON(html string) ([]byte, error)— pull__NEXT_DATA__JSON from NextJS pages
Checklist: Phase 3 Done When
- All 68 bases compile:
go build ./sources/base/... base/heancms—GetPopularMangareturns ≥1 manga from a live sitebase/madara—GetChapterListreturns chapters via AJAX endpointbase/mangathemesia—GetPageListextracts images fromts_reader.run()JS blobbase/mangahub— GraphQL popular list works with cookie acquisitionbase/mangotheme— decrypted page URL returns HTTP 200 image- FlareSolverr path — a CF-protected base returns data when FlareSolverr is running