Conversation
Tangerine Archive renders coin-locked chapters with href="#" and premium-block/coin-N classes, so the shared template dropped them and the chapter list understated each novel's real length. Add a flag-gated listLockedChapters source option (Tangerine Archive only) that: - keeps premium rows in the list with the site's own unlock state, e.g. "Chapter 161 [Premium - 10 coins - Unlocked in 1 day]" or "[Premium - 12 coins - TBA]"; - rebuilds the real (still server-gated) URL from the chapter name using a rule measured against the site's own free-row hrefs (3288/3289 exact: "Chapter 27.2" -> chapter-27-2, "Chapter 141 (emoji)" -> the emoji slug, " - subtitle" suffixes dropped); - carries each row's own post id in the rebuilt path (?chapter-id=<id>), which the site ignores but parseChapter uses to verify that the URL resolves to that row - so duplicate chapter numbers (villain-let-me-touch-you Chapter 166 ids 16701/16700) and any future slug drift fail with an honest "resolves to a different chapter" error instead of showing another chapter's notice; - makes parseChapter throw a clear locked-chapter error (price read from the fetched page's gate block, covering rows still listed as free whose page is already gated, e.g. holy-night Chapter 359) and a clear "page not found" error when a rebuilt URL falls back to the series page (soft 404). Verified live, anonymous read-only: 37/37 probe checks; counts match the ajax list for garden-of-may 212 (52 premium), villain 191 (46), holy-night 464 (105), it-seems-like, me-the-weakest, deal-breaker and i-thought; free chapters parse normally; locked rows throw; shared-template guard SleepyTranslations passes with the flag off; build:compile, build:multisrc, eslint and prettier pass. Co-Authored-By: firstmate crewmate (AI agent) <crewmate@local>
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.
Stacked candidate fix for lnreader#2564 (Tangerine Archive premium/coin-locked chapters). Base is deliberately
fm/lnreader-plugins-2555-tangerine, not a default branch.Wave-2 replica of the
tangerine-premium-name-metalane. This is an independent implementation with the hardening the replica brief asked for; it is not a copy of PR 1. Every probe was anonymous and read-only: no login, cookies, nonces, purchase calls, or access-control defeat.What changed
plugins/multisrc/madara/template.ts— new flag-gatedlistLockedChaptersoption, off by default:parseNovel: keepspremium-blockrows and appends the site's own unlock state to the name, e.g.Chapter 161 [Premium - 10 coins - Unlocked in 1 day],Chapter 411 [Premium - 16 coins - TBA]; rebuilds the real (still server-gated) URL from the chapter name; setsreleaseTime: nullfor those rows (countdown/TBA is not a publication date).Chapter 141 🔞→chapter-141-%F0%9F%94%9E), a- subtitlesuffix is dropped (Chapter 166 - Secret→chapter-166).?chapter-id=<id>). The site ignores that query (verified on free and locked pages), butparseChapteruses it to verify that the URL really resolves to that row.parseChapter: throws a clear locked error with the price read from the fetched page's gate block (this also covers rows still listed as free whose page is already gated, e.g. holy-nightChapter 359→ 12 coins); throws a clear "could not find this chapter's page" when a rebuilt URL falls back to the series page (soft 404); throws "resolves to a different chapter" when the expected id mismatches — the honest outcome for the duplicateChapter 166pair (ids 16701/16700) in villain-let-me-touch-you.gate block presentOR (This chapter is lockedtext present AND no.text-left/.text-rightbody), so a lock notice can never mask real prose.plugins/multisrc/madara/sources.json—tangerinearchiveopts in (listLockedChapters: true,hasLocked: true,versionIncrements: 1→ plugin 2.2.1). Other Madara sources take the exact old code path.plugins/multisrc/madara/README.md— documents the option.What was probed (live, anonymous read-only)
npm run build:multisrc,npm run build:compile,npx eslintandnpx prettier --checkon the changed files: pass.npm run check:plugin -- plugins/english/TangerineArchive[madara].ts: PASS (popularNovels 12 novels, searchNovels, parseNovel 173 chapters, parseChapter 14497 chars).ajax/chapters/list — garden-of-may 212 (52 premium + 160 free), villain-let-me-touch-you 191 (46), holy-night 464 (105, including a 16-coin row), it-seems-like, me-the-weakest, deal-breaker (0 premium), i-thought; premium paths and?chapter-idvalues equal each row's owndata-chapter-<id>; free prose parses (garden ch160 = 6538 chars); locked gom 161/212 throw the 10-coin error; villain emojichapter-176-%F0%9F%94%9Ethrows 10-coin; holy-night 359 (list-marked free, gated page) throws 12-coin; duplicate 166 owner row throws the lock error, non-owner row throws the mismatch error; a wrong derived slug throws the not-found error;hideLockedon/off = 160/212 chapters;Chapter 27.2andChapter 0free rows are untouched.SleepyTranslations[madara]PASS (16 novels / 44 chapters / 9872 chars) andLightNovelHeaven[madara]PASS (12 novels / 798 chapters / 15439 chars)./wp-json/has 222 routes with no chapter content route. New dead ends are logged on the swarm board (CPT archive/feed 404/301,/wp/v2/typesand taxonomies, posts-by-id 404, Yoast routes 401, static cache dirs empty/403).What was NOT tested
lockmode confirms the gate; it refuses without credentials and without explicit authorization) and is ready to run the moment credentials arrive. No session/nonce was forged or replayed and no coins were spent.releaseTime: 'LL'bug for free rows is untouched and out of scope.Co-authored by an AI agent (firstmate crewmate) under the owner's authorization on file; review accordingly.