docs: spec 003 (Tapas source), its plan, and captured Tapas fixtures

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Lucas WintherandClaude Opus 5.5 committed 2026-10-15 11:53:36 +02:00
1 parent a7253940fa
commit d5c07465da
8 files changed
+15003

No files matched your search

+47
View File
@@ -0,0 +1,47 @@
# Tapas source — implementation plan
> **For agentic workers:** superpowers:executing-plans (native, the user's standing choice). Checkbox steps.
**Goal:** a `tapas` Source (comics and novels) registered next to `webtoons`.
**Architecture:** `src/core/sources/tapas/{urls,parse,index}.ts` mirroring `webtoons/`; one registry line; host
lists; source-neutral copy. **Spec:** [`docs/specs/003-tapas.md`](../specs/003-tapas.md).
## Global constraints
- `src/core` pure (no DOM/Bun/node/GM). Tests offline, fixtures captured (done: `test/fixtures/tapas/*`,
`test/fixtures/wayback/tapas-villains-*`). No new dependencies.
## Review focus
1. Wayback rows for `<slug>-novel` must not count as the comic. → Task 1 same-series test, Task 3 history test.
2. Age-gated series must not fail the run. → Task 3 test.
3. CloudFront URLs from 2020 normalise to `us-a.tapas.io` without the size suffix. → Task 1 test.
4. Episode links resolve to the series. → Task 3 test.
5. Capitalised/underscored slugs (`RU_Screwed`) parse. → Task 1 test.
### Task 1: URLs (`tapas/urls.ts`)
**Produces:** `TAPAS_HOSTS`, `IMAGE_HOST = "us-a.tapas.io"`, `IMAGE_HOSTS`, `parseTapasUrl(url): TapasRef`
(`{ kind: "series", key: string /* slug or id */ } | { kind: "episode", id: string }`), `isTapasUrl(url)`,
`infoUrl(key)`, `normalizeImageUrl(raw)`, `isSameTapasSeries(linkUrl, slug, id)`, `slugOf(canonicalUrl)`.
- [ ] Tests: every link form; non-series paths rejected (`/comics`, `/series/`); normalisation (cloudfront → us-a,
`_z`/`_m` dropped, query dropped, other hosts untouched); same-series by slug (case-insensitive, `/info`,
trailing slash), by id, `-novel` rejected. RED → implement → GREEN → commit.
### Task 2: Parsing (`tapas/parse.ts`)
**Produces:** `parseInfoPage(html, pageUrl): { id, title, canonicalUrl, novel, covers }`, `extractCovers(html,
pageUrl)`, `episodeSeriesId(html)`, `ageGateTarget(html): string | null`.
- [ ] Tests on fixtures: comic (id 186414, title, not novel, poster 960×1440 URL, banner), novel (266599, novel),
2020 archive (cloudfront poster + banner normalised), reader page (`seriesId` 186414), age check (`from` URL).
RED → implement → GREEN → commit.
### Task 3: Source (`tapas/index.ts`) and registry
- [ ] Tests through `FakeTransport`: info link; `/series/<id>` (fake redirect = info page served for id URL);
episode link (two fetches); age check (mature, no covers, warning via a `SourceSeries` flag read by the
pipeline → add `ageGated` flag and pipeline warning); Wayback history over the CDX fixture keeps only the
comic rows. Register in `SOURCES`; hosts. RED → implement → GREEN → commit.
### Task 4: Copy, userscript @connect, docs
- [ ] Link hint, "No rehosting" warning, userscript description/@connect (+ gm test), README sources section,
ARCHITECTURE map, DECISIONS entry. Commit.
### Task 5: Verify
- [ ] Real run in headless Chrome: comic and novel (no Wayback), and one with Wayback every 12 months; final
review; remove this plan; merge; push.
+69
View File
@@ -0,0 +1,69 @@
---
status: approved
---
# 003 — Tapas source
A second source (spec 001 §4.1): covers of a [Tapas](https://tapas.io) series, comics and novels. Design approved
by the user in chat on 2026-10-15 ("Comics and novels"). Everything else — inspection, dedupe, Wayback history,
hosting, download, history — is the existing pipeline.
## 1. Verified facts (2026-10-15)
Checked against *Villains Are Destined to Die* (comic, id 186414) and its novel (id 266599), a mature series
(id 286112) and Wayback captures since 2020-10. Fixtures in `test/fixtures/tapas/` and `test/fixtures/wayback/tapas-*`.
- **Series page:** `https://tapas.io/series/<slug>/info` (its own canonical URL). `/series/<slug>` serves the
episode reader (canonical `/episode/<id>`). `/series/<id>/info` redirects to the slug form. Slugs may contain
capitals and underscores (`/series/RU_Screwed`).
- **Series id:** on the info page `pageMeta : { id: <id>, type: 'series_id' }`; on the reader `seriesId: <id>`.
- **Comic or novel:** the stats row links `/static-landing/genre?category=COMIC` or `…=NOVEL`. `og:type` is
`comicpanda:webcomic_series` for both.
- **Title:** the cover image's `alt` in `.thumb-wrapper`; `og:title` is "Read <title> | Tapas Web Comics".
- **Images** (`us-a.tapas.io/sa/<xx>/<uuid>[_<size>].<ext>`, no token, no Referer needed):
- **Portrait cover:** the `<img>` in `.thumb-wrapper` (both the info page and the 2020 reader page),
`…_z.jpg` = 400×600. Without the suffix: the original, 960×1440.
- **Banner:** `og:image` (also the `js-top-banner` / `header-layer` background), 1280×460, no suffix.
- Lists use `_m` (180 px) of other images; `pc/…` images are signed promotions of other series. Neither is used.
- Older pages use `d30womf5coomej.cloudfront.net/sa/…`; the same paths answer on `us-a.tapas.io`.
- **Mature series:** without a signed-in, age-verified account, `/series/…/info` redirects to
`/account/verify-age?from=https://tapas.io/series/<slug>/info`, a page with no series data. The userscript's
`GM_xmlhttpRequest` sends the user's own tapas.io cookies, so a signed-in adult gets the real page there.
- **Language:** English only (MangaBaka `en`).
- **Wayback:** `tapas.io/series/<slug>` captured about monthly since 2020; the prefix also matches
`<slug>-novel` and other longer slugs.
## 2. Behaviour
- **Links accepted:** `tapas.io/series/<slug>`, `…/info`, `…/<id>`, `…/<id>/info`, and `tapas.io/episode/<id>`
(the reader page names its series id). `www.` and `m.` hosts too. Fetched as `https://tapas.io/series/<slug or
id>/info`; an episode link first fetches the episode page for its series id.
- **Series:** `externalId` = the numeric id, `title`, `language: "en"`, `canonicalUrl` =
`https://tapas.io/series/<slug>/info`, `flags.novel`, `archiveUrls` = [`tapas.io/series/<slug>`].
- **Current covers:** portrait (role `poster`, suffix removed) and banner (role `banner`). The poster is the
suggested main cover as for Webtoons.
- **Mature (age check):** the series is resolved from the `from=` link (slug; title from the slug), `mature: true`,
no current covers, and a warning: Tapas shows this series only to signed-in adults; use the userscript while
signed in, or tick the Wayback history. History still runs.
- **Image URLs:** `normalizeImageUrl` maps both image hosts to `us-a.tapas.io`, drops `_<letters>` size suffixes
after the UUID and any query.
- **Same series:** a link is the same series when it is a tapas.io `/series/<slug>[/info][/]` with the same slug
(case-insensitive) or `/series/<id>[/info]` with the same id. This also filters Wayback rows (`-novel`).
- **Hosts:** fetch `tapas.io`, `www.tapas.io`, `m.tapas.io`, `us-a.tapas.io`, `d30womf5coomej.cloudfront.net`;
images `us-a.tapas.io`, `d30womf5coomej.cloudfront.net`. The userscript `@connect`s `tapas.io` and the
CloudFront host.
- **Chrome:** source-neutral where it named WEBTOON: the link hint ("WEBTOON or Tapas for now"), the
"No rehosting" warning ("the source's own image URL"), the userscript description.
## 3. Testing
Unit tests on the captured pages, no network: link parsing (every form, rejects), page parsing (comic, novel,
reader, 2020 archive, age check), URL normalisation, same-series (slug, id, `-novel` rejected), and the source
end to end through the fake transport (info page, episode link, age check, `/series/<id>` redirect).
Then a real run in headless Chrome for one comic and one novel.
## 4. Risks
- Tapas markup changes; the parser looks for two stable hooks (`thumb-wrapper`, `og:image`) and the page type link.
- The info page may show a mature badge to signed-in users that we never saw; mature is only known from the
age check.
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+182
View File
@@ -0,0 +1,182 @@
20201031233824 https://tapas.io/series/villains-are-destined-to-die
20201101073743 https://tapas.io/series/villains-are-destined-to-die
20201201230244 https://tapas.io/series/villains-are-destined-to-die
20210115210204 https://tapas.io/series/villains-are-destined-to-die
20210310220234 https://tapas.io/series/villains-are-destined-to-die
20210815193810 https://tapas.io/series/villains-are-destined-to-die
20220207235742 https://tapas.io/series/villains-are-destined-to-die/
20220314091858 https://tapas.io/series/villains-are-destined-to-die
20221020175350 https://tapas.io/series/villains-are-destined-to-die
20230130104227 https://tapas.io/series/villains-are-destined-to-die
20230216203609 https://tapas.io/series/villains-are-destined-to-die
20230711060200 https://tapas.io/series/villains-are-destined-to-die
20240324214731 https://tapas.io/series/villains-are-destined-to-die
20240722175417 https://tapas.io/series/villains-are-destined-to-die
20240910161454 https://tapas.io/series/villains-are-destined-to-die
20241002071717 https://tapas.io/series/villains-are-destined-to-die
20241122170150 https://tapas.io/series/villains-are-destined-to-die
20241210090231 https://tapas.io/series/villains-are-destined-to-die
20250321012616 https://tapas.io/series/villains-are-destined-to-die
20250401004641 https://tapas.io/series/villains-are-destined-to-die
20250801205333 https://tapas.io/series/villains-are-destined-to-die
20251112024545 https://tapas.io/series/villains-are-destined-to-die
20251201020925 https://tapas.io/series/villains-are-destined-to-die
20260112215610 https://tapas.io/series/villains-are-destined-to-die
20260309000646 https://tapas.io/series/villains-are-destined-to-die
20260527150043 https://tapas.io/series/villains-are-destined-to-die
20260701201337 https://tapas.io/series/villains-are-destined-to-die
20260825092034 https://tapas.io/series/villains-are-destined-to-die
20260908215721 https://tapas.io/series/villains-are-destined-to-die
20261011020749 https://tapas.io/series/villains-are-destined-to-die
20230916222951 https://tapas.io/series/villains-are-destined-to-die-novel
20231207104017 https://tapas.io/series/villains-are-destined-to-die-novel
20240101234523 https://tapas.io/series/villains-are-destined-to-die-novel
20240203072125 https://tapas.io/series/villains-are-destined-to-die-novel
20240302031318 https://tapas.io/series/villains-are-destined-to-die-novel
20240402010836 https://tapas.io/series/villains-are-destined-to-die-novel
20240502022841 https://tapas.io/series/villains-are-destined-to-die-novel
20240605030250 https://tapas.io/series/villains-are-destined-to-die-novel
20240705062104 https://tapas.io/series/villains-are-destined-to-die-novel
20240801210136 https://tapas.io/series/villains-are-destined-to-die-novel
20240902111241 https://tapas.io/series/villains-are-destined-to-die-novel
20241109074723 https://tapas.io/series/villains-are-destined-to-die-novel
20241210034115 https://tapas.io/series/villains-are-destined-to-die-novel
20250115001019 https://tapas.io/series/villains-are-destined-to-die-novel
20250203123143 https://tapas.io/series/villains-are-destined-to-die-novel
20250403074738 https://tapas.io/series/villains-are-destined-to-die-novel
20250711024058 https://tapas.io/series/villains-are-destined-to-die-novel
20251116194411 https://tapas.io/series/villains-are-destined-to-die-novel
20251219041119 https://tapas.io/series/villains-are-destined-to-die-novel
20260214141029 https://tapas.io/series/villains-are-destined-to-die-novel
20260819182839 https://tapas.io/series/villains-are-destined-to-die-novel
20260913185942 https://tapas.io/series/villains-are-destined-to-die-novel
20231221015719 https://tapas.io/series/villains-are-destined-to-die-novel/info
20240322004209 https://tapas.io/series/villains-are-destined-to-die-novel/info
20240506074459 https://tapas.io/series/villains-are-destined-to-die-novel/info
20240623184336 https://tapas.io/series/villains-are-destined-to-die-novel/info
20240712220349 https://tapas.io/series/villains-are-destined-to-die-novel/info
20240905185533 https://tapas.io/series/villains-are-destined-to-die-novel/info
20241203140218 https://tapas.io/series/villains-are-destined-to-die-novel/info
20250124084148 https://tapas.io/series/villains-are-destined-to-die-novel/info
20250228023359 https://tapas.io/series/villains-are-destined-to-die-novel/info
20250319155034 https://tapas.io/series/villains-are-destined-to-die-novel/info
20250426151250 https://tapas.io/series/villains-are-destined-to-die-novel/info
20250729162654 https://tapas.io/series/villains-are-destined-to-die-novel/info
20251008221657 https://tapas.io/series/villains-are-destined-to-die-novel/info
20251208081857 https://tapas.io/series/villains-are-destined-to-die-novel/info
20260215113844 https://tapas.io/series/villains-are-destined-to-die-novel/info
20260913185954 https://tapas.io/series/villains-are-destined-to-die-novel/info
20261003173459 https://tapas.io/series/villains-are-destined-to-die-novel/?_escaped_fragment_=/go-to-top
20260923013556 https://tapas.io/series/villains-are-destined-to-die-novel?c_id=1881&c_title=%F0%9F%8F%86Tapas%20Top%20Titles%F0%9F%8F%86
20241004093328 https://tapas.io/series/villains-are-destined-to-die-novel?c_id=1888&c_title=%F0%9F%8E%86March%20Series%20Finale%20Sale%F0%9F%8E%87
20260923025415 https://tapas.io/series/villains-are-destined-to-die-novel?c_id=1888&c_title=%F0%9F%8E%86March%20Series%20Finale%20Sale%F0%9F%8E%87
20260227125134 https://tapas.io/series/villains-are-destined-to-die/announcement
20201101061815 https://tapas.io/series/villains-are-destined-to-die/info
20201209223441 https://tapas.io/series/villains-are-destined-to-die/info
20210720144012 https://tapas.io/series/villains-are-destined-to-die/info
20220307133159 https://tapas.io/series/villains-are-destined-to-die/info
20220616190944 https://tapas.io/series/villains-are-destined-to-die/info
20221024005722 https://tapas.io/series/villains-are-destined-to-die/info
20221105204538 https://tapas.io/series/villains-are-destined-to-die/info
20230325233316 https://tapas.io/series/villains-are-destined-to-die/info
20230417173531 https://tapas.io/series/villains-are-destined-to-die/info
20241109074750 https://tapas.io/series/villains-are-destined-to-die/info
20241207140447 https://tapas.io/series/villains-are-destined-to-die/info
20250116032916 https://tapas.io/series/villains-are-destined-to-die/info
20250203123325 https://tapas.io/series/villains-are-destined-to-die/info
20250304001719 https://tapas.io/series/villains-are-destined-to-die/info
20250419222427 https://tapas.io/series/villains-are-destined-to-die/info
20250801205419 https://tapas.io/series/villains-are-destined-to-die/info
20251002220415 https://tapas.io/series/villains-are-destined-to-die/info
20251124103547 https://tapas.io/series/villains-are-destined-to-die/info
20251213022322 https://tapas.io/series/villains-are-destined-to-die/info
20260306115123 https://tapas.io/series/villains-are-destined-to-die/info
20260604195453 https://tapas.io/series/villains-are-destined-to-die/info
20260815195119 https://tapas.io/series/villains-are-destined-to-die/info
20260905232522 https://tapas.io/series/villains-are-destined-to-die/info
20261003190724 https://tapas.io/series/villains-are-destined-to-die/info
20260925012911 https://tapas.io/series/villains-are-destined-to-die/?_escaped_fragment_=
20230127171805 https://tapas.io/series/villains-are-destined-to-die?c_id=1002&c_title=Destined%20to%20be%20Royal%20Collection
20250513063636 https://tapas.io/series/villains-are-destined-to-die?c_id=1002&c_title=Destined%20to%20be%20Royal%20Collection
20260923015219 https://tapas.io/series/villains-are-destined-to-die?c_id=1002&c_title=Destined%20to%20be%20Royal%20Collection
20240224192751 https://tapas.io/series/villains-are-destined-to-die?c_id=1011&c_title=Women%27s%20History%20Month
20260923024728 https://tapas.io/series/villains-are-destined-to-die?c_id=1011&c_title=Women%27s%20History%20Month
20230329141002 https://tapas.io/series/villains-are-destined-to-die?c_id=1031&c_title=Fight%20for%20Love
20260923014557 https://tapas.io/series/villains-are-destined-to-die?c_id=1031&c_title=Fight%20for%20Love
20240225201156 https://tapas.io/series/villains-are-destined-to-die?c_id=1055&c_title=Best%20of%20Romance
20260923013434 https://tapas.io/series/villains-are-destined-to-die?c_id=1055&c_title=Best%20of%20Romance
20220521225521 https://tapas.io/series/villains-are-destined-to-die?c_id=1069&c_title=the%20Best%20Romance%20Fantasy%20collection
20230321044352 https://tapas.io/series/villains-are-destined-to-die?c_id=1069&c_title=the%20Best%20Romance%20Fantasy%20collection
20240418234531 https://tapas.io/series/villains-are-destined-to-die?c_id=1069&c_title=the%20Best%20Romance%20Fantasy%20collection
20260923022147 https://tapas.io/series/villains-are-destined-to-die?c_id=1069&c_title=the%20Best%20Romance%20Fantasy%20collection
20230325201634 https://tapas.io/series/villains-are-destined-to-die?c_id=1078&c_title=Most_viewed_comics_romance
20260923021822 https://tapas.io/series/villains-are-destined-to-die?c_id=1078&c_title=Most_viewed_comics_romance
20240302232254 https://tapas.io/series/villains-are-destined-to-die?c_id=1092&c_title=the%20Love%20to%20Remember%20collection
20241208054523 https://tapas.io/series/villains-are-destined-to-die?c_id=1092&c_title=the%20Love%20to%20Remember%20collection
20260923025515 https://tapas.io/series/villains-are-destined-to-die?c_id=1092&c_title=the%20Love%20to%20Remember%20collection
20220523165656 https://tapas.io/series/villains-are-destined-to-die?c_id=1113&c_title=The%20Immersive%20Gaming%20collection
20260923032027 https://tapas.io/series/villains-are-destined-to-die?c_id=1113&c_title=The%20Immersive%20Gaming%20collection
20230131004552 https://tapas.io/series/villains-are-destined-to-die?c_id=1124&c_title=Play%20Now%21
20250514082332 https://tapas.io/series/villains-are-destined-to-die?c_id=1124&c_title=Play%20Now%21
20260608085958 https://tapas.io/series/villains-are-destined-to-die?c_id=1124&c_title=Play%20Now%21
20260923015655 https://tapas.io/series/villains-are-destined-to-die?c_id=1124&c_title=Play%20Now%21
20230202081423 https://tapas.io/series/villains-are-destined-to-die?c_id=1126&c_title=The%20Ultimate%20Villainess%20Collection
20260423000531 https://tapas.io/series/villains-are-destined-to-die?c_id=1126&c_title=The%20Ultimate%20Villainess%20Collection
20260923020956 https://tapas.io/series/villains-are-destined-to-die?c_id=1126&c_title=The%20Ultimate%20Villainess%20Collection
20250319165522 https://tapas.io/series/villains-are-destined-to-die?c_id=1397&c_title=Tyrants%20in%20love
20260923030759 https://tapas.io/series/villains-are-destined-to-die?c_id=1397&c_title=Tyrants%20in%20love
20250113210223 https://tapas.io/series/villains-are-destined-to-die?c_id=1419&c_title=The%20Deadliest%20of%20Games
20260422152724 https://tapas.io/series/villains-are-destined-to-die?c_id=1419&c_title=The%20Deadliest%20of%20Games
20260923025934 https://tapas.io/series/villains-are-destined-to-die?c_id=1419&c_title=The%20Deadliest%20of%20Games
20240724005926 https://tapas.io/series/villains-are-destined-to-die?c_id=1447&c_title=The%20Villainess%20Collection
20250213134412 https://tapas.io/series/villains-are-destined-to-die?c_id=1447&c_title=The%20Villainess%20Collection
20260923020807 https://tapas.io/series/villains-are-destined-to-die?c_id=1447&c_title=The%20Villainess%20Collection
20240616181138 https://tapas.io/series/villains-are-destined-to-die?c_id=1465&c_title=Top%20Tapas%2010
20250907141930 https://tapas.io/series/villains-are-destined-to-die?c_id=1465&c_title=Top%20Tapas%2010
20260923024142 https://tapas.io/series/villains-are-destined-to-die?c_id=1465&c_title=Top%20Tapas%2010
20250714001404 https://tapas.io/series/villains-are-destined-to-die?c_id=1474&c_title=Villainesses%20are%20here%20to%20Stay
20260923013259 https://tapas.io/series/villains-are-destined-to-die?c_id=1474&c_title=Villainesses%20are%20here%20to%20Stay
20251011045613 https://tapas.io/series/villains-are-destined-to-die?c_id=1479&c_title=March%20Takeover%20Week%203%20Collection
20260923014334 https://tapas.io/series/villains-are-destined-to-die?c_id=1479&c_title=March%20Takeover%20Week%203%20Collection
20250126055929 https://tapas.io/series/villains-are-destined-to-die?c_id=1491&c_title=Best%20Dramatic%20Stories%21
20260923020334 https://tapas.io/series/villains-are-destined-to-die?c_id=1491&c_title=Best%20Dramatic%20Stories%21
20250217164440 https://tapas.io/series/villains-are-destined-to-die?c_id=1498&c_title=Top%2010%20Romance%20Stories
20260923023032 https://tapas.io/series/villains-are-destined-to-die?c_id=1498&c_title=Top%2010%20Romance%20Stories
20250206141557 https://tapas.io/series/villains-are-destined-to-die?c_id=1554&c_title=I%20am%20the%20Villainess%3F%21
20260608151039 https://tapas.io/series/villains-are-destined-to-die?c_id=1554&c_title=I%20am%20the%20Villainess%3F%21
20260923021013 https://tapas.io/series/villains-are-destined-to-die?c_id=1554&c_title=I%20am%20the%20Villainess%3F%21
20250616192131 https://tapas.io/series/villains-are-destined-to-die?c_id=1556&c_title=Romance%20with%20Fantasy
20260923030730 https://tapas.io/series/villains-are-destined-to-die?c_id=1556&c_title=Romance%20with%20Fantasy
20230606014551 https://tapas.io/series/villains-are-destined-to-die?c_id=1594&c_title=Devastatingly%20Handsome%21
20250123124357 https://tapas.io/series/villains-are-destined-to-die?c_id=1594&c_title=Devastatingly%20Handsome%21
20260923020103 https://tapas.io/series/villains-are-destined-to-die?c_id=1594&c_title=Devastatingly%20Handsome%21
20240715233146 https://tapas.io/series/villains-are-destined-to-die?c_id=1670&c_title=Strategic%20Leads
20260923012757 https://tapas.io/series/villains-are-destined-to-die?c_id=1670&c_title=Strategic%20Leads
20250122205620 https://tapas.io/series/villains-are-destined-to-die?c_id=1681&c_title=September%202022%3A%20The%20Quintessential%20Sale
20260219001555 https://tapas.io/series/villains-are-destined-to-die?c_id=1681&c_title=September%202022%3A%20The%20Quintessential%20Sale
20260923021113 https://tapas.io/series/villains-are-destined-to-die?c_id=1681&c_title=September%202022%3A%20The%20Quintessential%20Sale
20240811222255 https://tapas.io/series/villains-are-destined-to-die?c_id=1684&c_title=September%20Binge-A-Thon%3A%20Hand-picked%20series%20for%20you%21
20260923023244 https://tapas.io/series/villains-are-destined-to-die?c_id=1684&c_title=September%20Binge-A-Thon%3A%20Hand-picked%20series%20for%20you%21
20251010161412 https://tapas.io/series/villains-are-destined-to-die?c_id=1688&c_title=Hand-picked%20series%20for%20you%21
20260923012845 https://tapas.io/series/villains-are-destined-to-die?c_id=1688&c_title=Hand-picked%20series%20for%20you%21
20250326011650 https://tapas.io/series/villains-are-destined-to-die?c_id=1832&c_title=%F0%9F%8E%B9A%20Helpful%20Guide%20to%20Tapas%20July%20Deals%F0%9F%8E%B9
20260923022750 https://tapas.io/series/villains-are-destined-to-die?c_id=1832&c_title=%F0%9F%8E%B9A%20Helpful%20Guide%20to%20Tapas%20July%20Deals%F0%9F%8E%B9
20250804191603 https://tapas.io/series/villains-are-destined-to-die?c_id=1880&c_title=%F0%9F%8E%89Tapas%2012th%20Birthday%20Bash%F0%9F%8E%82
20260923020934 https://tapas.io/series/villains-are-destined-to-die?c_id=1880&c_title=%F0%9F%8E%89Tapas%2012th%20Birthday%20Bash%F0%9F%8E%82
20250521233327 https://tapas.io/series/villains-are-destined-to-die?c_id=1882&c_title=%5BBirthday%20Bash%5D%20Romance
20260923020348 https://tapas.io/series/villains-are-destined-to-die?c_id=1882&c_title=%5BBirthday%20Bash%5D%20Romance
20220129003329 https://tapas.io/series/villains-are-destined-to-die?c_id=400&c_title=Featured%20comics
20221207052610 https://tapas.io/series/villains-are-destined-to-die?c_id=400&c_title=Featured%20comics
20230321162858 https://tapas.io/series/villains-are-destined-to-die?c_id=400&c_title=Featured%20comics
20220309091051 https://tapas.io/series/villains-are-destined-to-die?c_id=400&c_title=Featured+comics
20260923015856 https://tapas.io/series/villains-are-destined-to-die?c_id=911&c_title=Grateful%20for%20Love%F0%9F%92%9D
20240221075429 https://tapas.io/series/villains-are-destined-to-die?c_id=937&c_title=Best%20of%202020
20260923021202 https://tapas.io/series/villains-are-destined-to-die?c_id=937&c_title=Best%20of%202020
20250719171504 https://tapas.io/series/villains-are-destined-to-die?c_id=953&c_title=%E2%9D%84%EF%B8%8FLet%20It%20Snow%20Hide%20and%20Seek%20Challenge%E2%9D%84%EF%B8%8F
20260923033236 https://tapas.io/series/villains-are-destined-to-die?c_id=953&c_title=%E2%9D%84%EF%B8%8FLet%20It%20Snow%20Hide%20and%20Seek%20Challenge%E2%9D%84%EF%B8%8F
20230127080232 https://tapas.io/series/villains-are-destined-to-die?c_id=956&c_title=Game%20on
20241011084243 https://tapas.io/series/villains-are-destined-to-die?c_id=956&c_title=Game%20on
20260923015454 https://tapas.io/series/villains-are-destined-to-die?c_id=956&c_title=Game%20on
20220521133810 https://tapas.io/series/villains-are-destined-to-die?c_id=975&c_title=Villainess%20Face-off%21
20230320232000 https://tapas.io/series/villains-are-destined-to-die?c_id=975&c_title=Villainess%20Face-off%21
20260923020331 https://tapas.io/series/villains-are-destined-to-die?c_id=975&c_title=Villainess%20Face-off%21