Repository navigation
Conversation
The site moved to a new Nuxt front end (en/detail/<id>, JSON chapter payloads, no ajax chapter list), which the readnovelfull template can no longer parse. Replace the generated source with a standalone plugin that keeps the id and name.
[Medium impact] Migrates a novel-scraping plugin to a new architecture. The PR appears safe to merge, with non-blocking fixes recommended for genre text and request deadlines. FindingsSummaryReplaces the generated LightNovelPlus adapter with a standalone plugin for the redesigned site.
RibatTRW acknowledged that HTTP 522 prevented live checks and deferred the playground screenshot until the site is reachable. Reviews (1) · Last reviewed commit: "no-mistakes(document): Fix stale lightno..." · Reviewed by Greptile |
| .toLowerCase(); | ||
| const value = | ||
| label === 'author' || label === 'genre' | ||
| ? row.children('a').text().trim() |
There was a problem hiding this comment.
parseNovel reads all genre links with .text(), which drops separators between the links. If a row contains separate Action and Fantasy links, it returns ActionFantasy instead of the comma-separated list required by SourceNovel.genres. Read each link separately and join its text with commas.
| const response = await Promise.race([ | ||
| fetchApi(url), | ||
| this.sleep(ATTEMPT_TIMEOUT_MS).then(() => null), | ||
| ]); | ||
| if (response) { | ||
| status = response.status; | ||
| if (response.ok) return await response.text(); |
There was a problem hiding this comment.
Slow requests outlive their deadline
The deadline in fetchHtml ends when response headers arrive, before response.text() finishes. If the server sends headers and then stalls, the read can wait indefinitely instead of retrying. When the timer wins, the old request also keeps running while another starts. Apply the deadline to the full response read and cancel expired requests where the host supports it.
|
Closing for now: lightnovelplus.com is currently down (Cloudflare 522), so this rewrite cannot be verified against the live site. The branch is kept and will be reopened once the site is reachable and the change has been tested live. |
Summary
AI-authored (Claude Code, supervised by the Firstmate agent orchestrator); not human-reviewed, and not tested in the LNReader app. No upstream issue.
LightNovelPlus[readnovelfull]failed its live check atparseNovelwithMissing novel name. lightnovelplus.com has been rebuilt as a Nuxt app, so thereadnovelfulltemplate can no longer parse it:en/detail/<id>(coverimghasalt, notitle);get_chapter_listajax endpoint is gone; chapters are paged aten/detail/<id>/page/<n>and also served as a JSON payload (.../_payload.json, 100 chapters per page);en/class?type=...&id=...&page_num=..., search isen/search?keyword=...; chapter text is in#chapter-contentaten/book/<id>/<chapterId>.Because the template cannot express this, the source is replaced by a standalone plugin rather than patching the shared generator (which is untouched). Plugin id and name are unchanged (
lightnovelplus/LightNovelPlus), version 3.0.0. Novel paths saved from the old site (book/....html) will not resolve on the new site.Changes
plugins/english/lightnovelplus.ts: popular/latest/completed + genre filter, search, novel details, full chapter list (via the JSON payload, with retries and a per-attempt timeout because the site returns 503 "Server is busy" under load), chapter text.lightnovelplusentry fromplugins/multisrc/readnovelfull/sources.jsonand deletedfilters/lightnovelplus.json, so the generator stops emitting the broken file.public/static/src/en/lightnovelplus/icon.png(rename only).parseNovelthrows rather than returning a silently truncated list.Testing - read this
lightnovelplus.com went down while this was being tested (2026-10-15/16) and the live check could not be completed. No screenshots of the rewritten plugin could be captured (the requested playground screenshots are missing because nothing loads). The shipping decision was made knowing this.
Errors seen on the chapter pages (
/en/detail/<id>/page/<n>and its_payload.json): HTTP 503 "Server is busy", requests hanging until timeout, and finally Cloudflare 522 on every page including the home page, listing, search and detail.Verified live earlier, before the outage got worse (via
npm run check:plugin -- plugins/english/lightnovelplus.tsand direct fetches):popularNovels: PASS (20 novels)searchNovels: PASS (1 result for "Divine Path System")#chapter-contentnpm run build:fullexit 0; eslint and prettier clean on the changed filesNot verified live:
parseNovelend to end: chapter pagination was returning 503/hangs, then 522, so the chapter-list code (JSON payload parsing across pages) has not been run against a full novel. The checker reportedparseNovelas INCONCLUSIVE / failed on a 503 for a later chapter page.parseChapterthrough the checker (never reached), and any use inside the playground or the LNReader app.Please re-run
npm run check:plugin -- plugins/english/lightnovelplus.tsonce the site is back before relying on this.Pipeline
Updates from git push no-mistakes
✅ **intent** - passed
✅ No issues found.
✅ **Rebase** - passed
✅ No issues found.
✅ **Review** - passed
✅ No issues found.
npm run check:pluginand curl on the home and detail URLs; Cloudflare returned 522 each time. The origin is down, so no workspace-local route can reach it. Re-run once the site is back.npm ci --ignore-scriptsnpm run check:plugin -- plugins/english/lightnovelplus.ts(siteReachability: INCONCLUSIVE, HTTP 522)curlagainst https://lightnovelplus.com/ and /en/detail/1 (522 on each of 3 tries)✅ **Document** - passed
✅ No issues found.
✅ **Lint** - passed
✅ No issues found.
✅ **Push** - passed
✅ No issues found.