Repository navigation
Conversation
Standalone English source for onlinereadfreenovel.com (issue lnreader#149). Browse popular and genre listings, search, read novel details, and read text. The site splits each book across numbered pages, so each page is listed as a chapter; empty pages are skipped.
[Medium impact] The PR appears safe to merge; no blocking issues were found. SummaryAdds Online Read Free Novel as an English source, with browsing, genre filtering, search, book details, chapter text, and an icon. Since the previous review:
No new actionable issues were found. This review checked code only; it did not run the live checker. Reviews (2) · Last reviewed commit: "no-mistakes(review): retry and throw on ..." · Reviewed by Greptile |
…readfreenovel.ts fixed. Cause: fetchDom threw a plain Error with no HTTP status on a non-OK response, so the live check could not tell a site block (403/503, INCONCLUSIVE by design) from a plugin bug and reported FAIL for popularNovels /allbooks/. Fix: fetchDom now throws with status: res.status, the same convention other plugins use. Verified: a mocked 403 or 503 on /allbooks/ now reports INCONCLUSIVE (was FAIL); a mocked 500 still reports FAIL; the unmocked live check passes all four steps; eslint and prettier pass on the file. Remaining risk: the CI log does not show the runner's actual status, so if CI got a 500 or 429 the check will still FAIL. Two tsc errors on the filters declaration predate this change. Change is uncommitted in the worktree
RibatTRW
marked this pull request as draft
October 15, 2026 14:04
… page, recover search links - Send a client-identifying User-Agent: Cloudflare challenges browser and generic tool UAs from datacenter networks (GitHub runners got 403 on every request shape tried), but lets a named client through. - Keep walking past empty pages after a page that links onward; the site serves runs of broken pages mid-book, and stopping at two lost most of long books (Anna Karenina: 122 of 219 pages). - Fetch pages six at a time (Anna Karenina: 88s to 18s). - Name pages after the chapter that opens on them, skipping contents pages. - Rebuild search links the site truncates (e.g. `..._stone.ht`) from the link or the cover file name, so those results open. - Throw on an empty book or page instead of returning a blank title or text. - Drop the stray `-->` paragraph; type filters with `satisfies Filters`.
RibatTRW
marked this pull request as ready for review
October 15, 2026 22:57
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #149
Study Novels (studynovels.com) from #149 is not covered: the host no longer resolves, so it is out of scope here. Only Onlinereadfreenovel is added.
This PR was written with AI assistance (Claude) and has not had a human review yet.
Screenshots
These are screenshots of the plugin working in the repository's plugin playground (the Vite dev UI), captured headless. They are not from the LNReader app: the Android toolchain is not installed on the machine used.
Screenshots 1-4 were taken on the earlier revision. Popular, search and the Poles Apart detail and chapter still look the same on the current head. Screenshots 5-7 were captured headless in the playground on the current head (
8860ad6).Untested edge cases
The earlier revision's live validation was inconclusive, and the captain accepted a test exception for it. On the current head the pipeline's live validation verdict is
go, and the GitHub Plugin Live Check passes all four steps. These paths are still not exercised against the live site, because the site can't be made to fail on demand:parseNovelthrows)Review fixes, reading improvements and live check
An AI review pass (Claude) on top of
6e93de5, in45a1a62plus the pipeline's review fix8860ad6. All of it was checked against the live site on 2026-10-16.Why the live check was INCONCLUSIVE. Cloudflare answers GitHub's runners with a 403 "Just a moment..." challenge. A probe on a GitHub runner sent each request shape to
/,/allbooks/, search and book pages, twice. These were all challenged:node(the default),curl, python-requests, an empty UA and bareMozilla/5.0Accept/Accept-Languageheaders, aReferer, fullSec-Fetch-*headers, thewwwhost andhttpSelf-identifying client UAs (
LNReader,Mozilla/5.0 (compatible; LNReader),okhttp) were let through every time. The plugin now sendsUser-Agent: Mozilla/5.0 (compatible; LNReader). From a home connection every shape gets a 200, so only datacenter networks (and probably VPNs) are affected.Live check result. The PR's Plugin Live Check on
8860ad6passes all four steps: popularNovels (21 novels), searchNovels (20 results), parseNovel (16 chapters) and parseChapter (26604 chars). The same result came from 3 earlier runs of the unmodified checker on a GitHub runner, and from local runs.Review fixes
parseNovelthrow. Only a 404 or an empty page counts toward the empty run. (pipeline fix)..._philosophers_stone.ht(a 404) or a slug cut in the middle. The book path is now rebuilt from the link, or from the cover file name when the slug itself was cut. All 13 sampled cut links resolved.-->paragraph is dropped.filtersusessatisfies Filters, which clears twotscerrors. The page-cap warning fires only when text was actually cut off (pipeline fix).Reading improvements
Page 1: Chapter 1 The Boy Who Lived. A page with no heading staysPage N, and so does a table-of-contents page.Residual risk. The checker first sends a
HEAD /with its own user agent, which the plugin doesn't control. From a runner that UA was challenged once in 6 probe requests. If that happens, the check reports INCONCLUSIVE, and a re-run clears it.Intent
Deploy an Opus agent to #2686.
Get it to do a code review and also see how it can make the reading experience better for the user; also make sure the live validation passes instead of being inconclusive.
Context: PR #2686 ("feat(english): add Online Read Free Novel source", closes issue #149) adds plugins/english/onlinereadfreenovel.ts. It is open as a draft from the fork RibatTRW/lnreader-plugins, branch fm/lnreader-onlinereadfreenovel-149, base master. Its Plugin Live Check on GitHub currently reports popularNovels as INCONCLUSIVE with "HTTP 403 (likely anti-bot block)" for https://onlinereadfreenovel.com/allbooks/, so the check is green without proving the plugin works. The PR body already carries playground screenshots and AI-authorship disclosure.
What Changed
plugins/english/onlinereadfreenovel.ts(v1.0.0), for onlinereadfreenovel.com. It implementspopularNovels(with a genre filter),searchNovels,parseNovelandparseChapter.parseNovelthrows instead of returning a blank entry when no book is found, andparseChapterthrows when the site returns no text.status, so the live checker can tell a site block (403/503 →INCONCLUSIVE) from a plugin bug. The walk stops at the last page or after a run of empty pages. It logs a warning if it stops at theMAX_PAGEScap.public/static/src/en/onlinereadfreenovel/icon.png.Closes #149
🤖 Generated with Claude Code
Risk Assessment
✅ Low: I traced the batched page walk, the retry and throw handling, the empty-run logic and the MAX_PAGES warning against the recorded decisions, and found no defects. I did not run any tests or the live check.
Testing
I ran the live checker against onlinereadfreenovel.com. popularNovels (21 novels), searchNovels (20 results), parseNovel (16 chapters) and parseChapter (26.6k chars) all returned PASS, none INCONCLUSIVE. I did not drive the mid-walk retry/throw, 404-as-empty and cap-warning paths, because the real site cannot be made to fail on demand.
Evidence: live check output
Pipeline
Updates from git push no-mistakes
✅ **intent** - passed
✅ No issues found.
✅ **Rebase** - passed
✅ No issues found.
🔧 **Review** - 2 issues found → auto-fixed ✅
plugins/english/onlinereadfreenovel.ts:212- The user's recorded decision was to keep sequential page fetching and keep the MAX_PAGES cap at its decided value. This change walks pages in parallel batches (PAGE_BATCH = 6, Promise.all at lines 212-223) and raises MAX_PAGES from 300 to 400. Parallel fetches also interact badly with the decided rule that a non-OK page is treated as empty. Under 429/403 rate limiting, six concurrent requests are more likely to fail, and 12 consecutive non-OK pages (MAX_EMPTY_RUN) end the walk with a silently truncated chapter list and no warning. Smallest honest remedy: confirm that the later parallel/12-empty-run design supersedes the earlier decision. If it does not, revert to sequential fetching and the earlier cap.plugins/english/onlinereadfreenovel.ts:248- The MAX_PAGES warning (lines 248-252) fires whenever the for-loop is exhausted. That includes the case where the page at the cap is empty and the book has no more text, so the warning can be a false positive. The round-2 decision was to warn only when the cap actually cut off text. Remedy: warn only when the last handled page had text and a next link.🔧 Fix applied.
✅ Re-checked - no issues remain.
✅ **Test** - passed
✅ No issues found.
npm cinode scripts/live-check-plugin.js plugins/english/onlinereadfreenovel.ts✅ **Document** - passed
✅ No issues found.
✅ **Lint** - passed
✅ No issues found.
✅ **Push** - passed
✅ No issues found.