Conversation
RibatTRW
force-pushed
the
fm/tangerine-premium-nav-continuity
branch
from
September 23, 2026 12:01
65aa49c to
8ae4d84
Compare
Tangerine Archive's coin-locked (premium) chapters have href="#" in the
chapter list, so the Madara template dropped them from novel.chapters and
the reader's prev/next jumped straight past them. Their bodies are
server-gated behind login + coins, so they cannot be read anonymously.
Add a flag-gated `listLockedChapters` source option (only tangerinearchive
opts in) that:
- keeps locked rows in the list, rebuilding their canonical
/series/<slug>/chapter-<n>/ URL from the row's chapter number, including
the slug token when a non-ASCII suffix is part of it ("Chapter 176 🔞" ->
chapter-176-🔞, verified against the real hrefs of 1036 free rows);
- derives locked rows' unlock date from the site's "Unlocked in N ..."
countdown and claims none for "TBA", instead of parseData's backwards
subtraction reporting a past date;
- returns an honest locked notice from parseChapter (price from the page's
coin-N class, unlock countdown read from the series chapter list) instead
of blank text, plus an explicit "could not be loaded" notice when a
derived URL lands on the series page (duplicate chapter numbers).
Tangerine Archive also gets the existing "Hide locked chapters" setting
(`hasLocked`) and a version bump to 2.2.1. Sources without the flag keep
the previous code path unchanged.
Co-Authored-By: firstmate-crewmate <crewmate@firstmate.local>
RibatTRW
force-pushed
the
fm/tangerine-premium-nav-continuity
branch
from
September 23, 2026 12:04
8ae4d84 to
e1e4477
Compare
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 (base is that PR's branch
fm/lnreader-plugins-2555-tangerine, not the default branch).Fixes the gap PR 2564 documented: premium (coin-locked) chapters were left out of the chapter list. They now appear, marked as locked, and opening one gives an honest locked notice instead of a blank chapter - so reader prev/next steps through them instead of skipping them.
What changed
plugins/multisrc/madara/template.ts(additive and flag-gated; other Madara sources take the old code path unchanged):New
listLockedChaptersoption inMadaraOptions.parseNovel: locked rows (premium-block,href="#") are kept. Their canonical/series/<slug>/chapter-<n>/URL is rebuilt from the row's chapter number (Chapter 175 -> chapter-175/, dots become dashes,Chapter 176 🔞 -> chapter-176-🔞when a non-ASCII token is part of the slug), the existing🔒prefix is kept, andchapterNumber/order stay aligned with the full live inventory. The non-ASCII rule was checked against the real hrefs of 1036 free rows on the live site (1035 exact, the single miss being a duplicate title that has a real href and is never reconstructed).Locked rows'
releaseTimecomes from the site's own unlock countdown: "Unlocked in 4 weeks" becomes the future date it names (asYYYY-MM-DD); "TBA" claims no date. The template'sparseDatawould have subtracted instead and reported a date in the past.New
parseChapterhelperparseLockedChapter: when the fetched page contains.reading-content .content-blocked, it returns e.g.Price is read from the block's
coin-<N>class; the countdown is read from the series chapter-list ajax (the only place the site renders it) by chapter id, with a price-only fallback if that lookup fails.A derived URL can land on the series page when the real slug is not
chapter-<n>(peer-verified cases: emoji-suffixed titles, duplicate chapter numbers). Those rows now return an explicit "could not be loaded" notice instead of coming back empty.plugins/multisrc/madara/sources.json+plugins/multisrc/madara/README.md:tangerinearchiveopts in withlistLockedChapters, the existinghasLockedsetting (so users can hide locked chapters again), andversionIncrements: 1(version 2.2.1).Chapter name metadata in the list is deliberately unchanged beyond the existing
🔒marker.What was probed (anonymous, read-only; no cookies, no login, no purchase, no bypass)
POST /series/<slug>/ajax/chapters/is the full inventory in one response; premium rows areli.premium.coin-N.data-chapter-<id>.premium-blockwithhref="#"and a countdown or TBA. Built the URL rule from the row's visible number and verified derived URLs against the row'sdata-chapter-<id>(#wp-manga-current-chap data-idon the fetched page) across 5 series..reading-content .content-blockedand no body; free pages have real prose (~6.4k-10.5k chars) and zerocontent-blocked. Countdown is absent from the chapter page, present only in the list.159 -> 160 -> 161 -> 162 -> 161 -> 160(garden-of-may) and51 -> 52 -> 53 -> 54 -> 53 -> 52(i-thought-i-was-the-monster-dukes-fake-tranquilizer): free chapters return prose, locked ones return the notice.Chapter 175 🔞/Chapter 176 🔞now reconstruct to/chapter-175-%F0%9F%94%9E/and/chapter-176-%F0%9F%94%9E/, whose pages carry the row's owndata-id(16719 / 16720) and return the locked notice;Chapter 242 - 🔞stays plain/chapter-242/(a dash makes the emoji a title, not a slug token); a deliberately wrong path (/chapter-176/) returns the "could not be loaded" notice instead of a blank chapter; the duplicateChapter 166row returns a locked notice, never free prose.hideLockedverified both ways with a stubbed storage: off -> 212 chapters / 52 locked, on -> 160 chapters / 0 locked.Validation
npm run build:multisrcandnpm run build:compilepass.npm run check:plugin -- 'plugins/english/TangerineArchive[madara].ts'passes all four steps (popularNovels 12, searchNovels pass, parseNovel 173 chapters, parseChapter 14497 chars).SleepyTranslations[madara]passes all four checks identically on base and head.ZetroTranslation[madara]popularNovelsfails on the base commit too (dead site), andBoxNovel/NovelNice/LunarLetters/WooksTeahouseare site-level unreachable - none caused by this change.prettier --checkandeslinton the changed file pass (repo-wide eslint has pre-existing errors in untouched files).Not tested
Related: lnreader#2564, lnreader#2555