# lightnovelworld.net — chapter slug vs. series slug Research note for Gitea issue #77. All pages fetched live on **2026-08-11** with plain `curl` and a desktop UA. **No Cloudflare challenge was encountered on any request** — every fetch below returned real HTML on the first try, so the Playwright fallback was never needed. Every claim carries the URL it came from. Nothing here is inferred from the existing code; where a claim is an interpretation rather than an observation it is marked `[INFERENCE]`. --- ## 1. Summary answer table | Question | Answer | Evidence | |---|---|---| | Does the chapter slug equal the series slug? | **No, not reliably.** 3 of 41 sampled novels diverge at their latest chapter (~7%); a 4th diverges historically. | §4 | | Best chapter-page → series-URL pointer | `a[aria-label='All Chapter']` and the microdata breadcrumb `a[itemprop=item]` at `position 2`. Both carry the full absolute series URL. | §3 | | Is JSON-LD `BreadcrumbList` usable? | **No.** The Rank Math JSON-LD breadcrumb on a chapter page contains only *Home* and *the chapter itself* — the series is absent. | §3.1 | | Is `` usable? | **No.** It points at the chapter page itself. | §3.2 | | Are `og:` tags usable? | **No.** `og:url` is the chapter page; no `og:` tag names the series. | §3.3 | | Does the series page list chapters in the initial HTML? | **Yes — all of them.** 1232 unique chapters (1…1232) present in one document. | §5 | | Is there a paginated chapter endpoint? | **No.** `/novel//chapters/` and `/novel//chapters/page-2` both **404**. | §5 | | Does the series page carry *other* novels' chapter anchors? | **No.** Across 30 series pages, every `-chapter-N/` URL belonged to the page's own novel. | §6 | | Unscoped regex `lightnovelworld\.net/[a-z0-9-]+-chapter-([0-9.]+)/` on a series page | **SAFE** | §6 | | Does `/novel//` 404? | **Yes**, 404, no redirect. | §7 | | Is there a chapter-slug → series-slug endpoint that avoids parsing a chapter page? | **No endpoint found.** But `//` (no `-chapter-N`) **302s to chapter 1**, which still requires parsing a chapter page. | §7 | | Is there an "Alternative names" field explaining divergence? | **No such field exists** on lightnovelworld series pages. | §4.3 | --- ## 2. The two reference pages | URL | Status | |---|---| | `https://lightnovelworld.net/my-longevity-simulation-chapter-1/` | **200**, 0 redirects | | `https://lightnovelworld.net/novel/immortality-simulator/` | **200**, 0 redirects | | `https://lightnovelworld.net/novel/my-longevity-simulation/` | **404**, 0 redirects | Confirmed: chapter slug `my-longevity-simulation`, series slug `immortality-simulator`, and the naive `/novel//` construction is a hard 404. --- ## 3. Chapter page → series URL: every in-page pointer, in priority order All snippets below are verbatim from `https://lightnovelworld.net/my-longevity-simulation-chapter-1/`. ### Priority 1 — `a[aria-label='All Chapter']` ✅ WORKS Single occurrence in the document, inside the chapter navigation bar: ```html ``` Note the **single quotes** on both attributes — a regex written for `href="` will miss it. This is the most narrowly-targeted pointer: exactly one element on the page has `aria-label='All Chapter'`. ### Priority 2 — microdata `BreadcrumbList` / `a[itemprop=item]` ✅ WORKS At line 363–379 of the served HTML. `position 2` is the series: ```html ``` Bonus: `Immortality Simulator` gives the clean series **title** as well, which the userscript currently derives by stripping `Chapter ` off `h1.entry-title`. Caveat: `itemprop="item"` is **not** unique to the breadcrumb — the site header nav also uses `itemprop="url"` on anchors, and unrelated `itemprop="item"` usage could appear. Scope any selector to the enclosing `[itemtype="http://schema.org/BreadcrumbList"]`. ### Priority 3 — corroborating `/novel/` anchors ⚠️ AMBIGUOUS The chapter page contains exactly **8** distinct `/novel/…` hrefs. Two are navigational (`/novel/` index), one is the series, and **five are a "recommended" strip of unrelated novels**: ``` href="/novel/" href="https://lightnovelworld.net/novel/" href="https://lightnovelworld.net/novel/dreadful-radio-game/" href="https://lightnovelworld.net/novel/evil-god-average/" href="https://lightnovelworld.net/novel/immortality-simulator/" href="https://lightnovelworld.net/novel/omniscient-first-persons-viewpoint/" href="https://lightnovelworld.net/novel/reverend-insanity/" href="https://lightnovelworld.net/novel/surviving-in-a-romance-fantasy-novel/" ``` So **"grab the first `/novel//` link on a chapter page" is unsafe** — the recommendation strip contaminates it. Use Priority 1 or 2. ### ❌ NOT usable — JSON-LD `BreadcrumbList` (§3.1) There is exactly one `application/ld+json` block on the page (Rank Math SEO). Verbatim: ```html ``` Only two items — Home and the chapter. **The series does not appear.** The JSON-LD breadcrumb and the visible microdata breadcrumb disagree; the microdata one is the richer of the two. Do not use the JSON-LD. ### ❌ NOT usable — `` (§3.2) ```html ``` Self-referential. ### ❌ NOT usable — `og:` meta tags (§3.3) ```html ``` `og:url` is the chapter. `og:title` carries the **chapter-slug-derived** title ("My Longevity Simulation"), *not* the series title ("Immortality Simulator") — so og tags actively reinforce the wrong name. ### Also present — `rel=next` / `rel=prev` chapter navigation ```html ``` Chapter 1 has no `rel=prev`. Useful for walking chapters, useless for finding the series. --- ## 4. The reverse direction, and how common divergence is ### 4.1 Sample method Two independent samples, deduplicated: - 14 novels taken from the latest-updates listing on `https://lightnovelworld.net/` (distinct chapter slugs), each chapter page fetched and its `aria-label='All Chapter'` href read for the series slug. - 30 series URLs taken from `https://lightnovelworld.net/novel/`, each series page fetched and its chapter anchors' slug prefix extracted. Two of the 30 (`/novel/feed/` and `/novel/list-mode/`) are not novels and are excluded, leaving 28. One novel (`investing-in-my-crippled-wife-every-return-makes-me-stronger`) appears in both samples. **Distinct novels sampled: 41.** ### 4.2 Divergence results | Series slug (`/novel/<…>/`) | Chapter slug (`/<…>-chapter-N/`) | Result | |---|---|---| | `immortality-simulator` | `my-longevity-simulation` | **DIVERGE** | | `the-sword-illuminates-the-great-wilderness` | `radiant-blade-of-the-wilderness` | **DIVERGE** | | `a-villains-will-to-survive` | `the-villain-wants-to-live` | **DIVERGE** | | `all-jobs-and-classes-i-just-wanted-one-skill-not-them-all` | `all-jobs-and-classes-i-just-wanted-one-skill-not` (ch. 1–99) **and** `all-jobs-and-classes-i-just-wanted-one-skill-not-them-all` (ch. 100–423) | **SPLIT** (latest matches) | | `86-eighty-six` | same | match | | `a-dungeon-beneath-my-house-let-me-gain-800-exp` | same | match | | `a-journey-of-black-and-red` | same | match | | `a-knight-who-eternally-regresses` | same | match | | `a-regressors-tale-of-cultivation` | same | match | | `a-will-eternal` | same | match | | `absolute-resonance` | same | match | | `absolute-sword-sense` | same | match | | `advent-of-the-three-calamities` | same | match | | `after-changing-to-the-ruthless-way-the-brothers-cried-and-begged-for-forgiveness` | same | match | | `against-the-gods` | same | match | | `apocalypse-i-built-the-infinite-train` | same | match | | `arcane-exfil` | same | match | | `as-a-mafia-boss-i-refuse-to-be-an-extra` | same | match | | `ascendance-of-a-bookworm` | same | match | | `avatar-conquering-the-elements` | same | match | | `battle-world-ascending-without-limits` | same | match | | `became-the-patron-of-villains` | same | match | | `ending-maker` | same | match | | `got-dropped-into-a-ghost-story-still-gotta-work` | same | match | | `greed-all-for-what` | same | match | | `investing-in-my-crippled-wife-every-return-makes-me-stronger` | same | match | | `lord-of-mysteries-2-circle-of-inevitability` | same | match | | `lord-of-the-mysteries` | same | match | | `my-vampire-system` | same | match | | `cleaver-of-sin` | same | match | | `greatest-legacy-of-the-magus-universe` | same | match | | `magus-infinite` | same | match | | `path-of-the-extra` | same | match | | `regnum-aetern-dual-rebirth` | same | match | | `shadow-slave` | same | match | | `slime-evolution` | same | match | | `sss-awakening-i-can-class-change-at-will` | same | match | | `the-dao-of-reincarnation-ascending-through-a-hundred-lives` | same | match | | `the-gamers-pov` | same | match | | `the-insane-regressor-throne-of-pride` | same | match | | `the-villains-pov` | same | match | **Counts (41 distinct novels):** - **37 match** (90.2%) - **3 diverge at the latest chapter** (7.3%) — these are the ones that break the poller *today* - **1 splits mid-series** but its newest chapters happen to match the series slug (2.4%) `[INFERENCE]` The true site-wide divergence rate is probably in the same ballpark, but 41 novels out of a catalogue of thousands is a small sample and the listing page is alphabetically front-loaded. Treat ~7% as an order of magnitude, not a precise figure. ### 4.3 Is there a derivable rule? **No.** The divergence is **not directional**, so you cannot compute one slug from the other: - `immortality-simulator` — the *series* carries the polished English title (`

` is absent from the chapter page's own naming; `og:title` says "My Longevity Simulation"), while the *chapters* carry the literal translation. - `the-sword-illuminates-the-great-wilderness` — the reverse: the *series* has the literal title (`

The Sword Illuminates the Great Wilderness

`, `Read The Sword Illuminates the Great Wilderness English Online Free - LightNovelworld`) while the *chapters* carry the polished one (`radiant-blade-of-the-wilderness`). - `a-villains-will-to-survive` — `

A Villain’s Will to Survive

`, chapters at `the-villain-wants-to-live-chapter-N/`. `[INFERENCE]` The consistent explanation is that a novel is retitled after publication; WordPress updates the series post's slug but leaves the already-published chapter posts' slugs alone. The direction of the retitle varies per novel, which is why no rule exists. This is consistent with the split case in §4.4, but the site exposes no field that states it. **There is no "Alternative names" / "Associated names" field.** Scanning `https://lightnovelworld.net/novel/a-villains-will-to-survive/` and `https://lightnovelworld.net/novel/immortality-simulator/` for such a label returns nothing; the series info panel exposes only **Author**, **Released**, **Type**, **Status**. (The only `names?` match in the document is the `>Name*<` label on the comment form.) So the old title is **not** recoverable from the series page — the mapping only exists in the chapter anchors themselves. ### 4.4 The split case — a slug can change *mid-series* `https://lightnovelworld.net/novel/all-jobs-and-classes-i-just-wanted-one-skill-not-them-all/` carries **two** chapter slugs in one page: | Chapter slug prefix | Anchors | Chapter range | |---|---|---| | `all-jobs-and-classes-i-just-wanted-one-skill-not` | 100 | 1 – 99 | | `all-jobs-and-classes-i-just-wanted-one-skill-not-them-all` | 325 | 100 – 423 | Both resolve, and **both point back at the same series**: ``` 200 https://lightnovelworld.net/all-jobs-and-classes-i-just-wanted-one-skill-not-chapter-1/ 200 https://lightnovelworld.net/all-jobs-and-classes-i-just-wanted-one-skill-not-them-all-chapter-404/ ``` **Consequence:** a single stored chapter slug is not a sufficient key even for one novel. A fix that captures "the chapter slug at bookmark time" and pins the poller regex to it would still miss chapters published under a later slug. This is the strongest argument for the unscoped regex over a stored-slug regex. --- ## 5. Series page → chapter list From `https://lightnovelworld.net/novel/immortality-simulator/` (200, 655 037 bytes): - **1234** anchors matching `href="https://lightnovelworld.net/-chapter-/"`. - **1232 unique** chapter URLs, covering chapter numbers **1 through 1232 with no gaps**. - The 2 extras are the First/Last shortcut widget, which duplicates two chapters: ```html

Read Immortality Simulator

``` **The entire chapter list is in the initial HTML.** No JS hydration, no pagination, no separate endpoint. Confirmed by probing the shapes the issue speculated about: | URL | Status | |---|---| | `https://lightnovelworld.net/novel/immortality-simulator/chapters/` | **404** | | `https://lightnovelworld.net/novel/immortality-simulator/chapters/page-2` | **404** | The only `page-numbers` / pagination markup in the document belongs to `class="wpdiscuz-comment-pagination"` (the comment widget), not the chapter list. This holds for large novels too: `greed-all-for-what` served 2666 chapter anchors and `my-vampire-system` 2547, all inline in one response. **All chapter hrefs are absolute** (`https://lightnovelworld.net/…`). A grep for relative `href="/-chapter-N/"` on the series page returned **0** matches, so a pattern anchored on the literal host is safe. --- ## 6. Is the unscoped chapter regex SAFE on a series page? ### Verdict: **SAFE** Proposed pattern: `lightnovelworld\.net/[a-z0-9-]+-chapter-([0-9.]+)/` **Proof.** For each of the 30 series pages fetched from `https://lightnovelworld.net/novel/`, every occurrence of `-chapter-/` anywhere in the document (href or not) was reduced to its slug prefix and deduplicated: - **27 of 28 real series pages had exactly 1 distinct chapter-slug prefix**, equal to that novel's own chapter slug. - **1 page had 2 prefixes** — `all-jobs-and-classes-…`, and §4.4 proves *both belong to that same novel*. Not foreign. - **0 pages carried any other novel's chapter URL.** The recommendation and sidebar widgets on a series page link to **series** URLs only, never chapter URLs. On `https://lightnovelworld.net/novel/immortality-simulator/` the recommendation strip renders as: ```html