Repository navigation
Conversation
Add a standalone Indonesian source for grensia.blogspot.com (Blogger). - Catalog: the site's own "List Novel" index (label novel). - Chapters: the reader's HTML search for the series name, followed through the "Older Posts" pages, filtered to the matching series. - Search: site search grouped by series name, so series missing from the List Novel (e.g. Isekai wa Heiwa deshita) are still found. - Chapter text is the post body. Known gap: 15 of the 38 listed series have titles that do not match their chapter posts on the site, so they show no chapters. Co-Authored-By: Claude <noreply@anthropic.com>
…ing zero-chapter series
[Medium impact] Adds a new content source plugin for Indonesian novels. The PR appears safe to merge with non-blocking fixes recommended for search coverage and exported covers. FindingsSummaryAdds Grensia as an Indonesian source with a source icon.
Acknowledged issues excluded from this review: RibatTRW's PR description records catalog-name gaps, previously declined empty-term search behavior, and a known near-duplicate search result. Reviews (1) · Last reviewed commit: "no-mistakes(document): no docs stale; pr..." · Reviewed by Greptile |
| if (pageNo > 1) return []; | ||
|
|
||
| const posts = await readAll( | ||
| `${BASE}/search?q=${encodeURIComponent(searchTerm)}&max-results=${SEARCH_PAGE_SIZE}`, | ||
| 1, |
There was a problem hiding this comment.
searchNovels reads only the first 150 matching posts and returns nothing for later pages. These are chapter posts, not distinct novels, so a long series can fill that page and hide other matching series. Follow the older-post links or support pageNo so users can reach those results.
Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!
| resolveUrl = (path: string, isNovel?: boolean) => | ||
| isNovel ? `${BASE}/search?q=${path}` : BASE + path; |
There was a problem hiding this comment.
Exported books lose their covers
resolveUrl turns an absolute cover URL into a Blogger search URL when the playground exports an EPUB. useEpubExport calls it with sourceNovel.cover and true, so the export fetches a search page instead of artwork. Preserve absolute image URLs before building the novel search URL.
| resolveUrl = (path: string, isNovel?: boolean) => | |
| isNovel ? `${BASE}/search?q=${path}` : BASE + path; | |
| resolveUrl = (path: string, isNovel?: boolean) => | |
| /^https?:\/\//i.test(path) | |
| ? path | |
| : isNovel | |
| ? `${BASE}/search?q=${path}` | |
| : BASE + path; |
Intent
Work on #241 and include screenshots of the working fix in the PR.
Issue 241, "[Source Request] Grensia" (opened four years ago; a duplicate was closed as #428): the requester wants the site added as a source. https://grensia.blogspot.com/ returns 200, and a chapter post such as https://grensia.blogspot.com/2022/08/isekai-wa-heiwa-deshita-chapter-1217.html returns 200 with readable text. No plugin and no generated source covers the site today. It is a Blogger site whose posts are the chapters; the content is Indonesian.
Make sure the fix's pull request shows a photo of the plugin working correctly inside the plugin playground, and run that screenshot process headless if possible.
What Changed
plugins/indonesian/grensia.tssource for grensia.blogspot.com (Blogger, Indonesian).novel), 38 series after dedupe..post-bodyof the chapter page, with scripts, styles, ins, iframes and the "more" anchor removed.public/static/src/id/grensia/icon.png.Closes #241
Screenshots
These come from this repo's plugin playground (
npm run dev:start, headless Chromium), not from the LNReader app. The Android toolchain is not installed on this machine, so the plugin has not been tested in the app.Known gap (shipped by decision)
Five of the 38 series on the site's List Novel still show no chapters, because the title on the List Novel does not match the chapter posts' titles on the site. They are:
The known gap was reviewed and the captain's decision was to ship with it, with no further fix round. No hard-coded per-series title map was added.
Blogger's search totals vary between requests. We observed 1220 and 1049 chapters for Isekai wa Heiwa deshita in different runs.
Testing
npm run check:plugin -- plugins/indonesian/grensia.ts: all four steps PASS (38 popular, 1 search result, 137 chapters, 12486-character chapter).npm run build:fullexits 0;eslintandprettierpass on the plugin file.Disclosure
This PR was written by an AI agent (Claude, via Claude Code). No human has reviewed it yet.
Pipeline
Updates from git push no-mistakes
✅ **intent** - passed
✅ No issues found.
✅ **Rebase** - passed
✅ No issues found.
✅ **Review** - passed
✅ No issues found.
plugins/indonesian/grensia.ts:156- 15 of 38 series in the Popular catalog return zero chapters from parseNovel (e.g. 'I Was Caught up in a Hero Summoning, but That World Is at Peace', 'Orc Eiyuu Monogatari Sontaku Retsuden'), because the catalog landing title does not match the chapter post titles. The same series are reachable with chapters via Search. This is the author's recorded known gap in commit 08fc0c6; the user must decide whether to ship with it or fix it.plugins/indonesian/grensia.ts:226- searchNovels('-') returns all 33 series because the normalized term is empty and key.indexOf('') === 0. This matches the review-3 finding the user already declined, so it is noted only.plugins/indonesian/grensia.ts:233- Search results include a near-duplicate entry 'Clearing an Isekai with the Zero-Believers Goddes' alongside 'Clearing an Isekai with the Zero-Believers Goddess', because the series-name derivation yields two different keys for one series. It is a cosmetic data issue, not a crash.npm run check:plugin -- plugins/indonesian/grensia.tsoutput (all four steps PASS)zero-chapter series: 15 of 38(output in /tmp/grensia-driver/sweep/run.log)npm ciin the worktree (dependency install, needed to run the toolchain)npm run check:plugin -- plugins/indonesian/grensia.ts(live check, all four steps PASS)npx vite --port 3000 --host 127.0.0.1 --strictPortas the playground server (port 3000 was already held by another process on [::1], so the playground was bound to IPv4 loopback only, and Chromium was given--host-resolver-rules=MAP localhost 127.0.0.1so the hardcoded localhost:3000 fetch shim reaches it)Headless Chromium driven over CDP from /tmp/grensia-driver/cdp.mjs (real mouse and keyboard events for Radix tabs and inputs; element.click() for list items and fetch buttons): Popular fetch, card arrow → Parse Novel, Search 'Isekai', Parse Novel fetch, Parse Chapter with the issue example pathNode sweep of all 38 Popular series through the esbuild-bundled plugin against the live site (parseNovel chapter counts)Node adversarial checks: searchNovels('zzqqxxnomatch') → 0 results; searchNovels('-') → 33 results (info only)Evidence copied to ~/.no-mistakes/evidence/01M4ZV1934NK3XCYHECY9AVRRW (grensia-1..5 PNGs)Stopped the playground server and headless Chromium; worktree git status is clean🔧 No changes applied.
3 issues (2 errors, 1 warning) still open:
plugins/indonesian/grensia.ts:178- Series chapters are matched only by normalize(seriesName(post.title)) against the catalog name. For the 'I Was Caught up in a Hero Summoning, but That World Is at Peace' series, Blogger headlines read 'Isekai wa Heiwa deshita Chapter N', so parseNovel returns 0 chapters and searchNovels cannot find the series by its catalog title. The JSON-LD description on about 90 posts starts with 'Novel I Was Caught up in a Hero Summoning, but That World Is at Peace Indonesia Chapter N', which is a reliable key the plugin ignores. Remedy: also match posts whose description carries the landing name, and use the same rule in searchNovels so both paths agree.plugins/indonesian/grensia.ts:235- The known gap from the previous round still stands for the other 14 of 38 Popular series that return 0 chapters. This run did not re-drive that sweep, so its current size is unverified here. The user should decide whether to ship with the gap or fix it before this is marked ready.npm run check:plugin -- plugins/indonesian/grensia.ts (popularNovels 38, searchNovels 1, parseNovel 137 chapters, parseChapter 12486 chars; all PASS)npm run dev:start (multisrc regenerated) and a Vite server on 127.0.0.1:3000 for the playground proxyHeadless Chromium with --host-resolver-rules=MAP localhost 127.0.0.1, driven via chrome-devtools-axi: Grensia selected in the plugin list, Popular Fetch, Search 'isekai', Parse Novel for Isekai wa Heiwa deshita, Parse Chapter /2022/08/isekai-wa-heiwa-deshita-chapter-1217.html, Parse Novel for the Hero Summoning Popular card (opened via its arrow button), Search 'Hero Summoning' and the full catalog titleDirect curl against grensia.blogspot.com search pages to inspect JSON-LD headline vs description for the Hero Summoning series (about 90 description matches vs 0 headline matches)Stopped my Vite and Chromium afterwards; the other worktree's server on port 3000 was left untouched🔧 Fix applied.
2 errors still open:
plugins/indonesian/grensia.ts:178- 10 of 38 Popular series still return zero chapters from parseNovel (down from 15), because catalog landing titles do not match chapter post headlines or descriptions. This is the known gap recorded in commit 08fc0c6. Ship with it or fix it? The Hero Summoning series is fixed.npm run check:plugin -- plugins/indonesian/grensia.ts(all four checks PASS: 38 popular, 1 search result, 137 chapters, 12486-char chapter)Started the playground withnpx vite --host(the default bind is IPv6-only, and the app hardcodes http://localhost:3000)Drove the playground headless (system Chromium with remote debugging, isolated profile) at http://localhost:3000/?plugin=grensia: Popular tab, FetchSearch tab, term 'Hero Summoning'Parse Novel tab, path for 'I Was Caught up in a Hero Summoning, but That World Is at Peace', Fetch (227 chapters)Parse Chapter tab, path /2022/08/isekai-wa-heiwa-deshita-chapter-1217.html, Fetch (8426 characters of readable text)Bundled plugins/indonesian/grensia.ts with esbuild and ran popularNovels + parseNovel over all 38 series, plus searchNovels for the catalog title and 'Hero Summoning' (script in /tmp/grensia-sweep, outside the worktree)Stopped the Vite server and headless Chromium; worktree left clean (git status empty)🔧 Fix applied.
2 errors still open:
plugins/indonesian/grensia.ts:178- 5 of 38 Popular series still return zero chapters from parseNovel (down from 15 in round 1 and 10 in round 3): A Sword Master Childhood Friend Power Harassed Me Harshly; Sword Art Online Progressive Light Novel; We Live in Dragons Peak; I Became the Strongest With The Failure Frame; I'm the Evil Lord of an Intergalactic Empire!. This is the known gap recorded in commit 08fc0c6. The user must decide whether to ship with it or fix it.node scripts/live-check-plugin.js plugins/indonesian/grensia.ts (baseline, all four checks PASS)npx vite --port 3000 (playground dev server, real product), then headless Chromium with chrome-devtools-axi attached via CHROME_DEVTOOLS_AXI_BROWSER_URLPlayground: Popular tab, Fetch, screenshot of catalogPlayground: Parse Novel for MAGICAL★EXPLORER path, screenshotPlayground: Parse Novel for I Was Caught up in a Hero Summoning, but That World Is at Peace, screenshot (227 chapters)Playground: Search tab, term 'Hero Summoning', screenshot (series returned)Playground: Parse Novel for Orc Eiyuu Monogatari Sontaku Retsuden (60 chapters)Playground: Parse Chapter for /2019/10/magicalexplorer-chapter-1-prologue.html, screenshot (12490 characters)Adversarial sweep: bundled grensia.ts with esbuild (same options as live-check) and ran popularNovels(1) then parseNovel for each of 38 series against the live site: 33 non-empty, 5 zero (A Sword Master Childhood Friend Power Harassed Me Harshly; Sword Art Online Progressive Light Novel; We Live in Dragons Peak; I Became the Strongest With The Failure Frame; I'm the Evil Lord of an Intergalactic Empire!)Teardown: stopped vite and the headless Chromium, removed scratch files; git status clean in the worktree✅ **Document** - passed
✅ No issues found.
✅ **Lint** - passed
✅ No issues found.
✅ **Push** - passed
✅ No issues found.