Repository navigation
Conversation
Adds the Novelito (noveli.to) plugin with popular browsing, search, novel details, the full chapter list and chapter text from the site's JSON API. Co-Authored-By: OpenCode <noreply@opencode.ai>
[Medium impact] The changes reach one new novel-reading source and its users. The PR appears safe to merge, with a non-blocking improvement to character-reference decoding. Findings
SummaryAdds a standalone Novelito source and its icon.
Live access was not independently tested during this review. The icon's path was checked, but this model could not view the image. Rendered PR screenshots were not verified. RibatTRW explicitly described returning a title-only chapter as intentional because it matches the source response. Reviews (1) · Last reviewed commit: "no-mistakes(review): filter bare Noveli...." · Reviewed by Greptile |
| function decodeEntities(text: string): string { | ||
| return text | ||
| .replace(/ /gi, ' ') | ||
| .replace(/&/gi, '&') | ||
| .replace(/</gi, '<') | ||
| .replace(/>/gi, '>') | ||
| .replace(/"/gi, '"') | ||
| .replace(/�?39;/gi, "'"); |
There was a problem hiding this comment.
Character codes remain visible
If chapter text contains references such as ’ or ’, decodeEntities leaves them unchanged. parseChapterBody then escapes their ampersands, so readers see literal codes instead of punctuation. Extend the decoder to handle decimal, hexadecimal, and common named references before escaping the text. Add examples that pass through the full chapter conversion.
Knowledge Base Used: Plugin authoring contract
There was a problem hiding this comment.
Fixed in 83341fd: decodeEntities now decodes decimal (’), hex (’) and common named references (’, “, …, , — and more) in a single pass, so &lt; decodes only once, before the text is escaped. Unknown names and invalid code points are left as-is.
Summary
Adds a Novelito (https://noveli.to) source for English novels, requested in #2759. The site exposes a public JSON API for its catalogue, novel details, chapter lists and chapter text, so no account, bot challenge or browser is needed; browser-like headers are sent because the chapter endpoint rejects bare clients. Closes #2759.
Screenshots (plugin playground, live results)
What Changed
plugins/english/novelito.tsplugin (idnovelito, v1.0.0) for https://noveli.to/. It reads the site's JSON API (/api/novels,/api/novels/<id>,/api/novels/<id>/chapters,/api/novels/<id>/chapters/<cid>) with a browser User-Agent and site Referer, and retries on HTTP 429.popularNovels(with sort, status and genre filters, plus a latest-novels mode),searchNovels,parseNovel(metadata and the full chapter list) andparseChapter. Chapter paragraphs are HTML-escaped after decoding numeric and named character references, and bare Noveli.to notices are removed from the chapter body.public/static/src/en/novelito/icon.png.Closes
#2759🤖 Generated with Claude Code
Risk Assessment
✅ Low: A single self-contained standalone plugin plus a valid 96x96 icon. The recorded review fixes (429 retry, parsePage removal, chrome and notice filtering, entity decoding) are all present and correct on trace, and I found no new defects.
Testing
I ran the repo's live check on the plugin and got all four checks passing. I then bundled the plugin and called it directly against noveli.to for each case named in the round-1 decisions. Chapter 1 of novel 63983 no longer starts with reader-chrome labels. Martial Peak chapter 64875 shows
&once, not double-escaped. Chapter 25937207 of novel 33388 has no "Provided by" or "support more free releases" lines. A burst of 12 back-to-back chapter fetches all succeeded. That burst did not show whether a 429 occurred or whether the retry logic ran, so retry behavior is unconfirmed. I did not checkparsePageremoval or capture PR screenshots in this phase.Evidence: chapter chrome and entity output
Evidence: notice filter and burst output
Pipeline
Updates from git push no-mistakes
✅ **Intent** - passed
✅ No issues found.
✅ **Rebase** - passed
✅ No issues found.
✅ **Review** - passed
✅ No issues found.
✅ **Test** - passed
✅ No issues found.
npm run check:plugin -- plugins/english/novelito.ts(popularNovels, searchNovels, parseNovel, parseChapter all PASS)esbuild-bundled plugin driven live: parseChapter on novel 63983 chapter 1 (chrome stripped)parseChapter on novel 83 chapter 64875 (entity decoded once)parseChapter on novel 33388 chapter 25937207 (bare notices removed)12 sequential chapter fetches (all succeeded)✅ **Document** - passed
✅ No issues found.
✅ **Lint** - passed
✅ No issues found.
✅ **Push** - passed
✅ No issues found.