Skip to content

feat(english): add Maehwasup, Hen Novel Translations and MyLasted - #2638

Open
Sadloif wants to merge 2 commits into
lnreader:masterfrom
Sadloif:feat/three-english-translation-sources
Open

Sadloif wants to merge 2 commits into
lnreader:masterfrom
Sadloif:feat/three-english-translation-sources

Conversation

@Sadloif

@Sadloif Sadloif commented Oct 5, 2026 •

Copy link
Copy Markdown

Adds three English sources: Maehwasup, Hen Novel Translations, and Machine Editing (MyLasted). Each plugin supports catalogue/search, novel details, complete public chapter lists, and chapter reading through LNReader's normal fetching helpers.

  • Maehwasup reads the chapter index from the site's public WordPress.com API and collects every index page.
  • Hen uses its custom novel/episode layout and lists the site's FREE CHAPTERS, excluding advance-access entries. Password-protected chapter pages produce an error. Both /episodes/ permalinks and WordPress query-addressed episodes are retained with distinct identities.
  • MyLasted reads the site's series catalogue and label-specific Blogger feeds, continuing by the number of entries actually received until the complete index is collected. It supports both the main Mount Hua project and the archive project.

All three include 96×96 icons, clean navigation/advertising from chapter bodies, validate destination URLs, and reject malformed or repeated index entries instead of returning a partial chapter list. The sites' custom layouts do not match an existing multisrc template. None of these sources is in BLACKLIST.json.

Review fixes (version 1.0.1)

  • All three chapter parsers now use formatting-tag and attribute allowlists. Scripts, embedded documents, SVG/MathML, styles, event handlers, and executable URL schemes are removed. Links/images are limited to HTTP(S); relative destinations are resolved to the source page. The cleaned text must still meet the chapter-length check.
  • Hen requires one explicitly closed free-list container, one valid chapter link per direct row, and full row accounting. Repeated identities, missing/invalid links, nested rows, declared-total mismatches, and advertised pagination/load-more are errors. Query-addressed episodes retain their post IDs; they were previously silently skipped. The live Barbarian list now has 747 entries and Reaper has 189.
  • MyLasted uses one transitive ordering tuple: prologues, numbered chapters in numeric order, unnumbered extras by publication date, then epilogues; date/path tie-breakers make ties deterministic.

Hen currently supplies its free list inline without an independent free-chapter total. The plugin validates the full supplied list; it cannot detect unadvertised server-side omissions. The Korean-series total is not a free-chapter total. Six query-addressed Barbarian entries (584, 585, 589, 598, 599, 600) currently return site-side 404s. They remain represented in the source list, and attempting to read one reports HTTP 404 instead of treating an error page as chapter content.

Validation

  • Official check:plugin passes catalogue, search, novel parsing and chapter reading for all three sources.
  • Targeted ESLint and Prettier checks pass; production compilation and TypeScript checks pass.
  • Additional desktop checks exercised all nine project entries, complete unique supplied chapter lists, and first/latest public chapter bodies. Thirty-eight targeted regression checks cover hostile HTML attributes/URLs/embedded content, incomplete and repeated lists, query-addressed episodes, and mixed numbered/unnumbered ordering. Twelve original HTTP failure, destination and protected-page checks also pass.
  • The contributor tested the published 1.0.0 plugins in LNReader on Android and confirmed they work. Version 1.0.1 was rechecked on desktop; downloading/offline reading of this patch was not separately confirmed on Android.

Checklist

  • These are new upstream plugins; version 1.0.1 also updates the contributor's earlier published 1.0.0 versions.
  • Tested in the app by the contributor, alongside the automated live checks.
  • No related issue is claimed or closed by this submission.
  • Conventional commit message: feat(english): add three translation sources.

Implementation and submission prepared with OpenAI Codex assistance; app testing was performed by the contributor.

Add Maehwasup, Hen Novel Translations and Machine Editing (MyLasted) with complete public chapter indexes and source icons.

Prepared with OpenAI Codex assistance; app behavior verified by the contributor.
@greptile-apps

greptile-apps Bot commented Oct 5, 2026 •

Copy link
Copy Markdown

RetriggerConfidence Score: 3/5

[Medium risk] Adds three new novel source plugins.

This PR is not safe to merge until the new chapter parsers stop passing executable HTML to the reader.

Findings

  1. P1 Security Chapter HTML can run code ▶
  2. P2 Free chapters silently disappear ▶
  3. P2 Chapters can sort incorrectly ▶

Summary

Adds Maehwasup, Hen Novel Translations, and Machine Editing (MyLasted) as English sources for finding projects and reading public chapters. Each plugin reads the source’s own pages or feeds and adds an icon.

  • Maehwasup collects chapter posts from the public WordPress.com API.
  • Hen Novel Translations lists free episodes and reads public episode pages.
  • MyLasted loads projects from Blogger and gathers their chapter feeds.

Reviews (1) · Last reviewed commit: "feat(english): add three translation sou..."

Comment thread plugins/english/hennoveltranslations.ts Outdated
Comment on lines +115 to +123
body
.find('script,style,iframe,form,button,.episode-navigation,.adsbygoogle')
.remove();
body.find('[style]').removeAttr('style');
if (body.text().trim().length < 200)
throw new Error(
'Hen Novel Translations: no readable public chapter was found.',
);
return body.html()!;

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 security Chapter HTML can run code

All three new chapter parsers leave event-handler attributes in the HTML they return. If a publisher adds a handler to a chapter, the reader inserts it without cleaning it, so the publisher's code can run when someone opens the chapter. Remove unsafe attributes and links before returning the HTML.

How this was verified: The parsers return remote HTML with event handlers intact, and the reader inserts it with dangerouslySetInnerHTML.

Comment thread plugins/english/hennoveltranslations.ts Outdated
Comment on lines +73 to +87
const url = new URL(this.resolveUrl(link.attr('href')!));
if (!url.pathname.startsWith('/episodes/') || seen[url.pathname]) return;
seen[url.pathname] = true;
const title = link.text().trim();
const number = /(?:episode|chapter)\s+(\d+(?:\.\d+)?)/i.exec(title);
const row = link.closest('li');
chapters.push({
name: title,
path: url.pathname,
chapterNumber: number ? Number(number[1]) : undefined,
releaseTime: row.find('time').attr('datetime'),
});
});
chapters.reverse();
if (!chapters.length)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Free chapters silently disappear

parseNovel skips repeated chapter paths and accepts any nonempty free-chapter list. If the page repeats a link or shows only part of its chapters, readers get an incomplete list with no warning. Reject repeated links and check that the full list was collected.

Comment thread plugins/english/mylasted.ts Outdated
Comment on lines +109 to +113
chapters.sort((a, b) => {
if (a.chapterNumber !== undefined && b.chapterNumber !== undefined)
return a.chapterNumber - b.chapterNumber;
return (a.releaseTime || '').localeCompare(b.releaseTime || '');
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Chapters can sort incorrectly

MyLasted compares chapter numbers when both entries have one, but switches to dates when either lacks one. If a prologue or side story is published later, those rules can disagree and put it in the wrong reading position. Use one consistent rule for the whole list.

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!

Sanitize chapter HTML, validate every supplied Hen free-list row including query-addressed episodes, and use deterministic mixed-chapter ordering for MyLasted. Bump all three to 1.0.1.

Prepared with OpenAI Codex assistance; validated with live checks and targeted regression fixtures.

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