Skip to content

Add Toasteful source plugin (English) - #2671

Open
RibatTRW wants to merge 5 commits into
lnreader:masterfrom
RibatTRW:fm/lnreader-toasteful-458
Open

RibatTRW wants to merge 5 commits into
lnreader:masterfrom
RibatTRW:fm/lnreader-toasteful-458

Conversation

@RibatTRW

@RibatTRW RibatTRW commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Intent

Add a Toasteful source plugin to lnreader-plugins for #458. The source is Toasteful at https://www.toasteful.com/ (English), with the series list at https://www.toasteful.com/p/list-novel.html. Implement the full source (popular/latest/search, novel details, chapter list, chapter content) following the repos existing plugin template and docs/testing.md. Include screenshots of the working fix in the PR, and run the plugin verification headless in the background.

Testing with screenshots

Follow-up: searchNovels now pages the Web Novel label feed and matches titles client-side, so chapter posts can no longer crowd matching novels out (Greptile P1 addressed). Verified live: "hero" returns 18 novels, "dungeon demon lord" returns its hub, "hero mother" returns the hub plus side stories.

Site (headless capture of toasteful.com):

Novel list
Series list at /p/list-novel.html, grouped On-going / Others.

Novel page
Novel hub with cover, genres, summary and the full chapter list.

Chapter content
Chapter text as the plugin returns it — story only, promo and nav stripped.

Playground (plugin running inside the repo playground):

Playground popular list
Toasteful popular grid rendered by the playground (npm run dev:start).

Playground novel page
Hero-mother hub in the playground: cover, Ongoing status, 395 chapters, genres, summary.

What Changed

Final changed paths and statuses:

A	plugins/english/toasteful.ts
A	public/static/src/en/toasteful/icon.png

Risk Assessment

✅ Low: New standalone scraper with bounded feed/DOM logic; live hub markup confirms Chapter-gated links, here-hub exclusion, and search token matching behave as intended.

Testing

Drove the real Toasteful plugin against the live site: the repo's live-check harness passed popular (25 novels), search, novel parse (12 chapters), and chapter parse (13737 chars); a focused script against the bundled plugin confirmed the word-boundary chapter-link fix rejects 'The Departed Hero'/'Party'/'Particular' promos while accepting genuine chapter links, confirmed latest-novels ordering works live, and confirmed malformed feed entries are skipped safely.

  • Live validation: ✅ go - 7 of 7 scenarios driven live against the product
Scenario Result Live Evidence
Browse popular novels and get a list of Toasteful series ✅ pass live Toasteful live-check output
Browse latest novels (orderby=updated) and get recently updated series ✅ pass live node .lavish/toast-check.cjs LATEST live: 25 novels
Search for a novel by title and find it without chapter posts crowding it out ✅ pass live Toasteful live-check output
Open a novel page and get details plus a clean chapter list with promo links excluded ✅ pass live Toasteful live-check output
Adversarial: promo link 'The Departed Hero' (embeds 'part') is rejected as a chapter while real chapter links pass ✅ pass live node .lavish/toast-check.cjs ALL ADVERSARIAL CASES PASSED
Open a chapter and read its full text content ✅ pass live Toasteful live-check output
Malformed feed entries (missing title, foreign origin) are skipped without dropping the whole result batch ✅ pass live node .lavish/toast-check.cjs MALFORMED -> undefined, undefined
Evidence: Toasteful live-check output

> lnreader-plugins@3.0.0 check:plugin
> node scripts/live-check-plugin.js plugins/english/toasteful.ts

https://www.toasteful.com/feeds/posts/default/-/Web%20Novel?alt=json&max-results=25&start-index=1 {
  headers: {
    Connection: 'keep-alive',
    Accept: '*/*',
    'Accept-Language': '*',
    'Sec-Fetch-Mode': 'cors',
    'Accept-Encoding': 'gzip, deflate'
  }
}
https://www.toasteful.com/feeds/posts/default/-/Web%20Novel?alt=json&max-results=150&start-index=1 {
  headers: {
    Connection: 'keep-alive',
    Accept: '*/*',
    'Accept-Language': '*',
    'Sec-Fetch-Mode': 'cors',
    'Accept-Encoding': 'gzip, deflate'
  }
}
https://www.toasteful.com/feeds/posts/default/-/Web%20Novel?alt=json&max-results=150&start-index=36 {
  headers: {
    Connection: 'keep-alive',
    Accept: '*/*',
    'Accept-Language': '*',
    'Sec-Fetch-Mode': 'cors',
    'Accept-Encoding': 'gzip, deflate'
  }
}
https://www.toasteful.com/2026/10/skillless-goto.html {
  headers: {
    Connection: 'keep-alive',
    Accept: '*/*',
    'Accept-Language': '*',
    'Sec-Fetch-Mode': 'cors',
    'Accept-Encoding': 'gzip, deflate'
  }
}
https://www.toasteful.com/2026/10/skillless-goto-1.html {
  headers: {
    Connection: 'keep-alive',
    Accept: '*/*',
    'Accept-Language': '*',
    'Sec-Fetch-Mode': 'cors',
    'Accept-Encoding': 'gzip, deflate'
  }
}
## Plugin Live Check

\### `plugins/english/toasteful.ts`

| Check | Re... (truncated)

RibatTRW and others added 4 commits October 12, 2026 20:41
Implements popular/latest/search, novel details, chapter list and
chapter content for https://www.toasteful.com/ (English, Blogger),
using the site's own Web Novel label feed for listings and search.

Closes lnreader#458.

Test evidence: npm run check:plugin passes 4/4 (popular 25 novels,
search, parseNovel 12 chapters, parseChapter 13698 chars); extended
live assertions 23/23 incl. 395-chapter hub, volume prefixes,
side-route exclusion and chapter cleanup.

Co-Authored-By: Muse Spark <muse-spark@meta.com>
@greptile-apps

greptile-apps Bot commented Oct 12, 2026 •

Copy link
Copy Markdown

RetriggerConfidence Score: 4/5

[Medium impact] Adds a new novel source plugin.

Fix the search cutoff before merging so matching novels are not hidden by chapter posts.

Findings

  1. P1 Search misses matching novels ▶

Summary

Adds the English Toasteful source and its icon.

  • Readers can browse or search Toasteful novels.
  • Each Toasteful novel shows its details and chapter list.
  • Toasteful chapter pages return readable story content.

Reviews (1) · Last reviewed commit: "no-mistakes(review): Anchor chapter keyw..." · Reviewed by Greptile

Comment thread plugins/english/toasteful.ts Outdated
Comment on lines +312 to +317
for (let round = 0; round < 4 && novels.length < wanted; round++) {
const params = new URLSearchParams({
'alt': 'json',
'q': searchTerm,
'max-results': '150',
'start-index': String(start),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Search misses matching novels

searchNovels stops after 600 matching posts and only then keeps posts labeled Web Novel. If matching chapter posts fill that window before a novel's index page, readers get empty or incomplete results even though the novel matches. Later pages scan the same window and cannot recover it.

Restrict the feed search to Web Novel and page those results instead of filtering all posts after a fixed number of requests.

@RibatTRW RibatTRW changed the title chore: update pull request Add Toasteful source plugin (English) Oct 12, 2026
…d out matches

Blogger ignores the /-/label path once q is present, so a q search
returns chapter posts that crowd matching novels out of the window.
Search the Web Novel label feed instead and match titles client-side.

Bump version to 1.0.1.
@RibatTRW RibatTRW changed the title Add Toasteful source plugin (English) chore: update pull request Oct 12, 2026
@RibatTRW RibatTRW changed the title chore: update pull request Add Toasteful source plugin (English) Oct 12, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant