From 6edbceba152c9a7906be6adceffd84774033b012 Mon Sep 17 00:00:00 2001 From: CJ Rivas Date: Wed, 15 Jul 2026 23:13:32 -0400 Subject: [PATCH 01/12] KSN: add Supabase schema for catalog and user data - Add migration creating catalog tables: `series`, `arc_mappings`, `movies`, `search_aliases`, `genre_filters` - Add owner-scoped `user_progress` and `user_preferences` tables - Public read-only RLS on catalog; `auth.uid() = user_id` on user tables - Add `react-query-persist-client` + async-storage persister for the upcoming offline catalog cache --- bun.lock | 14 +- package.json | 4 +- ...715000000_kasane_catalog_and_user_data.sql | 136 ++++++++++++++++++ 3 files changed, 150 insertions(+), 4 deletions(-) create mode 100644 supabase/migrations/20260715000000_kasane_catalog_and_user_data.sql diff --git a/bun.lock b/bun.lock index 04e35f2..9991c39 100644 --- a/bun.lock +++ b/bun.lock @@ -10,7 +10,9 @@ "@expo/metro-runtime": "56.0.13", "@react-native-async-storage/async-storage": "3.1.0", "@supabase/supabase-js": "^2.110.2", - "@tanstack/react-query": "5.100.14", + "@tanstack/query-async-storage-persister": "^5.101.2", + "@tanstack/react-query": "5.101.2", + "@tanstack/react-query-persist-client": "^5.101.2", "expo": "56.0.6", "expo-constants": "56.0.16", "expo-font": "56.0.5", @@ -485,9 +487,15 @@ "@supabase/supabase-js": ["@supabase/supabase-js@2.110.2", "", { "dependencies": { "@supabase/auth-js": "2.110.2", "@supabase/functions-js": "2.110.2", "@supabase/postgrest-js": "2.110.2", "@supabase/realtime-js": "2.110.2", "@supabase/storage-js": "2.110.2" } }, "sha512-r9q9w4ZQ6mOjh36aqUNFSisBF611vzpO8JphBESr2Q1SWvmGFQeI7Jq7Y+PaNMZ6Zszz+S2yTlJStCpnaMSnQg=="], - "@tanstack/query-core": ["@tanstack/query-core@5.100.14", "", {}, "sha512-5X41dGpxgeaHISCRW2oYwcSycZeULZzAunaudXT9ov1KOTj9xwt0CH6hbwqP1/z74ZWF7rYFnDpyYH07XFcZew=="], + "@tanstack/query-async-storage-persister": ["@tanstack/query-async-storage-persister@5.101.2", "", { "dependencies": { "@tanstack/query-core": "5.101.2", "@tanstack/query-persist-client-core": "5.101.2" } }, "sha512-jf7zvVKZ5q2j/xuhbTIBUpw5xt6cw/ioOFQquxK7fRY0AmMQP8A0JVMOgYoeQLA4PKdeT7RxsuLAF0Lft9oJ8Q=="], - "@tanstack/react-query": ["@tanstack/react-query@5.100.14", "", { "dependencies": { "@tanstack/query-core": "5.100.14" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-oOr6aRdSFEwWhzxEkD/9ZcItM3+LjBSkeVmadWKwUssAHTsqd/7bOjWrX4AbvEkoEhgAxzN0Xk6H/aYzXiYBAw=="], + "@tanstack/query-core": ["@tanstack/query-core@5.101.2", "", {}, "sha512-hH5MLoJhF7KaIGd7q3xTXGXvslI+GYlM1Z/35aSHHWaCJWB7XvTSHYuV3eM7tw+aE0mT/xMro4M4Q9rCGHT0lw=="], + + "@tanstack/query-persist-client-core": ["@tanstack/query-persist-client-core@5.101.2", "", { "dependencies": { "@tanstack/query-core": "5.101.2" } }, "sha512-rgMsbvBVpSPDUsprC9FYxojdG0Q1LH6yq1i3DXz2aps4VEqv2l4Msj3YDqIifU3xkl/DrYe9YWntZAJLrM6xTg=="], + + "@tanstack/react-query": ["@tanstack/react-query@5.101.2", "", { "dependencies": { "@tanstack/query-core": "5.101.2" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-seDkr6kzGzX1okaaTtZPtgA688CDPlXUz1C6xSg0ESqn04Vuc8tlrYms1s3de+znBqhPVxFRfpAfUf+6XvfPWg=="], + + "@tanstack/react-query-persist-client": ["@tanstack/react-query-persist-client@5.101.2", "", { "dependencies": { "@tanstack/query-persist-client-core": "5.101.2" }, "peerDependencies": { "@tanstack/react-query": "^5.101.2", "react": "^18 || ^19" } }, "sha512-19UpaRtf0lvB2QAJ2MoixxtGf3osMOd508g99EsttUj4+3eLs+ulnNgYjB7AkQMHrRlcbVXqpVNqWkB4a7g8Zw=="], "@tauri-apps/cli": ["@tauri-apps/cli@2.11.2", "", { "optionalDependencies": { "@tauri-apps/cli-darwin-arm64": "2.11.2", "@tauri-apps/cli-darwin-x64": "2.11.2", "@tauri-apps/cli-linux-arm-gnueabihf": "2.11.2", "@tauri-apps/cli-linux-arm64-gnu": "2.11.2", "@tauri-apps/cli-linux-arm64-musl": "2.11.2", "@tauri-apps/cli-linux-riscv64-gnu": "2.11.2", "@tauri-apps/cli-linux-x64-gnu": "2.11.2", "@tauri-apps/cli-linux-x64-musl": "2.11.2", "@tauri-apps/cli-win32-arm64-msvc": "2.11.2", "@tauri-apps/cli-win32-ia32-msvc": "2.11.2", "@tauri-apps/cli-win32-x64-msvc": "2.11.2" }, "bin": { "tauri": "tauri.js" } }, "sha512-bk3HemqvGRoy+5D/dVMUQHKMYLglD0jVnMm/0iGMH6ufZ+p8r14m6BpIixwij3PBvZdvORUp1YifTD8QxVZ1Nw=="], diff --git a/package.json b/package.json index 6acacab..269cc70 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,9 @@ "@expo/metro-runtime": "56.0.13", "@react-native-async-storage/async-storage": "3.1.0", "@supabase/supabase-js": "^2.110.2", - "@tanstack/react-query": "5.100.14", + "@tanstack/query-async-storage-persister": "^5.101.2", + "@tanstack/react-query": "5.101.2", + "@tanstack/react-query-persist-client": "^5.101.2", "expo": "56.0.6", "expo-constants": "56.0.16", "expo-font": "56.0.5", diff --git a/supabase/migrations/20260715000000_kasane_catalog_and_user_data.sql b/supabase/migrations/20260715000000_kasane_catalog_and_user_data.sql new file mode 100644 index 0000000..99fce8e --- /dev/null +++ b/supabase/migrations/20260715000000_kasane_catalog_and_user_data.sql @@ -0,0 +1,136 @@ +-- kasane: catalog + user-data schema +-- +-- Catalog tables (series, arc_mappings, movies, search_aliases, genre_filters) +-- are public read-only: anyone can SELECT, nobody writes from the client. +-- Writes happen via the Supabase dashboard / service role only. +-- +-- User tables (user_progress, user_preferences) are owner-scoped via RLS. + +-- --------------------------------------------------------------------------- +-- Catalog +-- --------------------------------------------------------------------------- + +create table public.series ( + id bigint generated always as identity primary key, + anilist_anime_id integer not null unique, + anilist_manga_id integer not null, + title text not null, + source_notes text, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now() +); +create index series_anilist_manga_id_idx on public.series (anilist_manga_id); + +create table public.arc_mappings ( + id bigint generated always as identity primary key, + series_id bigint not null references public.series (id) on delete cascade, + position integer not null, + episode_start integer, + episode_end integer, + chapter_start integer not null, + chapter_end integer not null, + arc text, + season integer, + note text, + unique (series_id, position), + constraint arc_episodes_paired check ((episode_start is null) = (episode_end is null)) +); +create index arc_mappings_series_id_idx on public.arc_mappings (series_id); + +create table public.movies ( + id bigint generated always as identity primary key, + series_id bigint not null references public.series (id) on delete cascade, + position integer not null, + anilist_id integer, + title text not null, + year integer not null, + chapter_start integer, + chapter_end integer, + after_episode integer, + note text, + unique (series_id, position), + constraint movie_chapters_paired check ((chapter_start is null) = (chapter_end is null)) +); +create index movies_series_id_idx on public.movies (series_id); + +create table public.search_aliases ( + alias text primary key, + target text not null +); + +create table public.genre_filters ( + id text primary key, + label text not null, + kind text not null check (kind in ('genre', 'tag')), + token text not null, + sort_order integer not null +); + +-- --------------------------------------------------------------------------- +-- User data +-- --------------------------------------------------------------------------- + +create table public.user_progress ( + user_id uuid not null references auth.users (id) on delete cascade, + route_id integer not null, + side text not null check (side in ('anime', 'manga')), + position integer not null, + updated_at timestamptz not null default now(), + primary key (user_id, route_id, side) +); + +create table public.user_preferences ( + user_id uuid primary key references auth.users (id) on delete cascade, + japanese boolean not null default false, + hidden_genres text[] not null default '{}', + updated_at timestamptz not null default now() +); + +-- --------------------------------------------------------------------------- +-- Row-level security +-- --------------------------------------------------------------------------- + +alter table public.series enable row level security; +alter table public.arc_mappings enable row level security; +alter table public.movies enable row level security; +alter table public.search_aliases enable row level security; +alter table public.genre_filters enable row level security; +alter table public.user_progress enable row level security; +alter table public.user_preferences enable row level security; + +create policy "series are readable by everyone" + on public.series for select using (true); +create policy "arc_mappings are readable by everyone" + on public.arc_mappings for select using (true); +create policy "movies are readable by everyone" + on public.movies for select using (true); +create policy "search_aliases are readable by everyone" + on public.search_aliases for select using (true); +create policy "genre_filters are readable by everyone" + on public.genre_filters for select using (true); + +create policy "users manage their own progress" + on public.user_progress for all + using (auth.uid() = user_id) + with check (auth.uid() = user_id); +create policy "users manage their own preferences" + on public.user_preferences for all + using (auth.uid() = user_id) + with check (auth.uid() = user_id); + +-- --------------------------------------------------------------------------- +-- Grants (RLS still gates rows; these gate table access per role) +-- --------------------------------------------------------------------------- + +grant select on + public.series, + public.arc_mappings, + public.movies, + public.search_aliases, + public.genre_filters + to anon, authenticated; + +grant select, insert, update, delete on + public.user_progress, + public.user_preferences + to authenticated; From e984ac94d855419a8ab189afbb02e69616620014 Mon Sep 17 00:00:00 2001 From: CJ Rivas Date: Wed, 15 Jul 2026 23:20:23 -0400 Subject: [PATCH 02/12] KSN: add one-time Supabase catalog seeder - Read the 578 mapping JSONs in `ALL_MAPPINGS` order and load `series`, `arc_mappings`, and `movies` via the PostgREST client - Preserve insertion order so identity ids keep the shared-manga-id tie-break (first-listed series wins), matching `findMappingByMediaId` - Seeded 578 series, 2767 arcs, 221 movies, 30 aliases, 27 genre filters --- scripts/seed-supabase.ts | 202 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 scripts/seed-supabase.ts diff --git a/scripts/seed-supabase.ts b/scripts/seed-supabase.ts new file mode 100644 index 0000000..8b3040c --- /dev/null +++ b/scripts/seed-supabase.ts @@ -0,0 +1,202 @@ +/** + * One-time seeder: loads the static mapping JSON files into Supabase. + * + * The mapping data is spread across ~580 files in `src/data/mappings/`, wired + * together (in a specific order) by the `ALL_MAPPINGS` array in + * `src/data/index.ts`. That order matters: `findMappingByMediaId` returns the + * first match, so when two series share a manga id the earlier one wins. We + * insert `series` in the same order so identity ids increment accordingly, and + * the client fetches ordered by id to preserve the tie-break. + * + * Catalog tables are read-only under RLS, so this must run while a temporary + * insert grant/policy is in place (see the surrounding seed steps). It talks to + * PostgREST with the publishable key — no service key or raw SQL needed. + * + * Run: `bun run scripts/seed-supabase.ts` + */ +import * as fs from "fs"; +import * as path from "path"; +import { createClient } from "@supabase/supabase-js"; + +type RawEntry = { + episodes?: number[]; + chapters: number[]; + arc?: string; + season?: number; + note?: string; +}; +type RawMovie = { + anilistId?: number; + title: string; + year: number; + chapters?: number[]; + afterEpisode?: number; + note?: string; +}; +type RawMapping = { + anilistAnimeId: number; + anilistMangaId: number; + title: string; + sourceNotes?: string; + mappings: RawEntry[]; + movies?: RawMovie[]; +}; + +const SUPABASE_URL = "https://obtgldkascmxbtpnvscn.supabase.co"; +const SUPABASE_PUBLISHABLE_KEY = + "sb_publishable_4z9kuzXtE3PeVgbPDtQUWw_cSrKxsu-"; + +const ROOT = path.resolve(__dirname, ".."); +const MAPPINGS_DIR = path.join(ROOT, "src/data/mappings"); + +/** Ordered list of mapping files, matching the `ALL_MAPPINGS` array order. */ +const orderedMappingFiles = (): string[] => { + const indexSrc = fs.readFileSync( + path.join(ROOT, "src/data/index.ts"), + "utf8", + ); + + const importRe = + /import\s+(\w+)\s+from\s+"@\/data\/mappings\/([^"]+)\.json";/g; + const varToFile = new Map( + [...indexSrc.matchAll(importRe)].map((m): [string, string] => [ + m[1], + `${m[2]}.json`, + ]), + ); + + const start = indexSrc.indexOf("const ALL_MAPPINGS: SeriesMapping[] = ["); + const arrOpen = indexSrc.indexOf("= [", start) + 2; + const end = indexSrc.indexOf("].map(normalizeMapping);", arrOpen); + + return indexSrc + .slice(arrOpen + 1, end) + .split(",") + .map((s) => s.trim()) + .filter((s) => varToFile.has(s)) + .map((s) => { + const file = varToFile.get(s); + if (!file) throw new Error(`no file for ${s}`); + return file; + }); +}; + +const chunk = (arr: T[], size: number): T[][] => + arr.reduce((acc, item, i) => { + if (i % size === 0) acc.push([]); + acc[acc.length - 1].push(item); + return acc; + }, []); + +const seed = async (): Promise => { + const files = orderedMappingFiles(); + const onDisk = fs + .readdirSync(MAPPINGS_DIR) + .filter((f) => f.endsWith(".json")); + if (files.length !== onDisk.length) { + throw new Error( + `ALL_MAPPINGS lists ${files.length} files but ${onDisk.length} exist on disk`, + ); + } + + const mappings: RawMapping[] = files.map((f) => + JSON.parse(fs.readFileSync(path.join(MAPPINGS_DIR, f), "utf8")), + ); + + const supabase = createClient(SUPABASE_URL, SUPABASE_PUBLISHABLE_KEY, { + auth: { persistSession: false }, + }); + + // series — inserted in ALL_MAPPINGS order so identity ids increment in order. + const seriesToId = new Map(); + await chunk(mappings, 200).reduce( + (prev, batch) => + prev.then(async () => { + const { data, error } = await supabase + .from("series") + .insert( + batch.map((m) => ({ + anilist_anime_id: m.anilistAnimeId, + anilist_manga_id: m.anilistMangaId, + title: m.title, + source_notes: m.sourceNotes ?? null, + })), + ) + .select("id, anilist_anime_id"); + if (error) throw new Error(`series insert failed: ${error.message}`); + (data ?? []).forEach((row) => + seriesToId.set(row.anilist_anime_id, row.id), + ); + }), + Promise.resolve(), + ); + console.log(`inserted ${seriesToId.size} series`); + + const idFor = (animeId: number): number => { + const id = seriesToId.get(animeId); + if (id === undefined) throw new Error(`no series id for anime ${animeId}`); + return id; + }; + + // arc_mappings + const arcRows = mappings.flatMap((m) => + m.mappings.map((e, i) => { + const [es, ee] = e.episodes ?? [null, null]; + return { + series_id: idFor(m.anilistAnimeId), + position: i, + episode_start: es, + episode_end: ee, + chapter_start: e.chapters[0], + chapter_end: e.chapters[1], + arc: e.arc ?? null, + season: e.season ?? null, + note: e.note ?? null, + }; + }), + ); + await chunk(arcRows, 500).reduce( + (prev, batch) => + prev.then(async () => { + const { error } = await supabase.from("arc_mappings").insert(batch); + if (error) throw new Error(`arc insert failed: ${error.message}`); + }), + Promise.resolve(), + ); + console.log(`inserted ${arcRows.length} arc mappings`); + + // movies + const movieRows = mappings.flatMap((m) => + (m.movies ?? []).map((mv, i) => { + const [cs, ce] = mv.chapters ?? [null, null]; + return { + series_id: idFor(m.anilistAnimeId), + position: i, + anilist_id: mv.anilistId ?? null, + title: mv.title, + year: mv.year, + chapter_start: cs, + chapter_end: ce, + after_episode: mv.afterEpisode ?? null, + note: mv.note ?? null, + }; + }), + ); + await chunk(movieRows, 500).reduce( + (prev, batch) => + prev.then(async () => { + const { error } = await supabase.from("movies").insert(batch); + if (error) throw new Error(`movie insert failed: ${error.message}`); + }), + Promise.resolve(), + ); + console.log(`inserted ${movieRows.length} movies`); +}; + +seed().then( + () => console.log("seed complete"), + (err) => { + console.error(err); + process.exit(1); + }, +); From 6e345c3ee9dbc0fa8afeb8a910ffd65525a741e8 Mon Sep 17 00:00:00 2001 From: CJ Rivas Date: Wed, 15 Jul 2026 23:24:43 -0400 Subject: [PATCH 03/12] KSN: add DB-backed catalog read layer - Add `src/data/catalog.ts`: fetch series + arcs + movies + aliases + genre filters from Supabase in one pass, assemble into `SeriesMapping` - Expose `useCatalog`/`useMapping`/`useGenreFilters` via React Query, cached 1h and kept a week for offline cold starts - Preserve the shared-manga-id tie-break by fetching series in id order and letting the first-listed win - Type the Supabase client with generated `Database` types - Make search aliases a runtime-hydratable singleton --- src/api/supabase.ts | 19 +-- src/data/catalog.ts | 147 +++++++++++++++++++++++ src/data/searchAliases.ts | 13 ++- src/types/supabase.ts | 239 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 409 insertions(+), 9 deletions(-) create mode 100644 src/data/catalog.ts create mode 100644 src/types/supabase.ts diff --git a/src/api/supabase.ts b/src/api/supabase.ts index 1745541..3a3cc83 100644 --- a/src/api/supabase.ts +++ b/src/api/supabase.ts @@ -1,20 +1,25 @@ import { AppState, Platform } from "react-native"; import AsyncStorage from "@react-native-async-storage/async-storage"; import { createClient } from "@supabase/supabase-js"; +import type { Database } from "@/types/supabase"; // Publishable key — safe to ship in the client bundle. const SUPABASE_URL = "https://obtgldkascmxbtpnvscn.supabase.co"; const SUPABASE_PUBLISHABLE_KEY = "sb_publishable_4z9kuzXtE3PeVgbPDtQUWw_cSrKxsu-"; -export const supabase = createClient(SUPABASE_URL, SUPABASE_PUBLISHABLE_KEY, { - auth: { - storage: AsyncStorage, - autoRefreshToken: true, - persistSession: true, - detectSessionInUrl: false, +export const supabase = createClient( + SUPABASE_URL, + SUPABASE_PUBLISHABLE_KEY, + { + auth: { + storage: AsyncStorage, + autoRefreshToken: true, + persistSession: true, + detectSessionInUrl: false, + }, }, -}); +); // Native apps must pause token refresh while backgrounded; on web the SDK // already handles visibility itself. diff --git a/src/data/catalog.ts b/src/data/catalog.ts new file mode 100644 index 0000000..01aa462 --- /dev/null +++ b/src/data/catalog.ts @@ -0,0 +1,147 @@ +import { useQuery } from "@tanstack/react-query"; +import { supabase } from "@/api/supabase"; +import { setSearchAliases } from "@/data/searchAliases"; +import type { GenreFilter } from "@/data/genreFilters"; +import type { MappingEntry, MovieEntry, SeriesMapping } from "@/types"; +import type { Database } from "@/types/supabase"; + +type ArcRow = Database["public"]["Tables"]["arc_mappings"]["Row"]; +type MovieRow = Database["public"]["Tables"]["movies"]["Row"]; +type SeriesRow = Database["public"]["Tables"]["series"]["Row"] & { + arc_mappings: ArcRow[]; + movies: MovieRow[]; +}; + +export type Catalog = { + mappings: SeriesMapping[]; + byMediaId: Map; + genreFilters: GenreFilter[]; +}; + +export const CATALOG_QUERY_KEY = ["catalog"] as const; + +// Refetch at most hourly; keep the persisted copy for a week so a cold launch +// renders instantly (and offline) from cache while a background refresh runs. +const CATALOG_STALE_MS = 60 * 60 * 1000; +const CATALOG_GC_MS = 7 * 24 * 60 * 60 * 1000; + +const toArc = (a: ArcRow): MappingEntry => ({ + chapters: [a.chapter_start, a.chapter_end], + episodes: + a.episode_start !== null && a.episode_end !== null + ? [a.episode_start, a.episode_end] + : undefined, + arc: a.arc ?? undefined, + season: a.season ?? undefined, + note: a.note ?? undefined, +}); + +const toMovie = (m: MovieRow): MovieEntry => ({ + anilistId: m.anilist_id ?? undefined, + title: m.title, + year: m.year, + chapters: + m.chapter_start !== null && m.chapter_end !== null + ? [m.chapter_start, m.chapter_end] + : undefined, + afterEpisode: m.after_episode ?? undefined, + note: m.note ?? undefined, +}); + +const rowToMapping = (row: SeriesRow): SeriesMapping => { + const movies = [...row.movies] + .sort((a, b) => a.position - b.position) + .map(toMovie); + return { + anilistAnimeId: row.anilist_anime_id, + anilistMangaId: row.anilist_manga_id, + title: row.title, + sourceNotes: row.source_notes ?? undefined, + mappings: [...row.arc_mappings] + .sort((a, b) => a.position - b.position) + .map(toArc), + movies: movies.length > 0 ? movies : undefined, + }; +}; + +const fetchCatalog = async (): Promise => { + const [seriesRes, aliasRes, genreRes] = await Promise.all([ + supabase + .from("series") + .select("*, arc_mappings(*), movies(*)") + .order("id", { ascending: true }), + supabase.from("search_aliases").select("alias, target"), + supabase + .from("genre_filters") + .select("*") + .order("sort_order", { ascending: true }), + ]); + + if (seriesRes.error) throw seriesRes.error; + if (aliasRes.error) throw aliasRes.error; + if (genreRes.error) throw genreRes.error; + + const mappings = seriesRes.data.map(rowToMapping); + + // Both the anime and manga id resolve to the series. First-listed wins so a + // shared manga id keeps the old `findMappingByMediaId` array-order tie-break + // (series are fetched ordered by id, i.e. original ALL_MAPPINGS order). + const byMediaId = mappings.reduce((acc, m) => { + if (!acc.has(m.anilistAnimeId)) acc.set(m.anilistAnimeId, m); + if (!acc.has(m.anilistMangaId)) acc.set(m.anilistMangaId, m); + return acc; + }, new Map()); + + // Hydrate the module-level alias table read by the (non-React) AniList query + // functions. + setSearchAliases( + aliasRes.data.reduce>((acc, a) => { + acc[a.alias] = a.target; + return acc; + }, {}), + ); + + const genreFilters = genreRes.data.map( + (g): GenreFilter => ({ + id: g.id, + label: g.label, + kind: g.kind === "tag" ? "tag" : "genre", + token: g.token, + }), + ); + + return { mappings, byMediaId, genreFilters }; +}; + +export const useCatalogQuery = () => + useQuery({ + queryKey: CATALOG_QUERY_KEY, + queryFn: fetchCatalog, + staleTime: CATALOG_STALE_MS, + gcTime: CATALOG_GC_MS, + }); + +export type CatalogAccess = { + findMapping: (mediaId: number) => SeriesMapping | null; + mappings: SeriesMapping[]; + isLoaded: boolean; +}; + +export const useCatalog = (): CatalogAccess => { + const { data, isSuccess } = useCatalogQuery(); + return { + findMapping: (mediaId) => data?.byMediaId.get(mediaId) ?? null, + mappings: data?.mappings ?? [], + isLoaded: isSuccess, + }; +}; + +export const useMapping = (mediaId: number): SeriesMapping | null => { + const { data } = useCatalogQuery(); + return data?.byMediaId.get(mediaId) ?? null; +}; + +export const useGenreFilters = (): GenreFilter[] => { + const { data } = useCatalogQuery(); + return data?.genreFilters ?? []; +}; diff --git a/src/data/searchAliases.ts b/src/data/searchAliases.ts index 702aebf..b1f5a1a 100644 --- a/src/data/searchAliases.ts +++ b/src/data/searchAliases.ts @@ -1,4 +1,6 @@ -const SEARCH_ALIASES: Record = { +// Seeded from the `search_aliases` table at launch (see catalog fetch); these +// bundled defaults cover the first render before the catalog resolves. +const DEFAULT_ALIASES: Record = { // concatenated titles AniList won't match without spaces deathnote: "death note", onepiece: "one piece", @@ -34,10 +36,17 @@ const SEARCH_ALIASES: Record = { ksdk: "kaguya-sama love is war", }; +// Mutable so the catalog fetch can swap in the DB-backed table at runtime. +let aliases: Record = DEFAULT_ALIASES; + +export function setSearchAliases(next: Record): void { + aliases = next; +} + export function applySearchAlias(query: string): string { const key = query .trim() .toLowerCase() .replace(/[^a-z0-9]/g, ""); - return SEARCH_ALIASES[key] ?? query; + return aliases[key] ?? query; } diff --git a/src/types/supabase.ts b/src/types/supabase.ts new file mode 100644 index 0000000..9cd35c3 --- /dev/null +++ b/src/types/supabase.ts @@ -0,0 +1,239 @@ +export type Json = + | string + | number + | boolean + | null + | { [key: string]: Json | undefined } + | Json[]; + +export type Database = { + // Allows to automatically instantiate createClient with right options + // instead of createClient(URL, KEY) + __InternalSupabase: { + PostgrestVersion: "14.5"; + }; + public: { + Tables: { + arc_mappings: { + Row: { + arc: string | null; + chapter_end: number; + chapter_start: number; + episode_end: number | null; + episode_start: number | null; + id: number; + note: string | null; + position: number; + season: number | null; + series_id: number; + }; + Insert: { + arc?: string | null; + chapter_end: number; + chapter_start: number; + episode_end?: number | null; + episode_start?: number | null; + id?: never; + note?: string | null; + position: number; + season?: number | null; + series_id: number; + }; + Update: { + arc?: string | null; + chapter_end?: number; + chapter_start?: number; + episode_end?: number | null; + episode_start?: number | null; + id?: never; + note?: string | null; + position?: number; + season?: number | null; + series_id?: number; + }; + Relationships: [ + { + foreignKeyName: "arc_mappings_series_id_fkey"; + columns: ["series_id"]; + isOneToOne: false; + referencedRelation: "series"; + referencedColumns: ["id"]; + }, + ]; + }; + genre_filters: { + Row: { + id: string; + kind: string; + label: string; + sort_order: number; + token: string; + }; + Insert: { + id: string; + kind: string; + label: string; + sort_order: number; + token: string; + }; + Update: { + id?: string; + kind?: string; + label?: string; + sort_order?: number; + token?: string; + }; + Relationships: []; + }; + movies: { + Row: { + after_episode: number | null; + anilist_id: number | null; + chapter_end: number | null; + chapter_start: number | null; + id: number; + note: string | null; + position: number; + series_id: number; + title: string; + year: number; + }; + Insert: { + after_episode?: number | null; + anilist_id?: number | null; + chapter_end?: number | null; + chapter_start?: number | null; + id?: never; + note?: string | null; + position: number; + series_id: number; + title: string; + year: number; + }; + Update: { + after_episode?: number | null; + anilist_id?: number | null; + chapter_end?: number | null; + chapter_start?: number | null; + id?: never; + note?: string | null; + position?: number; + series_id?: number; + title?: string; + year?: number; + }; + Relationships: [ + { + foreignKeyName: "movies_series_id_fkey"; + columns: ["series_id"]; + isOneToOne: false; + referencedRelation: "series"; + referencedColumns: ["id"]; + }, + ]; + }; + search_aliases: { + Row: { + alias: string; + target: string; + }; + Insert: { + alias: string; + target: string; + }; + Update: { + alias?: string; + target?: string; + }; + Relationships: []; + }; + series: { + Row: { + anilist_anime_id: number; + anilist_manga_id: number; + created_at: string; + id: number; + source_notes: string | null; + title: string; + updated_at: string; + }; + Insert: { + anilist_anime_id: number; + anilist_manga_id: number; + created_at?: string; + id?: never; + source_notes?: string | null; + title: string; + updated_at?: string; + }; + Update: { + anilist_anime_id?: number; + anilist_manga_id?: number; + created_at?: string; + id?: never; + source_notes?: string | null; + title?: string; + updated_at?: string; + }; + Relationships: []; + }; + user_preferences: { + Row: { + hidden_genres: string[]; + japanese: boolean; + updated_at: string; + user_id: string; + }; + Insert: { + hidden_genres?: string[]; + japanese?: boolean; + updated_at?: string; + user_id: string; + }; + Update: { + hidden_genres?: string[]; + japanese?: boolean; + updated_at?: string; + user_id?: string; + }; + Relationships: []; + }; + user_progress: { + Row: { + position: number; + route_id: number; + side: string; + updated_at: string; + user_id: string; + }; + Insert: { + position: number; + route_id: number; + side: string; + updated_at?: string; + user_id: string; + }; + Update: { + position?: number; + route_id?: number; + side?: string; + updated_at?: string; + user_id?: string; + }; + Relationships: []; + }; + }; + Views: { + [_ in never]: never; + }; + Functions: { + [_ in never]: never; + }; + Enums: { + [_ in never]: never; + }; + CompositeTypes: { + [_ in never]: never; + }; + }; +}; From 5174e3469400b16a7d8127cdd51da73e8d03df79 Mon Sep 17 00:00:00 2001 From: CJ Rivas Date: Wed, 15 Jul 2026 23:25:56 -0400 Subject: [PATCH 04/12] KSN: persist the catalog query for offline cold starts - Wrap the app in `PersistQueryClientProvider` backed by AsyncStorage - Dehydrate only the `catalog` query (AniList/MangaDex stay in-memory), kept for up to a week - Warm the catalog at launch so mappings and search aliases are ready before the first screen renders --- app/_layout.tsx | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/app/_layout.tsx b/app/_layout.tsx index c12bbcd..a7282cf 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -1,10 +1,17 @@ import { useEffect } from "react"; import { Pressable, StyleSheet, Text, View } from "react-native"; import { Stack, useRouter, usePathname } from "expo-router"; -import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { + defaultShouldDehydrateQuery, + QueryClient, +} from "@tanstack/react-query"; +import { PersistQueryClientProvider } from "@tanstack/react-query-persist-client"; +import { createAsyncStoragePersister } from "@tanstack/query-async-storage-persister"; +import AsyncStorage from "@react-native-async-storage/async-storage"; import { SafeAreaProvider } from "react-native-safe-area-context"; import { StatusBar } from "expo-status-bar"; import * as SplashScreen from "expo-splash-screen"; +import { CATALOG_QUERY_KEY, useCatalogQuery } from "@/data/catalog"; import { useFonts, SpaceGrotesk_400Regular, @@ -26,6 +33,22 @@ const queryClient = new QueryClient({ }, }); +// Persist only the catalog query to AsyncStorage so a cold (or offline) launch +// renders the anime<->manga mappings instantly, then refreshes in the +// background. AniList/MangaDex results stay in-memory only. +const persister = createAsyncStoragePersister({ + storage: AsyncStorage, + key: "kasane-query-cache", +}); +const CATALOG_CACHE_MAX_AGE = 7 * 24 * 60 * 60 * 1000; + +// Warms the catalog at launch (and hydrates the search-alias table) so it is +// ready before the first screen needs a mapping. +function CatalogWarmup() { + useCatalogQuery(); + return null; +} + function GlobalHeader() { const router = useRouter(); const pathname = usePathname(); @@ -105,10 +128,22 @@ export default function RootLayout() { if (!fontsLoaded) return null; return ( - + + defaultShouldDehydrateQuery(query) && + query.queryKey[0] === CATALOG_QUERY_KEY[0], + }, + }} + > + - + ); } From 57de552680d59b387f4197437ddfab448273bfa9 Mon Sep 17 00:00:00 2001 From: CJ Rivas Date: Wed, 15 Jul 2026 23:28:38 -0400 Subject: [PATCH 05/12] KSN: read genre filters from Supabase on the home screen - Drop the static `GENRE_FILTERS` array; `splitHiddenForAniList` now takes the filter list as an argument - Home screen and the mobile filter sheet render `useGenreFilters()` - Keep the always-hidden Ecchi/Hentai policy in code - Rework the genre-filters test to exercise the pure bucketing logic against a fixture --- app/index.tsx | 16 ++++++--- src/data/genreFilters.test.ts | 58 ++++++++----------------------- src/data/genreFilters.ts | 65 +++++------------------------------ 3 files changed, 35 insertions(+), 104 deletions(-) diff --git a/app/index.tsx b/app/index.tsx index c8dad04..8353191 100644 --- a/app/index.tsx +++ b/app/index.tsx @@ -18,7 +18,8 @@ import { Link } from "expo-router"; import { useQuery } from "@tanstack/react-query"; import { getLatestAnime, searchMedia } from "@/api/anilist"; import { pairResults } from "@/data"; -import { GENRE_FILTERS, splitHiddenForAniList } from "@/data/genreFilters"; +import { useGenreFilters } from "@/data/catalog"; +import { splitHiddenForAniList, type GenreFilter } from "@/data/genreFilters"; import { SeriesCard } from "@/components/SeriesCard"; import { ContinueSection } from "@/components/ContinueSection"; import { @@ -48,7 +49,11 @@ export default function HomeScreen() { const [filtersOpen, setFiltersOpen] = useState(false); const hiddenGenres = usePreferences((s) => s.hiddenGenres); const toggleHiddenGenre = usePreferences((s) => s.toggleHiddenGenre); - const { genreNotIn, tagNotIn } = splitHiddenForAniList(hiddenGenres); + const genreFilters = useGenreFilters(); + const { genreNotIn, tagNotIn } = splitHiddenForAniList( + hiddenGenres, + genreFilters, + ); const { width: windowWidth } = useWindowDimensions(); const isMobile = windowWidth < MOBILE_WIDTH_BREAKPOINT; const hiddenCount = hiddenGenres.length; @@ -117,7 +122,7 @@ export default function HomeScreen() { {!isMobile && filtersOpen && ( - {GENRE_FILTERS.map((f) => { + {genreFilters.map((f) => { const included = !hiddenGenres.includes(f.id); return ( setFiltersOpen(false)} @@ -182,11 +188,13 @@ export default function HomeScreen() { function GenreFilterSheet({ visible, + filters, hiddenGenres, onToggle, onClose, }: { visible: boolean; + filters: readonly GenreFilter[]; hiddenGenres: string[]; onToggle: (id: string) => void; onClose: () => void; @@ -219,7 +227,7 @@ function GenreFilterSheet({ style={styles.sheetScroll} contentContainerStyle={styles.sheetScrollContent} > - {GENRE_FILTERS.map((f) => { + {filters.map((f) => { const included = !hiddenGenres.includes(f.id); return ( { - it("has 27 entries", () => { - expect(GENRE_FILTERS).toHaveLength(27); - }); - - it("has unique ids", () => { - const ids = GENRE_FILTERS.map((f) => f.id); - expect(new Set(ids).size).toBe(ids.length); - }); - - it("has unique tokens within each kind", () => { - const genres = GENRE_FILTERS.filter((f) => f.kind === "genre").map( - (f) => f.token, - ); - const tags = GENRE_FILTERS.filter((f) => f.kind === "tag").map( - (f) => f.token, - ); - expect(new Set(genres).size).toBe(genres.length); - expect(new Set(tags).size).toBe(tags.length); - }); - - it("does not expose Ecchi as a toggleable chip", () => { - expect(GENRE_FILTERS.find((f) => f.id === "ecchi")).toBeUndefined(); - }); - - it("does not expose Hentai as a toggleable chip", () => { - expect(GENRE_FILTERS.find((f) => f.id === "hentai")).toBeUndefined(); - }); - - it('contains BL with token "Boys\' Love"', () => { - const bl = GENRE_FILTERS.find((f) => f.id === "bl"); - expect(bl?.kind).toBe("tag"); - expect(bl?.token).toBe("Boys' Love"); - }); -}); +// A representative slice of the `genre_filters` table (the full catalog now +// lives in Supabase; these fixtures exercise the pure bucketing logic). +const FILTERS: readonly GenreFilter[] = [ + { id: "horror", label: "Horror", kind: "genre", token: "Horror" }, + { id: "isekai", label: "Isekai", kind: "tag", token: "Isekai" }, + { id: "bl", label: "BL", kind: "tag", token: "Boys' Love" }, +]; describe("splitHiddenForAniList", () => { it("always injects Ecchi and Hentai into genreNotIn for an empty selection", () => { - expect(splitHiddenForAniList([])).toEqual({ + expect(splitHiddenForAniList([], FILTERS)).toEqual({ genreNotIn: ["Ecchi", "Hentai"], tagNotIn: null, }); }); it("routes a genre id into genreNotIn alongside the always-hidden genres", () => { - expect(splitHiddenForAniList(["horror"])).toEqual({ + expect(splitHiddenForAniList(["horror"], FILTERS)).toEqual({ genreNotIn: ["Ecchi", "Hentai", "Horror"], tagNotIn: null, }); }); it("routes a tag id into tagNotIn while still hiding Ecchi and Hentai", () => { - expect(splitHiddenForAniList(["isekai"])).toEqual({ + expect(splitHiddenForAniList(["isekai"], FILTERS)).toEqual({ genreNotIn: ["Ecchi", "Hentai"], tagNotIn: ["Isekai"], }); }); it("splits mixed selections into the right buckets", () => { - const out = splitHiddenForAniList(["isekai", "horror", "bl"]); + const out = splitHiddenForAniList(["isekai", "horror", "bl"], FILTERS); expect(out.genreNotIn?.sort()).toEqual(["Ecchi", "Hentai", "Horror"]); expect(out.tagNotIn?.sort()).toEqual(["Boys' Love", "Isekai"]); }); it("produces stable output regardless of input order", () => { - const a = splitHiddenForAniList(["horror", "isekai"]); - const b = splitHiddenForAniList(["isekai", "horror"]); + const a = splitHiddenForAniList(["horror", "isekai"], FILTERS); + const b = splitHiddenForAniList(["isekai", "horror"], FILTERS); expect(a).toEqual(b); }); it("ignores unknown ids without throwing", () => { - expect(splitHiddenForAniList(["nonexistent-id"])).toEqual({ + expect(splitHiddenForAniList(["nonexistent-id"], FILTERS)).toEqual({ genreNotIn: ["Ecchi", "Hentai"], tagNotIn: null, }); diff --git a/src/data/genreFilters.ts b/src/data/genreFilters.ts index f0602b0..81dd48d 100644 --- a/src/data/genreFilters.ts +++ b/src/data/genreFilters.ts @@ -7,61 +7,9 @@ export type GenreFilter = { token: string; }; -export const GENRE_FILTERS: readonly GenreFilter[] = [ - { id: "shounen", label: "Shounen", kind: "tag", token: "Shounen" }, - { id: "shoujo", label: "Shoujo", kind: "tag", token: "Shoujo" }, - { id: "seinen", label: "Seinen", kind: "tag", token: "Seinen" }, - { id: "josei", label: "Josei", kind: "tag", token: "Josei" }, - { id: "kids", label: "Kids", kind: "tag", token: "Kids" }, - { id: "action", label: "Action", kind: "genre", token: "Action" }, - { id: "adventure", label: "Adventure", kind: "genre", token: "Adventure" }, - { id: "comedy", label: "Comedy", kind: "genre", token: "Comedy" }, - { id: "drama", label: "Drama", kind: "genre", token: "Drama" }, - { id: "romance", label: "Romance", kind: "genre", token: "Romance" }, - { - id: "slice-of-life", - label: "Slice of Life", - kind: "genre", - token: "Slice of Life", - }, - { id: "mystery", label: "Mystery", kind: "genre", token: "Mystery" }, - { - id: "psychological", - label: "Psychological", - kind: "genre", - token: "Psychological", - }, - { id: "thriller", label: "Thriller", kind: "genre", token: "Thriller" }, - { id: "horror", label: "Horror", kind: "genre", token: "Horror" }, - { id: "mecha", label: "Mecha", kind: "genre", token: "Mecha" }, - { - id: "mahou-shoujo", - label: "Magical Girl", - kind: "genre", - token: "Mahou Shoujo", - }, - { id: "sports", label: "Sports", kind: "genre", token: "Sports" }, - { id: "music", label: "Music", kind: "genre", token: "Music" }, - { id: "isekai", label: "Isekai", kind: "tag", token: "Isekai" }, - { id: "iyashikei", label: "Iyashikei", kind: "tag", token: "Iyashikei" }, - { id: "yuri", label: "Yuri", kind: "tag", token: "Yuri" }, - { id: "bl", label: "BL", kind: "tag", token: "Boys' Love" }, - { id: "cooking", label: "Cooking", kind: "tag", token: "Cooking" }, - { - id: "dark-fantasy", - label: "Dark Fantasy", - kind: "tag", - token: "Dark Fantasy", - }, - { id: "harem", label: "Harem", kind: "tag", token: "Harem" }, - { - id: "reverse-harem", - label: "Reverse Harem", - kind: "tag", - token: "Reverse Harem", - }, -]; - +// AniList genres always excluded from results regardless of user choice. These +// are app policy, not toggleable chips, so they stay in code rather than the +// `genre_filters` table. const ALWAYS_HIDDEN_GENRES: readonly string[] = ["Ecchi", "Hentai"]; const ALWAYS_HIDDEN_TAGS: readonly string[] = []; @@ -70,10 +18,13 @@ export type SplitFilters = { tagNotIn: string[] | null; }; -export function splitHiddenForAniList(hiddenIds: string[]): SplitFilters { +export function splitHiddenForAniList( + hiddenIds: string[], + filters: readonly GenreFilter[], +): SplitFilters { const matched = [...hiddenIds] .sort() - .map((id) => GENRE_FILTERS.find((f) => f.id === id)) + .map((id) => filters.find((f) => f.id === id)) .filter((e): e is GenreFilter => !!e); const genres = [ ...ALWAYS_HIDDEN_GENRES, From 016b3769e49366b9a36d19986073f7521c0a28bb Mon Sep 17 00:00:00 2001 From: CJ Rivas Date: Wed, 15 Jul 2026 23:30:31 -0400 Subject: [PATCH 06/12] KSN: resolve mappings from the DB catalog in screens - `SeriesCard` and the arc screens read `useMapping`/`useCatalog` - Series/anime/manga detail screens resolve the curated mapping via `useCatalog().findMapping` and only fall back to a synthetic mapping once the catalog has loaded (avoids an auto-estimated flash) - Arc screens show a spinner until the catalog resolves, then the not-found state --- app/anime/[id]/arc/[arcIdx].tsx | 16 ++++++++++++---- app/anime/[id]/index.tsx | 23 ++++++++++------------- app/manga/[id]/arc/[arcIdx].tsx | 16 ++++++++++++---- app/manga/[id]/index.tsx | 15 ++++++++------- app/series/[id]/arc/[arcIdx].tsx | 16 ++++++++++++---- app/series/[id]/index.tsx | 15 ++++++++------- src/components/SeriesCard.tsx | 4 ++-- 7 files changed, 64 insertions(+), 41 deletions(-) diff --git a/app/anime/[id]/arc/[arcIdx].tsx b/app/anime/[id]/arc/[arcIdx].tsx index 437e109..1eb9a27 100644 --- a/app/anime/[id]/arc/[arcIdx].tsx +++ b/app/anime/[id]/arc/[arcIdx].tsx @@ -1,7 +1,6 @@ -import { useMemo } from "react"; -import { Text, View, StyleSheet } from "react-native"; +import { ActivityIndicator, Text, View, StyleSheet } from "react-native"; import { useLocalSearchParams } from "expo-router"; -import { findMappingByMediaId } from "@/data"; +import { useCatalog } from "@/data/catalog"; import { ArcDetailView } from "@/components/ArcDetailView"; import { FONT } from "@/theme"; @@ -10,7 +9,16 @@ export default function AnimeArcDetail() { const mediaId = Number(id); const arcIndex = Number(arcIdx); - const mapping = useMemo(() => findMappingByMediaId(mediaId), [mediaId]); + const { findMapping, isLoaded } = useCatalog(); + const mapping = findMapping(mediaId); + + if (!isLoaded) { + return ( + + + + ); + } if (!mapping) { return ( diff --git a/app/anime/[id]/index.tsx b/app/anime/[id]/index.tsx index d6b8d8e..26cc733 100644 --- a/app/anime/[id]/index.tsx +++ b/app/anime/[id]/index.tsx @@ -17,13 +17,13 @@ import { buildSyntheticMapping, chapterToEpisodes, episodeToChapters, - findMappingByMediaId, } from "@/data"; +import { useCatalog } from "@/data/catalog"; import { EpisodeChapterRail } from "@/components/EpisodeChapterRail"; import { Footer } from "@/components/Footer"; import { Paragraph } from "@/components/Paragraph"; import { formatAniListDate } from "@/data/format"; -import type { AnimeFranchise } from "@/types"; +import type { AnimeFranchise, SeriesMapping } from "@/types"; import { FONT } from "@/theme"; export default function AnimeDetail() { @@ -45,13 +45,14 @@ export default function AnimeDetail() { staleTime: 24 * 60 * 60 * 1000, }); - const curatedMapping = useMemo( - () => findMappingByMediaId(mediaId), - [mediaId], - ); + const { findMapping, isLoaded: catalogLoaded } = useCatalog(); + const curatedMapping = findMapping(mediaId); const syntheticMapping = useMemo( - () => (media && !curatedMapping ? buildSyntheticMapping(media) : null), - [media, curatedMapping], + () => + media && catalogLoaded && !curatedMapping + ? buildSyntheticMapping(media) + : null, + [media, catalogLoaded, curatedMapping], ); const mapping = curatedMapping ?? syntheticMapping; const isAutoEstimated = !curatedMapping && !!syntheticMapping; @@ -228,11 +229,7 @@ function SeasonsList({ ); } -function QuickLookup({ - mapping, -}: { - mapping: ReturnType; -}) { +function QuickLookup({ mapping }: { mapping: SeriesMapping | null }) { const [epInput, setEpInput] = useState(""); const [chInput, setChInput] = useState(""); diff --git a/app/manga/[id]/arc/[arcIdx].tsx b/app/manga/[id]/arc/[arcIdx].tsx index 0931d14..0bdaf96 100644 --- a/app/manga/[id]/arc/[arcIdx].tsx +++ b/app/manga/[id]/arc/[arcIdx].tsx @@ -1,7 +1,6 @@ -import { useMemo } from "react"; -import { Text, View, StyleSheet } from "react-native"; +import { ActivityIndicator, Text, View, StyleSheet } from "react-native"; import { useLocalSearchParams } from "expo-router"; -import { findMappingByMediaId } from "@/data"; +import { useCatalog } from "@/data/catalog"; import { ArcDetailView } from "@/components/ArcDetailView"; import { FONT } from "@/theme"; @@ -10,7 +9,16 @@ export default function MangaArcDetail() { const mediaId = Number(id); const arcIndex = Number(arcIdx); - const mapping = useMemo(() => findMappingByMediaId(mediaId), [mediaId]); + const { findMapping, isLoaded } = useCatalog(); + const mapping = findMapping(mediaId); + + if (!isLoaded) { + return ( + + + + ); + } if (!mapping) { return ( diff --git a/app/manga/[id]/index.tsx b/app/manga/[id]/index.tsx index 5588a8e..7b16085 100644 --- a/app/manga/[id]/index.tsx +++ b/app/manga/[id]/index.tsx @@ -18,8 +18,8 @@ import { buildSyntheticMapping, chapterToEpisodes, episodeToChapters, - findMappingByMediaId, } from "@/data"; +import { useCatalog } from "@/data/catalog"; import { EpisodeChapterRail } from "@/components/EpisodeChapterRail"; import { Footer } from "@/components/Footer"; import { Paragraph } from "@/components/Paragraph"; @@ -50,13 +50,14 @@ export default function MangaDetail() { staleTime: 60 * 60 * 1000, }); - const curatedMapping = useMemo( - () => findMappingByMediaId(mediaId), - [mediaId], - ); + const { findMapping, isLoaded: catalogLoaded } = useCatalog(); + const curatedMapping = findMapping(mediaId); const syntheticMapping = useMemo( - () => (media && !curatedMapping ? buildSyntheticMapping(media) : null), - [media, curatedMapping], + () => + media && catalogLoaded && !curatedMapping + ? buildSyntheticMapping(media) + : null, + [media, catalogLoaded, curatedMapping], ); const mapping = curatedMapping ?? syntheticMapping; const isAutoEstimated = !curatedMapping && !!syntheticMapping; diff --git a/app/series/[id]/arc/[arcIdx].tsx b/app/series/[id]/arc/[arcIdx].tsx index ec4352a..5962833 100644 --- a/app/series/[id]/arc/[arcIdx].tsx +++ b/app/series/[id]/arc/[arcIdx].tsx @@ -1,7 +1,6 @@ -import { useMemo } from "react"; -import { Text, View, StyleSheet } from "react-native"; +import { ActivityIndicator, Text, View, StyleSheet } from "react-native"; import { useLocalSearchParams } from "expo-router"; -import { findMappingByMediaId } from "@/data"; +import { useCatalog } from "@/data/catalog"; import { ArcDetailView } from "@/components/ArcDetailView"; import { FONT } from "@/theme"; @@ -10,7 +9,16 @@ export default function SeriesArcDetail() { const mediaId = Number(id); const arcIndex = Number(arcIdx); - const mapping = useMemo(() => findMappingByMediaId(mediaId), [mediaId]); + const { findMapping, isLoaded } = useCatalog(); + const mapping = findMapping(mediaId); + + if (!isLoaded) { + return ( + + + + ); + } if (!mapping) { return ( diff --git a/app/series/[id]/index.tsx b/app/series/[id]/index.tsx index efb7592..802f7c1 100644 --- a/app/series/[id]/index.tsx +++ b/app/series/[id]/index.tsx @@ -17,8 +17,8 @@ import { buildSyntheticMapping, chapterToEpisodes, episodeToChapters, - findMappingByMediaId, } from "@/data"; +import { useCatalog } from "@/data/catalog"; import { EpisodeChapterRail } from "@/components/EpisodeChapterRail"; import { EpisodeChapterPie } from "@/components/EpisodeChapterPie"; import { @@ -68,10 +68,8 @@ export default function SeriesDetail() { enabled: !Number.isNaN(mediaId), }); - const curatedMapping = useMemo( - () => findMappingByMediaId(mediaId), - [mediaId], - ); + const { findMapping, isLoaded: catalogLoaded } = useCatalog(); + const curatedMapping = findMapping(mediaId); const partnerId = useMemo(() => { if (!media) return null; @@ -117,8 +115,11 @@ export default function SeriesDetail() { }); const syntheticMapping = useMemo( - () => (media && !curatedMapping ? buildSyntheticMapping(media) : null), - [media, curatedMapping], + () => + media && catalogLoaded && !curatedMapping + ? buildSyntheticMapping(media) + : null, + [media, catalogLoaded, curatedMapping], ); const mapping = curatedMapping ?? syntheticMapping; const isAutoEstimated = !curatedMapping && !!syntheticMapping; diff --git a/src/components/SeriesCard.tsx b/src/components/SeriesCard.tsx index 3cb6ef0..2076eea 100644 --- a/src/components/SeriesCard.tsx +++ b/src/components/SeriesCard.tsx @@ -3,7 +3,7 @@ import { Link } from "expo-router"; import { useQuery } from "@tanstack/react-query"; import type { SeriesBadge, SeriesEntry } from "@/types"; import { FONT } from "@/theme"; -import { findMappingByMediaId } from "@/data"; +import { useMapping } from "@/data/catalog"; import { getAnimeFranchise, hasAnimeSequels } from "@/api/anilist"; import { usePreferences } from "@/state/preferences"; import { useSeriesProgress } from "@/state/progress"; @@ -28,7 +28,7 @@ export function SeriesCard({ entry }: { entry: SeriesEntry }) { ? (primary.title.native ?? primary.title.english ?? primary.title.romaji) : (primary.title.english ?? primary.title.romaji); - const mapping = findMappingByMediaId(routeId); + const mapping = useMapping(routeId); const mappedEpisodeCount = mapping ? (() => { const eps = mapping.mappings From 88639582a42c8bb1d37fe73a935c2bce5400c26f Mon Sep 17 00:00:00 2001 From: CJ Rivas Date: Wed, 15 Jul 2026 23:32:53 -0400 Subject: [PATCH 07/12] KSN: track a preferences updatedAt for cloud sync - Stamp `updatedAt` on every japanese/hidden-genre toggle and persist it - Enables last-write-wins reconciliation against the Supabase copy --- src/state/preferences.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/state/preferences.ts b/src/state/preferences.ts index c790345..c864d13 100644 --- a/src/state/preferences.ts +++ b/src/state/preferences.ts @@ -8,13 +8,17 @@ type State = { hiddenGenres: string[]; toggleHiddenGenre: (id: string) => void; + + // Last local edit, in epoch ms. Drives last-write-wins against the cloud copy. + updatedAt: number; }; export const usePreferences = create()( persist( (set) => ({ japanese: false, - toggleJapanese: () => set((s) => ({ japanese: !s.japanese })), + toggleJapanese: () => + set((s) => ({ japanese: !s.japanese, updatedAt: Date.now() })), hiddenGenres: [], toggleHiddenGenre: (id) => @@ -22,7 +26,10 @@ export const usePreferences = create()( hiddenGenres: s.hiddenGenres.includes(id) ? s.hiddenGenres.filter((x) => x !== id) : [...s.hiddenGenres, id], + updatedAt: Date.now(), })), + + updatedAt: 0, }), { name: "kasane-preferences", @@ -30,6 +37,7 @@ export const usePreferences = create()( partialize: (s) => ({ japanese: s.japanese, hiddenGenres: s.hiddenGenres, + updatedAt: s.updatedAt, }), }, ), From bc36b63a6b8694d94d683ad93cc54928a5a3ccd2 Mon Sep 17 00:00:00 2001 From: CJ Rivas Date: Wed, 15 Jul 2026 23:33:58 -0400 Subject: [PATCH 08/12] KSN: add pure sync-merge helpers for user data - `mergeProgress`: last-write-wins union of local and server progress, per (routeId, side), plus the rows that need pushing - `diffProgress`: upsert/delete deltas to move the server between states - `mergePreferences`: last-write-wins for the single preferences row - Cover all three with unit tests --- src/state/syncMerge.test.ts | 131 ++++++++++++++++++++++++++ src/state/syncMerge.ts | 181 ++++++++++++++++++++++++++++++++++++ 2 files changed, 312 insertions(+) create mode 100644 src/state/syncMerge.test.ts create mode 100644 src/state/syncMerge.ts diff --git a/src/state/syncMerge.test.ts b/src/state/syncMerge.test.ts new file mode 100644 index 0000000..69db6cb --- /dev/null +++ b/src/state/syncMerge.test.ts @@ -0,0 +1,131 @@ +import { + diffProgress, + mergePreferences, + mergeProgress, + type ProgressByRoute, + type RemoteProgressRow, +} from "./syncMerge"; + +const iso = (ms: number): string => new Date(ms).toISOString(); + +describe("mergeProgress", () => { + it("pulls a remote-only entry into the merged state", () => { + const remote: RemoteProgressRow[] = [ + { route_id: 21, side: "anime", position: 10, updated_at: iso(1000) }, + ]; + const { merged, toPush } = mergeProgress({}, remote); + expect(merged).toEqual({ + 21: { anime: { position: 10, updatedAt: 1000 } }, + }); + expect(toPush).toEqual([]); + }); + + it("pushes a local-only entry", () => { + const local: ProgressByRoute = { + 21: { anime: { position: 5, updatedAt: 2000 } }, + }; + const { merged, toPush } = mergeProgress(local, []); + expect(merged).toEqual(local); + expect(toPush).toEqual([ + { routeId: 21, side: "anime", position: 5, updatedAt: 2000 }, + ]); + }); + + it("keeps the newer side per route on conflict", () => { + const local: ProgressByRoute = { + 21: { + anime: { position: 5, updatedAt: 3000 }, // local newer + manga: { position: 2, updatedAt: 1000 }, // remote newer + }, + }; + const remote: RemoteProgressRow[] = [ + { route_id: 21, side: "anime", position: 4, updated_at: iso(2000) }, + { route_id: 21, side: "manga", position: 9, updated_at: iso(4000) }, + ]; + const { merged, toPush } = mergeProgress(local, remote); + expect(merged).toEqual({ + 21: { + anime: { position: 5, updatedAt: 3000 }, + manga: { position: 9, updatedAt: 4000 }, + }, + }); + expect(toPush).toEqual([ + { routeId: 21, side: "anime", position: 5, updatedAt: 3000 }, + ]); + }); + + it("does not push when timestamps tie", () => { + const local: ProgressByRoute = { + 7: { manga: { position: 3, updatedAt: 1500 } }, + }; + const remote: RemoteProgressRow[] = [ + { route_id: 7, side: "manga", position: 3, updated_at: iso(1500) }, + ]; + expect(mergeProgress(local, remote).toPush).toEqual([]); + }); +}); + +describe("diffProgress", () => { + it("flags added and changed entries as upserts", () => { + const prev: ProgressByRoute = { + 1: { anime: { position: 1, updatedAt: 100 } }, + }; + const next: ProgressByRoute = { + 1: { anime: { position: 2, updatedAt: 200 } }, // changed + 2: { manga: { position: 9, updatedAt: 300 } }, // added + }; + const { upserts, deletes } = diffProgress(prev, next); + expect(upserts).toEqual([ + { routeId: 1, side: "anime", position: 2, updatedAt: 200 }, + { routeId: 2, side: "manga", position: 9, updatedAt: 300 }, + ]); + expect(deletes).toEqual([]); + }); + + it("flags removed entries as deletes", () => { + const prev: ProgressByRoute = { + 1: { + anime: { position: 1, updatedAt: 100 }, + manga: { position: 5, updatedAt: 100 }, + }, + }; + const next: ProgressByRoute = { + 1: { anime: { position: 1, updatedAt: 100 } }, + }; + const { upserts, deletes } = diffProgress(prev, next); + expect(upserts).toEqual([]); + expect(deletes).toEqual([{ routeId: 1, side: "manga" }]); + }); +}); + +describe("mergePreferences", () => { + const local = { japanese: true, hiddenGenres: ["horror"], updatedAt: 2000 }; + + it("pushes local when the server has no row", () => { + expect(mergePreferences(local, null)).toEqual({ + merged: local, + pushLocal: true, + }); + }); + + it("adopts the server copy when it is newer", () => { + const merge = mergePreferences(local, { + japanese: false, + hidden_genres: ["isekai"], + updated_at: iso(5000), + }); + expect(merge).toEqual({ + merged: { japanese: false, hiddenGenres: ["isekai"], updatedAt: 5000 }, + pushLocal: false, + }); + }); + + it("pushes local when it is newer than the server copy", () => { + const merge = mergePreferences(local, { + japanese: false, + hidden_genres: [], + updated_at: iso(1000), + }); + expect(merge).toEqual({ merged: local, pushLocal: true }); + }); +}); diff --git a/src/state/syncMerge.ts b/src/state/syncMerge.ts new file mode 100644 index 0000000..15c5bbf --- /dev/null +++ b/src/state/syncMerge.ts @@ -0,0 +1,181 @@ +import type { ProgressSide, SeriesProgress } from "@/state/progress"; + +// Pure reconciliation helpers shared by the cloud-sync controller. Kept free of +// react-native / supabase imports so they can be unit tested in isolation. + +export type ProgressByRoute = Record; + +export type ProgressEntry = { + routeId: number; + side: ProgressSide; + position: number; + updatedAt: number; +}; + +// Shape of a `user_progress` row as returned by PostgREST. +export type RemoteProgressRow = { + route_id: number; + side: ProgressSide; + position: number; + updated_at: string; +}; + +const SIDES: readonly ProgressSide[] = ["anime", "manga"]; +const rowKey = (routeId: number, side: ProgressSide): string => + `${routeId}:${side}`; + +const flatten = (byRoute: ProgressByRoute): ProgressEntry[] => + Object.entries(byRoute).flatMap(([routeId, progress]) => + SIDES.flatMap((side) => { + const pointer = progress[side]; + return pointer + ? [ + { + routeId: Number(routeId), + side, + position: pointer.position, + updatedAt: pointer.updatedAt, + }, + ] + : []; + }), + ); + +const rebuild = (entries: ProgressEntry[]): ProgressByRoute => + entries.reduce((acc, e) => { + acc[e.routeId] = { + ...(acc[e.routeId] ?? {}), + [e.side]: { position: e.position, updatedAt: e.updatedAt }, + }; + return acc; + }, {}); + +export type ProgressMerge = { + // The reconciled state to write back into the local store. + merged: ProgressByRoute; + // Entries where the local copy is newer (or the server lacks it) — upsert. + toPush: ProgressEntry[]; +}; + +/** + * Merges local progress with the server's rows, last-write-wins per + * (routeId, side). Union of both sides; ties keep the local value. + */ +export const mergeProgress = ( + local: ProgressByRoute, + remote: RemoteProgressRow[], +): ProgressMerge => { + const localByKey = new Map( + flatten(local).map((e) => [rowKey(e.routeId, e.side), e]), + ); + const remoteByKey = new Map( + remote.map((r): [string, ProgressEntry] => [ + rowKey(r.route_id, r.side), + { + routeId: r.route_id, + side: r.side, + position: r.position, + updatedAt: Date.parse(r.updated_at), + }, + ]), + ); + + type Decision = { + winner: ProgressEntry; + fromLocal: boolean; + remote: ProgressEntry | undefined; + }; + + const keys = new Set([...localByKey.keys(), ...remoteByKey.keys()]); + const decisions = [...keys].flatMap((k): Decision[] => { + const l = localByKey.get(k); + const r = remoteByKey.get(k); + if (l && r) { + return [ + l.updatedAt >= r.updatedAt + ? { winner: l, fromLocal: true, remote: r } + : { winner: r, fromLocal: false, remote: r }, + ]; + } + if (l) return [{ winner: l, fromLocal: true, remote: undefined }]; + if (r) return [{ winner: r, fromLocal: false, remote: r }]; + return []; + }); + + return { + merged: rebuild(decisions.map((d) => d.winner)), + toPush: decisions + .filter( + (d) => + d.fromLocal && (!d.remote || d.winner.updatedAt > d.remote.updatedAt), + ) + .map((d) => d.winner), + }; +}; + +export type ProgressDelta = { + upserts: ProgressEntry[]; + deletes: { routeId: number; side: ProgressSide }[]; +}; + +/** Rows to upsert/delete to move the server from `prev` to `next`. */ +export const diffProgress = ( + prev: ProgressByRoute, + next: ProgressByRoute, +): ProgressDelta => { + const prevByKey = new Map( + flatten(prev).map((e) => [rowKey(e.routeId, e.side), e]), + ); + const nextByKey = new Map( + flatten(next).map((e) => [rowKey(e.routeId, e.side), e]), + ); + + const upserts = [...nextByKey.values()].filter((n) => { + const p = prevByKey.get(rowKey(n.routeId, n.side)); + return !p || p.position !== n.position || p.updatedAt !== n.updatedAt; + }); + const deletes = [...prevByKey.values()] + .filter((p) => !nextByKey.has(rowKey(p.routeId, p.side))) + .map((p) => ({ routeId: p.routeId, side: p.side })); + + return { upserts, deletes }; +}; + +export type LocalPreferences = { + japanese: boolean; + hiddenGenres: string[]; + updatedAt: number; +}; + +// Shape of the `user_preferences` row as returned by PostgREST (null when the +// user has none yet). +export type RemotePreferences = { + japanese: boolean; + hidden_genres: string[]; + updated_at: string; +} | null; + +export type PreferencesMerge = { + merged: LocalPreferences; + pushLocal: boolean; +}; + +/** Last-write-wins for the single preferences row. */ +export const mergePreferences = ( + local: LocalPreferences, + remote: RemotePreferences, +): PreferencesMerge => { + if (!remote) return { merged: local, pushLocal: true }; + const remoteUpdatedAt = Date.parse(remote.updated_at); + if (remoteUpdatedAt > local.updatedAt) { + return { + merged: { + japanese: remote.japanese, + hiddenGenres: remote.hidden_genres, + updatedAt: remoteUpdatedAt, + }, + pushLocal: false, + }; + } + return { merged: local, pushLocal: local.updatedAt > remoteUpdatedAt }; +}; From 5c651c2d0172a791a9d337372bdd7640a10e29f9 Mon Sep 17 00:00:00 2001 From: CJ Rivas Date: Wed, 15 Jul 2026 23:38:21 -0400 Subject: [PATCH 09/12] KSN: sync progress and preferences to Supabase when signed in - Add a cloud-sync controller: pull + last-write-wins merge on login, debounced push of local changes, delete propagation for cleared entries - Local zustand stores stay the immediate source of truth; sync is best-effort and never blocks the UI (logged-out users are unaffected) - Guard against pull->push echo with an applying-remote flag - Start the controller once from the root layout --- app/_layout.tsx | 4 + src/state/sync.ts | 197 +++++++++++++++++++++++++++++++++++++++++ src/state/syncMerge.ts | 4 +- 3 files changed, 204 insertions(+), 1 deletion(-) create mode 100644 src/state/sync.ts diff --git a/app/_layout.tsx b/app/_layout.tsx index a7282cf..8f8571b 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -22,11 +22,15 @@ import { import { ZenTokyoZoo_400Regular } from "@expo-google-fonts/zen-tokyo-zoo"; import { usePreferences } from "@/state/preferences"; import { useAuthEmail } from "@/state/auth"; +import { startCloudSync } from "@/state/sync"; import type { PressableState } from "@/types"; import { FONT } from "@/theme"; SplashScreen.preventAutoHideAsync().catch(() => {}); +// Reconcile local progress/preferences with Supabase once a session exists. +startCloudSync(); + const queryClient = new QueryClient({ defaultOptions: { queries: { staleTime: 5 * 60 * 1000, retry: 1 }, diff --git a/src/state/sync.ts b/src/state/sync.ts new file mode 100644 index 0000000..a492af6 --- /dev/null +++ b/src/state/sync.ts @@ -0,0 +1,197 @@ +import { supabase } from "@/api/supabase"; +import { useAuth } from "@/state/auth"; +import { useProgress } from "@/state/progress"; +import { usePreferences } from "@/state/preferences"; +import { + diffProgress, + mergePreferences, + mergeProgress, + type LocalPreferences, + type ProgressByRoute, + type ProgressEntry, + type ProgressSideDelete, + type RemoteProgressRow, +} from "@/state/syncMerge"; + +// Cloud sync for user progress + preferences. The local zustand stores stay the +// immediate source of truth (instant, offline, works logged out); this layer +// reconciles them with Supabase when a session exists: +// - pull + last-write-wins merge on login +// - debounced push of local changes while signed in +// Writes never block the UI and failures are non-fatal — the local copy holds. + +const PUSH_DEBOUNCE_MS = 800; + +let started = false; +let userId: string | null = null; +// While true, store writes come from a pull and must not echo back as pushes. +let applyingRemote = false; +// Server-side snapshot of progress, used to compute minimal upsert/delete diffs. +let lastPushedProgress: ProgressByRoute = {}; +let progressTimer: ReturnType | null = null; +let preferencesTimer: ReturnType | null = null; + +const isoFor = (updatedAt: number): string => new Date(updatedAt).toISOString(); + +const readLocalPreferences = (): LocalPreferences => { + const { japanese, hiddenGenres, updatedAt } = usePreferences.getState(); + return { japanese, hiddenGenres, updatedAt }; +}; + +const upsertProgress = async ( + uid: string, + rows: ProgressEntry[], +): Promise => { + if (rows.length === 0) return; + const { error } = await supabase.from("user_progress").upsert( + rows.map((r) => ({ + user_id: uid, + route_id: r.routeId, + side: r.side, + position: r.position, + updated_at: isoFor(r.updatedAt), + })), + ); + if (error) console.warn("[sync] progress upsert failed:", error.message); +}; + +const deleteProgress = async ( + uid: string, + rows: ProgressSideDelete[], +): Promise => { + await Promise.all( + rows.map(async (r) => { + const { error } = await supabase + .from("user_progress") + .delete() + .match({ user_id: uid, route_id: r.routeId, side: r.side }); + if (error) console.warn("[sync] progress delete failed:", error.message); + }), + ); +}; + +const upsertPreferences = async ( + uid: string, + prefs: LocalPreferences, +): Promise => { + const { error } = await supabase.from("user_preferences").upsert({ + user_id: uid, + japanese: prefs.japanese, + hidden_genres: prefs.hiddenGenres, + updated_at: isoFor(prefs.updatedAt || Date.now()), + }); + if (error) console.warn("[sync] preferences upsert failed:", error.message); +}; + +const pushProgress = async (): Promise => { + const uid = userId; + if (!uid) return; + const current = useProgress.getState().byRouteId; + const { upserts, deletes } = diffProgress(lastPushedProgress, current); + lastPushedProgress = current; + await Promise.all([ + upsertProgress(uid, upserts), + deleteProgress(uid, deletes), + ]); +}; + +const pushPreferences = async (): Promise => { + const uid = userId; + if (!uid) return; + await upsertPreferences(uid, readLocalPreferences()); +}; + +const pull = async (uid: string): Promise => { + const [progressRes, preferencesRes] = await Promise.all([ + supabase + .from("user_progress") + .select("route_id, side, position, updated_at") + .eq("user_id", uid), + supabase + .from("user_preferences") + .select("japanese, hidden_genres, updated_at") + .eq("user_id", uid) + .maybeSingle(), + ]); + + if (userId !== uid) return; // session changed while the fetch was in flight + + applyingRemote = true; + try { + if (!progressRes.error) { + // The `side` column is text; narrow it to ProgressSide without casting. + const remoteRows = (progressRes.data ?? []).flatMap( + (r): RemoteProgressRow[] => + r.side === "anime" || r.side === "manga" + ? [ + { + route_id: r.route_id, + side: r.side, + position: r.position, + updated_at: r.updated_at, + }, + ] + : [], + ); + const { merged, toPush } = mergeProgress( + useProgress.getState().byRouteId, + remoteRows, + ); + useProgress.setState({ byRouteId: merged }); + lastPushedProgress = merged; + await upsertProgress(uid, toPush); + } + if (!preferencesRes.error) { + const { merged, pushLocal } = mergePreferences( + readLocalPreferences(), + preferencesRes.data ?? null, + ); + usePreferences.setState({ + japanese: merged.japanese, + hiddenGenres: merged.hiddenGenres, + updatedAt: merged.updatedAt, + }); + if (pushLocal) await upsertPreferences(uid, merged); + } + } finally { + applyingRemote = false; + } +}; + +const onAuthChange = (): void => { + const nextUserId = useAuth.getState().session?.user.id ?? null; + if (nextUserId === userId) return; + userId = nextUserId; + if (userId) { + lastPushedProgress = useProgress.getState().byRouteId; + void pull(userId); + } else { + // Signed out: keep local data, just stop syncing. + lastPushedProgress = {}; + } +}; + +export const startCloudSync = (): void => { + if (started) return; + started = true; + + useAuth.subscribe(onAuthChange); + + useProgress.subscribe(() => { + if (applyingRemote || !userId) return; + if (progressTimer) clearTimeout(progressTimer); + progressTimer = setTimeout(() => void pushProgress(), PUSH_DEBOUNCE_MS); + }); + + usePreferences.subscribe(() => { + if (applyingRemote || !userId) return; + if (preferencesTimer) clearTimeout(preferencesTimer); + preferencesTimer = setTimeout( + () => void pushPreferences(), + PUSH_DEBOUNCE_MS, + ); + }); + + // Catch a session that resolved before we subscribed. + onAuthChange(); +}; diff --git a/src/state/syncMerge.ts b/src/state/syncMerge.ts index 15c5bbf..09004a3 100644 --- a/src/state/syncMerge.ts +++ b/src/state/syncMerge.ts @@ -113,9 +113,11 @@ export const mergeProgress = ( }; }; +export type ProgressSideDelete = { routeId: number; side: ProgressSide }; + export type ProgressDelta = { upserts: ProgressEntry[]; - deletes: { routeId: number; side: ProgressSide }[]; + deletes: ProgressSideDelete[]; }; /** Rows to upsert/delete to move the server from `prev` to `next`. */ From 783bd042835bf6007e21689fbcc893ce37e7b66f Mon Sep 17 00:00:00 2001 From: CJ Rivas Date: Wed, 15 Jul 2026 23:40:28 -0400 Subject: [PATCH 10/12] KSN: hydrate search aliases from catalog data - Include aliases in the catalog query result and push them into the alias singleton via an effect keyed on the data - Fixes aliases staying empty on a cache-restored start, where the query function (which previously hydrated them) never runs --- app/_layout.tsx | 11 ++++++++--- src/data/catalog.ts | 27 ++++++++++++++++++--------- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/app/_layout.tsx b/app/_layout.tsx index 8f8571b..0184e9c 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -11,7 +11,11 @@ import AsyncStorage from "@react-native-async-storage/async-storage"; import { SafeAreaProvider } from "react-native-safe-area-context"; import { StatusBar } from "expo-status-bar"; import * as SplashScreen from "expo-splash-screen"; -import { CATALOG_QUERY_KEY, useCatalogQuery } from "@/data/catalog"; +import { + CATALOG_QUERY_KEY, + useCatalogQuery, + useHydrateSearchAliases, +} from "@/data/catalog"; import { useFonts, SpaceGrotesk_400Regular, @@ -46,10 +50,11 @@ const persister = createAsyncStoragePersister({ }); const CATALOG_CACHE_MAX_AGE = 7 * 24 * 60 * 60 * 1000; -// Warms the catalog at launch (and hydrates the search-alias table) so it is -// ready before the first screen needs a mapping. +// Warms the catalog at launch and keeps the search-alias table hydrated so +// everything is ready before the first screen needs a mapping. function CatalogWarmup() { useCatalogQuery(); + useHydrateSearchAliases(); return null; } diff --git a/src/data/catalog.ts b/src/data/catalog.ts index 01aa462..695c217 100644 --- a/src/data/catalog.ts +++ b/src/data/catalog.ts @@ -1,3 +1,4 @@ +import { useEffect } from "react"; import { useQuery } from "@tanstack/react-query"; import { supabase } from "@/api/supabase"; import { setSearchAliases } from "@/data/searchAliases"; @@ -15,6 +16,7 @@ type SeriesRow = Database["public"]["Tables"]["series"]["Row"] & { export type Catalog = { mappings: SeriesMapping[]; byMediaId: Map; + aliases: Record; genreFilters: GenreFilter[]; }; @@ -92,14 +94,10 @@ const fetchCatalog = async (): Promise => { return acc; }, new Map()); - // Hydrate the module-level alias table read by the (non-React) AniList query - // functions. - setSearchAliases( - aliasRes.data.reduce>((acc, a) => { - acc[a.alias] = a.target; - return acc; - }, {}), - ); + const aliases = aliasRes.data.reduce>((acc, a) => { + acc[a.alias] = a.target; + return acc; + }, {}); const genreFilters = genreRes.data.map( (g): GenreFilter => ({ @@ -110,7 +108,7 @@ const fetchCatalog = async (): Promise => { }), ); - return { mappings, byMediaId, genreFilters }; + return { mappings, byMediaId, aliases, genreFilters }; }; export const useCatalogQuery = () => @@ -145,3 +143,14 @@ export const useGenreFilters = (): GenreFilter[] => { const { data } = useCatalogQuery(); return data?.genreFilters ?? []; }; + +// Pushes the DB-backed alias table into the module singleton read by the +// (non-React) AniList query functions. Reads from query data — not the fetch — +// so it also runs on a cache-restored start where fetchCatalog never fires. +// Call once, high in the tree. +export const useHydrateSearchAliases = (): void => { + const { data } = useCatalogQuery(); + useEffect(() => { + if (data) setSearchAliases(data.aliases); + }, [data]); +}; From 61fda93ce5d60ab9cd3366bc7158aeb99e100391 Mon Sep 17 00:00:00 2001 From: CJ Rivas Date: Wed, 15 Jul 2026 23:43:04 -0400 Subject: [PATCH 11/12] KSN: remove static mapping JSON now that data lives in Supabase - Delete `src/data/mappings/` (578 files) and `top100-manifest.json` - Strip the import wall, `ALL_MAPPINGS`, `findMappingByMediaId`, and the `normalizeMapping` layer from `src/data/index.ts`; keep only the pure helpers (`pairResults`, `buildSyntheticMapping`, episode/chapter lookup) - Empty the bundled search-alias defaults (loaded from the DB now) - Reword detail-screen copy that pointed contributors at the JSON files - Drops ~578 modules and ~0.6 MB from the web bundle --- app/anime/[id]/index.tsx | 9 +- app/manga/[id]/index.tsx | 11 +- app/series/[id]/index.tsx | 9 +- src/data/index.ts | 1248 +---------------- src/data/mappings/100-girlfriends.json | 66 - src/data/mappings/3-gatsu-no-lion.json | 36 - src/data/mappings/7th-prince.json | 22 - src/data/mappings/7th-time-loop.json | 14 - src/data/mappings/86-eighty-six.json | 18 - .../mappings/8th-son-are-you-kidding-me.json | 32 - .../a-certain-scientific-railgun.json | 46 - src/data/mappings/a-couple-of-cuckoos.json | 52 - src/data/mappings/a-lull-in-the-sea.json | 18 - .../a-place-further-than-the-universe.json | 19 - src/data/mappings/a-sisters-all-you-need.json | 32 - src/data/mappings/absolute-duo.json | 32 - src/data/mappings/accel-world.json | 42 - src/data/mappings/ace-of-diamond.json | 38 - src/data/mappings/adachi-and-shimamura.json | 27 - .../mappings/aesthetica-of-a-rogue-hero.json | 14 - src/data/mappings/afro-samurai.json | 23 - src/data/mappings/after-the-rain.json | 24 - .../mappings/aharen-san-wa-hakarenai.json | 18 - src/data/mappings/aho-girl.json | 17 - src/data/mappings/ajin.json | 22 - src/data/mappings/akame-ga-kill.json | 16 - src/data/mappings/akashic-records.json | 32 - src/data/mappings/akudama-drive.json | 29 - src/data/mappings/alderamin-on-the-sky.json | 28 - src/data/mappings/aldnoah-zero.json | 23 - src/data/mappings/alya-sometimes-hides.json | 27 - .../mappings/am-i-actually-the-strongest.json | 32 - src/data/mappings/amagi-brilliant-park.json | 32 - src/data/mappings/an-archdemons-dilemma.json | 17 - src/data/mappings/ancient-magus-bride.json | 22 - src/data/mappings/angel-next-door.json | 32 - src/data/mappings/anohana.json | 18 - src/data/mappings/another.json | 23 - src/data/mappings/ao-chan-cant-study.json | 10 - src/data/mappings/ao-haru-ride.json | 15 - src/data/mappings/aoashi.json | 38 - src/data/mappings/apothecary-diaries.json | 25 - .../mappings/arakawa-under-the-bridge.json | 19 - src/data/mappings/arifureta.json | 27 - .../mappings/armed-girls-machiavellism.json | 34 - .../mappings/ascendance-of-a-bookworm.json | 35 - src/data/mappings/ashita-no-joe.json | 23 - src/data/mappings/asobi-asobase.json | 22 - .../mappings/assassination-classroom.json | 48 - src/data/mappings/assassins-pride.json | 32 - src/data/mappings/asterisk-war.json | 37 - src/data/mappings/astra-lost-in-space.json | 33 - src/data/mappings/attack-on-titan.json | 21 - src/data/mappings/azumanga-daioh.json | 23 - src/data/mappings/baccano.json | 27 - src/data/mappings/baka-and-test.json | 22 - src/data/mappings/bakemonogatari.json | 14 - src/data/mappings/baki-hanma.json | 19 - src/data/mappings/baki.json | 18 - src/data/mappings/bakuman.json | 38 - src/data/mappings/banana-fish.json | 28 - .../banished-from-the-heros-party.json | 51 - src/data/mappings/barakamon.json | 27 - src/data/mappings/beast-tamer.json | 10 - src/data/mappings/beastars.json | 25 - .../mappings/beck-mongolian-chop-squad.json | 15 - src/data/mappings/beelzebub.json | 37 - src/data/mappings/berserk-of-gluttony.json | 34 - src/data/mappings/berserk.json | 20 - src/data/mappings/beyond-the-boundary.json | 27 - src/data/mappings/black-bullet.json | 27 - src/data/mappings/black-butler.json | 28 - src/data/mappings/black-clover.json | 56 - src/data/mappings/black-lagoon.json | 49 - src/data/mappings/black-summoner.json | 19 - .../blade-dance-of-the-elementalers.json | 13 - src/data/mappings/blast-of-tempest.json | 18 - src/data/mappings/bleach-tybw.json | 23 - src/data/mappings/bleach.json | 88 -- src/data/mappings/blend-s.json | 17 - .../mappings/blood-blockade-battlefront.json | 18 - src/data/mappings/blood-c.json | 27 - src/data/mappings/blood-lad.json | 32 - src/data/mappings/bloom-into-you.json | 36 - src/data/mappings/blue-box.json | 37 - src/data/mappings/blue-exorcist.json | 46 - src/data/mappings/blue-lock.json | 30 - src/data/mappings/blue-period.json | 32 - src/data/mappings/bna.json | 13 - src/data/mappings/boarding-school-juliet.json | 61 - src/data/mappings/bocchi-the-rock.json | 18 - src/data/mappings/bofuri.json | 52 - .../mappings/brynhildr-in-the-darkness.json | 14 - src/data/mappings/btooom.json | 21 - src/data/mappings/bubble.json | 7 - src/data/mappings/bungo-stray-dogs.json | 36 - src/data/mappings/bunny-drop.json | 10 - src/data/mappings/bunny-girl-senpai.json | 63 - src/data/mappings/burn-the-witch.json | 23 - .../mappings/by-the-grace-of-the-gods.json | 18 - src/data/mappings/call-of-the-night.json | 26 - .../campfire-cooking-in-another-world.json | 37 - src/data/mappings/campione.json | 17 - src/data/mappings/cardcaptor-sakura.json | 39 - src/data/mappings/carole-tuesday.json | 13 - src/data/mappings/case-study-of-vanitas.json | 37 - src/data/mappings/cautious-hero.json | 38 - src/data/mappings/cells-at-work.json | 22 - .../mappings/chaika-the-coffin-princess.json | 14 - src/data/mappings/chained-soldier.json | 62 - src/data/mappings/chainsaw-man.json | 42 - src/data/mappings/charlotte.json | 23 - src/data/mappings/cheat-skill.json | 32 - src/data/mappings/chihayafuru.json | 27 - .../mappings/chillin-in-another-world.json | 10 - .../mappings/chivalry-of-a-failed-knight.json | 17 - src/data/mappings/chobits.json | 15 - src/data/mappings/chunibyo.json | 27 - src/data/mappings/citrus.json | 42 - src/data/mappings/clannad.json | 63 - src/data/mappings/classroom-of-the-elite.json | 23 - src/data/mappings/claymore.json | 44 - src/data/mappings/clevatess.json | 22 - src/data/mappings/code-geass.json | 22 - .../combatants-will-be-dispatched.json | 27 - src/data/mappings/cowboy-bebop.json | 22 - src/data/mappings/d-frag.json | 17 - .../mappings/daemons-of-the-shadow-realm.json | 36 - src/data/mappings/dagashi-kashi.json | 22 - .../daily-lives-of-high-school-boys.json | 13 - src/data/mappings/dandadan.json | 23 - .../mappings/danganronpa-the-animation.json | 19 - src/data/mappings/dangers-in-my-heart.json | 48 - src/data/mappings/danmachi.json | 37 - src/data/mappings/darling-in-the-franxx.json | 23 - src/data/mappings/darwins-game.json | 27 - src/data/mappings/date-a-live.json | 46 - .../mappings/days-with-my-stepsister.json | 21 - src/data/mappings/dead-mount-death-play.json | 50 - src/data/mappings/deadman-wonderland.json | 25 - src/data/mappings/death-march.json | 37 - src/data/mappings/death-note.json | 19 - src/data/mappings/delicious-in-dungeon.json | 48 - src/data/mappings/demon-king-daimao.json | 18 - src/data/mappings/demon-lord-retry.json | 28 - src/data/mappings/demon-slayer.json | 60 - src/data/mappings/detective-conan.json | 240 ---- src/data/mappings/devil-is-a-part-timer.json | 41 - src/data/mappings/devilman-crybaby.json | 33 - src/data/mappings/devils-line.json | 14 - src/data/mappings/dgray-man.json | 35 - src/data/mappings/digimon-adventure.json | 43 - ...-and-her-two-hit-multi-target-attacks.json | 17 - src/data/mappings/domestic-girlfriend.json | 31 - src/data/mappings/dorohedoro.json | 22 - src/data/mappings/dororo.json | 28 - src/data/mappings/dr-stone.json | 28 - src/data/mappings/dragon-ball-super.json | 40 - src/data/mappings/dragon-ball-z.json | 108 -- src/data/mappings/dragon-ball.json | 57 - src/data/mappings/dragon-maid.json | 31 - src/data/mappings/drifters.json | 32 - .../mappings/duke-of-death-and-his-maid.json | 11 - src/data/mappings/durarara.json | 18 - src/data/mappings/dusk-maiden-of-amnesia.json | 17 - src/data/mappings/edens-zero.json | 37 - src/data/mappings/elfen-lied.json | 27 - src/data/mappings/eminence-in-shadow.json | 23 - .../mappings/engaged-to-the-unidentified.json | 17 - src/data/mappings/erased.json | 33 - src/data/mappings/eromanga-sensei.json | 32 - src/data/mappings/failure-frame.json | 10 - src/data/mappings/fairy-tail.json | 53 - src/data/mappings/familiar-of-zero.json | 32 - src/data/mappings/faraway-paladin.json | 22 - .../farming-life-in-another-world.json | 22 - src/data/mappings/fate-apocrypha.json | 33 - src/data/mappings/fate-stay-night.json | 18 - src/data/mappings/fate-strange-fake.json | 17 - src/data/mappings/fate-zero.json | 18 - src/data/mappings/fire-force.json | 38 - src/data/mappings/fist-of-the-north-star.json | 61 - src/data/mappings/flying-witch.json | 10 - src/data/mappings/food-wars.json | 54 - src/data/mappings/fragrant-flower.json | 32 - src/data/mappings/frieren.json | 30 - ...d-country-bumpkin-to-master-swordsman.json | 14 - src/data/mappings/fruits-basket-2019.json | 38 - src/data/mappings/full-dive.json | 13 - src/data/mappings/full-metal-panic.json | 48 - .../fullmetal-alchemist-brotherhood.json | 45 - src/data/mappings/future-diary.json | 33 - src/data/mappings/gabriel-dropout.json | 61 - src/data/mappings/gachiakuta.json | 37 - src/data/mappings/gamers.json | 37 - src/data/mappings/gangsta.json | 27 - src/data/mappings/gantz.json | 80 -- .../gargantia-on-the-verdurous-planet.json | 9 - src/data/mappings/gate.json | 42 - ...ius-princes-guide-raising-nation-debt.json | 32 - src/data/mappings/ghost-in-the-shell.json | 40 - src/data/mappings/gintama.json | 101 -- src/data/mappings/girlfriend-girlfriend.json | 42 - src/data/mappings/girls-last-tour.json | 32 - src/data/mappings/girls-und-panzer.json | 70 - src/data/mappings/given.json | 61 - src/data/mappings/gleipnir.json | 27 - src/data/mappings/go-go-loser-ranger.json | 37 - src/data/mappings/goblin-slayer.json | 28 - src/data/mappings/god-of-high-school.json | 27 - src/data/mappings/golden-boy.json | 32 - src/data/mappings/golden-kamuy.json | 43 - src/data/mappings/golden-time.json | 33 - src/data/mappings/gosick.json | 58 - src/data/mappings/grand-blue.json | 42 - src/data/mappings/great-teacher-onizuka.json | 47 - ...test-demon-lord-reborn-typical-nobody.json | 51 - src/data/mappings/grimgar.json | 27 - src/data/mappings/guilty-crown.json | 18 - .../mappings/gun-gale-online-alternative.json | 44 - src/data/mappings/gurren-lagann.json | 23 - .../mappings/gushing-over-magical-girls.json | 17 - src/data/mappings/haganai.json | 25 - src/data/mappings/haikyuu.json | 49 - src/data/mappings/hajime-no-ippo.json | 41 - src/data/mappings/hanasaku-iroha.json | 18 - src/data/mappings/happy-sugar-life.json | 14 - ...rem-in-the-labyrinth-of-another-world.json | 14 - src/data/mappings/haruhi-suzumiya.json | 42 - src/data/mappings/heavenly-delusion.json | 27 - src/data/mappings/heavens-lost-property.json | 33 - src/data/mappings/hells-paradise.json | 17 - src/data/mappings/hellsing-2001.json | 32 - src/data/mappings/hellsing-ultimate.json | 58 - src/data/mappings/hensuki.json | 23 - .../hentai-prince-and-the-stony-cat.json | 14 - src/data/mappings/hidden-dungeon.json | 32 - src/data/mappings/higehiro.json | 33 - src/data/mappings/high-rise-invasion.json | 37 - src/data/mappings/high-school-dxd.json | 28 - ...es-have-it-easy-even-in-another-world.json | 17 - src/data/mappings/highschool-of-the-dead.json | 32 - src/data/mappings/hinamatsuri.json | 32 - .../hokkaido-gals-are-super-adorable.json | 17 - src/data/mappings/horimiya.json | 44 - src/data/mappings/how-heavy-dumbbells.json | 32 - .../how-not-to-summon-a-demon-lord.json | 22 - src/data/mappings/hundred.json | 14 - src/data/mappings/hunter-x-hunter-2011.json | 34 - src/data/mappings/hyouka.json | 32 - ...-understand-what-my-husband-is-saying.json | 15 - src/data/mappings/i-parry-everything.json | 14 - src/data/mappings/iceblade-sorcerer.json | 23 - src/data/mappings/ikoku-nikki.json | 21 - src/data/mappings/im-quitting-heroing.json | 17 - src/data/mappings/im-sakamoto.json | 28 - .../im-standing-on-a-million-lives.json | 22 - src/data/mappings/infinite-stratos.json | 42 - src/data/mappings/initial-d.json | 84 -- .../mappings/insomniacs-after-school.json | 50 - src/data/mappings/interspecies-reviewers.json | 72 - .../interviews-with-monster-girls.json | 22 - .../mappings/inu-x-boku-secret-service.json | 17 - src/data/mappings/inuyasha.json | 59 - src/data/mappings/inuyashiki.json | 28 - .../irregular-at-magic-high-school.json | 56 - src/data/mappings/iruma-kun.json | 42 - src/data/mappings/is-this-a-zombie.json | 27 - src/data/mappings/isekai-cheat-magician.json | 17 - .../mappings/jojo-stardust-crusaders.json | 23 - src/data/mappings/jormungand.json | 50 - src/data/mappings/jujutsu-kaisen.json | 56 - src/data/mappings/k-on.json | 31 - src/data/mappings/k.json | 27 - .../kabaneri-of-the-iron-fortress.json | 37 - src/data/mappings/kaguya-sama.json | 38 - .../mappings/kaiji-ultimate-survivor.json | 24 - src/data/mappings/kaiju-no-8.json | 42 - src/data/mappings/kakegurui.json | 22 - src/data/mappings/kakushigoto.json | 68 - src/data/mappings/kamikatsu.json | 16 - src/data/mappings/kamisama-kiss.json | 47 - src/data/mappings/katanagatari.json | 68 - src/data/mappings/katekyo-hitman-reborn.json | 32 - src/data/mappings/kawai-complex.json | 10 - src/data/mappings/kaze-no-stigma.json | 26 - .../keep-your-hands-off-eizouken.json | 27 - src/data/mappings/keijo.json | 32 - src/data/mappings/kemono-jihen.json | 47 - src/data/mappings/kids-on-the-slope.json | 18 - src/data/mappings/kill-la-kill.json | 18 - .../mappings/killing-slimes-300-years.json | 27 - src/data/mappings/kimi-ni-todoke.json | 32 - src/data/mappings/kingdom.json | 54 - src/data/mappings/kiss-him-not-me.json | 47 - src/data/mappings/kiss-x-sis.json | 22 - src/data/mappings/kiznaiver.json | 14 - src/data/mappings/knights-of-sidonia.json | 52 - src/data/mappings/kokoro-connect.json | 32 - src/data/mappings/komi-cant-communicate.json | 50 - src/data/mappings/kono-oto-tomare.json | 27 - src/data/mappings/konosuba-explosion.json | 23 - src/data/mappings/konosuba.json | 33 - src/data/mappings/kotoura-san.json | 13 - .../kubo-wont-let-me-be-invisible.json | 10 - src/data/mappings/kurokos-basketball.json | 24 - src/data/mappings/laid-back-camp.json | 46 - src/data/mappings/land-of-the-lustrous.json | 25 - .../life-lessons-with-uramichi-oniisan.json | 14 - src/data/mappings/log-horizon.json | 13 - .../mappings/lord-marksman-and-vanadis.json | 15 - .../mappings/love-after-world-domination.json | 17 - src/data/mappings/love-and-lies.json | 36 - src/data/mappings/love-tyrant.json | 17 - src/data/mappings/lovely-complex.json | 36 - src/data/mappings/lucky-star.json | 17 - src/data/mappings/lycoris-recoil.json | 19 - src/data/mappings/made-in-abyss.json | 39 - src/data/mappings/madoka-magica.json | 28 - .../mappings/magi-adventure-of-sinbad.json | 61 - src/data/mappings/magi.json | 25 - src/data/mappings/magical-girl-site.json | 14 - src/data/mappings/magical-sempai.json | 14 - src/data/mappings/maid-sama.json | 42 - .../makeine-too-many-losing-heroines.json | 43 - src/data/mappings/maoyu.json | 22 - src/data/mappings/marriagetoxin.json | 32 - src/data/mappings/masamune-kun-revenge.json | 18 - src/data/mappings/mashle.json | 18 - src/data/mappings/mayo-chiki.json | 17 - src/data/mappings/mieruko-chan.json | 27 - .../misfit-of-demon-king-academy.json | 18 - src/data/mappings/mmo-junkie.json | 32 - src/data/mappings/mob-psycho-100.json | 26 - src/data/mappings/monster-musume.json | 32 - src/data/mappings/monster.json | 21 - .../mappings/more-than-a-married-couple.json | 42 - src/data/mappings/moriarty-the-patriot.json | 72 - src/data/mappings/mushishi.json | 42 - src/data/mappings/mushoku-tensei.json | 29 - src/data/mappings/my-deer-friend-nokotan.json | 17 - src/data/mappings/my-dress-up-darling.json | 51 - .../my-first-girlfriend-is-a-gal.json | 27 - .../mappings/my-girlfriend-is-shobitch.json | 10 - src/data/mappings/my-happy-marriage.json | 32 - src/data/mappings/my-hero-academia.json | 85 -- src/data/mappings/my-isekai-life.json | 19 - src/data/mappings/my-little-monster.json | 31 - .../my-love-story-with-yamada-kun.json | 32 - src/data/mappings/my-love-story.json | 47 - src/data/mappings/my-mental-choices.json | 13 - src/data/mappings/my-senpai-is-annoying.json | 22 - .../mappings/my-status-as-an-assassin.json | 13 - .../my-stepmoms-daughter-is-my-ex.json | 31 - .../mappings/mysterious-girlfriend-x.json | 14 - src/data/mappings/nagatoro.json | 32 - src/data/mappings/nana.json | 25 - src/data/mappings/nanbaka.json | 22 - src/data/mappings/naruto.json | 133 -- src/data/mappings/natsume-yuujinchou.json | 63 - .../mappings/neon-genesis-evangelion.json | 38 - src/data/mappings/netoge.json | 27 - src/data/mappings/new-game.json | 22 - src/data/mappings/nichijou.json | 17 - src/data/mappings/nisekoi.json | 54 - src/data/mappings/no-game-no-life.json | 31 - .../no-longer-allowed-in-another-world.json | 10 - src/data/mappings/noblesse.json | 11 - src/data/mappings/non-non-biyori.json | 36 - src/data/mappings/noragami.json | 16 - src/data/mappings/nozaki-kun.json | 32 - .../mappings/nura-rise-of-the-yokai-clan.json | 32 - src/data/mappings/nyaruko.json | 11 - .../o-maidens-in-your-savage-season.json | 28 - src/data/mappings/oddtaxi.json | 34 - src/data/mappings/one-piece.json | 113 -- src/data/mappings/one-punch-man.json | 76 - src/data/mappings/orange.json | 37 - src/data/mappings/orb.json | 19 - src/data/mappings/oregairu.json | 23 - src/data/mappings/oreimo.json | 38 - src/data/mappings/oreshura.json | 32 - src/data/mappings/oresuki.json | 37 - src/data/mappings/osamake.json | 16 - src/data/mappings/oshi-no-ko.json | 32 - .../mappings/ossan-newbie-adventurer.json | 17 - src/data/mappings/our-dating-story.json | 10 - src/data/mappings/our-last-crusade.json | 52 - .../mappings/ouran-high-school-host-club.json | 60 - src/data/mappings/outbreak-company.json | 14 - src/data/mappings/overlord.json | 37 - .../mappings/parallel-world-pharmacy.json | 22 - src/data/mappings/parasyte.json | 28 - src/data/mappings/penguindrum.json | 18 - src/data/mappings/pet-girl-of-sakurasou.json | 23 - src/data/mappings/phantom-world.json | 23 - .../mappings/ping-pong-the-animation.json | 33 - src/data/mappings/plastic-memories.json | 9 - src/data/mappings/platinum-end.json | 23 - src/data/mappings/plunderer.json | 27 - src/data/mappings/pluto.json | 48 - src/data/mappings/prison-school.json | 22 - src/data/mappings/problem-children.json | 22 - src/data/mappings/promised-neverland.json | 28 - src/data/mappings/pseudo-harem.json | 9 - src/data/mappings/psycho-pass.json | 50 - .../mappings/quintessential-quintuplets.json | 37 - src/data/mappings/ragna-crimson.json | 32 - src/data/mappings/rainbow.json | 17 - src/data/mappings/ranking-of-kings.json | 27 - src/data/mappings/re-creators.json | 18 - src/data/mappings/re-zero.json | 13 - src/data/mappings/real-girl.json | 10 - src/data/mappings/realist-hero.json | 37 - .../mappings/record-of-grancrest-war.json | 23 - src/data/mappings/record-of-ragnarok.json | 66 - src/data/mappings/redo-of-healer.json | 32 - .../mappings/reincarnated-as-a-sword.json | 27 - ...incarnation-of-the-strongest-exorcist.json | 10 - src/data/mappings/relife.json | 23 - src/data/mappings/remake-our-life.json | 36 - src/data/mappings/rent-a-girlfriend.json | 42 - .../mappings/restaurant-to-another-world.json | 14 - .../rokka-braves-of-the-six-flowers.json | 17 - src/data/mappings/romantic-killer.json | 28 - src/data/mappings/rosario-vampire.json | 32 - src/data/mappings/rurouni-kenshin.json | 19 - src/data/mappings/sabikui-bisco.json | 13 - src/data/mappings/saekano.json | 32 - src/data/mappings/saiki-k.json | 23 - src/data/mappings/sailor-moon.json | 56 - src/data/mappings/saint-seiya.json | 58 - .../saints-magic-power-is-omnipotent.json | 18 - src/data/mappings/sakamoto-days.json | 23 - src/data/mappings/samurai-champloo.json | 13 - src/data/mappings/sankarea.json | 40 - src/data/mappings/sasaki-and-miyano.json | 23 - src/data/mappings/say-i-love-you.json | 32 - .../mappings/sayonara-zetsubou-sensei.json | 14 - src/data/mappings/school-babysitters.json | 17 - src/data/mappings/school-live.json | 26 - src/data/mappings/science-fell-in-love.json | 52 - src/data/mappings/scums-wish.json | 27 - .../second-prettiest-girl-in-my-class.json | 24 - .../mappings/secrets-of-the-silent-witch.json | 23 - src/data/mappings/seirei-gensouki.json | 42 - src/data/mappings/seitokai-yakuindomo.json | 38 - src/data/mappings/sekirei.json | 15 - src/data/mappings/senko-san.json | 22 - src/data/mappings/sentenced-to-be-a-hero.json | 22 - src/data/mappings/seraph-of-the-end.json | 22 - src/data/mappings/seven-deadly-sins.json | 44 - src/data/mappings/shadows-house.json | 11 - src/data/mappings/shakugan-no-shana.json | 38 - src/data/mappings/shaman-king-2021.json | 38 - src/data/mappings/shangri-la-frontier.json | 32 - src/data/mappings/shield-hero.json | 28 - .../mappings/shikimoris-not-just-a-cutie.json | 27 - src/data/mappings/shimoneta.json | 28 - .../mappings/showa-genroku-rakugo-shinju.json | 18 - src/data/mappings/sign-of-affection.json | 27 - src/data/mappings/sing-yesterday-for-me.json | 10 - .../skeleton-knight-in-another-world.json | 27 - src/data/mappings/skip-and-loafer.json | 36 - src/data/mappings/slam-dunk.json | 61 - .../sleepy-princess-in-the-demon-castle.json | 14 - src/data/mappings/smartphone.json | 22 - ...oking-behind-the-supermarket-with-you.json | 14 - .../snow-white-with-the-red-hair.json | 47 - src/data/mappings/so-i-cant-play-h.json | 9 - src/data/mappings/so-im-a-spider.json | 37 - src/data/mappings/solo-leveling.json | 28 - .../somali-and-the-forest-spirit.json | 17 - src/data/mappings/soul-eater.json | 23 - src/data/mappings/space-dandy.json | 10 - src/data/mappings/spice-and-wolf.json | 18 - src/data/mappings/spy-x-family.json | 37 - src/data/mappings/ssss-gridman.json | 9 - src/data/mappings/steins-gate.json | 27 - src/data/mappings/strike-the-blood.json | 103 -- src/data/mappings/summer-time-rendering.json | 38 - ...ngeon-boonies-moved-to-a-starter-town.json | 14 - .../mappings/sweetness-and-lightning.json | 10 - src/data/mappings/sword-art-online.json | 33 - src/data/mappings/takopis-original-sin.json | 38 - src/data/mappings/takt-op-destiny.json | 13 - src/data/mappings/talentless-nana.json | 114 -- src/data/mappings/tamako-market.json | 18 - .../tanaka-kun-is-always-listless.json | 72 - src/data/mappings/tanya-the-evil.json | 23 - .../mappings/teasing-master-takagi-san.json | 36 - src/data/mappings/tensura.json | 39 - src/data/mappings/terra-formars.json | 36 - .../testament-of-sister-new-devil.json | 32 - ...he-aristocrats-otherworldly-adventure.json | 19 - src/data/mappings/the-day-i-became-a-god.json | 14 - .../the-detective-is-already-dead.json | 17 - .../the-dreaming-boy-is-a-realist.json | 9 - src/data/mappings/the-elusive-samurai.json | 18 - src/data/mappings/the-fruit-of-grisaia.json | 33 - .../the-girl-i-like-forgot-her-glasses.json | 17 - .../the-great-jahy-will-not-be-defeated.json | 10 - .../mappings/the-heroic-legend-of-arslan.json | 22 - ...ice-guy-and-his-cool-female-colleague.json | 10 - src/data/mappings/the-kingdoms-of-ruin.json | 29 - ...ed-princess-and-the-genius-young-lady.json | 14 - ...strongest-sage-with-the-weakest-crest.json | 20 - src/data/mappings/the-summer-hikaru-died.json | 22 - src/data/mappings/the-water-magician.json | 28 - .../mappings/this-art-club-has-a-problem.json | 14 - src/data/mappings/to-love-ru.json | 32 - src/data/mappings/to-your-eternity.json | 27 - src/data/mappings/toaru-majutsu-no-index.json | 32 - .../mappings/toilet-bound-hanako-kun.json | 27 - src/data/mappings/tokyo-ghoul.json | 24 - src/data/mappings/tokyo-ravens.json | 28 - src/data/mappings/tokyo-revengers.json | 28 - src/data/mappings/tomo-chan-is-a-girl.json | 33 - src/data/mappings/tomodachi-game.json | 27 - src/data/mappings/tomozaki.json | 22 - src/data/mappings/tonikawa.json | 22 - src/data/mappings/toradora.json | 48 - src/data/mappings/toriko.json | 76 - src/data/mappings/tower-of-god.json | 32 - .../mappings/trapped-in-a-dating-sim.json | 22 - src/data/mappings/trigun.json | 21 - src/data/mappings/trinity-seven.json | 50 - src/data/mappings/tsukimichi.json | 33 - src/data/mappings/tsuredure-children.json | 17 - src/data/mappings/twin-star-exorcists.json | 22 - src/data/mappings/umaru-chan.json | 22 - .../mappings/uncle-from-another-world.json | 42 - src/data/mappings/undead-unluck.json | 34 - .../undefeated-bahamut-chronicle.json | 25 - .../mappings/unwanted-undead-adventurer.json | 32 - src/data/mappings/uzaki-chan.json | 37 - src/data/mappings/uzumaki.json | 32 - src/data/mappings/vampire-knight.json | 22 - src/data/mappings/vermeil-in-gold.json | 37 - src/data/mappings/villainess-level-99.json | 17 - src/data/mappings/villainess.json | 41 - src/data/mappings/vinland-saga.json | 18 - src/data/mappings/violet-evergarden.json | 30 - .../mappings/vivy-fluorite-eyes-song.json | 18 - src/data/mappings/wagnaria.json | 23 - src/data/mappings/waiting-in-the-summer.json | 18 - src/data/mappings/wandering-witch.json | 32 - src/data/mappings/watamote.json | 32 - .../mappings/way-of-the-househusband.json | 27 - src/data/mappings/we-never-learn.json | 42 - .../mappings/welcome-to-the-ballroom.json | 27 - src/data/mappings/welcome-to-the-nhk.json | 38 - ...pernatural-battles-became-commonplace.json | 37 - .../why-the-hell-are-you-here-teacher.json | 32 - src/data/mappings/wind-breaker.json | 37 - src/data/mappings/wise-mans-grandchild.json | 32 - .../mappings/wistoria-wand-and-sword.json | 25 - src/data/mappings/witch-craft-works.json | 15 - src/data/mappings/witch-hat-atelier.json | 26 - src/data/mappings/witch-watch.json | 22 - .../mappings/wolf-girl-and-black-prince.json | 14 - src/data/mappings/world-god-only-knows.json | 27 - src/data/mappings/world-trigger.json | 32 - src/data/mappings/worldend-sukasuka.json | 31 - src/data/mappings/worlds-end-harem.json | 32 - src/data/mappings/worlds-finest-assassin.json | 37 - src/data/mappings/wotakoi.json | 17 - .../wrong-way-to-use-healing-magic.json | 22 - src/data/mappings/ya-boy-kongming.json | 36 - .../yakuzas-guide-to-babysitting.json | 17 - .../yamada-and-the-seven-witches.json | 21 - src/data/mappings/yona-of-the-dawn.json | 28 - src/data/mappings/yosuga-no-sora.json | 33 - .../you-and-i-are-polar-opposites.json | 37 - src/data/mappings/your-lie-in-april.json | 38 - src/data/mappings/yowamushi-pedal.json | 43 - src/data/mappings/yu-yu-hakusho.json | 38 - src/data/mappings/yugioh-duel-monsters.json | 50 - src/data/mappings/yuru-yuri.json | 17 - .../yuuna-and-the-haunted-hot-springs.json | 30 - src/data/mappings/zom-100.json | 27 - src/data/mappings/zombie-land-saga.json | 19 - src/data/searchAliases.ts | 44 +- src/data/top100-manifest.json | 792 ----------- 584 files changed, 18 insertions(+), 19886 deletions(-) delete mode 100644 src/data/mappings/100-girlfriends.json delete mode 100644 src/data/mappings/3-gatsu-no-lion.json delete mode 100644 src/data/mappings/7th-prince.json delete mode 100644 src/data/mappings/7th-time-loop.json delete mode 100644 src/data/mappings/86-eighty-six.json delete mode 100644 src/data/mappings/8th-son-are-you-kidding-me.json delete mode 100644 src/data/mappings/a-certain-scientific-railgun.json delete mode 100644 src/data/mappings/a-couple-of-cuckoos.json delete mode 100644 src/data/mappings/a-lull-in-the-sea.json delete mode 100644 src/data/mappings/a-place-further-than-the-universe.json delete mode 100644 src/data/mappings/a-sisters-all-you-need.json delete mode 100644 src/data/mappings/absolute-duo.json delete mode 100644 src/data/mappings/accel-world.json delete mode 100644 src/data/mappings/ace-of-diamond.json delete mode 100644 src/data/mappings/adachi-and-shimamura.json delete mode 100644 src/data/mappings/aesthetica-of-a-rogue-hero.json delete mode 100644 src/data/mappings/afro-samurai.json delete mode 100644 src/data/mappings/after-the-rain.json delete mode 100644 src/data/mappings/aharen-san-wa-hakarenai.json delete mode 100644 src/data/mappings/aho-girl.json delete mode 100644 src/data/mappings/ajin.json delete mode 100644 src/data/mappings/akame-ga-kill.json delete mode 100644 src/data/mappings/akashic-records.json delete mode 100644 src/data/mappings/akudama-drive.json delete mode 100644 src/data/mappings/alderamin-on-the-sky.json delete mode 100644 src/data/mappings/aldnoah-zero.json delete mode 100644 src/data/mappings/alya-sometimes-hides.json delete mode 100644 src/data/mappings/am-i-actually-the-strongest.json delete mode 100644 src/data/mappings/amagi-brilliant-park.json delete mode 100644 src/data/mappings/an-archdemons-dilemma.json delete mode 100644 src/data/mappings/ancient-magus-bride.json delete mode 100644 src/data/mappings/angel-next-door.json delete mode 100644 src/data/mappings/anohana.json delete mode 100644 src/data/mappings/another.json delete mode 100644 src/data/mappings/ao-chan-cant-study.json delete mode 100644 src/data/mappings/ao-haru-ride.json delete mode 100644 src/data/mappings/aoashi.json delete mode 100644 src/data/mappings/apothecary-diaries.json delete mode 100644 src/data/mappings/arakawa-under-the-bridge.json delete mode 100644 src/data/mappings/arifureta.json delete mode 100644 src/data/mappings/armed-girls-machiavellism.json delete mode 100644 src/data/mappings/ascendance-of-a-bookworm.json delete mode 100644 src/data/mappings/ashita-no-joe.json delete mode 100644 src/data/mappings/asobi-asobase.json delete mode 100644 src/data/mappings/assassination-classroom.json delete mode 100644 src/data/mappings/assassins-pride.json delete mode 100644 src/data/mappings/asterisk-war.json delete mode 100644 src/data/mappings/astra-lost-in-space.json delete mode 100644 src/data/mappings/attack-on-titan.json delete mode 100644 src/data/mappings/azumanga-daioh.json delete mode 100644 src/data/mappings/baccano.json delete mode 100644 src/data/mappings/baka-and-test.json delete mode 100644 src/data/mappings/bakemonogatari.json delete mode 100644 src/data/mappings/baki-hanma.json delete mode 100644 src/data/mappings/baki.json delete mode 100644 src/data/mappings/bakuman.json delete mode 100644 src/data/mappings/banana-fish.json delete mode 100644 src/data/mappings/banished-from-the-heros-party.json delete mode 100644 src/data/mappings/barakamon.json delete mode 100644 src/data/mappings/beast-tamer.json delete mode 100644 src/data/mappings/beastars.json delete mode 100644 src/data/mappings/beck-mongolian-chop-squad.json delete mode 100644 src/data/mappings/beelzebub.json delete mode 100644 src/data/mappings/berserk-of-gluttony.json delete mode 100644 src/data/mappings/berserk.json delete mode 100644 src/data/mappings/beyond-the-boundary.json delete mode 100644 src/data/mappings/black-bullet.json delete mode 100644 src/data/mappings/black-butler.json delete mode 100644 src/data/mappings/black-clover.json delete mode 100644 src/data/mappings/black-lagoon.json delete mode 100644 src/data/mappings/black-summoner.json delete mode 100644 src/data/mappings/blade-dance-of-the-elementalers.json delete mode 100644 src/data/mappings/blast-of-tempest.json delete mode 100644 src/data/mappings/bleach-tybw.json delete mode 100644 src/data/mappings/bleach.json delete mode 100644 src/data/mappings/blend-s.json delete mode 100644 src/data/mappings/blood-blockade-battlefront.json delete mode 100644 src/data/mappings/blood-c.json delete mode 100644 src/data/mappings/blood-lad.json delete mode 100644 src/data/mappings/bloom-into-you.json delete mode 100644 src/data/mappings/blue-box.json delete mode 100644 src/data/mappings/blue-exorcist.json delete mode 100644 src/data/mappings/blue-lock.json delete mode 100644 src/data/mappings/blue-period.json delete mode 100644 src/data/mappings/bna.json delete mode 100644 src/data/mappings/boarding-school-juliet.json delete mode 100644 src/data/mappings/bocchi-the-rock.json delete mode 100644 src/data/mappings/bofuri.json delete mode 100644 src/data/mappings/brynhildr-in-the-darkness.json delete mode 100644 src/data/mappings/btooom.json delete mode 100644 src/data/mappings/bubble.json delete mode 100644 src/data/mappings/bungo-stray-dogs.json delete mode 100644 src/data/mappings/bunny-drop.json delete mode 100644 src/data/mappings/bunny-girl-senpai.json delete mode 100644 src/data/mappings/burn-the-witch.json delete mode 100644 src/data/mappings/by-the-grace-of-the-gods.json delete mode 100644 src/data/mappings/call-of-the-night.json delete mode 100644 src/data/mappings/campfire-cooking-in-another-world.json delete mode 100644 src/data/mappings/campione.json delete mode 100644 src/data/mappings/cardcaptor-sakura.json delete mode 100644 src/data/mappings/carole-tuesday.json delete mode 100644 src/data/mappings/case-study-of-vanitas.json delete mode 100644 src/data/mappings/cautious-hero.json delete mode 100644 src/data/mappings/cells-at-work.json delete mode 100644 src/data/mappings/chaika-the-coffin-princess.json delete mode 100644 src/data/mappings/chained-soldier.json delete mode 100644 src/data/mappings/chainsaw-man.json delete mode 100644 src/data/mappings/charlotte.json delete mode 100644 src/data/mappings/cheat-skill.json delete mode 100644 src/data/mappings/chihayafuru.json delete mode 100644 src/data/mappings/chillin-in-another-world.json delete mode 100644 src/data/mappings/chivalry-of-a-failed-knight.json delete mode 100644 src/data/mappings/chobits.json delete mode 100644 src/data/mappings/chunibyo.json delete mode 100644 src/data/mappings/citrus.json delete mode 100644 src/data/mappings/clannad.json delete mode 100644 src/data/mappings/classroom-of-the-elite.json delete mode 100644 src/data/mappings/claymore.json delete mode 100644 src/data/mappings/clevatess.json delete mode 100644 src/data/mappings/code-geass.json delete mode 100644 src/data/mappings/combatants-will-be-dispatched.json delete mode 100644 src/data/mappings/cowboy-bebop.json delete mode 100644 src/data/mappings/d-frag.json delete mode 100644 src/data/mappings/daemons-of-the-shadow-realm.json delete mode 100644 src/data/mappings/dagashi-kashi.json delete mode 100644 src/data/mappings/daily-lives-of-high-school-boys.json delete mode 100644 src/data/mappings/dandadan.json delete mode 100644 src/data/mappings/danganronpa-the-animation.json delete mode 100644 src/data/mappings/dangers-in-my-heart.json delete mode 100644 src/data/mappings/danmachi.json delete mode 100644 src/data/mappings/darling-in-the-franxx.json delete mode 100644 src/data/mappings/darwins-game.json delete mode 100644 src/data/mappings/date-a-live.json delete mode 100644 src/data/mappings/days-with-my-stepsister.json delete mode 100644 src/data/mappings/dead-mount-death-play.json delete mode 100644 src/data/mappings/deadman-wonderland.json delete mode 100644 src/data/mappings/death-march.json delete mode 100644 src/data/mappings/death-note.json delete mode 100644 src/data/mappings/delicious-in-dungeon.json delete mode 100644 src/data/mappings/demon-king-daimao.json delete mode 100644 src/data/mappings/demon-lord-retry.json delete mode 100644 src/data/mappings/demon-slayer.json delete mode 100644 src/data/mappings/detective-conan.json delete mode 100644 src/data/mappings/devil-is-a-part-timer.json delete mode 100644 src/data/mappings/devilman-crybaby.json delete mode 100644 src/data/mappings/devils-line.json delete mode 100644 src/data/mappings/dgray-man.json delete mode 100644 src/data/mappings/digimon-adventure.json delete mode 100644 src/data/mappings/do-you-love-your-mom-and-her-two-hit-multi-target-attacks.json delete mode 100644 src/data/mappings/domestic-girlfriend.json delete mode 100644 src/data/mappings/dorohedoro.json delete mode 100644 src/data/mappings/dororo.json delete mode 100644 src/data/mappings/dr-stone.json delete mode 100644 src/data/mappings/dragon-ball-super.json delete mode 100644 src/data/mappings/dragon-ball-z.json delete mode 100644 src/data/mappings/dragon-ball.json delete mode 100644 src/data/mappings/dragon-maid.json delete mode 100644 src/data/mappings/drifters.json delete mode 100644 src/data/mappings/duke-of-death-and-his-maid.json delete mode 100644 src/data/mappings/durarara.json delete mode 100644 src/data/mappings/dusk-maiden-of-amnesia.json delete mode 100644 src/data/mappings/edens-zero.json delete mode 100644 src/data/mappings/elfen-lied.json delete mode 100644 src/data/mappings/eminence-in-shadow.json delete mode 100644 src/data/mappings/engaged-to-the-unidentified.json delete mode 100644 src/data/mappings/erased.json delete mode 100644 src/data/mappings/eromanga-sensei.json delete mode 100644 src/data/mappings/failure-frame.json delete mode 100644 src/data/mappings/fairy-tail.json delete mode 100644 src/data/mappings/familiar-of-zero.json delete mode 100644 src/data/mappings/faraway-paladin.json delete mode 100644 src/data/mappings/farming-life-in-another-world.json delete mode 100644 src/data/mappings/fate-apocrypha.json delete mode 100644 src/data/mappings/fate-stay-night.json delete mode 100644 src/data/mappings/fate-strange-fake.json delete mode 100644 src/data/mappings/fate-zero.json delete mode 100644 src/data/mappings/fire-force.json delete mode 100644 src/data/mappings/fist-of-the-north-star.json delete mode 100644 src/data/mappings/flying-witch.json delete mode 100644 src/data/mappings/food-wars.json delete mode 100644 src/data/mappings/fragrant-flower.json delete mode 100644 src/data/mappings/frieren.json delete mode 100644 src/data/mappings/from-old-country-bumpkin-to-master-swordsman.json delete mode 100644 src/data/mappings/fruits-basket-2019.json delete mode 100644 src/data/mappings/full-dive.json delete mode 100644 src/data/mappings/full-metal-panic.json delete mode 100644 src/data/mappings/fullmetal-alchemist-brotherhood.json delete mode 100644 src/data/mappings/future-diary.json delete mode 100644 src/data/mappings/gabriel-dropout.json delete mode 100644 src/data/mappings/gachiakuta.json delete mode 100644 src/data/mappings/gamers.json delete mode 100644 src/data/mappings/gangsta.json delete mode 100644 src/data/mappings/gantz.json delete mode 100644 src/data/mappings/gargantia-on-the-verdurous-planet.json delete mode 100644 src/data/mappings/gate.json delete mode 100644 src/data/mappings/genius-princes-guide-raising-nation-debt.json delete mode 100644 src/data/mappings/ghost-in-the-shell.json delete mode 100644 src/data/mappings/gintama.json delete mode 100644 src/data/mappings/girlfriend-girlfriend.json delete mode 100644 src/data/mappings/girls-last-tour.json delete mode 100644 src/data/mappings/girls-und-panzer.json delete mode 100644 src/data/mappings/given.json delete mode 100644 src/data/mappings/gleipnir.json delete mode 100644 src/data/mappings/go-go-loser-ranger.json delete mode 100644 src/data/mappings/goblin-slayer.json delete mode 100644 src/data/mappings/god-of-high-school.json delete mode 100644 src/data/mappings/golden-boy.json delete mode 100644 src/data/mappings/golden-kamuy.json delete mode 100644 src/data/mappings/golden-time.json delete mode 100644 src/data/mappings/gosick.json delete mode 100644 src/data/mappings/grand-blue.json delete mode 100644 src/data/mappings/great-teacher-onizuka.json delete mode 100644 src/data/mappings/greatest-demon-lord-reborn-typical-nobody.json delete mode 100644 src/data/mappings/grimgar.json delete mode 100644 src/data/mappings/guilty-crown.json delete mode 100644 src/data/mappings/gun-gale-online-alternative.json delete mode 100644 src/data/mappings/gurren-lagann.json delete mode 100644 src/data/mappings/gushing-over-magical-girls.json delete mode 100644 src/data/mappings/haganai.json delete mode 100644 src/data/mappings/haikyuu.json delete mode 100644 src/data/mappings/hajime-no-ippo.json delete mode 100644 src/data/mappings/hanasaku-iroha.json delete mode 100644 src/data/mappings/happy-sugar-life.json delete mode 100644 src/data/mappings/harem-in-the-labyrinth-of-another-world.json delete mode 100644 src/data/mappings/haruhi-suzumiya.json delete mode 100644 src/data/mappings/heavenly-delusion.json delete mode 100644 src/data/mappings/heavens-lost-property.json delete mode 100644 src/data/mappings/hells-paradise.json delete mode 100644 src/data/mappings/hellsing-2001.json delete mode 100644 src/data/mappings/hellsing-ultimate.json delete mode 100644 src/data/mappings/hensuki.json delete mode 100644 src/data/mappings/hentai-prince-and-the-stony-cat.json delete mode 100644 src/data/mappings/hidden-dungeon.json delete mode 100644 src/data/mappings/higehiro.json delete mode 100644 src/data/mappings/high-rise-invasion.json delete mode 100644 src/data/mappings/high-school-dxd.json delete mode 100644 src/data/mappings/high-school-prodigies-have-it-easy-even-in-another-world.json delete mode 100644 src/data/mappings/highschool-of-the-dead.json delete mode 100644 src/data/mappings/hinamatsuri.json delete mode 100644 src/data/mappings/hokkaido-gals-are-super-adorable.json delete mode 100644 src/data/mappings/horimiya.json delete mode 100644 src/data/mappings/how-heavy-dumbbells.json delete mode 100644 src/data/mappings/how-not-to-summon-a-demon-lord.json delete mode 100644 src/data/mappings/hundred.json delete mode 100644 src/data/mappings/hunter-x-hunter-2011.json delete mode 100644 src/data/mappings/hyouka.json delete mode 100644 src/data/mappings/i-cant-understand-what-my-husband-is-saying.json delete mode 100644 src/data/mappings/i-parry-everything.json delete mode 100644 src/data/mappings/iceblade-sorcerer.json delete mode 100644 src/data/mappings/ikoku-nikki.json delete mode 100644 src/data/mappings/im-quitting-heroing.json delete mode 100644 src/data/mappings/im-sakamoto.json delete mode 100644 src/data/mappings/im-standing-on-a-million-lives.json delete mode 100644 src/data/mappings/infinite-stratos.json delete mode 100644 src/data/mappings/initial-d.json delete mode 100644 src/data/mappings/insomniacs-after-school.json delete mode 100644 src/data/mappings/interspecies-reviewers.json delete mode 100644 src/data/mappings/interviews-with-monster-girls.json delete mode 100644 src/data/mappings/inu-x-boku-secret-service.json delete mode 100644 src/data/mappings/inuyasha.json delete mode 100644 src/data/mappings/inuyashiki.json delete mode 100644 src/data/mappings/irregular-at-magic-high-school.json delete mode 100644 src/data/mappings/iruma-kun.json delete mode 100644 src/data/mappings/is-this-a-zombie.json delete mode 100644 src/data/mappings/isekai-cheat-magician.json delete mode 100644 src/data/mappings/jojo-stardust-crusaders.json delete mode 100644 src/data/mappings/jormungand.json delete mode 100644 src/data/mappings/jujutsu-kaisen.json delete mode 100644 src/data/mappings/k-on.json delete mode 100644 src/data/mappings/k.json delete mode 100644 src/data/mappings/kabaneri-of-the-iron-fortress.json delete mode 100644 src/data/mappings/kaguya-sama.json delete mode 100644 src/data/mappings/kaiji-ultimate-survivor.json delete mode 100644 src/data/mappings/kaiju-no-8.json delete mode 100644 src/data/mappings/kakegurui.json delete mode 100644 src/data/mappings/kakushigoto.json delete mode 100644 src/data/mappings/kamikatsu.json delete mode 100644 src/data/mappings/kamisama-kiss.json delete mode 100644 src/data/mappings/katanagatari.json delete mode 100644 src/data/mappings/katekyo-hitman-reborn.json delete mode 100644 src/data/mappings/kawai-complex.json delete mode 100644 src/data/mappings/kaze-no-stigma.json delete mode 100644 src/data/mappings/keep-your-hands-off-eizouken.json delete mode 100644 src/data/mappings/keijo.json delete mode 100644 src/data/mappings/kemono-jihen.json delete mode 100644 src/data/mappings/kids-on-the-slope.json delete mode 100644 src/data/mappings/kill-la-kill.json delete mode 100644 src/data/mappings/killing-slimes-300-years.json delete mode 100644 src/data/mappings/kimi-ni-todoke.json delete mode 100644 src/data/mappings/kingdom.json delete mode 100644 src/data/mappings/kiss-him-not-me.json delete mode 100644 src/data/mappings/kiss-x-sis.json delete mode 100644 src/data/mappings/kiznaiver.json delete mode 100644 src/data/mappings/knights-of-sidonia.json delete mode 100644 src/data/mappings/kokoro-connect.json delete mode 100644 src/data/mappings/komi-cant-communicate.json delete mode 100644 src/data/mappings/kono-oto-tomare.json delete mode 100644 src/data/mappings/konosuba-explosion.json delete mode 100644 src/data/mappings/konosuba.json delete mode 100644 src/data/mappings/kotoura-san.json delete mode 100644 src/data/mappings/kubo-wont-let-me-be-invisible.json delete mode 100644 src/data/mappings/kurokos-basketball.json delete mode 100644 src/data/mappings/laid-back-camp.json delete mode 100644 src/data/mappings/land-of-the-lustrous.json delete mode 100644 src/data/mappings/life-lessons-with-uramichi-oniisan.json delete mode 100644 src/data/mappings/log-horizon.json delete mode 100644 src/data/mappings/lord-marksman-and-vanadis.json delete mode 100644 src/data/mappings/love-after-world-domination.json delete mode 100644 src/data/mappings/love-and-lies.json delete mode 100644 src/data/mappings/love-tyrant.json delete mode 100644 src/data/mappings/lovely-complex.json delete mode 100644 src/data/mappings/lucky-star.json delete mode 100644 src/data/mappings/lycoris-recoil.json delete mode 100644 src/data/mappings/made-in-abyss.json delete mode 100644 src/data/mappings/madoka-magica.json delete mode 100644 src/data/mappings/magi-adventure-of-sinbad.json delete mode 100644 src/data/mappings/magi.json delete mode 100644 src/data/mappings/magical-girl-site.json delete mode 100644 src/data/mappings/magical-sempai.json delete mode 100644 src/data/mappings/maid-sama.json delete mode 100644 src/data/mappings/makeine-too-many-losing-heroines.json delete mode 100644 src/data/mappings/maoyu.json delete mode 100644 src/data/mappings/marriagetoxin.json delete mode 100644 src/data/mappings/masamune-kun-revenge.json delete mode 100644 src/data/mappings/mashle.json delete mode 100644 src/data/mappings/mayo-chiki.json delete mode 100644 src/data/mappings/mieruko-chan.json delete mode 100644 src/data/mappings/misfit-of-demon-king-academy.json delete mode 100644 src/data/mappings/mmo-junkie.json delete mode 100644 src/data/mappings/mob-psycho-100.json delete mode 100644 src/data/mappings/monster-musume.json delete mode 100644 src/data/mappings/monster.json delete mode 100644 src/data/mappings/more-than-a-married-couple.json delete mode 100644 src/data/mappings/moriarty-the-patriot.json delete mode 100644 src/data/mappings/mushishi.json delete mode 100644 src/data/mappings/mushoku-tensei.json delete mode 100644 src/data/mappings/my-deer-friend-nokotan.json delete mode 100644 src/data/mappings/my-dress-up-darling.json delete mode 100644 src/data/mappings/my-first-girlfriend-is-a-gal.json delete mode 100644 src/data/mappings/my-girlfriend-is-shobitch.json delete mode 100644 src/data/mappings/my-happy-marriage.json delete mode 100644 src/data/mappings/my-hero-academia.json delete mode 100644 src/data/mappings/my-isekai-life.json delete mode 100644 src/data/mappings/my-little-monster.json delete mode 100644 src/data/mappings/my-love-story-with-yamada-kun.json delete mode 100644 src/data/mappings/my-love-story.json delete mode 100644 src/data/mappings/my-mental-choices.json delete mode 100644 src/data/mappings/my-senpai-is-annoying.json delete mode 100644 src/data/mappings/my-status-as-an-assassin.json delete mode 100644 src/data/mappings/my-stepmoms-daughter-is-my-ex.json delete mode 100644 src/data/mappings/mysterious-girlfriend-x.json delete mode 100644 src/data/mappings/nagatoro.json delete mode 100644 src/data/mappings/nana.json delete mode 100644 src/data/mappings/nanbaka.json delete mode 100644 src/data/mappings/naruto.json delete mode 100644 src/data/mappings/natsume-yuujinchou.json delete mode 100644 src/data/mappings/neon-genesis-evangelion.json delete mode 100644 src/data/mappings/netoge.json delete mode 100644 src/data/mappings/new-game.json delete mode 100644 src/data/mappings/nichijou.json delete mode 100644 src/data/mappings/nisekoi.json delete mode 100644 src/data/mappings/no-game-no-life.json delete mode 100644 src/data/mappings/no-longer-allowed-in-another-world.json delete mode 100644 src/data/mappings/noblesse.json delete mode 100644 src/data/mappings/non-non-biyori.json delete mode 100644 src/data/mappings/noragami.json delete mode 100644 src/data/mappings/nozaki-kun.json delete mode 100644 src/data/mappings/nura-rise-of-the-yokai-clan.json delete mode 100644 src/data/mappings/nyaruko.json delete mode 100644 src/data/mappings/o-maidens-in-your-savage-season.json delete mode 100644 src/data/mappings/oddtaxi.json delete mode 100644 src/data/mappings/one-piece.json delete mode 100644 src/data/mappings/one-punch-man.json delete mode 100644 src/data/mappings/orange.json delete mode 100644 src/data/mappings/orb.json delete mode 100644 src/data/mappings/oregairu.json delete mode 100644 src/data/mappings/oreimo.json delete mode 100644 src/data/mappings/oreshura.json delete mode 100644 src/data/mappings/oresuki.json delete mode 100644 src/data/mappings/osamake.json delete mode 100644 src/data/mappings/oshi-no-ko.json delete mode 100644 src/data/mappings/ossan-newbie-adventurer.json delete mode 100644 src/data/mappings/our-dating-story.json delete mode 100644 src/data/mappings/our-last-crusade.json delete mode 100644 src/data/mappings/ouran-high-school-host-club.json delete mode 100644 src/data/mappings/outbreak-company.json delete mode 100644 src/data/mappings/overlord.json delete mode 100644 src/data/mappings/parallel-world-pharmacy.json delete mode 100644 src/data/mappings/parasyte.json delete mode 100644 src/data/mappings/penguindrum.json delete mode 100644 src/data/mappings/pet-girl-of-sakurasou.json delete mode 100644 src/data/mappings/phantom-world.json delete mode 100644 src/data/mappings/ping-pong-the-animation.json delete mode 100644 src/data/mappings/plastic-memories.json delete mode 100644 src/data/mappings/platinum-end.json delete mode 100644 src/data/mappings/plunderer.json delete mode 100644 src/data/mappings/pluto.json delete mode 100644 src/data/mappings/prison-school.json delete mode 100644 src/data/mappings/problem-children.json delete mode 100644 src/data/mappings/promised-neverland.json delete mode 100644 src/data/mappings/pseudo-harem.json delete mode 100644 src/data/mappings/psycho-pass.json delete mode 100644 src/data/mappings/quintessential-quintuplets.json delete mode 100644 src/data/mappings/ragna-crimson.json delete mode 100644 src/data/mappings/rainbow.json delete mode 100644 src/data/mappings/ranking-of-kings.json delete mode 100644 src/data/mappings/re-creators.json delete mode 100644 src/data/mappings/re-zero.json delete mode 100644 src/data/mappings/real-girl.json delete mode 100644 src/data/mappings/realist-hero.json delete mode 100644 src/data/mappings/record-of-grancrest-war.json delete mode 100644 src/data/mappings/record-of-ragnarok.json delete mode 100644 src/data/mappings/redo-of-healer.json delete mode 100644 src/data/mappings/reincarnated-as-a-sword.json delete mode 100644 src/data/mappings/reincarnation-of-the-strongest-exorcist.json delete mode 100644 src/data/mappings/relife.json delete mode 100644 src/data/mappings/remake-our-life.json delete mode 100644 src/data/mappings/rent-a-girlfriend.json delete mode 100644 src/data/mappings/restaurant-to-another-world.json delete mode 100644 src/data/mappings/rokka-braves-of-the-six-flowers.json delete mode 100644 src/data/mappings/romantic-killer.json delete mode 100644 src/data/mappings/rosario-vampire.json delete mode 100644 src/data/mappings/rurouni-kenshin.json delete mode 100644 src/data/mappings/sabikui-bisco.json delete mode 100644 src/data/mappings/saekano.json delete mode 100644 src/data/mappings/saiki-k.json delete mode 100644 src/data/mappings/sailor-moon.json delete mode 100644 src/data/mappings/saint-seiya.json delete mode 100644 src/data/mappings/saints-magic-power-is-omnipotent.json delete mode 100644 src/data/mappings/sakamoto-days.json delete mode 100644 src/data/mappings/samurai-champloo.json delete mode 100644 src/data/mappings/sankarea.json delete mode 100644 src/data/mappings/sasaki-and-miyano.json delete mode 100644 src/data/mappings/say-i-love-you.json delete mode 100644 src/data/mappings/sayonara-zetsubou-sensei.json delete mode 100644 src/data/mappings/school-babysitters.json delete mode 100644 src/data/mappings/school-live.json delete mode 100644 src/data/mappings/science-fell-in-love.json delete mode 100644 src/data/mappings/scums-wish.json delete mode 100644 src/data/mappings/second-prettiest-girl-in-my-class.json delete mode 100644 src/data/mappings/secrets-of-the-silent-witch.json delete mode 100644 src/data/mappings/seirei-gensouki.json delete mode 100644 src/data/mappings/seitokai-yakuindomo.json delete mode 100644 src/data/mappings/sekirei.json delete mode 100644 src/data/mappings/senko-san.json delete mode 100644 src/data/mappings/sentenced-to-be-a-hero.json delete mode 100644 src/data/mappings/seraph-of-the-end.json delete mode 100644 src/data/mappings/seven-deadly-sins.json delete mode 100644 src/data/mappings/shadows-house.json delete mode 100644 src/data/mappings/shakugan-no-shana.json delete mode 100644 src/data/mappings/shaman-king-2021.json delete mode 100644 src/data/mappings/shangri-la-frontier.json delete mode 100644 src/data/mappings/shield-hero.json delete mode 100644 src/data/mappings/shikimoris-not-just-a-cutie.json delete mode 100644 src/data/mappings/shimoneta.json delete mode 100644 src/data/mappings/showa-genroku-rakugo-shinju.json delete mode 100644 src/data/mappings/sign-of-affection.json delete mode 100644 src/data/mappings/sing-yesterday-for-me.json delete mode 100644 src/data/mappings/skeleton-knight-in-another-world.json delete mode 100644 src/data/mappings/skip-and-loafer.json delete mode 100644 src/data/mappings/slam-dunk.json delete mode 100644 src/data/mappings/sleepy-princess-in-the-demon-castle.json delete mode 100644 src/data/mappings/smartphone.json delete mode 100644 src/data/mappings/smoking-behind-the-supermarket-with-you.json delete mode 100644 src/data/mappings/snow-white-with-the-red-hair.json delete mode 100644 src/data/mappings/so-i-cant-play-h.json delete mode 100644 src/data/mappings/so-im-a-spider.json delete mode 100644 src/data/mappings/solo-leveling.json delete mode 100644 src/data/mappings/somali-and-the-forest-spirit.json delete mode 100644 src/data/mappings/soul-eater.json delete mode 100644 src/data/mappings/space-dandy.json delete mode 100644 src/data/mappings/spice-and-wolf.json delete mode 100644 src/data/mappings/spy-x-family.json delete mode 100644 src/data/mappings/ssss-gridman.json delete mode 100644 src/data/mappings/steins-gate.json delete mode 100644 src/data/mappings/strike-the-blood.json delete mode 100644 src/data/mappings/summer-time-rendering.json delete mode 100644 src/data/mappings/suppose-a-kid-from-the-last-dungeon-boonies-moved-to-a-starter-town.json delete mode 100644 src/data/mappings/sweetness-and-lightning.json delete mode 100644 src/data/mappings/sword-art-online.json delete mode 100644 src/data/mappings/takopis-original-sin.json delete mode 100644 src/data/mappings/takt-op-destiny.json delete mode 100644 src/data/mappings/talentless-nana.json delete mode 100644 src/data/mappings/tamako-market.json delete mode 100644 src/data/mappings/tanaka-kun-is-always-listless.json delete mode 100644 src/data/mappings/tanya-the-evil.json delete mode 100644 src/data/mappings/teasing-master-takagi-san.json delete mode 100644 src/data/mappings/tensura.json delete mode 100644 src/data/mappings/terra-formars.json delete mode 100644 src/data/mappings/testament-of-sister-new-devil.json delete mode 100644 src/data/mappings/the-aristocrats-otherworldly-adventure.json delete mode 100644 src/data/mappings/the-day-i-became-a-god.json delete mode 100644 src/data/mappings/the-detective-is-already-dead.json delete mode 100644 src/data/mappings/the-dreaming-boy-is-a-realist.json delete mode 100644 src/data/mappings/the-elusive-samurai.json delete mode 100644 src/data/mappings/the-fruit-of-grisaia.json delete mode 100644 src/data/mappings/the-girl-i-like-forgot-her-glasses.json delete mode 100644 src/data/mappings/the-great-jahy-will-not-be-defeated.json delete mode 100644 src/data/mappings/the-heroic-legend-of-arslan.json delete mode 100644 src/data/mappings/the-ice-guy-and-his-cool-female-colleague.json delete mode 100644 src/data/mappings/the-kingdoms-of-ruin.json delete mode 100644 src/data/mappings/the-magical-revolution-of-the-reincarnated-princess-and-the-genius-young-lady.json delete mode 100644 src/data/mappings/the-strongest-sage-with-the-weakest-crest.json delete mode 100644 src/data/mappings/the-summer-hikaru-died.json delete mode 100644 src/data/mappings/the-water-magician.json delete mode 100644 src/data/mappings/this-art-club-has-a-problem.json delete mode 100644 src/data/mappings/to-love-ru.json delete mode 100644 src/data/mappings/to-your-eternity.json delete mode 100644 src/data/mappings/toaru-majutsu-no-index.json delete mode 100644 src/data/mappings/toilet-bound-hanako-kun.json delete mode 100644 src/data/mappings/tokyo-ghoul.json delete mode 100644 src/data/mappings/tokyo-ravens.json delete mode 100644 src/data/mappings/tokyo-revengers.json delete mode 100644 src/data/mappings/tomo-chan-is-a-girl.json delete mode 100644 src/data/mappings/tomodachi-game.json delete mode 100644 src/data/mappings/tomozaki.json delete mode 100644 src/data/mappings/tonikawa.json delete mode 100644 src/data/mappings/toradora.json delete mode 100644 src/data/mappings/toriko.json delete mode 100644 src/data/mappings/tower-of-god.json delete mode 100644 src/data/mappings/trapped-in-a-dating-sim.json delete mode 100644 src/data/mappings/trigun.json delete mode 100644 src/data/mappings/trinity-seven.json delete mode 100644 src/data/mappings/tsukimichi.json delete mode 100644 src/data/mappings/tsuredure-children.json delete mode 100644 src/data/mappings/twin-star-exorcists.json delete mode 100644 src/data/mappings/umaru-chan.json delete mode 100644 src/data/mappings/uncle-from-another-world.json delete mode 100644 src/data/mappings/undead-unluck.json delete mode 100644 src/data/mappings/undefeated-bahamut-chronicle.json delete mode 100644 src/data/mappings/unwanted-undead-adventurer.json delete mode 100644 src/data/mappings/uzaki-chan.json delete mode 100644 src/data/mappings/uzumaki.json delete mode 100644 src/data/mappings/vampire-knight.json delete mode 100644 src/data/mappings/vermeil-in-gold.json delete mode 100644 src/data/mappings/villainess-level-99.json delete mode 100644 src/data/mappings/villainess.json delete mode 100644 src/data/mappings/vinland-saga.json delete mode 100644 src/data/mappings/violet-evergarden.json delete mode 100644 src/data/mappings/vivy-fluorite-eyes-song.json delete mode 100644 src/data/mappings/wagnaria.json delete mode 100644 src/data/mappings/waiting-in-the-summer.json delete mode 100644 src/data/mappings/wandering-witch.json delete mode 100644 src/data/mappings/watamote.json delete mode 100644 src/data/mappings/way-of-the-househusband.json delete mode 100644 src/data/mappings/we-never-learn.json delete mode 100644 src/data/mappings/welcome-to-the-ballroom.json delete mode 100644 src/data/mappings/welcome-to-the-nhk.json delete mode 100644 src/data/mappings/when-supernatural-battles-became-commonplace.json delete mode 100644 src/data/mappings/why-the-hell-are-you-here-teacher.json delete mode 100644 src/data/mappings/wind-breaker.json delete mode 100644 src/data/mappings/wise-mans-grandchild.json delete mode 100644 src/data/mappings/wistoria-wand-and-sword.json delete mode 100644 src/data/mappings/witch-craft-works.json delete mode 100644 src/data/mappings/witch-hat-atelier.json delete mode 100644 src/data/mappings/witch-watch.json delete mode 100644 src/data/mappings/wolf-girl-and-black-prince.json delete mode 100644 src/data/mappings/world-god-only-knows.json delete mode 100644 src/data/mappings/world-trigger.json delete mode 100644 src/data/mappings/worldend-sukasuka.json delete mode 100644 src/data/mappings/worlds-end-harem.json delete mode 100644 src/data/mappings/worlds-finest-assassin.json delete mode 100644 src/data/mappings/wotakoi.json delete mode 100644 src/data/mappings/wrong-way-to-use-healing-magic.json delete mode 100644 src/data/mappings/ya-boy-kongming.json delete mode 100644 src/data/mappings/yakuzas-guide-to-babysitting.json delete mode 100644 src/data/mappings/yamada-and-the-seven-witches.json delete mode 100644 src/data/mappings/yona-of-the-dawn.json delete mode 100644 src/data/mappings/yosuga-no-sora.json delete mode 100644 src/data/mappings/you-and-i-are-polar-opposites.json delete mode 100644 src/data/mappings/your-lie-in-april.json delete mode 100644 src/data/mappings/yowamushi-pedal.json delete mode 100644 src/data/mappings/yu-yu-hakusho.json delete mode 100644 src/data/mappings/yugioh-duel-monsters.json delete mode 100644 src/data/mappings/yuru-yuri.json delete mode 100644 src/data/mappings/yuuna-and-the-haunted-hot-springs.json delete mode 100644 src/data/mappings/zom-100.json delete mode 100644 src/data/mappings/zombie-land-saga.json delete mode 100644 src/data/top100-manifest.json diff --git a/app/anime/[id]/index.tsx b/app/anime/[id]/index.tsx index 26cc733..1f57512 100644 --- a/app/anime/[id]/index.tsx +++ b/app/anime/[id]/index.tsx @@ -155,9 +155,8 @@ export default function AnimeDetail() { Linear pacing — anime episode count distributed evenly across the manga chapter count. Real arcs rarely adapt at a uniform - rate, so treat numbers as a rough guide. Curated JSON in{" "} - src/data/mappings/ overrides - this. + rate, so treat numbers as a rough guide. A curated mapping + overrides this estimate. )} @@ -173,8 +172,7 @@ export default function AnimeDetail() { No mapping available yet We couldn't find an anime↔manga adaptation pair on AniList for - this entry, and no curated mapping exists. Add a JSON file to{" "} - src/data/mappings/ in the repo. + this entry, and no curated mapping exists for it yet. )} @@ -353,7 +351,6 @@ const styles = StyleSheet.create({ lineHeight: 18, fontFamily: FONT.regular, }, - code: { fontFamily: "Menlo", color: "#7c5cff" }, lookup: { gap: 12, paddingTop: 8 }, lookupRow: { flexDirection: "row", diff --git a/app/manga/[id]/index.tsx b/app/manga/[id]/index.tsx index 7b16085..1418612 100644 --- a/app/manga/[id]/index.tsx +++ b/app/manga/[id]/index.tsx @@ -142,9 +142,8 @@ export default function MangaDetail() { Linear pacing — anime episode count distributed evenly across - the manga chapter count. Real pacing varies; curated JSON in{" "} - src/data/mappings/ overrides - this. + the manga chapter count. Real pacing varies; a curated mapping + overrides this estimate. )} @@ -166,9 +165,8 @@ export default function MangaDetail() { No anime adaptation mapped yet - No curated or auto-estimated mapping is available for this manga. - Add a JSON file to{" "} - src/data/mappings/. + No curated or auto-estimated mapping is available for this manga + yet. )} @@ -554,7 +552,6 @@ const styles = StyleSheet.create({ lineHeight: 18, fontFamily: FONT.regular, }, - code: { fontFamily: "Menlo", color: "#7c5cff" }, seasonBlock: { padding: 12, backgroundColor: "#17181b", diff --git a/app/series/[id]/index.tsx b/app/series/[id]/index.tsx index 802f7c1..b04f91a 100644 --- a/app/series/[id]/index.tsx +++ b/app/series/[id]/index.tsx @@ -317,9 +317,8 @@ export default function SeriesDetail() { Linear pacing — anime episode count distributed evenly across - the manga chapter count. Real pacing varies; curated JSON in{" "} - src/data/mappings/ overrides - this. + the manga chapter count. Real pacing varies; a curated mapping + overrides this estimate. )} @@ -353,8 +352,7 @@ export default function SeriesDetail() { No mapping available yet We couldn't find an anime↔manga adaptation pair on AniList for - this entry, and no curated mapping exists. Add a JSON file to{" "} - src/data/mappings/ in the repo. + this entry, and no curated mapping exists for it yet. )} @@ -572,7 +570,6 @@ const styles = StyleSheet.create({ lineHeight: 18, fontFamily: FONT.regular, }, - code: { fontFamily: "Menlo", color: "#7c5cff" }, volumesBlock: { gap: 12 }, titlesBlock: { gap: 8 }, titlesList: { gap: 6 }, diff --git a/src/data/index.ts b/src/data/index.ts index f170429..0c9b7ee 100644 --- a/src/data/index.ts +++ b/src/data/index.ts @@ -1,1251 +1,13 @@ import type { AniListMedia, - MappingEntry, - MovieEntry, RelationEdge, SeriesEntry, SeriesMapping, } from "@/types"; -import onePiece from "@/data/mappings/one-piece.json"; -import attackOnTitan from "@/data/mappings/attack-on-titan.json"; -import demonSlayer from "@/data/mappings/demon-slayer.json"; -import onePunchMan from "@/data/mappings/one-punch-man.json"; -import vinlandSaga from "@/data/mappings/vinland-saga.json"; -import fullmetalAlchemistBrotherhood from "@/data/mappings/fullmetal-alchemist-brotherhood.json"; -import hunterXHunter2011 from "@/data/mappings/hunter-x-hunter-2011.json"; -import monster from "@/data/mappings/monster.json"; -import jujutsuKaisen from "@/data/mappings/jujutsu-kaisen.json"; -import bleachTybw from "@/data/mappings/bleach-tybw.json"; -import mobPsycho100 from "@/data/mappings/mob-psycho-100.json"; -import frieren from "@/data/mappings/frieren.json"; -import apothecaryDiaries from "@/data/mappings/apothecary-diaries.json"; -import nana from "@/data/mappings/nana.json"; -import haikyuu from "@/data/mappings/haikyuu.json"; -import fruitsBasket2019 from "@/data/mappings/fruits-basket-2019.json"; -import berserk from "@/data/mappings/berserk.json"; -import dragonBall from "@/data/mappings/dragon-ball.json"; -import dragonBallZ from "@/data/mappings/dragon-ball-z.json"; -import dragonBallSuper from "@/data/mappings/dragon-ball-super.json"; -import wistoriaWandAndSword from "@/data/mappings/wistoria-wand-and-sword.json"; -import drStone from "@/data/mappings/dr-stone.json"; -import baki from "@/data/mappings/baki.json"; -import bakiHanma from "@/data/mappings/baki-hanma.json"; -import assassinationClassroom from "@/data/mappings/assassination-classroom.json"; -import gintama from "@/data/mappings/gintama.json"; -import kaguyaSama from "@/data/mappings/kaguya-sama.json"; -import marchComesInLikeALion from "@/data/mappings/3-gatsu-no-lion.json"; -import kingdom from "@/data/mappings/kingdom.json"; -import ashitaNoJoe from "@/data/mappings/ashita-no-joe.json"; -import hajimeNoIppo from "@/data/mappings/hajime-no-ippo.json"; -import ikokuNikki from "@/data/mappings/ikoku-nikki.json"; -import witchHatAtelier from "@/data/mappings/witch-hat-atelier.json"; -import bocchiTheRock from "@/data/mappings/bocchi-the-rock.json"; -import orb from "@/data/mappings/orb.json"; -import mushishi from "@/data/mappings/mushishi.json"; -import myHeroAcademia from "@/data/mappings/my-hero-academia.json"; -import oshiNoKo from "@/data/mappings/oshi-no-ko.json"; -import chainsawMan from "@/data/mappings/chainsaw-man.json"; -import spyXFamily from "@/data/mappings/spy-x-family.json"; -import promisedNeverland from "@/data/mappings/promised-neverland.json"; -import dandadan from "@/data/mappings/dandadan.json"; -import tokyoRevengers from "@/data/mappings/tokyo-revengers.json"; -import madeInAbyss from "@/data/mappings/made-in-abyss.json"; -import naruto from "@/data/mappings/naruto.json"; -import blackClover from "@/data/mappings/black-clover.json"; -import fireForce from "@/data/mappings/fire-force.json"; -import soulEater from "@/data/mappings/soul-eater.json"; -import noragami from "@/data/mappings/noragami.json"; -import mashle from "@/data/mappings/mashle.json"; -import sakamotoDays from "@/data/mappings/sakamoto-days.json"; -import kaijuNo8 from "@/data/mappings/kaiju-no-8.json"; -import beastars from "@/data/mappings/beastars.json"; -import goldenKamuy from "@/data/mappings/golden-kamuy.json"; -import bleach from "@/data/mappings/bleach.json"; -import yuYuHakusho from "@/data/mappings/yu-yu-hakusho.json"; -import rurouniKenshin from "@/data/mappings/rurouni-kenshin.json"; -import inuyasha from "@/data/mappings/inuyasha.json"; -import fairyTail from "@/data/mappings/fairy-tail.json"; -import sevenDeadlySins from "@/data/mappings/seven-deadly-sins.json"; -import dgrayMan from "@/data/mappings/dgray-man.json"; -import magi from "@/data/mappings/magi.json"; -import akameGaKill from "@/data/mappings/akame-ga-kill.json"; -import yonaOfTheDawn from "@/data/mappings/yona-of-the-dawn.json"; -import jojoStardustCrusaders from "@/data/mappings/jojo-stardust-crusaders.json"; -import tokyoGhoul from "@/data/mappings/tokyo-ghoul.json"; -import bungoStrayDogs from "@/data/mappings/bungo-stray-dogs.json"; -import hellsingUltimate from "@/data/mappings/hellsing-ultimate.json"; -import blackButler from "@/data/mappings/black-butler.json"; -import trigun from "@/data/mappings/trigun.json"; -import parasyte from "@/data/mappings/parasyte.json"; -import goblinSlayer from "@/data/mappings/goblin-slayer.json"; -import deathNote from "@/data/mappings/death-note.json"; -import codeGeass from "@/data/mappings/code-geass.json"; -import steinsGate from "@/data/mappings/steins-gate.json"; -import psychoPass from "@/data/mappings/psycho-pass.json"; -import neonGenesisEvangelion from "@/data/mappings/neon-genesis-evangelion.json"; -import cowboyBebop from "@/data/mappings/cowboy-bebop.json"; -import samuraiChamploo from "@/data/mappings/samurai-champloo.json"; -import eightySix from "@/data/mappings/86-eighty-six.json"; -import madokaMagica from "@/data/mappings/madoka-magica.json"; -import reZero from "@/data/mappings/re-zero.json"; -import mushokuTensei from "@/data/mappings/mushoku-tensei.json"; -import overlord from "@/data/mappings/overlord.json"; -import tensura from "@/data/mappings/tensura.json"; -import shieldHero from "@/data/mappings/shield-hero.json"; -import konosuba from "@/data/mappings/konosuba.json"; -import noGameNoLife from "@/data/mappings/no-game-no-life.json"; -import logHorizon from "@/data/mappings/log-horizon.json"; -import tanyaTheEvil from "@/data/mappings/tanya-the-evil.json"; -import eminenceInShadow from "@/data/mappings/eminence-in-shadow.json"; -import soloLeveling from "@/data/mappings/solo-leveling.json"; -import swordArtOnline from "@/data/mappings/sword-art-online.json"; -import fateZero from "@/data/mappings/fate-zero.json"; -import fateStayNight from "@/data/mappings/fate-stay-night.json"; -import bakemonogatari from "@/data/mappings/bakemonogatari.json"; -import durarara from "@/data/mappings/durarara.json"; -import toaruMajutsuNoIndex from "@/data/mappings/toaru-majutsu-no-index.json"; -import spiceAndWolf from "@/data/mappings/spice-and-wolf.json"; -import quintessentialQuintuplets from "@/data/mappings/quintessential-quintuplets.json"; -import slamDunk from "@/data/mappings/slam-dunk.json"; -import cardcaptorSakura from "@/data/mappings/cardcaptor-sakura.json"; -import yugiohDuelMonsters from "@/data/mappings/yugioh-duel-monsters.json"; -import digimonAdventure from "@/data/mappings/digimon-adventure.json"; -import blueLock from "@/data/mappings/blue-lock.json"; -import kurokosBasketball from "@/data/mappings/kurokos-basketball.json"; -import aceOfDiamond from "@/data/mappings/ace-of-diamond.json"; -import yowamushiPedal from "@/data/mappings/yowamushi-pedal.json"; -import chihayafuru from "@/data/mappings/chihayafuru.json"; -import blueExorcist from "@/data/mappings/blue-exorcist.json"; -import worldTrigger from "@/data/mappings/world-trigger.json"; -import shamanKing2021 from "@/data/mappings/shaman-king-2021.json"; -import katekyoHitmanReborn from "@/data/mappings/katekyo-hitman-reborn.json"; -import toriko from "@/data/mappings/toriko.json"; -import hellsParadise from "@/data/mappings/hells-paradise.json"; -import undeadUnluck from "@/data/mappings/undead-unluck.json"; -import beelzebub from "@/data/mappings/beelzebub.json"; -import nuraRiseOfTheYokaiClan from "@/data/mappings/nura-rise-of-the-yokai-clan.json"; -import toiletBoundHanakoKun from "@/data/mappings/toilet-bound-hanako-kun.json"; -import fistOfTheNorthStar from "@/data/mappings/fist-of-the-north-star.json"; -import saintSeiya from "@/data/mappings/saint-seiya.json"; -import dororo from "@/data/mappings/dororo.json"; -import claymore from "@/data/mappings/claymore.json"; -import blackLagoon from "@/data/mappings/black-lagoon.json"; -import dorohedoro from "@/data/mappings/dorohedoro.json"; -import gantz from "@/data/mappings/gantz.json"; -import ajin from "@/data/mappings/ajin.json"; -import deadmanWonderland from "@/data/mappings/deadman-wonderland.json"; -import btooom from "@/data/mappings/btooom.json"; -import bananaFish from "@/data/mappings/banana-fish.json"; -import drifters from "@/data/mappings/drifters.json"; -import terraFormars from "@/data/mappings/terra-formars.json"; -import knightsOfSidonia from "@/data/mappings/knights-of-sidonia.json"; -import inuyashiki from "@/data/mappings/inuyashiki.json"; -import horimiya from "@/data/mappings/horimiya.json"; -import komiCantCommunicate from "@/data/mappings/komi-cant-communicate.json"; -import myDressUpDarling from "@/data/mappings/my-dress-up-darling.json"; -import nisekoi from "@/data/mappings/nisekoi.json"; -import ouranHighSchoolHostClub from "@/data/mappings/ouran-high-school-host-club.json"; -import yourLieInApril from "@/data/mappings/your-lie-in-april.json"; -import erased from "@/data/mappings/erased.json"; -import skipAndLoafer from "@/data/mappings/skip-and-loafer.json"; -import bluePeriod from "@/data/mappings/blue-period.json"; -import given from "@/data/mappings/given.json"; -import foodWars from "@/data/mappings/food-wars.json"; -import grandBlue from "@/data/mappings/grand-blue.json"; -import devilIsAPartTimer from "@/data/mappings/devil-is-a-part-timer.json"; -import yaBoyKongming from "@/data/mappings/ya-boy-kongming.json"; -import cellsAtWork from "@/data/mappings/cells-at-work.json"; -import ancientMagusBride from "@/data/mappings/ancient-magus-bride.json"; -import landOfTheLustrous from "@/data/mappings/land-of-the-lustrous.json"; -import rankingOfKings from "@/data/mappings/ranking-of-kings.json"; -import toYourEternity from "@/data/mappings/to-your-eternity.json"; -import callOfTheNight from "@/data/mappings/call-of-the-night.json"; -import chivalryOfAFailedKnight from "@/data/mappings/chivalry-of-a-failed-knight.json"; -import masamuneKunRevenge from "@/data/mappings/masamune-kun-revenge.json"; -import nichijou from "@/data/mappings/nichijou.json"; -import gachiakuta from "@/data/mappings/gachiakuta.json"; -import zom100 from "@/data/mappings/zom-100.json"; -import chunibyo from "@/data/mappings/chunibyo.json"; -import towerOfGod from "@/data/mappings/tower-of-god.json"; -import dragonMaid from "@/data/mappings/dragon-maid.json"; -import seraphOfTheEnd from "@/data/mappings/seraph-of-the-end.json"; -import wotakoi from "@/data/mappings/wotakoi.json"; -import highSchoolDxd from "@/data/mappings/high-school-dxd.json"; -import rentAGirlfriend from "@/data/mappings/rent-a-girlfriend.json"; -import godOfHighSchool from "@/data/mappings/god-of-high-school.json"; -import clannad from "@/data/mappings/clannad.json"; -import maidSama from "@/data/mappings/maid-sama.json"; -import highschoolOfTheDead from "@/data/mappings/highschool-of-the-dead.json"; -import beyondTheBoundary from "@/data/mappings/beyond-the-boundary.json"; -import petGirlOfSakurasou from "@/data/mappings/pet-girl-of-sakurasou.json"; -import elfenLied from "@/data/mappings/elfen-lied.json"; -import nagatoro from "@/data/mappings/nagatoro.json"; -import bunnyGirlSenpai from "@/data/mappings/bunny-girl-senpai.json"; -import toradora from "@/data/mappings/toradora.json"; -import kakegurui from "@/data/mappings/kakegurui.json"; -import classroomOfTheElite from "@/data/mappings/classroom-of-the-elite.json"; -import futureDiary from "@/data/mappings/future-diary.json"; -import danmachi from "@/data/mappings/danmachi.json"; -import another from "@/data/mappings/another.json"; -import oregairu from "@/data/mappings/oregairu.json"; -import saikiK from "@/data/mappings/saiki-k.json"; -import hyouka from "@/data/mappings/hyouka.json"; -import misfitOfDemonKingAcademy from "@/data/mappings/misfit-of-demon-king-academy.json"; -import goldenTime from "@/data/mappings/golden-time.json"; -import myLittleMonster from "@/data/mappings/my-little-monster.json"; -import irregularAtMagicHighSchool from "@/data/mappings/irregular-at-magic-high-school.json"; -import relife from "@/data/mappings/relife.json"; -import orange from "@/data/mappings/orange.json"; -import bloodBlockadeBattlefront from "@/data/mappings/blood-blockade-battlefront.json"; -import arifureta from "@/data/mappings/arifureta.json"; -import nozakiKun from "@/data/mappings/nozaki-kun.json"; -import deliciousInDungeon from "@/data/mappings/delicious-in-dungeon.json"; -import summerTimeRendering from "@/data/mappings/summer-time-rendering.json"; -import kimiNiTodoke from "@/data/mappings/kimi-ni-todoke.json"; -import prisonSchool from "@/data/mappings/prison-school.json"; -import dateALive from "@/data/mappings/date-a-live.json"; -import aoHaruRide from "@/data/mappings/ao-haru-ride.json"; -import tonikawa from "@/data/mappings/tonikawa.json"; -import violetEvergarden from "@/data/mappings/violet-evergarden.json"; -import devilmanCrybaby from "@/data/mappings/devilman-crybaby.json"; -import kOn from "@/data/mappings/k-on.json"; -import domesticGirlfriend from "@/data/mappings/domestic-girlfriend.json"; -import shikimorisNotJustACutie from "@/data/mappings/shikimoris-not-just-a-cutie.json"; -import heavenlyDelusion from "@/data/mappings/heavenly-delusion.json"; -import caseStudyOfVanitas from "@/data/mappings/case-study-of-vanitas.json"; -import shimoneta from "@/data/mappings/shimoneta.json"; -import howNotToSummonADemonLord from "@/data/mappings/how-not-to-summon-a-demon-lord.json"; -import haruhiSuzumiya from "@/data/mappings/haruhi-suzumiya.json"; -import welcomeToTheNhk from "@/data/mappings/welcome-to-the-nhk.json"; -import worldsFinestAssassin from "@/data/mappings/worlds-finest-assassin.json"; -import myLoveStoryWithYamadaKun from "@/data/mappings/my-love-story-with-yamada-kun.json"; -import akashicRecords from "@/data/mappings/akashic-records.json"; -import cautiousHero from "@/data/mappings/cautious-hero.json"; -import trinitySeven from "@/data/mappings/trinity-seven.json"; -import blackBullet from "@/data/mappings/black-bullet.json"; -import tsuredureChildren from "@/data/mappings/tsuredure-children.json"; -import gate from "@/data/mappings/gate.json"; -import fragrantFlower from "@/data/mappings/fragrant-flower.json"; -import alyaSometimesHides from "@/data/mappings/alya-sometimes-hides.json"; -import dailyLivesOfHighSchoolBoys from "@/data/mappings/daily-lives-of-high-school-boys.json"; -import kokoroConnect from "@/data/mappings/kokoro-connect.json"; -import imSakamoto from "@/data/mappings/im-sakamoto.json"; -import baccano from "@/data/mappings/baccano.json"; -import yamadaAndTheSevenWitches from "@/data/mappings/yamada-and-the-seven-witches.json"; -import higehiro from "@/data/mappings/higehiro.json"; -import eromangaSensei from "@/data/mappings/eromanga-sensei.json"; -import windBreaker from "@/data/mappings/wind-breaker.json"; -import blendS from "@/data/mappings/blend-s.json"; -import scumsWish from "@/data/mappings/scums-wish.json"; -import wiseMansGrandchild from "@/data/mappings/wise-mans-grandchild.json"; -import grimgar from "@/data/mappings/grimgar.json"; -import snowWhiteWithTheRedHair from "@/data/mappings/snow-white-with-the-red-hair.json"; -import bofuri from "@/data/mappings/bofuri.json"; -import shangriLaFrontier from "@/data/mappings/shangri-la-frontier.json"; -import saekano from "@/data/mappings/saekano.json"; -import greatTeacherOnizuka from "@/data/mappings/great-teacher-onizuka.json"; -import gamers from "@/data/mappings/gamers.json"; -import darwinsGame from "@/data/mappings/darwins-game.json"; -import umaruChan from "@/data/mappings/umaru-chan.json"; -import tomoChanIsAGirl from "@/data/mappings/tomo-chan-is-a-girl.json"; -import monsterMusume from "@/data/mappings/monster-musume.json"; -import teasingMasterTakagiSan from "@/data/mappings/teasing-master-takagi-san.json"; -import tsukimichi from "@/data/mappings/tsukimichi.json"; -import kamisamaKiss from "@/data/mappings/kamisama-kiss.json"; -import laidBackCamp from "@/data/mappings/laid-back-camp.json"; -import haganai from "@/data/mappings/haganai.json"; -import irumaKun from "@/data/mappings/iruma-kun.json"; -import amagiBrilliantPark from "@/data/mappings/amagi-brilliant-park.json"; -import angelNextDoor from "@/data/mappings/angel-next-door.json"; -import tomodachiGame from "@/data/mappings/tomodachi-game.json"; -import mierukoChan from "@/data/mappings/mieruko-chan.json"; -import testamentOfSisterNewDevil from "@/data/mappings/testament-of-sister-new-devil.json"; -import wayOfTheHousehusband from "@/data/mappings/way-of-the-househusband.json"; -import moreThanAMarriedCouple from "@/data/mappings/more-than-a-married-couple.json"; -import myLoveStory from "@/data/mappings/my-love-story.json"; -import asteriskWar from "@/data/mappings/asterisk-war.json"; -import moriartyThePatriot from "@/data/mappings/moriarty-the-patriot.json"; -import familiarOfZero from "@/data/mappings/familiar-of-zero.json"; -import dangersInMyHeart from "@/data/mappings/dangers-in-my-heart.json"; -import sayILoveYou from "@/data/mappings/say-i-love-you.json"; -import smartphone from "@/data/mappings/smartphone.json"; -import barakamon from "@/data/mappings/barakamon.json"; -import watamote from "@/data/mappings/watamote.json"; -import soImASpider from "@/data/mappings/so-im-a-spider.json"; -import gleipnir from "@/data/mappings/gleipnir.json"; -import wanderingWitch from "@/data/mappings/wandering-witch.json"; -import hinamatsuri from "@/data/mappings/hinamatsuri.json"; -import uzakiChan from "@/data/mappings/uzaki-chan.json"; -import asobiAsobase from "@/data/mappings/asobi-asobase.json"; -import redoOfHealer from "@/data/mappings/redo-of-healer.json"; -import oreimo from "@/data/mappings/oreimo.json"; -import villainess from "@/data/mappings/villainess.json"; -import myFirstGirlfriendIsAGal from "@/data/mappings/my-first-girlfriend-is-a-gal.json"; -import cheatSkill from "@/data/mappings/cheat-skill.json"; -import luckyStar from "@/data/mappings/lucky-star.json"; -import citrus from "@/data/mappings/citrus.json"; -import netoge from "@/data/mappings/netoge.json"; -import tomozaki from "@/data/mappings/tomozaki.json"; -import blueBox from "@/data/mappings/blue-box.json"; -import toLoveRu from "@/data/mappings/to-love-ru.json"; -import bloodLad from "@/data/mappings/blood-lad.json"; -import myHappyMarriage from "@/data/mappings/my-happy-marriage.json"; -import plunderer from "@/data/mappings/plunderer.json"; -import oresuki from "@/data/mappings/oresuki.json"; -import phantomWorld from "@/data/mappings/phantom-world.json"; -import killingSlimes300Years from "@/data/mappings/killing-slimes-300-years.json"; -import bloomIntoYou from "@/data/mappings/bloom-into-you.json"; -import realistHero from "@/data/mappings/realist-hero.json"; -import gangsta from "@/data/mappings/gangsta.json"; -import seireiGensouki from "@/data/mappings/seirei-gensouki.json"; -import girlsLastTour from "@/data/mappings/girls-last-tour.json"; -import mmoJunkie from "@/data/mappings/mmo-junkie.json"; -import signOfAffection from "@/data/mappings/sign-of-affection.json"; -import deathMarch from "@/data/mappings/death-march.json"; -import highRiseInvasion from "@/data/mappings/high-rise-invasion.json"; -import katanagatari from "@/data/mappings/katanagatari.json"; -import worldGodOnlyKnows from "@/data/mappings/world-god-only-knows.json"; -import recordOfRagnarok from "@/data/mappings/record-of-ragnarok.json"; -import gunGaleOnlineAlternative from "@/data/mappings/gun-gale-online-alternative.json"; -import aCertainScientificRailgun from "@/data/mappings/a-certain-scientific-railgun.json"; -import sentencedToBeAHero from "@/data/mappings/sentenced-to-be-a-hero.json"; -import theFruitOfGrisaia from "@/data/mappings/the-fruit-of-grisaia.json"; -import hellsing2001 from "@/data/mappings/hellsing-2001.json"; -import theSummerHikaruDied from "@/data/mappings/the-summer-hikaru-died.json"; -import takopisOriginalSin from "@/data/mappings/takopis-original-sin.json"; -import lovelyComplex from "@/data/mappings/lovely-complex.json"; -import rokkaBravesOfTheSixFlowers from "@/data/mappings/rokka-braves-of-the-six-flowers.json"; -import sankarea from "@/data/mappings/sankarea.json"; -import accelWorld from "@/data/mappings/accel-world.json"; -import infiniteStratos from "@/data/mappings/infinite-stratos.json"; -import fateApocrypha from "@/data/mappings/fate-apocrypha.json"; -import oreshura from "@/data/mappings/oreshura.json"; -import uncleFromAnotherWorld from "@/data/mappings/uncle-from-another-world.json"; -import girlfriendGirlfriend from "@/data/mappings/girlfriend-girlfriend.json"; -import weNeverLearn from "@/data/mappings/we-never-learn.json"; -import gabrielDropout from "@/data/mappings/gabriel-dropout.json"; -import platinumEnd from "@/data/mappings/platinum-end.json"; -import strikeTheBlood from "@/data/mappings/strike-the-blood.json"; -import natsumeYuujinchou from "@/data/mappings/natsume-yuujinchou.json"; -import makeineTooManyLosingHeroines from "@/data/mappings/makeine-too-many-losing-heroines.json"; -import theDetectiveIsAlreadyDead from "@/data/mappings/the-detective-is-already-dead.json"; -import ahoGirl from "@/data/mappings/aho-girl.json"; -import hiddenDungeon from "@/data/mappings/hidden-dungeon.json"; -import hundredGirlfriends from "@/data/mappings/100-girlfriends.json"; -import kemonoJihen from "@/data/mappings/kemono-jihen.json"; -import aharenSanWaHakarenai from "@/data/mappings/aharen-san-wa-hakarenai.json"; -import tanakaKunIsAlwaysListless from "@/data/mappings/tanaka-kun-is-always-listless.json"; -import howHeavyDumbbells from "@/data/mappings/how-heavy-dumbbells.json"; -import rosarioVampire from "@/data/mappings/rosario-vampire.json"; -import schoolLive from "@/data/mappings/school-live.json"; -import pingPongTheAnimation from "@/data/mappings/ping-pong-the-animation.json"; -import gosick from "@/data/mappings/gosick.json"; -import twinStarExorcists from "@/data/mappings/twin-star-exorcists.json"; -import banishedFromTheHerosParty from "@/data/mappings/banished-from-the-heros-party.json"; -import wrongWayToUseHealingMagic from "@/data/mappings/wrong-way-to-use-healing-magic.json"; -import problemChildren from "@/data/mappings/problem-children.json"; -import combatantsWillBeDispatched from "@/data/mappings/combatants-will-be-dispatched.json"; -import bakuman from "@/data/mappings/bakuman.json"; -import konosubaExplosion from "@/data/mappings/konosuba-explosion.json"; -import talentlessNana from "@/data/mappings/talentless-nana.json"; -import newGame from "@/data/mappings/new-game.json"; -import absoluteDuo from "@/data/mappings/absolute-duo.json"; -import scienceFellInLove from "@/data/mappings/science-fell-in-love.json"; -import trappedInADatingSim from "@/data/mappings/trapped-in-a-dating-sim.json"; -import nonNonBiyori from "@/data/mappings/non-non-biyori.json"; -import magiAdventureOfSinbad from "@/data/mappings/magi-adventure-of-sinbad.json"; -import bakaAndTest from "@/data/mappings/baka-and-test.json"; -import dagashiKashi from "@/data/mappings/dagashi-kashi.json"; -import worldendSukasuka from "@/data/mappings/worldend-sukasuka.json"; -import ascendanceOfABookworm from "@/data/mappings/ascendance-of-a-bookworm.json"; -import keepYourHandsOffEizouken from "@/data/mappings/keep-your-hands-off-eizouken.json"; -import campfireCookingInAnotherWorld from "@/data/mappings/campfire-cooking-in-another-world.json"; -import daemonsOfTheShadowRealm from "@/data/mappings/daemons-of-the-shadow-realm.json"; -import initialD from "@/data/mappings/initial-d.json"; -import isThisAZombie from "@/data/mappings/is-this-a-zombie.json"; -import blastOfTempest from "@/data/mappings/blast-of-tempest.json"; -import loveAndLies from "@/data/mappings/love-and-lies.json"; -import boardingSchoolJuliet from "@/data/mappings/boarding-school-juliet.json"; -import skeletonKnightInAnotherWorld from "@/data/mappings/skeleton-knight-in-another-world.json"; -import mySenpaiIsAnnoying from "@/data/mappings/my-senpai-is-annoying.json"; -import reincarnatedAsASword from "@/data/mappings/reincarnated-as-a-sword.json"; -import aCoupleOfCuckoos from "@/data/mappings/a-couple-of-cuckoos.json"; -import remakeOurLife from "@/data/mappings/remake-our-life.json"; -import chainedSoldier from "@/data/mappings/chained-soldier.json"; -import assassinsPride from "@/data/mappings/assassins-pride.json"; -import greatestDemonLordRebornTypicalNobody from "@/data/mappings/greatest-demon-lord-reborn-typical-nobody.json"; -import oMaidensInYourSavageSeason from "@/data/mappings/o-maidens-in-your-savage-season.json"; -import ourLastCrusade from "@/data/mappings/our-last-crusade.json"; -import ragnaCrimson from "@/data/mappings/ragna-crimson.json"; -import seitokaiYakuindomo from "@/data/mappings/seitokai-yakuindomo.json"; -import whyTheHellAreYouHereTeacher from "@/data/mappings/why-the-hell-are-you-here-teacher.json"; -import maoyu from "@/data/mappings/maoyu.json"; -import azumangaDaioh from "@/data/mappings/azumanga-daioh.json"; -import senkoSan from "@/data/mappings/senko-san.json"; -import interspeciesReviewers from "@/data/mappings/interspecies-reviewers.json"; -import keijo from "@/data/mappings/keijo.json"; -import vermeilInGold from "@/data/mappings/vermeil-in-gold.json"; -import geniusPrincesGuideRaisingNationDebt from "@/data/mappings/genius-princes-guide-raising-nation-debt.json"; -import imQuittingHeroing from "@/data/mappings/im-quitting-heroing.json"; -import farmingLifeInAnotherWorld from "@/data/mappings/farming-life-in-another-world.json"; -import insomniacsAfterSchool from "@/data/mappings/insomniacs-after-school.json"; -import kakushigoto from "@/data/mappings/kakushigoto.json"; -import youAndIArePolarOpposites from "@/data/mappings/you-and-i-are-polar-opposites.json"; -import farawayPaladin from "@/data/mappings/faraway-paladin.json"; -import myStepmomsDaughterIsMyEx from "@/data/mappings/my-stepmoms-daughter-is-my-ex.json"; -import whenSupernaturalBattlesBecameCommonplace from "@/data/mappings/when-supernatural-battles-became-commonplace.json"; -import myDeerFriendNokotan from "@/data/mappings/my-deer-friend-nokotan.json"; -import kissXSis from "@/data/mappings/kiss-x-sis.json"; -import romanticKiller from "@/data/mappings/romantic-killer.json"; -import kissHimNotMe from "@/data/mappings/kiss-him-not-me.json"; -import sailorMoon from "@/data/mappings/sailor-moon.json"; -import astraLostInSpace from "@/data/mappings/astra-lost-in-space.json"; -import konoOtoTomare from "@/data/mappings/kono-oto-tomare.json"; -import interviewsWithMonsterGirls from "@/data/mappings/interviews-with-monster-girls.json"; -import aSistersAllYouNeed from "@/data/mappings/a-sisters-all-you-need.json"; -import yosugaNoSora from "@/data/mappings/yosuga-no-sora.json"; -import schoolBabysitters from "@/data/mappings/school-babysitters.json"; -import pluto from "@/data/mappings/pluto.json"; -import ghostInTheShell from "@/data/mappings/ghost-in-the-shell.json"; -import mapping7thPrince from "@/data/mappings/7th-prince.json"; -import mapping7thTimeLoop from "@/data/mappings/7th-time-loop.json"; -import mapping8thSonAreYouKiddingMe from "@/data/mappings/8th-son-are-you-kidding-me.json"; -import mappingALullInTheSea from "@/data/mappings/a-lull-in-the-sea.json"; -import mappingAPlaceFurtherThanTheUniverse from "@/data/mappings/a-place-further-than-the-universe.json"; -import mappingAdachiAndShimamura from "@/data/mappings/adachi-and-shimamura.json"; -import mappingAestheticaOfARogueHero from "@/data/mappings/aesthetica-of-a-rogue-hero.json"; -import mappingAfroSamurai from "@/data/mappings/afro-samurai.json"; -import mappingAfterTheRain from "@/data/mappings/after-the-rain.json"; -import mappingAkudamaDrive from "@/data/mappings/akudama-drive.json"; -import mappingAlderaminOnTheSky from "@/data/mappings/alderamin-on-the-sky.json"; -import mappingAldnoahZero from "@/data/mappings/aldnoah-zero.json"; -import mappingAmIActuallyTheStrongest from "@/data/mappings/am-i-actually-the-strongest.json"; -import mappingAnArchdemonsDilemma from "@/data/mappings/an-archdemons-dilemma.json"; -import mappingAnohana from "@/data/mappings/anohana.json"; -import mappingAoChanCantStudy from "@/data/mappings/ao-chan-cant-study.json"; -import mappingAoashi from "@/data/mappings/aoashi.json"; -import mappingArmedGirlsMachiavellism from "@/data/mappings/armed-girls-machiavellism.json"; -import mappingBeckMongolianChopSquad from "@/data/mappings/beck-mongolian-chop-squad.json"; -import mappingBerserkOfGluttony from "@/data/mappings/berserk-of-gluttony.json"; -import mappingBlackSummoner from "@/data/mappings/black-summoner.json"; -import mappingBladeDanceOfTheElementalers from "@/data/mappings/blade-dance-of-the-elementalers.json"; -import mappingBloodC from "@/data/mappings/blood-c.json"; -import mappingBna from "@/data/mappings/bna.json"; -import mappingBubble from "@/data/mappings/bubble.json"; -import mappingBunnyDrop from "@/data/mappings/bunny-drop.json"; -import mappingBurnTheWitch from "@/data/mappings/burn-the-witch.json"; -import mappingByTheGraceOfTheGods from "@/data/mappings/by-the-grace-of-the-gods.json"; -import mappingCampione from "@/data/mappings/campione.json"; -import mappingCaroleTuesday from "@/data/mappings/carole-tuesday.json"; -import mappingChaikaTheCoffinPrincess from "@/data/mappings/chaika-the-coffin-princess.json"; -import mappingCharlotte from "@/data/mappings/charlotte.json"; -import mappingChillinInAnotherWorld from "@/data/mappings/chillin-in-another-world.json"; -import mappingChobits from "@/data/mappings/chobits.json"; -import mappingClevatess from "@/data/mappings/clevatess.json"; -import mappingDFrag from "@/data/mappings/d-frag.json"; -import mappingDanganronpaTheAnimation from "@/data/mappings/danganronpa-the-animation.json"; -import mappingDarlingInTheFranxx from "@/data/mappings/darling-in-the-franxx.json"; -import mappingDaysWithMyStepsister from "@/data/mappings/days-with-my-stepsister.json"; -import mappingDeadMountDeathPlay from "@/data/mappings/dead-mount-death-play.json"; -import mappingDemonKingDaimao from "@/data/mappings/demon-king-daimao.json"; -import mappingDemonLordRetry from "@/data/mappings/demon-lord-retry.json"; -import mappingDetectiveConan from "@/data/mappings/detective-conan.json"; -import mappingDevilsLine from "@/data/mappings/devils-line.json"; -import mappingDoYouLoveYourMomAndHerTwoHitMultiTargetAttacks from "@/data/mappings/do-you-love-your-mom-and-her-two-hit-multi-target-attacks.json"; -import mappingDukeOfDeathAndHisMaid from "@/data/mappings/duke-of-death-and-his-maid.json"; -import mappingDuskMaidenOfAmnesia from "@/data/mappings/dusk-maiden-of-amnesia.json"; -import mappingEdensZero from "@/data/mappings/edens-zero.json"; -import mappingEngagedToTheUnidentified from "@/data/mappings/engaged-to-the-unidentified.json"; -import mappingFailureFrame from "@/data/mappings/failure-frame.json"; -import mappingFateStrangeFake from "@/data/mappings/fate-strange-fake.json"; -import mappingFlyingWitch from "@/data/mappings/flying-witch.json"; -import mappingFromOldCountryBumpkinToMasterSwordsman from "@/data/mappings/from-old-country-bumpkin-to-master-swordsman.json"; -import mappingFullDive from "@/data/mappings/full-dive.json"; -import mappingFullMetalPanic from "@/data/mappings/full-metal-panic.json"; -import mappingGargantiaOnTheVerdurousPlanet from "@/data/mappings/gargantia-on-the-verdurous-planet.json"; -import mappingGirlsUndPanzer from "@/data/mappings/girls-und-panzer.json"; -import mappingGoGoLoserRanger from "@/data/mappings/go-go-loser-ranger.json"; -import mappingGoldenBoy from "@/data/mappings/golden-boy.json"; -import mappingGuiltyCrown from "@/data/mappings/guilty-crown.json"; -import mappingGurrenLagann from "@/data/mappings/gurren-lagann.json"; -import mappingGushingOverMagicalGirls from "@/data/mappings/gushing-over-magical-girls.json"; -import mappingHanasakuIroha from "@/data/mappings/hanasaku-iroha.json"; -import mappingHappySugarLife from "@/data/mappings/happy-sugar-life.json"; -import mappingHaremInTheLabyrinthOfAnotherWorld from "@/data/mappings/harem-in-the-labyrinth-of-another-world.json"; -import mappingHeavensLostProperty from "@/data/mappings/heavens-lost-property.json"; -import mappingHensuki from "@/data/mappings/hensuki.json"; -import mappingHentaiPrinceAndTheStonyCat from "@/data/mappings/hentai-prince-and-the-stony-cat.json"; -import mappingHighSchoolProdigiesHaveItEasyEvenInAnotherWorld from "@/data/mappings/high-school-prodigies-have-it-easy-even-in-another-world.json"; -import mappingHokkaidoGalsAreSuperAdorable from "@/data/mappings/hokkaido-gals-are-super-adorable.json"; -import mappingHundred from "@/data/mappings/hundred.json"; -import mappingICantUnderstandWhatMyHusbandIsSaying from "@/data/mappings/i-cant-understand-what-my-husband-is-saying.json"; -import mappingIParryEverything from "@/data/mappings/i-parry-everything.json"; -import mappingIcebladeSorcerer from "@/data/mappings/iceblade-sorcerer.json"; -import mappingImStandingOnAMillionLives from "@/data/mappings/im-standing-on-a-million-lives.json"; -import mappingInuXBokuSecretService from "@/data/mappings/inu-x-boku-secret-service.json"; -import mappingIsekaiCheatMagician from "@/data/mappings/isekai-cheat-magician.json"; -import mappingJormungand from "@/data/mappings/jormungand.json"; -import mappingK from "@/data/mappings/k.json"; -import mappingKabaneriOfTheIronFortress from "@/data/mappings/kabaneri-of-the-iron-fortress.json"; -import mappingKaijiUltimateSurvivor from "@/data/mappings/kaiji-ultimate-survivor.json"; -import mappingKamikatsu from "@/data/mappings/kamikatsu.json"; -import mappingKawaiComplex from "@/data/mappings/kawai-complex.json"; -import mappingKazeNoStigma from "@/data/mappings/kaze-no-stigma.json"; -import mappingKidsOnTheSlope from "@/data/mappings/kids-on-the-slope.json"; -import mappingKillLaKill from "@/data/mappings/kill-la-kill.json"; -import mappingKiznaiver from "@/data/mappings/kiznaiver.json"; -import mappingKotouraSan from "@/data/mappings/kotoura-san.json"; -import mappingKuboWontLetMeBeInvisible from "@/data/mappings/kubo-wont-let-me-be-invisible.json"; -import mappingLifeLessonsWithUramichiOniisan from "@/data/mappings/life-lessons-with-uramichi-oniisan.json"; -import mappingLordMarksmanAndVanadis from "@/data/mappings/lord-marksman-and-vanadis.json"; -import mappingLoveAfterWorldDomination from "@/data/mappings/love-after-world-domination.json"; -import mappingLoveTyrant from "@/data/mappings/love-tyrant.json"; -import mappingLycorisRecoil from "@/data/mappings/lycoris-recoil.json"; -import mappingMagicalSempai from "@/data/mappings/magical-sempai.json"; -import mappingMarriagetoxin from "@/data/mappings/marriagetoxin.json"; -import mappingMayoChiki from "@/data/mappings/mayo-chiki.json"; -import mappingMyGirlfriendIsShobitch from "@/data/mappings/my-girlfriend-is-shobitch.json"; -import mappingMyIsekaiLife from "@/data/mappings/my-isekai-life.json"; -import mappingMyMentalChoices from "@/data/mappings/my-mental-choices.json"; -import mappingMyStatusAsAnAssassin from "@/data/mappings/my-status-as-an-assassin.json"; -import mappingMysteriousGirlfriendX from "@/data/mappings/mysterious-girlfriend-x.json"; -import mappingNanbaka from "@/data/mappings/nanbaka.json"; -import mappingNoLongerAllowedInAnotherWorld from "@/data/mappings/no-longer-allowed-in-another-world.json"; -import mappingNoblesse from "@/data/mappings/noblesse.json"; -import mappingNyaruko from "@/data/mappings/nyaruko.json"; -import mappingOddtaxi from "@/data/mappings/oddtaxi.json"; -import mappingOsamake from "@/data/mappings/osamake.json"; -import mappingOssanNewbieAdventurer from "@/data/mappings/ossan-newbie-adventurer.json"; -import mappingOurDatingStory from "@/data/mappings/our-dating-story.json"; -import mappingOutbreakCompany from "@/data/mappings/outbreak-company.json"; -import mappingParallelWorldPharmacy from "@/data/mappings/parallel-world-pharmacy.json"; -import mappingPenguindrum from "@/data/mappings/penguindrum.json"; -import mappingPlasticMemories from "@/data/mappings/plastic-memories.json"; -import mappingPseudoHarem from "@/data/mappings/pseudo-harem.json"; -import mappingRainbow from "@/data/mappings/rainbow.json"; -import mappingReCreators from "@/data/mappings/re-creators.json"; -import mappingRealGirl from "@/data/mappings/real-girl.json"; -import mappingRecordOfGrancrestWar from "@/data/mappings/record-of-grancrest-war.json"; -import mappingReincarnationOfTheStrongestExorcist from "@/data/mappings/reincarnation-of-the-strongest-exorcist.json"; -import mappingRestaurantToAnotherWorld from "@/data/mappings/restaurant-to-another-world.json"; -import mappingSabikuiBisco from "@/data/mappings/sabikui-bisco.json"; -import mappingSaintsMagicPowerIsOmnipotent from "@/data/mappings/saints-magic-power-is-omnipotent.json"; -import mappingSasakiAndMiyano from "@/data/mappings/sasaki-and-miyano.json"; -import mappingSayonaraZetsubouSensei from "@/data/mappings/sayonara-zetsubou-sensei.json"; -import mappingSecondPrettiestGirlInMyClass from "@/data/mappings/second-prettiest-girl-in-my-class.json"; -import mappingSecretsOfTheSilentWitch from "@/data/mappings/secrets-of-the-silent-witch.json"; -import mappingShadowsHouse from "@/data/mappings/shadows-house.json"; -import mappingShakuganNoShana from "@/data/mappings/shakugan-no-shana.json"; -import mappingShowaGenrokuRakugoShinju from "@/data/mappings/showa-genroku-rakugo-shinju.json"; -import mappingSingYesterdayForMe from "@/data/mappings/sing-yesterday-for-me.json"; -import mappingSleepyPrincessInTheDemonCastle from "@/data/mappings/sleepy-princess-in-the-demon-castle.json"; -import mappingSmokingBehindTheSupermarketWithYou from "@/data/mappings/smoking-behind-the-supermarket-with-you.json"; -import mappingSoICantPlayH from "@/data/mappings/so-i-cant-play-h.json"; -import mappingSomaliAndTheForestSpirit from "@/data/mappings/somali-and-the-forest-spirit.json"; -import mappingSpaceDandy from "@/data/mappings/space-dandy.json"; -import mappingSsssGridman from "@/data/mappings/ssss-gridman.json"; -import mappingSupposeAKidFromTheLastDungeonBooniesMovedToAStarterTown from "@/data/mappings/suppose-a-kid-from-the-last-dungeon-boonies-moved-to-a-starter-town.json"; -import mappingSweetnessAndLightning from "@/data/mappings/sweetness-and-lightning.json"; -import mappingTaktOpDestiny from "@/data/mappings/takt-op-destiny.json"; -import mappingTamakoMarket from "@/data/mappings/tamako-market.json"; -import mappingTheAristocratsOtherworldlyAdventure from "@/data/mappings/the-aristocrats-otherworldly-adventure.json"; -import mappingTheDayIBecameAGod from "@/data/mappings/the-day-i-became-a-god.json"; -import mappingTheDreamingBoyIsARealist from "@/data/mappings/the-dreaming-boy-is-a-realist.json"; -import mappingTheElusiveSamurai from "@/data/mappings/the-elusive-samurai.json"; -import mappingTheGirlILikeForgotHerGlasses from "@/data/mappings/the-girl-i-like-forgot-her-glasses.json"; -import mappingTheGreatJahyWillNotBeDefeated from "@/data/mappings/the-great-jahy-will-not-be-defeated.json"; -import mappingTheIceGuyAndHisCoolFemaleColleague from "@/data/mappings/the-ice-guy-and-his-cool-female-colleague.json"; -import mappingTheKingdomsOfRuin from "@/data/mappings/the-kingdoms-of-ruin.json"; -import mappingTheMagicalRevolutionOfTheReincarnatedPrincessAndTheGeniusYoungLady from "@/data/mappings/the-magical-revolution-of-the-reincarnated-princess-and-the-genius-young-lady.json"; -import mappingTheStrongestSageWithTheWeakestCrest from "@/data/mappings/the-strongest-sage-with-the-weakest-crest.json"; -import mappingTheWaterMagician from "@/data/mappings/the-water-magician.json"; -import mappingThisArtClubHasAProblem from "@/data/mappings/this-art-club-has-a-problem.json"; -import mappingTokyoRavens from "@/data/mappings/tokyo-ravens.json"; -import mappingUndefeatedBahamutChronicle from "@/data/mappings/undefeated-bahamut-chronicle.json"; -import mappingUnwantedUndeadAdventurer from "@/data/mappings/unwanted-undead-adventurer.json"; -import mappingUzumaki from "@/data/mappings/uzumaki.json"; -import mappingVampireKnight from "@/data/mappings/vampire-knight.json"; -import mappingVillainessLevel99 from "@/data/mappings/villainess-level-99.json"; -import mappingVivyFluoriteEyesSong from "@/data/mappings/vivy-fluorite-eyes-song.json"; -import mappingWagnaria from "@/data/mappings/wagnaria.json"; -import mappingWaitingInTheSummer from "@/data/mappings/waiting-in-the-summer.json"; -import mappingWelcomeToTheBallroom from "@/data/mappings/welcome-to-the-ballroom.json"; -import mappingWitchCraftWorks from "@/data/mappings/witch-craft-works.json"; -import mappingWitchWatch from "@/data/mappings/witch-watch.json"; -import mappingWolfGirlAndBlackPrince from "@/data/mappings/wolf-girl-and-black-prince.json"; -import mappingWorldsEndHarem from "@/data/mappings/worlds-end-harem.json"; -import mappingYakuzasGuideToBabysitting from "@/data/mappings/yakuzas-guide-to-babysitting.json"; -import mappingYuruYuri from "@/data/mappings/yuru-yuri.json"; -import mappingYuunaAndTheHauntedHotSprings from "@/data/mappings/yuuna-and-the-haunted-hot-springs.json"; -import mappingZombieLandSaga from "@/data/mappings/zombie-land-saga.json"; -import mappingBeastTamer from "@/data/mappings/beast-tamer.json"; -import mappingSekirei from "@/data/mappings/sekirei.json"; -import mappingArakawaUnderTheBridge from "@/data/mappings/arakawa-under-the-bridge.json"; -import mappingBrynhildrInTheDarkness from "@/data/mappings/brynhildr-in-the-darkness.json"; -import mappingMagicalGirlSite from "@/data/mappings/magical-girl-site.json"; -import mappingTheHeroicLegendOfArslan from "@/data/mappings/the-heroic-legend-of-arslan.json"; -// JSON imports lose tuple types — `[1, 100]` becomes `number[]` instead of -// `[number, number]`. `normalizeMapping` rebuilds tuples literally. -type RawEntry = { - episodes?: number[]; - chapters: number[]; - arc?: string; - season?: number; - note?: string; -}; -type RawMovie = { - anilistId?: number; - title: string; - year: number; - chapters?: number[]; - afterEpisode?: number; - note?: string; -}; -type RawMapping = { - anilistAnimeId: number; - anilistMangaId: number; - title: string; - sourceNotes?: string; - mappings: RawEntry[]; - movies?: RawMovie[]; -}; - -function normalizeEntry(e: RawEntry): MappingEntry { - if (e.chapters.length !== 2) { - throw new Error( - `mapping entry chapters must be a 2-tuple: ${JSON.stringify(e)}`, - ); - } - if (e.episodes && e.episodes.length !== 2) { - throw new Error( - `mapping entry episodes must be a 2-tuple: ${JSON.stringify(e)}`, - ); - } - return { - chapters: [e.chapters[0], e.chapters[1]], - episodes: e.episodes ? [e.episodes[0], e.episodes[1]] : undefined, - arc: e.arc, - season: e.season, - note: e.note, - }; -} - -function normalizeMovie(m: RawMovie): MovieEntry { - if (m.chapters && m.chapters.length !== 2) { - throw new Error( - `movie entry chapters must be a 2-tuple: ${JSON.stringify(m)}`, - ); - } - return { - anilistId: m.anilistId, - title: m.title, - year: m.year, - chapters: m.chapters ? [m.chapters[0], m.chapters[1]] : undefined, - afterEpisode: m.afterEpisode, - note: m.note, - }; -} - -function normalizeMapping(m: RawMapping): SeriesMapping { - return { - anilistAnimeId: m.anilistAnimeId, - anilistMangaId: m.anilistMangaId, - title: m.title, - sourceNotes: m.sourceNotes, - mappings: m.mappings.map(normalizeEntry), - movies: m.movies?.map(normalizeMovie) ?? undefined, - }; -} - -const ALL_MAPPINGS: SeriesMapping[] = [ - onePiece, - attackOnTitan, - demonSlayer, - onePunchMan, - vinlandSaga, - fullmetalAlchemistBrotherhood, - hunterXHunter2011, - monster, - jujutsuKaisen, - bleachTybw, - mobPsycho100, - frieren, - apothecaryDiaries, - nana, - haikyuu, - fruitsBasket2019, - berserk, - dragonBall, - dragonBallZ, - dragonBallSuper, - wistoriaWandAndSword, - drStone, - baki, - bakiHanma, - assassinationClassroom, - gintama, - kaguyaSama, - marchComesInLikeALion, - kingdom, - ashitaNoJoe, - hajimeNoIppo, - ikokuNikki, - witchHatAtelier, - bocchiTheRock, - orb, - mushishi, - myHeroAcademia, - oshiNoKo, - chainsawMan, - spyXFamily, - promisedNeverland, - dandadan, - tokyoRevengers, - madeInAbyss, - naruto, - blackClover, - fireForce, - soulEater, - noragami, - mashle, - sakamotoDays, - kaijuNo8, - beastars, - goldenKamuy, - bleach, - yuYuHakusho, - rurouniKenshin, - inuyasha, - fairyTail, - sevenDeadlySins, - dgrayMan, - magi, - akameGaKill, - yonaOfTheDawn, - jojoStardustCrusaders, - tokyoGhoul, - bungoStrayDogs, - hellsingUltimate, - blackButler, - trigun, - parasyte, - goblinSlayer, - deathNote, - codeGeass, - steinsGate, - psychoPass, - neonGenesisEvangelion, - cowboyBebop, - samuraiChamploo, - eightySix, - madokaMagica, - reZero, - mushokuTensei, - overlord, - tensura, - shieldHero, - konosuba, - noGameNoLife, - logHorizon, - tanyaTheEvil, - eminenceInShadow, - soloLeveling, - swordArtOnline, - fateZero, - fateStayNight, - bakemonogatari, - durarara, - toaruMajutsuNoIndex, - spiceAndWolf, - quintessentialQuintuplets, - slamDunk, - cardcaptorSakura, - yugiohDuelMonsters, - digimonAdventure, - blueLock, - kurokosBasketball, - aceOfDiamond, - yowamushiPedal, - chihayafuru, - blueExorcist, - worldTrigger, - shamanKing2021, - katekyoHitmanReborn, - toriko, - hellsParadise, - undeadUnluck, - beelzebub, - nuraRiseOfTheYokaiClan, - toiletBoundHanakoKun, - fistOfTheNorthStar, - saintSeiya, - dororo, - claymore, - blackLagoon, - dorohedoro, - gantz, - ajin, - deadmanWonderland, - btooom, - bananaFish, - drifters, - terraFormars, - knightsOfSidonia, - inuyashiki, - horimiya, - komiCantCommunicate, - myDressUpDarling, - nisekoi, - ouranHighSchoolHostClub, - yourLieInApril, - erased, - skipAndLoafer, - bluePeriod, - given, - foodWars, - grandBlue, - devilIsAPartTimer, - yaBoyKongming, - cellsAtWork, - ancientMagusBride, - landOfTheLustrous, - rankingOfKings, - toYourEternity, - callOfTheNight, - chivalryOfAFailedKnight, - masamuneKunRevenge, - nichijou, - gachiakuta, - zom100, - chunibyo, - towerOfGod, - dragonMaid, - seraphOfTheEnd, - wotakoi, - highSchoolDxd, - rentAGirlfriend, - godOfHighSchool, - clannad, - maidSama, - highschoolOfTheDead, - beyondTheBoundary, - petGirlOfSakurasou, - elfenLied, - nagatoro, - bunnyGirlSenpai, - toradora, - kakegurui, - classroomOfTheElite, - futureDiary, - danmachi, - another, - oregairu, - saikiK, - hyouka, - misfitOfDemonKingAcademy, - goldenTime, - myLittleMonster, - irregularAtMagicHighSchool, - relife, - orange, - bloodBlockadeBattlefront, - arifureta, - nozakiKun, - deliciousInDungeon, - summerTimeRendering, - kimiNiTodoke, - prisonSchool, - dateALive, - aoHaruRide, - tonikawa, - violetEvergarden, - devilmanCrybaby, - kOn, - domesticGirlfriend, - shikimorisNotJustACutie, - heavenlyDelusion, - caseStudyOfVanitas, - shimoneta, - howNotToSummonADemonLord, - haruhiSuzumiya, - welcomeToTheNhk, - worldsFinestAssassin, - myLoveStoryWithYamadaKun, - akashicRecords, - cautiousHero, - trinitySeven, - blackBullet, - tsuredureChildren, - gate, - fragrantFlower, - alyaSometimesHides, - dailyLivesOfHighSchoolBoys, - kokoroConnect, - imSakamoto, - baccano, - yamadaAndTheSevenWitches, - higehiro, - eromangaSensei, - windBreaker, - blendS, - scumsWish, - wiseMansGrandchild, - grimgar, - snowWhiteWithTheRedHair, - bofuri, - shangriLaFrontier, - saekano, - greatTeacherOnizuka, - gamers, - darwinsGame, - umaruChan, - tomoChanIsAGirl, - monsterMusume, - teasingMasterTakagiSan, - tsukimichi, - kamisamaKiss, - laidBackCamp, - haganai, - irumaKun, - amagiBrilliantPark, - angelNextDoor, - tomodachiGame, - mierukoChan, - testamentOfSisterNewDevil, - wayOfTheHousehusband, - moreThanAMarriedCouple, - myLoveStory, - asteriskWar, - moriartyThePatriot, - familiarOfZero, - dangersInMyHeart, - sayILoveYou, - smartphone, - barakamon, - watamote, - soImASpider, - gleipnir, - wanderingWitch, - hinamatsuri, - uzakiChan, - asobiAsobase, - redoOfHealer, - oreimo, - villainess, - myFirstGirlfriendIsAGal, - cheatSkill, - luckyStar, - citrus, - netoge, - tomozaki, - blueBox, - toLoveRu, - bloodLad, - myHappyMarriage, - plunderer, - oresuki, - phantomWorld, - killingSlimes300Years, - bloomIntoYou, - realistHero, - gangsta, - seireiGensouki, - girlsLastTour, - mmoJunkie, - signOfAffection, - deathMarch, - highRiseInvasion, - katanagatari, - worldGodOnlyKnows, - recordOfRagnarok, - gunGaleOnlineAlternative, - aCertainScientificRailgun, - sentencedToBeAHero, - theFruitOfGrisaia, - hellsing2001, - theSummerHikaruDied, - takopisOriginalSin, - lovelyComplex, - rokkaBravesOfTheSixFlowers, - sankarea, - accelWorld, - infiniteStratos, - fateApocrypha, - oreshura, - uncleFromAnotherWorld, - girlfriendGirlfriend, - weNeverLearn, - gabrielDropout, - platinumEnd, - strikeTheBlood, - natsumeYuujinchou, - makeineTooManyLosingHeroines, - theDetectiveIsAlreadyDead, - ahoGirl, - hiddenDungeon, - hundredGirlfriends, - kemonoJihen, - aharenSanWaHakarenai, - tanakaKunIsAlwaysListless, - howHeavyDumbbells, - rosarioVampire, - schoolLive, - pingPongTheAnimation, - gosick, - twinStarExorcists, - banishedFromTheHerosParty, - wrongWayToUseHealingMagic, - problemChildren, - combatantsWillBeDispatched, - bakuman, - konosubaExplosion, - talentlessNana, - newGame, - absoluteDuo, - scienceFellInLove, - trappedInADatingSim, - nonNonBiyori, - magiAdventureOfSinbad, - bakaAndTest, - dagashiKashi, - worldendSukasuka, - ascendanceOfABookworm, - keepYourHandsOffEizouken, - campfireCookingInAnotherWorld, - daemonsOfTheShadowRealm, - initialD, - isThisAZombie, - blastOfTempest, - loveAndLies, - boardingSchoolJuliet, - skeletonKnightInAnotherWorld, - mySenpaiIsAnnoying, - reincarnatedAsASword, - aCoupleOfCuckoos, - remakeOurLife, - chainedSoldier, - assassinsPride, - greatestDemonLordRebornTypicalNobody, - oMaidensInYourSavageSeason, - ourLastCrusade, - ragnaCrimson, - seitokaiYakuindomo, - whyTheHellAreYouHereTeacher, - maoyu, - azumangaDaioh, - senkoSan, - interspeciesReviewers, - keijo, - vermeilInGold, - geniusPrincesGuideRaisingNationDebt, - imQuittingHeroing, - farmingLifeInAnotherWorld, - insomniacsAfterSchool, - kakushigoto, - youAndIArePolarOpposites, - farawayPaladin, - myStepmomsDaughterIsMyEx, - whenSupernaturalBattlesBecameCommonplace, - myDeerFriendNokotan, - kissXSis, - romanticKiller, - kissHimNotMe, - sailorMoon, - astraLostInSpace, - konoOtoTomare, - interviewsWithMonsterGirls, - aSistersAllYouNeed, - yosugaNoSora, - schoolBabysitters, - pluto, - ghostInTheShell, - mapping7thPrince, - mapping7thTimeLoop, - mapping8thSonAreYouKiddingMe, - mappingALullInTheSea, - mappingAPlaceFurtherThanTheUniverse, - mappingAdachiAndShimamura, - mappingAestheticaOfARogueHero, - mappingAfroSamurai, - mappingAfterTheRain, - mappingAkudamaDrive, - mappingAlderaminOnTheSky, - mappingAldnoahZero, - mappingAmIActuallyTheStrongest, - mappingAnArchdemonsDilemma, - mappingAnohana, - mappingAoChanCantStudy, - mappingAoashi, - mappingArmedGirlsMachiavellism, - mappingBeckMongolianChopSquad, - mappingBerserkOfGluttony, - mappingBlackSummoner, - mappingBladeDanceOfTheElementalers, - mappingBloodC, - mappingBna, - mappingBubble, - mappingBunnyDrop, - mappingBurnTheWitch, - mappingByTheGraceOfTheGods, - mappingCampione, - mappingCaroleTuesday, - mappingChaikaTheCoffinPrincess, - mappingCharlotte, - mappingChillinInAnotherWorld, - mappingChobits, - mappingClevatess, - mappingDFrag, - mappingDanganronpaTheAnimation, - mappingDarlingInTheFranxx, - mappingDaysWithMyStepsister, - mappingDeadMountDeathPlay, - mappingDemonKingDaimao, - mappingDemonLordRetry, - mappingDetectiveConan, - mappingDevilsLine, - mappingDoYouLoveYourMomAndHerTwoHitMultiTargetAttacks, - mappingDukeOfDeathAndHisMaid, - mappingDuskMaidenOfAmnesia, - mappingEdensZero, - mappingEngagedToTheUnidentified, - mappingFailureFrame, - mappingFateStrangeFake, - mappingFlyingWitch, - mappingFromOldCountryBumpkinToMasterSwordsman, - mappingFullDive, - mappingFullMetalPanic, - mappingGargantiaOnTheVerdurousPlanet, - mappingGirlsUndPanzer, - mappingGoGoLoserRanger, - mappingGoldenBoy, - mappingGuiltyCrown, - mappingGurrenLagann, - mappingGushingOverMagicalGirls, - mappingHanasakuIroha, - mappingHappySugarLife, - mappingHaremInTheLabyrinthOfAnotherWorld, - mappingHeavensLostProperty, - mappingHensuki, - mappingHentaiPrinceAndTheStonyCat, - mappingHighSchoolProdigiesHaveItEasyEvenInAnotherWorld, - mappingHokkaidoGalsAreSuperAdorable, - mappingHundred, - mappingICantUnderstandWhatMyHusbandIsSaying, - mappingIParryEverything, - mappingIcebladeSorcerer, - mappingImStandingOnAMillionLives, - mappingInuXBokuSecretService, - mappingIsekaiCheatMagician, - mappingJormungand, - mappingK, - mappingKabaneriOfTheIronFortress, - mappingKaijiUltimateSurvivor, - mappingKamikatsu, - mappingKawaiComplex, - mappingKazeNoStigma, - mappingKidsOnTheSlope, - mappingKillLaKill, - mappingKiznaiver, - mappingKotouraSan, - mappingKuboWontLetMeBeInvisible, - mappingLifeLessonsWithUramichiOniisan, - mappingLordMarksmanAndVanadis, - mappingLoveAfterWorldDomination, - mappingLoveTyrant, - mappingLycorisRecoil, - mappingMagicalSempai, - mappingMarriagetoxin, - mappingMayoChiki, - mappingMyGirlfriendIsShobitch, - mappingMyIsekaiLife, - mappingMyMentalChoices, - mappingMyStatusAsAnAssassin, - mappingMysteriousGirlfriendX, - mappingNanbaka, - mappingNoLongerAllowedInAnotherWorld, - mappingNoblesse, - mappingNyaruko, - mappingOddtaxi, - mappingOsamake, - mappingOssanNewbieAdventurer, - mappingOurDatingStory, - mappingOutbreakCompany, - mappingParallelWorldPharmacy, - mappingPenguindrum, - mappingPlasticMemories, - mappingPseudoHarem, - mappingRainbow, - mappingReCreators, - mappingRealGirl, - mappingRecordOfGrancrestWar, - mappingReincarnationOfTheStrongestExorcist, - mappingRestaurantToAnotherWorld, - mappingSabikuiBisco, - mappingSaintsMagicPowerIsOmnipotent, - mappingSasakiAndMiyano, - mappingSayonaraZetsubouSensei, - mappingSecondPrettiestGirlInMyClass, - mappingSecretsOfTheSilentWitch, - mappingShadowsHouse, - mappingShakuganNoShana, - mappingShowaGenrokuRakugoShinju, - mappingSingYesterdayForMe, - mappingSleepyPrincessInTheDemonCastle, - mappingSmokingBehindTheSupermarketWithYou, - mappingSoICantPlayH, - mappingSomaliAndTheForestSpirit, - mappingSpaceDandy, - mappingSsssGridman, - mappingSupposeAKidFromTheLastDungeonBooniesMovedToAStarterTown, - mappingSweetnessAndLightning, - mappingTaktOpDestiny, - mappingTamakoMarket, - mappingTheAristocratsOtherworldlyAdventure, - mappingTheDayIBecameAGod, - mappingTheDreamingBoyIsARealist, - mappingTheElusiveSamurai, - mappingTheGirlILikeForgotHerGlasses, - mappingTheGreatJahyWillNotBeDefeated, - mappingTheIceGuyAndHisCoolFemaleColleague, - mappingTheKingdomsOfRuin, - mappingTheMagicalRevolutionOfTheReincarnatedPrincessAndTheGeniusYoungLady, - mappingTheStrongestSageWithTheWeakestCrest, - mappingTheWaterMagician, - mappingThisArtClubHasAProblem, - mappingTokyoRavens, - mappingUndefeatedBahamutChronicle, - mappingUnwantedUndeadAdventurer, - mappingUzumaki, - mappingVampireKnight, - mappingVillainessLevel99, - mappingVivyFluoriteEyesSong, - mappingWagnaria, - mappingWaitingInTheSummer, - mappingWelcomeToTheBallroom, - mappingWitchCraftWorks, - mappingWitchWatch, - mappingWolfGirlAndBlackPrince, - mappingWorldsEndHarem, - mappingYakuzasGuideToBabysitting, - mappingYuruYuri, - mappingYuunaAndTheHauntedHotSprings, - mappingZombieLandSaga, - mappingBeastTamer, - mappingSekirei, - mappingArakawaUnderTheBridge, - mappingBrynhildrInTheDarkness, - mappingMagicalGirlSite, - mappingTheHeroicLegendOfArslan, -].map(normalizeMapping); - -export function findMappingByMediaId(mediaId: number): SeriesMapping | null { - return ( - ALL_MAPPINGS.find( - (m) => m.anilistAnimeId === mediaId || m.anilistMangaId === mediaId, - ) ?? null - ); -} +// Pure mapping helpers. The curated mappings themselves now live in Supabase +// and are fetched via `@/data/catalog`; these functions operate on whatever +// `SeriesMapping` they are handed (curated or synthetic). export function episodeToChapters( mapping: SeriesMapping, @@ -1267,8 +29,6 @@ export function chapterToEpisodes( return hit?.episodes ?? null; } -export { ALL_MAPPINGS }; - function findRelatedId( edges: RelationEdge[], relationType: "SOURCE" | "ADAPTATION", @@ -1373,7 +133,7 @@ export function buildSyntheticMapping( anilistMangaId: manga.id, title: media.title.english ?? media.title.romaji ?? "Series", sourceNotes: - "Auto-estimated linear mapping — anime episode count distributed evenly across the manga chapter count. Real arc pacing is rarely uniform; submit a curated JSON for accuracy.", + "Auto-estimated linear mapping — anime episode count distributed evenly across the manga chapter count. Real arc pacing is rarely uniform.", mappings: [ { episodes: [1, episodes], diff --git a/src/data/mappings/100-girlfriends.json b/src/data/mappings/100-girlfriends.json deleted file mode 100644 index daab90f..0000000 --- a/src/data/mappings/100-girlfriends.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "anilistAnimeId": 162694, - "anilistMangaId": 114416, - "title": "The 100 Girlfriends Who Really, Really, Really, Really, REALLY Love You", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (12) = 24. Manga ongoing in Weekly Young Jump (approx. ch. 250 / 25 volumes as of mid-2026; AniList reports null chapter count). S1 adapts ch. 1-22 (continue at Vol. 3 ch. 23); S2 adapts ch. 23-50 (continue at Vol. 7 ch. 51); zero filler. This is a gag romcom structured around introducing one soulmate at a time, so arcs are named for the girlfriend introduced. Girlfriend-intro chapters are anchored where known (Hakari ch.1, Karane ch.2, Shizuka ch.3, Kurumi ch.24, Mei ch.30, Meme ch.45) and volume boundaries (V4 24-32, V5 33-41, V6 42-50, V7 51-59); intermediate episode/chapter splits are approximate. Season 3 premiered July 2026 and is not yet mapped; post-S2 chapters are listed source-only.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 4], - "arc": "Hakari Hanazono & Karane Inda" - }, - { - "episodes": [3, 4], - "chapters": [5, 7], - "arc": "Shizuka Yoshimoto" - }, - { - "episodes": [5, 6], - "chapters": [8, 10], - "arc": "Nano Eiai" - }, - { - "episodes": [7, 9], - "chapters": [11, 16], - "arc": "Kusuri Yakuzen" - }, - { - "episodes": [10, 12], - "chapters": [17, 22], - "arc": "Hahari Hanazono" - }, - { - "episodes": [13, 15], - "chapters": [23, 29], - "arc": "Kurumi Haraga" - }, - { - "episodes": [16, 17], - "chapters": [30, 35], - "arc": "Mei Meido" - }, - { - "episodes": [18, 20], - "chapters": [36, 40], - "arc": "Iku Sutou" - }, - { - "episodes": [21, 22], - "chapters": [41, 44], - "arc": "Mimimi Utsukushisugi" - }, - { - "episodes": [23, 24], - "chapters": [45, 50], - "arc": "Meme Kakure" - }, - { - "chapters": [51, 59], - "arc": "Chiyo & Naddy (Vol. 7)" - }, - { - "chapters": [60, 250], - "arc": "Ongoing manga (Vol. 8+)" - } - ] -} diff --git a/src/data/mappings/3-gatsu-no-lion.json b/src/data/mappings/3-gatsu-no-lion.json deleted file mode 100644 index 05fb3be..0000000 --- a/src/data/mappings/3-gatsu-no-lion.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "anilistAnimeId": 21366, - "anilistMangaId": 31224, - "title": "March Comes in Like a Lion", - "sourceNotes": "Cumulative episodes across S1 (22) + S2 (22). Slow, faithful Shaft adaptation; arc boundaries follow major story beats. Chapter ranges approximate.", - "mappings": [ - { - "episodes": [1, 8], - "chapters": [1, 20], - "arc": "Rei's Loneliness / Kawamoto Sisters" - }, - { - "episodes": [9, 16], - "chapters": [21, 40], - "arc": "Newcomer Tournament / Nikaidou" - }, - { - "episodes": [17, 22], - "chapters": [41, 56], - "arc": "Lion King Tournament / Shimada" - }, - { - "episodes": [23, 32], - "chapters": [57, 80], - "arc": "Hinata's Bullying Arc" - }, - { "episodes": [33, 39], "chapters": [81, 100], "arc": "Souya Title Match" }, - { - "episodes": [40, 44], - "chapters": [101, 112], - "arc": "Newcomer Title Tournament" - }, - { "chapters": [113, 145], "arc": "Tatsuyuki / Yanagihara Retirement" }, - { "chapters": [146, 178], "arc": "Souya Meijin Defense" } - ] -} diff --git a/src/data/mappings/7th-prince.json b/src/data/mappings/7th-prince.json deleted file mode 100644 index c74f84d..0000000 --- a/src/data/mappings/7th-prince.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 156415, - "anilistMangaId": 123264, - "title": "I Was Reincarnated as the 7th Prince so I Can Take My Time Perfecting My Magical Ability", - "sourceNotes": "Cumulative episodes across S1 (12, AniList 156415) + S2 (12, AniList 178090) = 24. Sourced from Kodansha's manga adaptation (AniList 123264) of Kenkyo na Circle's ongoing light novel; the manga is ongoing at ch. 217 as of July 2026 (AniList lists no chapter count). Per community continue-reading guides, S1 adapts manga chapters 1-42 and S2 continues through chapter 85, with the manga resuming at ch. 86 for viewers who finish the anime. Arc names are approximate; the wiki documents an early \"Alchemy Festival\" arc and a \"Stampede\" arc within the S2 range, but full arc-by-arc chapter boundaries are not firmly documented, so episode ranges are grouped by season instead.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 42], - "arc": "Season 1 (Reincarnation and Magical Training)" - }, - { - "episodes": [13, 24], - "chapters": [43, 85], - "arc": "Season 2 (Alchemy Festival and Stampede)" - }, - { - "chapters": [86, 217], - "arc": "Later chapters to date (unadapted)" - } - ] -} diff --git a/src/data/mappings/7th-time-loop.json b/src/data/mappings/7th-time-loop.json deleted file mode 100644 index 0adf694..0000000 --- a/src/data/mappings/7th-time-loop.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 168374, - "anilistMangaId": 127008, - "title": "7th Time Loop: The Villainess Enjoys a Carefree Life Married to Her Worst Enemy!", - "sourceNotes": "Single season, 12 episodes, adapting Amamiya Touya's light novel (Kimi wa Bokuno...). AniList tracks neither the manga (id 127008) nor the light novel (id 129152) with a chapter count since both are still RELEASING; figures here are sourced from Seven Seas volume solicitations and a fan chapter-guide (epicstream.com, 'Where to Start Reading 7th Time Loop After the Anime'). The anime covers the light novel's first two volumes, ending partway into manga chapter 31. Manga ongoing (current ch. 42 as of late June 2026); unadapted continuation included at the tail.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 30], - "arc": "Season 1: Seventh Loop / Marriage to Arnold" - }, - { "chapters": [31, 42], "arc": "Unadapted continuation (ongoing)" } - ] -} diff --git a/src/data/mappings/86-eighty-six.json b/src/data/mappings/86-eighty-six.json deleted file mode 100644 index 3b475d9..0000000 --- a/src/data/mappings/86-eighty-six.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 116589, - "anilistMangaId": 98610, - "title": "86 EIGHTY-SIX", - "sourceNotes": "Cumulative episodes across S1 (11) + S2 (12, eps 12-23) = 23 total. The Yoshihara manga (id 98610) is ongoing and adapts the same Asato Asato light novel that the anime is based on. The earlier 2018 manga (id 101606, 20 ch) was cancelled. Chapter ranges approximate — the active manga's per-arc boundaries are not yet finalized.", - "mappings": [ - { - "episodes": [1, 11], - "chapters": [1, 25], - "arc": "Spearhead Squadron (LN vol 1)" - }, - { - "episodes": [12, 23], - "chapters": [26, 55], - "arc": "Federal Republic / Operation Halcyon (LN vol 2-3)" - } - ] -} diff --git a/src/data/mappings/8th-son-are-you-kidding-me.json b/src/data/mappings/8th-son-are-you-kidding-me.json deleted file mode 100644 index 3dcea21..0000000 --- a/src/data/mappings/8th-son-are-you-kidding-me.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 106319, - "anilistMangaId": 96344, - "title": "The 8th Son? Are You Kidding Me?", - "sourceNotes": "Single 12-episode season. Manga ongoing (current ch. 112); AniList does not track chapter/episode counts for this series so figures are sourced from tracking sites. The anime covers the succession-dispute opening storyline, ending around manga ch. 70 (community consensus continuation point). No widely-documented named-arc split exists for this stretch, so episode/chapter groupings below follow the anime's own episode-title beats and are approximate.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 22], - "arc": "Transmigration, Magic Awakening & Academy" - }, - { - "episodes": [5, 6], - "chapters": [23, 36], - "arc": "Betrothal & the Dragon-Slaying Bullet Tour" - }, - { - "episodes": [7, 9], - "chapters": [37, 54], - "arc": "Tournament, Ancient Ruins & Assassination Plot" - }, - { - "episodes": [10, 12], - "chapters": [55, 70], - "arc": "Undead Purification & Succession Climax" - }, - { - "chapters": [71, 112], - "arc": "Unadapted (manga ongoing)" - } - ] -} diff --git a/src/data/mappings/a-certain-scientific-railgun.json b/src/data/mappings/a-certain-scientific-railgun.json deleted file mode 100644 index e5a1e2f..0000000 --- a/src/data/mappings/a-certain-scientific-railgun.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "anilistAnimeId": 6213, - "anilistMangaId": 37776, - "title": "A Certain Scientific Railgun", - "sourceNotes": "Cumulative episodes across 3 TV seasons: Railgun S1 (24, 2009) + Railgun S (24, 2013) + Railgun T (25, 2020) = 73 eps. anilistMangaId 37776 is Kazuma Kamachi & Motoi Fuyukawa's Toaru Kagaku no Railgun manga (AniList lists 180 chapters; manga is actually still ongoing, ~180+ chapters / 20+ volumes as of 2025 — last entry extends to AniList's 180). Roughly half the anime is adaptation and half is anime-original: S1 adapts the Level Upper arc (eps 1-14) then invents the Poltergeist arc (eps 15-24, Big Spider woven in); Railgun S adapts the Sisters arc (eps 1-16) then invents the Silent Party arc (eps 17-24); Railgun T adapts the Daihaseisai/Daihasei Festival arc (eps 1-15) and the Dream Ranker arc (eps 16-25, covering the Indian Poker/Dream Ranker and Doppelganger/Kuriba Ryouko manga chapters with anime-original Scavenger/Kihara additions). Per-arc chapter boundaries are approximate (sources disagree by a chapter or two at arc seams). Anime-original arcs are anchored to their surrounding chapter as a placeholder and adapt no source. Unadapted manga tail: Jailbreaker arc (ch 97-127) and later school-life storylines (ch 128-180). Railgun has no theatrical film (the franchise's Endymion movie belongs to the sister series A Certain Magical Index).", - "mappings": [ - { - "episodes": [1, 14], - "chapters": [1, 17], - "arc": "Level Upper Arc" - }, - { - "episodes": [15, 24], - "chapters": [17, 17], - "arc": "Poltergeist Arc (anime-original; Big Spider woven in)" - }, - { - "episodes": [25, 40], - "chapters": [18, 39], - "arc": "Sisters Arc" - }, - { - "episodes": [41, 48], - "chapters": [39, 39], - "arc": "Silent Party Arc (anime-original)" - }, - { - "episodes": [49, 63], - "chapters": [40, 70], - "arc": "Daihaseisai (Daihasei Festival) Arc" - }, - { - "episodes": [64, 73], - "chapters": [71, 96], - "arc": "Dream Ranker Arc (Indian Poker + Doppelganger; anime-original Scavenger/Kihara additions)" - }, - { - "chapters": [97, 127], - "arc": "Jailbreaker Arc (unadapted)" - }, - { - "chapters": [128, 180], - "arc": "Post-Jailbreaker school-life storylines (unadapted; manga ongoing)" - } - ] -} diff --git a/src/data/mappings/a-couple-of-cuckoos.json b/src/data/mappings/a-couple-of-cuckoos.json deleted file mode 100644 index 39ad9a8..0000000 --- a/src/data/mappings/a-couple-of-cuckoos.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "anilistAnimeId": 132052, - "anilistMangaId": 114383, - "title": "A Couple of Cuckoos", - "sourceNotes": "Cumulative episodes across S1 (24 eps, 2 cours, 2022) + S2 (12 eps, 2025) = 36 total; S2E1 is cumulative episode 25. Faithful ~2-3-chapters-per-episode adaptation of Miki Yoshikawa's romcom manga (Weekly Shonen Magazine), 0 filler. S1 covers chapters 1-56 (a viewer resumes at ch 57); S2 covers roughly ch 57-112 (a viewer resumes at ch 113). The adaptation reorders a few late-S1 chapters: S1E24 pulls ch 59-60 forward while S2E25 backfills the skipped ch 57-58, so chapter ranges here are presented monotonically (S1 = ch 1-56, S2 = ch 57-112) to match the clean \"start reading\" points rather than strict adaptation order. Since the source has no official arc names, groupings are a descriptive segmentation of this love-polygon romcom. Manga is ongoing and entered its final arc on Jan 28, 2026 (current ch. ~300, 33 volumes); the unadapted tail is chapters-only. The \"Kakkou no Iikagen\" YouTube mini-series is a promotional short spin-off and is not mapped.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 8], - "arc": "The Baby Swap & the Arranged Engagement" - }, - { - "episodes": [5, 9], - "chapters": [9, 21], - "arc": "Erika Transfers In: School Life & the Love Square" - }, - { - "episodes": [10, 13], - "chapters": [22, 30], - "arc": "Hiro, Sachi & Deepening Feelings" - }, - { - "episodes": [14, 19], - "chapters": [31, 44], - "arc": "Summer Break: Beach, Idol Work & the Festival" - }, - { - "episodes": [20, 24], - "chapters": [45, 56], - "arc": "The Amano Family & the S1 Finale" - }, - { - "episodes": [25, 28], - "chapters": [57, 76], - "arc": "New Term: Rivalries & the Culture Festival" - }, - { - "episodes": [29, 32], - "chapters": [77, 95], - "arc": "Shifting Hearts & the Marriage Question" - }, - { - "episodes": [33, 36], - "chapters": [96, 112], - "arc": "Confessions & the S2 Finale" - }, - { - "chapters": [113, 300], - "arc": "Beyond the Anime (manga-only, ongoing final arc)" - } - ] -} diff --git a/src/data/mappings/a-lull-in-the-sea.json b/src/data/mappings/a-lull-in-the-sea.json deleted file mode 100644 index ebc7055..0000000 --- a/src/data/mappings/a-lull-in-the-sea.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 16067, - "anilistMangaId": 85063, - "title": "A Lull in the Sea", - "sourceNotes": "Single season, 26 episodes. Original P.A. Works anime; the manga (Project-118 / Risō Maeda) is a close tie-in adaptation, complete at 36 chapters across 6 volumes. No official episode-to-chapter sync guide exists, so the chapter split below approximates the anime's own time-skip divide (the Ofunehiki festival at the end of episode 13, followed by the 5-years-later second half) proportionally.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 18], - "arc": "Before the Ofunehiki (Pre-Time Skip)" - }, - { - "episodes": [14, 26], - "chapters": [19, 36], - "arc": "Five Years Later (Post-Time Skip)" - } - ] -} diff --git a/src/data/mappings/a-place-further-than-the-universe.json b/src/data/mappings/a-place-further-than-the-universe.json deleted file mode 100644 index b26afb2..0000000 --- a/src/data/mappings/a-place-further-than-the-universe.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "anilistAnimeId": 99426, - "anilistMangaId": 101415, - "title": "A Place Further Than the Universe", - "sourceNotes": "Single-cour anime, 13 episodes. Manga is a close tie-in retelling, complete at 17 chapters (15 main chapters plus two .5 bonus chapters, matching AniList's count) across 3 volumes, with each volume covering a clean four-to-five episode block.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 5], - "arc": "Forming the Yukihana Crew" - }, - { - "episodes": [5, 8], - "chapters": [6, 11], - "arc": "Voyage Aboard the Soya" - }, - { "episodes": [9, 13], "chapters": [12, 17], "arc": "Antarctica" } - ] -} diff --git a/src/data/mappings/a-sisters-all-you-need.json b/src/data/mappings/a-sisters-all-you-need.json deleted file mode 100644 index 6894501..0000000 --- a/src/data/mappings/a-sisters-all-you-need.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 98596, - "anilistMangaId": 97894, - "title": "A Sister's All You Need.", - "sourceNotes": "Single-cour 2017 TV anime (Silver Link, 12 episodes; no additional seasons, so episode numbers are non-cumulative). Source is Yomi Hirasaka's light novel (AniList id 97894, type MANGA / format NOVEL), 14 main volumes complete March 2015 - February 2020. AniList reports 206 \"chapters\" for the novel but gives no clean per-volume chapter boundaries, and the official @comic manga adaptation lags far behind, so this maps by LIGHT NOVEL VOLUME instead. IMPORTANT: the `chapters` tuples below hold LN VOLUME numbers, NOT chapter numbers. The anime adapts LN vols 1-4 (this is the community consensus). Episode-to-volume groupings are even ~3-episodes-per-volume estimates: the show is a low-arc slice-of-life comedy about light novelists that also reorders and adds original material, so boundaries are approximate. The unadapted tail is vols 5-14. No theatrical films (a related 6-episode ONA side story and TV specials exist but are separate entries and not films).", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 1], - "arc": "Meeting Itsuki, Nayuta & the gang (LN vol 1)" - }, - { - "episodes": [4, 6], - "chapters": [2, 2], - "arc": "Work, research & rivalries (LN vol 2)" - }, - { - "episodes": [7, 9], - "chapters": [3, 3], - "arc": "Adventure, love & friendship (LN vol 3)" - }, - { - "episodes": [10, 12], - "chapters": [4, 4], - "arc": "Becoming the protagonist (LN vol 4)" - }, - { - "chapters": [5, 14], - "arc": "Post-anime volumes (LN vols 5-14, unadapted)" - } - ] -} diff --git a/src/data/mappings/absolute-duo.json b/src/data/mappings/absolute-duo.json deleted file mode 100644 index e0e0d10..0000000 --- a/src/data/mappings/absolute-duo.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 20785, - "anilistMangaId": 81025, - "title": "Absolute Duo", - "sourceNotes": "LN-based mapping; ranges are by light novel VOLUME, not chapter (no per-chapter episode guide exists, so \"chapters\" here are volume numbers). Source is Takumi Hiiragiboshi's MF Bunko J light novel (AniList id 81025), complete at 11 volumes (Aug 2012 - Jul 2016). The single-cour 12-episode Eight Bit anime (2015) adapts volumes 1-4, condensing/omitting scenes to fit and closing on an anime-original resolution at the end of Vol 4. Volume boundaries are split evenly at roughly 3 episodes per volume (12 eps / 4 vols); exact per-episode volume cut points are approximate. Volumes 5-11 are unadapted. Single season, so episodes are non-cumulative.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 1], - "arc": "Volume 1: Blaze" - }, - { - "episodes": [4, 6], - "chapters": [2, 2], - "arc": "Volume 2: Survive" - }, - { - "episodes": [7, 9], - "chapters": [3, 3], - "arc": "Volume 3: Rebels" - }, - { - "episodes": [10, 12], - "chapters": [4, 4], - "arc": "Volume 4: Absolute Duo" - }, - { - "chapters": [5, 11], - "arc": "Volumes 5-11 (unadapted)" - } - ] -} diff --git a/src/data/mappings/accel-world.json b/src/data/mappings/accel-world.json deleted file mode 100644 index bbadde1..0000000 --- a/src/data/mappings/accel-world.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "anilistAnimeId": 11759, - "anilistMangaId": 53116, - "title": "Accel World", - "sourceNotes": "LN-based mapping: AniList has no manga source, so ranges use the light-novel VOLUME numbering (AniList novel id 53116, chapters/volumes null there). The 24-episode Sunrise TV series (single cour-pair, only season) adapts LN volumes 1-4 in chronological order and interleaves two short stories from the Vol 10 \"Elements\" collection: eps 6-7 (Aqua Current) and eps 18-19 (Snow Fairy / Okinawa trip). Volume-to-episode splits: Vol 1 = eps 1-5, Vol 10 short = eps 6-7, Vol 2 = eps 8-12, Vol 3 = eps 13-17, Vol 10 short = eps 18-19, Vol 4 = eps 20-24. The two OVA episodes (Accel World EX) are anime-original and not mapped. Light novel is ongoing at 28 volumes (Vol 28 \"Goddess of the Night\", Aug 2025; Vol 29 due Dec 2026). \"chapters\" ranges here denote VOLUME numbers, not chapter numbers.", - "mappings": [ - { - "episodes": [1, 5], - "chapters": [1, 1], - "arc": "Kuroyukihime's Return (Vol 1)" - }, - { - "episodes": [6, 7], - "chapters": [10, 10], - "arc": "Aqua Current (Elements side story, Vol 10)" - }, - { - "episodes": [8, 12], - "chapters": [2, 2], - "arc": "The Red Storm Princess (Vol 2)" - }, - { - "episodes": [13, 17], - "chapters": [3, 3], - "arc": "The Twilight Marauder (Vol 3)" - }, - { - "episodes": [18, 19], - "chapters": [10, 10], - "arc": "Snow Fairy / Okinawa (Elements side story, Vol 10)" - }, - { - "episodes": [20, 24], - "chapters": [4, 4], - "arc": "Flight Toward a Blue Sky (Vol 4)" - }, - { - "chapters": [5, 28], - "arc": "The Floating Starlight Bridge onward (unadapted, Vol 5-28)" - } - ] -} diff --git a/src/data/mappings/ace-of-diamond.json b/src/data/mappings/ace-of-diamond.json deleted file mode 100644 index 50f81fe..0000000 --- a/src/data/mappings/ace-of-diamond.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "anilistAnimeId": 18689, - "anilistMangaId": 40884, - "title": "Ace of the Diamond", - "sourceNotes": "Cumulative episodes across S1 (75) + Second Season (51) = 126 episodes, which adapt essentially the entire original 'Diamond no Ace' (Act I) manga: ch 1 through the Fall Tournament final (~ch 410), with only the short graduation epilogue (~ch 411-418) left to OVAs. There is NO large unadapted Act I tail. The separate sequel manga 'Act II' and its anime (id 105749) are a distinct continuation and are not mapped here. Verified anchors: Yakushi summer QF = ch 97-120 / ep 33-40; Fall Tournament start ~ch 238 / ep 79; Fall final = ch 369-410 / ep 116-126. Middle chapter boundaries are interpolated approximations.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 33], - "arc": "Introduction / Sawamura Joins Seido" - }, - { - "episodes": [14, 21], - "chapters": [34, 70], - "arc": "Spring Training Camp" - }, - { - "episodes": [22, 56], - "chapters": [71, 190], - "arc": "Summer East Tokyo Koshien Qualifier (loss to Inashiro)" - }, - { - "episodes": [57, 78], - "chapters": [191, 237], - "arc": "Post-Summer Transition / Team Rebuild" - }, - { "episodes": [79, 115], "chapters": [238, 368], "arc": "Fall Tournament" }, - { - "episodes": [116, 126], - "chapters": [369, 410], - "arc": "Fall Tournament Final (Seido vs Yakushi)" - }, - { - "chapters": [411, 418], - "arc": "Graduation Epilogue (TV-unadapted; OVA-covered)" - } - ] -} diff --git a/src/data/mappings/adachi-and-shimamura.json b/src/data/mappings/adachi-and-shimamura.json deleted file mode 100644 index 090e944..0000000 --- a/src/data/mappings/adachi-and-shimamura.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 109287, - "anilistMangaId": 109302, - "title": "Adachi and Shimamura", - "sourceNotes": "Source is Hitoma Iruma's ongoing light novel (13+ volumes, still RELEASING on AniList). The 2020 Tezuka Productions anime (12 eps) adapts LN vols 1-4 in NON-CHRONOLOGICAL order (ep7 pulls from vol.3, ep8 from vol.2, before eps 9-12 return to vol.4 for the Christmas-date finale). Chapters here map to the current, ongoing Moke Yuzuhara manga (AniList id 109302, Yen Press-licensed), which fan guides use as the canonical continuation point: the anime's story tracks to approximately its chapter 21, after which the manga continues into unadapted LN vol.5+ material (current ch. ~44, ongoing as of late 2025 — APPROXIMATE, no official chapter total published). An earlier, unrelated/discontinued 2016 Mani manga (3 vols, 18 ch, AniList id 98797) is not used here. Chapter ranges within the anime's run are APPROXIMATE given the non-linear adaptation order.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 11], - "arc": "Meeting on the Gym's Second Floor (LN Vol. 1)" - }, - { - "episodes": [7, 8], - "chapters": [12, 15], - "arc": "Growing Feelings, Out of Order (LN Vols. 2-3)" - }, - { - "episodes": [9, 12], - "chapters": [16, 21], - "arc": "Christmas Date & Confession (LN Vol. 4)" - }, - { - "chapters": [22, 44], - "arc": "Unadapted (LN Vol. 5+, Yuzuhara manga, ongoing)" - } - ] -} diff --git a/src/data/mappings/aesthetica-of-a-rogue-hero.json b/src/data/mappings/aesthetica-of-a-rogue-hero.json deleted file mode 100644 index f4524f9..0000000 --- a/src/data/mappings/aesthetica-of-a-rogue-hero.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 13161, - "anilistMangaId": 70409, - "title": "Aesthetica of a Rogue Hero", - "sourceNotes": "Single-cour 12-episode TV anime (2012) adapting light novel volumes 1-3. The tie-in manga (Hagure Yuusha no Kichiku Bigaku) is a separate, condensed adaptation of the same light novel material, complete at 18 chapters across 3 volumes. No formally named story arcs; episode titles suggest a rough split between the early Babel/master-servant setup and the later BABEL ranking tournament, used as broad divisions here.", - "mappings": [ - { "episodes": [1, 7], "chapters": [1, 10], "arc": "Return to Babel" }, - { - "episodes": [8, 12], - "chapters": [11, 18], - "arc": "BABEL Ranking Tournament" - } - ] -} diff --git a/src/data/mappings/afro-samurai.json b/src/data/mappings/afro-samurai.json deleted file mode 100644 index ae82049..0000000 --- a/src/data/mappings/afro-samurai.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 1292, - "anilistMangaId": 39935, - "title": "Afro Samurai", - "sourceNotes": "Anime is 5 TV episodes (2007): episodes 1-4 form the Number Two arc, episode 5 the Number One/Justice arc. Manga complete at 10 chapters (2 volumes) — a 2008 remake of Takashi Okazaki's original self-published doujinshi, split evenly between the two arcs; the creator calls it the closest version to the source doujinshi, though it also folds in some elements from the film sequel.", - "mappings": [ - { "episodes": [1, 4], "chapters": [1, 5], "arc": "Number Two Arc" }, - { - "episodes": [5, 5], - "chapters": [6, 10], - "arc": "Number One Arc (Justice)" - } - ], - "movies": [ - { - "anilistId": 4970, - "title": "Afro Samurai: Resurrection", - "year": 2009, - "afterEpisode": 5, - "note": "Canon sequel film continuing directly after the TV series; anime-original story, not covered by the 10-chapter manga." - } - ] -} diff --git a/src/data/mappings/after-the-rain.json b/src/data/mappings/after-the-rain.json deleted file mode 100644 index 4559330..0000000 --- a/src/data/mappings/after-the-rain.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "anilistAnimeId": 98385, - "anilistMangaId": 86639, - "title": "After the Rain", - "sourceNotes": "Single season, 12 episodes. Manga complete at 83 chapters. Episodes 1-8 track the manga closely up through the typhoon (~ch. 25); episodes 9-10 condense the following volumes; episodes 11-12 diverge into an anime-original ending that loosely parallels manga material into the mid-40s while resolving the central relationship differently. Chapters beyond that point were never adapted and exist only in the manga.", - "mappings": [ - { - "episodes": [1, 8], - "chapters": [1, 25], - "arc": "Meeting Through the Typhoon" - }, - { - "episodes": [9, 10], - "chapters": [26, 39], - "arc": "Condensed Later Volumes" - }, - { - "episodes": [11, 12], - "chapters": [40, 44], - "arc": "Anime-Original Ending" - }, - { "chapters": [45, 83], "arc": "Unadapted Continuation (manga only)" } - ] -} diff --git a/src/data/mappings/aharen-san-wa-hakarenai.json b/src/data/mappings/aharen-san-wa-hakarenai.json deleted file mode 100644 index 1c6edb0..0000000 --- a/src/data/mappings/aharen-san-wa-hakarenai.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 137281, - "anilistMangaId": 98686, - "title": "Aharen-san wa Hakarenai", - "sourceNotes": "Source is Asato Mizu's manga (AniList 98686), complete at 167 chapters across 17 volumes. Cumulative episodes across S1 (12) + S2 (12) = 24. This is an episodic gag/romantic-comedy manga with no canonical named story arcs, so ranges are grouped by season/cumulative-chapter blocks rather than plot arcs. Season 1 (ep 1-12) adapted ch 1-67 (through vol 7); Season 2 (ep 13-24) adapted ch 68-167, running through the manga's finale (which covers the flash-forward marriage epilogue). Roughly 5-6 chapters per episode in S1 and ~8 per episode in S2; per-episode boundaries are approximate.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 67], - "arc": "Season 1" - }, - { - "episodes": [13, 24], - "chapters": [68, 167], - "arc": "Season 2" - } - ] -} diff --git a/src/data/mappings/aho-girl.json b/src/data/mappings/aho-girl.json deleted file mode 100644 index 59530ad..0000000 --- a/src/data/mappings/aho-girl.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 98251, - "anilistMangaId": 77102, - "title": "AHO-GIRL", - "sourceNotes": "Single-cour 12-episode TV_SHORT (Diomedéa, 2017), ~15 min episodes; anilistAnimeId 98251 is the only season. Sourced from the completed 4-koma-style gag manga (AniList 77102), collected in 12 tankobon; AniList counts 155 chapters (split/extra chapters), while Wikipedia lists the run ending at ch. 130 — chapter numbering is fuzzy on this title. This is episodic gag comedy with no real story arcs, and the anime adapts chapters NON-sequentially as a \"best-of\": it pulls scattered gags from roughly ch. 1-85 (furthest adapted is ch. 85.5, Dog's walk in ep. 11), so per-episode chapter ranges cannot be pinned down. Continue-reading guides tell anime finishers to start at Vol. 6 / ch. 86. Chapter ranges below are approximate. No theatrical films exist.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 85], - "arc": "Yoshiko & A-kun (episodic gags)" - }, - { - "chapters": [86, 155], - "arc": "Remaining manga chapters (unadapted)" - } - ] -} diff --git a/src/data/mappings/ajin.json b/src/data/mappings/ajin.json deleted file mode 100644 index 6d70b9d..0000000 --- a/src/data/mappings/ajin.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 21341, - "anilistMangaId": 79865, - "title": "Ajin: Demi-Human", - "sourceNotes": "Manga complete; AniList counts 99 chapters / 17 volumes because it includes every magazine installment (the '.5' split chapters and the untitled Final Chapter). The volume/fan integer numbering instead runs 1 through ~85 plus the Final Chapter, so cross-checks against Bato/Kodansha volumes will show a lower top chapter than 99 - both describe the same complete manga. Chapter ranges here use AniList's 99 scale, with 99 = the Final Chapter. Anime (Polygon Pictures CG): Season 1 = eps 1-13, Season 2 = eps 14-26 (cumulative), total 26 episodes. Season 1 faithfully adapts ~chapters 1-21; the manga's documented divergence point is chapter 22. Season 2 only loosely follows the manga (to roughly chapter 69) and its finale (ep 26) is an anime-original ending in which Sato is defeated - in the manga Sato is never beaten. Fans recommend resuming the manga at chapter 22. The unadapted tail (~ch 70-99) is the manga's true climax and resolution. The three theatrical films (Shoudou/-Compel-, Shoutotsu, Shougeki) are recap compilations re-cutting the TV anime and are EXCLUDED. A 3-episode OVA of side stories is also excluded. Internal boundaries (22 / 69 / 70) are approximate.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 21], - "arc": "Awakening & First Conflict (Season 1)" - }, - { - "episodes": [14, 26], - "chapters": [22, 69], - "arc": "Sato's War (Season 2, anime-divergent; original finale)" - }, - { - "chapters": [70, 99], - "arc": "Final Confrontation (unadapted manga climax)" - } - ] -} diff --git a/src/data/mappings/akame-ga-kill.json b/src/data/mappings/akame-ga-kill.json deleted file mode 100644 index 1ebec66..0000000 --- a/src/data/mappings/akame-ga-kill.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "anilistAnimeId": 20613, - "anilistMangaId": 55132, - "title": "Akame ga Kill!", - "sourceNotes": "Anime complete at 24 episodes (2014). Manga complete at 80 chapters (2010-2016). Anime faithfully adapts ch 1-38 across eps 1-18, then diverges with an anime-original ending in eps 19-24 (unmapped). Manga continues with the Wild Hunt arc and the canonical resolution.", - "mappings": [ - { "episodes": [1, 7], "chapters": [1, 15], "arc": "Night Raid Initiation" }, - { - "episodes": [8, 18], - "chapters": [16, 38], - "arc": "Jaegers / Three Beasts" - }, - { "chapters": [39, 58], "arc": "Wild Hunt (unadapted; anime diverges)" }, - { "chapters": [59, 80], "arc": "Revolution / Final Battle (unadapted)" } - ] -} diff --git a/src/data/mappings/akashic-records.json b/src/data/mappings/akashic-records.json deleted file mode 100644 index 0f480f6..0000000 --- a/src/data/mappings/akashic-records.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 21700, - "anilistMangaId": 86432, - "title": "Akashic Records of Bastard Magic Instructor", - "sourceNotes": "Source is Taro Hitsuji's light novel (24 vols, ended 2023). Mapped against Aosa Tsunemi's MANGA adaptation (AniList 86432), which finished in June 2021 at 16 volumes / 78 chapters and covers roughly LN vols 1-10. The 2017 TV anime (12 eps, single cour) is a heavily abridged take on LN vols 1-5; the manga adapts that same span across vols 1-10 (ch 1-44), so a viewer resumes reading at ch 45. Episode-to-volume groupings: eps 1-3 = LN1, eps 4-6 = LN2, eps 7-9 = LN3, eps 10-12 = LN4-5. Manga chapter boundaries from MangaDex volume aggregate; LN-to-arc alignment approximate. No theatrical films.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 9], - "arc": "The Foolish Magic Instructor (Academy Debut & Terrorist Incident)" - }, - { - "episodes": [4, 6], - "chapters": [10, 18], - "arc": "The Magic Competition" - }, - { - "episodes": [7, 9], - "chapters": [19, 28], - "arc": "Re=L and the Sea of Falling Stars" - }, - { - "episodes": [10, 12], - "chapters": [29, 44], - "arc": "The Imperial Court Mage Corps Battle" - }, - { - "chapters": [45, 78], - "arc": "Beyond the Anime (Unadapted)" - } - ] -} diff --git a/src/data/mappings/akudama-drive.json b/src/data/mappings/akudama-drive.json deleted file mode 100644 index ae45d38..0000000 --- a/src/data/mappings/akudama-drive.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "anilistAnimeId": 116566, - "anilistMangaId": 118854, - "title": "Akudama Drive", - "sourceNotes": "Original anime (Too Kyo Games / Studio Pierrot); the 'Comicalize' manga by Rokurou Ogaki is a close tie-in adaptation that began serialization just before the anime aired and finished complete at 63 chapters across 9 volumes. The 12 TV episodes correspond to roughly the first 60 chapters; no official episode-by-episode chapter guide is published, so per-episode boundaries below are proportional estimates. The final 'Shikoku Arc' (ch. 61-63, vol. 9) is new manga-only material set after the anime's finale.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 15], - "arc": "The Swindler & the Cutthroat (the Job begins)" - }, - { - "episodes": [4, 6], - "chapters": [16, 30], - "arc": "Betrayals aboard the Shinkansen" - }, - { - "episodes": [7, 9], - "chapters": [31, 45], - "arc": "The Kansai government's pursuit" - }, - { - "episodes": [10, 12], - "chapters": [46, 60], - "arc": "Execution Site & the Cuffs' finale" - }, - { "chapters": [61, 63], "arc": "Shikoku Arc (manga-only epilogue)" } - ] -} diff --git a/src/data/mappings/alderamin-on-the-sky.json b/src/data/mappings/alderamin-on-the-sky.json deleted file mode 100644 index 8154e5a..0000000 --- a/src/data/mappings/alderamin-on-the-sky.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "anilistAnimeId": 21410, - "anilistMangaId": 85885, - "title": "Alderamin on the Sky", - "sourceNotes": "13-episode 2016 anime adapts roughly the first 3 of Bokuto Uno's 14 light-novel volumes (eps 1-4 = LN vol.1's academy enrollment, ep5 = interlude/side material, eps 6-9 = LN vol.2's Katjvarna Civil War, eps 10-13 = LN vol.3's climactic Battle of Alderamin Fortress). Chapters here map to Taiki Kawakami's manga adaptation (7 vols, 32 ch, FINISHED 2017), which closely parallels this same span and concludes at the same story point as the anime. Exact per-episode chapter boundaries are not documented in available sources and are proportionally APPROXIMATED. LN vols 4-14 continue the story well past the anime/manga and are unadapted by either.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 10], - "arc": "Enrollment at the Officers' Academy (LN Vol. 1)" - }, - { - "episodes": [5, 5], - "chapters": [10, 11], - "arc": "Interlude" - }, - { - "episodes": [6, 9], - "chapters": [12, 20], - "arc": "The Katjvarna Rebellion / Civil War (LN Vol. 2)" - }, - { - "episodes": [10, 13], - "chapters": [21, 32], - "arc": "The Kioka War & Battle of Alderamin Fortress (LN Vol. 3)" - } - ] -} diff --git a/src/data/mappings/aldnoah-zero.json b/src/data/mappings/aldnoah-zero.json deleted file mode 100644 index a217443..0000000 --- a/src/data/mappings/aldnoah-zero.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 20632, - "anilistMangaId": 87007, - "title": "ALDNOAH.ZERO", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (12) = 24. Original anime (Gen Urobuchi/A-1 Pictures/Troyca); manga is a close, roughly 1-chapter-per-episode tie-in released in two separate parts on AniList: \"Aldnoah.Zero Season One\" (anilistMangaId 87007, 12 chapters, art by Pinakes, covers S1 episodes 1-12) and \"Aldnoah.Zero 2nd Season\" (anilistMangaId 87008, 12 chapters, art by Fuyube Mahiro, covers S2 episodes 13-24); this mapping treats the two as one continuous 1-24 chapter range for cumulative navigation.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 12], - "arc": "Season One (Vers Empire Invasion)" - }, - { "episodes": [13, 24], "chapters": [13, 24], "arc": "2nd Season" } - ], - "movies": [ - { - "anilistId": 185714, - "title": "Aldnoah.Zero (Re+)", - "year": 2025, - "afterEpisode": 24, - "note": "Theatrical compilation film recapping all 24 TV episodes, bundled with new bonus content (\"Episode 24.5: Fragments of Rain -The Penultimate Truth-\") continuing the story after the finale." - } - ] -} diff --git a/src/data/mappings/alya-sometimes-hides.json b/src/data/mappings/alya-sometimes-hides.json deleted file mode 100644 index 461b75a..0000000 --- a/src/data/mappings/alya-sometimes-hides.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 162804, - "anilistMangaId": 152404, - "title": "Alya Sometimes Hides Her Feelings in Russian", - "sourceNotes": "Source is Sunsunsun's light novel (Roshidere); paired here with the ongoing manga adaptation (AniList 152404, ~9 volumes / ch 83 as of mid-2026). The 2024 TV anime (AniList 162804) is a single cour of 12 episodes adapting light-novel volumes 1-3 (vol 1 prologue through vol 3 epilogue, the student-council election speeches). This is a slow-burn romcom with loose, episodic arcs, so arcs are grouped by light-novel volume and the manga-chapter boundaries are approximate. Manga pacing anchors: the manga had reached ~ch 45 (end of LN vol 2) around the time the anime aired, and manga vol 9 (ch ~67+) covers the student-council election *competition* (LN vol 4+, beyond the anime), which places the anime's endpoint near manga ch 66. Chapters 67-83 are the unadapted tail (resume reading there after the anime). A second TV season (AniList 181641) was announced but had not aired. No theatrical films.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 23], - "arc": "The Aloof Princess and Her Neighbor (Daily School Life)" - }, - { - "episodes": [5, 8], - "chapters": [24, 45], - "arc": "Student Council & Cultural Festival (Family Revelations)" - }, - { - "episodes": [9, 12], - "chapters": [46, 66], - "arc": "Student Council President Election Campaign" - }, - { - "chapters": [67, 83], - "arc": "Election Competition & Beyond (ongoing, unadapted)" - } - ] -} diff --git a/src/data/mappings/am-i-actually-the-strongest.json b/src/data/mappings/am-i-actually-the-strongest.json deleted file mode 100644 index 8190e14..0000000 --- a/src/data/mappings/am-i-actually-the-strongest.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 154391, - "anilistMangaId": 110769, - "title": "Am I Actually the Strongest?", - "sourceNotes": "Single 12-episode season. Manga ongoing (current ch. 145); AniList does not track chapter counts for this series so figures are sourced from tracking sites. Confirmed boundaries: Volume 1 = ch. 1-6, Volume 5 = ch. 26-32, and the anime ends at ch. 36 (partway into Volume 6). Chapter splits for episodes 1-8 are approximate, extrapolated from those confirmed volume boundaries since per-episode chapter data isn't publicly documented.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 18], - "arc": "Reincarnation & the Confrontation with Gizelotte" - }, - { - "episodes": [7, 8], - "chapters": [19, 25], - "arc": "Journey to the Royal Capital" - }, - { - "episodes": [9, 11], - "chapters": [26, 32], - "arc": "Magic Academy Enrollment" - }, - { - "episodes": [12, 12], - "chapters": [33, 36], - "arc": "Magic Academy - Opening Rivalries" - }, - { - "chapters": [37, 145], - "arc": "Unadapted (manga ongoing)" - } - ] -} diff --git a/src/data/mappings/amagi-brilliant-park.json b/src/data/mappings/amagi-brilliant-park.json deleted file mode 100644 index fb5f92e..0000000 --- a/src/data/mappings/amagi-brilliant-park.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 20602, - "anilistMangaId": 85217, - "title": "Amagi Brilliant Park", - "sourceNotes": "Source is Shoji Gatoh's LIGHT NOVEL (illustrated by Yuka Nakajima; AniList id 85200), of which Fujimi Shobo published 8 volumes before the series went on hiatus in 2016. The 2014 Kyoto Animation TV anime (13 eps; the OVA 'No Time to Take It Easy!' ep 14 is excluded) adapts roughly LN VOLUMES 1-2 (with a touch of vol 3) — the park-revival-by-deadline plot, racing to 250,000 guests by the July 31 deadline — and wraps up with an ANIME-ORIGINAL ending, so a viewer resumes reading at LN vol 3. The linked manga adaptation (AniList id 85217; 32 chapters / 6 volumes, FINISHED) is a separate parallel retelling whose chapters don't cleanly anchor the anime, so this mapping uses LIGHT-NOVEL VOLUME numbers as the 'chapters' unit, NOT manga chapters. With only ~2 volumes spanning 13 episodes the groupings are coarse and volume-to-episode boundaries are APPROXIMATE. Vols 3-8 are unadapted (LN on hiatus). No theatrical films.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 1], - "arc": "Seiya's Recruitment & the 250,000-Visitor Deadline (LN vol 1)" - }, - { - "episodes": [3, 7], - "chapters": [1, 2], - "arc": "Rebuilding the Park — Marketing, Money, Staff & Pool (LN vols 1-2)" - }, - { - "episodes": [8, 10], - "chapters": [2, 2], - "arc": "Side Stories & Mounting Crisis (Love Appeal / Teamwork) (LN vol 2)" - }, - { - "episodes": [11, 13], - "chapters": [2, 2], - "arc": "The Final Deadline Push (anime-original ending) (LN vol 2)" - }, - { - "chapters": [3, 8], - "arc": "Post-anime (LN vols 3-8, on hiatus & unadapted)" - } - ] -} diff --git a/src/data/mappings/an-archdemons-dilemma.json b/src/data/mappings/an-archdemons-dilemma.json deleted file mode 100644 index c826630..0000000 --- a/src/data/mappings/an-archdemons-dilemma.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 156023, - "anilistMangaId": 101722, - "title": "An Archdemon's Dilemma: How to Love Your Elf Bride", - "sourceNotes": "Source is Hako Itagaki's manga adaptation (AniList 101722) of Fuminori Teshima's light novel; manga ongoing (~ch. 77 as of April 2026, 15 volumes). The 12-episode anime adapts through chapter 24 (four of manga Volume 5's five chapters), with the finale episode running slightly ahead of/original relative to the print pacing. No named story arcs; this is a single continuous romance narrative, so the anime run is grouped as one block with the unadapted tail left as chapters-only.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 24], - "arc": "Anime Run" - }, - { - "chapters": [25, 77], - "arc": "Post-Anime (Manga-Only)" - } - ] -} diff --git a/src/data/mappings/ancient-magus-bride.json b/src/data/mappings/ancient-magus-bride.json deleted file mode 100644 index d9e3462..0000000 --- a/src/data/mappings/ancient-magus-bride.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 98436, - "anilistMangaId": 85435, - "title": "The Ancient Magus' Bride", - "sourceNotes": "Maps the TV anime to the ongoing manga (RELEASING; latest collected chapters reach ~115 in vol 23, Oct 2025). TV Season 1 (id 98436, 24 eps) adapts roughly chapters 1-45 and resolves the pre-College story. TV Season 2 (ids 154364 + 166452, 12 + 12 = 24 eps, cumulative eps 25-48) adapts the College (Gakuin) arc, chapters 46-70. The 3-part OVA prequel 'Those Awaiting a Star' (id 21688) is a chronological prequel showing Chise's past and is not part of this episode numbering. No theatrical films. Chapter boundaries are approximate; the anime skips and reorders some short chapters.", - "mappings": [ - { - "episodes": [1, 24], - "chapters": [1, 45], - "arc": "Slave / Bride (pre-College story)" - }, - { - "episodes": [25, 48], - "chapters": [46, 70], - "arc": "College (Gakuin) arc" - }, - { - "chapters": [71, 115], - "arc": "Post-College arc (unadapted, manga ongoing)" - } - ] -} diff --git a/src/data/mappings/angel-next-door.json b/src/data/mappings/angel-next-door.json deleted file mode 100644 index 080685a..0000000 --- a/src/data/mappings/angel-next-door.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 143338, - "anilistMangaId": 113533, - "title": "The Angel Next Door Spoils Me Rotten", - "sourceNotes": "Source is Saekisan's light novel (AniList id 113533, type MANGA / format NOVEL), 12 main volumes as of mid-2026 (Japanese vol 12 released March 2026; Yen Press English at vol 10). The official manga adaptation (id 122337) is paced far behind the anime — only ~ch 28-29 / 7 tankobon as of June 2026, not yet past the anime's content — so chapter mapping is unusable; this maps by LIGHT NOVEL VOLUME instead. IMPORTANT: the `chapters` tuples below hold LN VOLUME numbers, NOT chapter numbers (AniList lists no chapter/volume count for either entry). The 2023 TV anime (id 143338, 12 eps, single cour) adapts LN vols 1-4, ending right as Amane and Mahiru confess and start dating. Episode-to-volume groupings are even ~3-eps-per-volume estimates — this is a low-arc slice-of-life romcom, so boundaries are approximate. The unadapted tail (vols 5-12) was partly covered by the 2026 Season 2 (id 170019, vols ~5-8), which is a separate AniList entry not included here.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 1], - "arc": "Meeting the Angel Next Door (LN vol 1)" - }, - { - "episodes": [4, 6], - "chapters": [2, 2], - "arc": "Growing Closer at Home & School (LN vol 2)" - }, - { - "episodes": [7, 9], - "chapters": [3, 3], - "arc": "Amane's Family & Deepening Trust (LN vol 3)" - }, - { - "episodes": [10, 12], - "chapters": [4, 4], - "arc": "Christmas & the Confession (LN vol 4)" - }, - { - "chapters": [5, 12], - "arc": "After They Start Dating (LN vols 5-12, unadapted by this anime)" - } - ] -} diff --git a/src/data/mappings/anohana.json b/src/data/mappings/anohana.json deleted file mode 100644 index 6ccf991..0000000 --- a/src/data/mappings/anohana.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 9989, - "anilistMangaId": 65733, - "title": "Anohana: The Flower We Saw That Day", - "sourceNotes": "Single-cour 11-episode series. Manga is a close tie-in adaptation running the same linear story with no distinct named arcs; complete at 13 chapters.", - "mappings": [ - { "episodes": [1, 11], "chapters": [1, 13], "arc": "Super Peace Busters" } - ], - "movies": [ - { - "anilistId": 15039, - "title": "Anohana the Movie: The Flower We Saw That Day", - "year": 2013, - "afterEpisode": 11, - "note": "Epilogue set a year after the TV series; new framing device (the group writing letters to Menma) around flashbacks to the show." - } - ] -} diff --git a/src/data/mappings/another.json b/src/data/mappings/another.json deleted file mode 100644 index d61dec6..0000000 --- a/src/data/mappings/another.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 11111, - "anilistMangaId": 54098, - "title": "Another", - "sourceNotes": "The 12-episode P.A. Works anime and the 4-volume / 20-chapter Hiro Kiyohara manga (id 54098, complete) both adapt Yukito Ayatsuji's 2009 horror novel. The manga is shorter and notably less deadly: it keeps several characters alive (e.g. Kazami and Ogura survive) and resolves the 'calamity' differently from the anime, which kills off most of the class and stages the climax at the burning summer resort. Endpoints (ep 1 = ch 1, ep 12 = ch 20) are firm; the finale diverges, so the ep 9-12 boundary is approximate.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 6], - "arc": "Transfer to Yomiyama North & the 'nonexistent' Mei Misaki" - }, - { - "episodes": [5, 8], - "chapters": [7, 13], - "arc": "The calamity begins & the failed countermeasure" - }, - { - "episodes": [9, 12], - "chapters": [14, 20], - "arc": "Summer camp & the 'casualty' revealed (anime finale diverges)" - } - ] -} diff --git a/src/data/mappings/ao-chan-cant-study.json b/src/data/mappings/ao-chan-cant-study.json deleted file mode 100644 index c212fd4..0000000 --- a/src/data/mappings/ao-chan-cant-study.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "anilistAnimeId": 105989, - "anilistMangaId": 105990, - "title": "Ao-chan Can't Study!", - "sourceNotes": "Single-cour, 12 episodes (TV_SHORT format). Manga complete at 39 chapters across 8 volumes. The anime adapts roughly chapters 1-20 (skipping a handful of chapters along the way, e.g. ch. 8, 10, 11, 13), leaving ch. 21-39 unadapted. No distinct named story arcs — episodic romantic-comedy chapters. A separate sequel manga ('Adult Arc') covering the characters' university years is not covered by this anime and is out of scope.", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 20], "arc": "Anime-Adapted Story" }, - { "chapters": [21, 39], "arc": "Unadapted Manga Continuation" } - ] -} diff --git a/src/data/mappings/ao-haru-ride.json b/src/data/mappings/ao-haru-ride.json deleted file mode 100644 index f878911..0000000 --- a/src/data/mappings/ao-haru-ride.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "anilistAnimeId": 20596, - "anilistMangaId": 54294, - "title": "Blue Spring Ride", - "sourceNotes": "S1 anime (12 eps, 2014) is a near chapter-per-episode adaptation covering roughly the first four volumes; the two OVAs ('unwritten' = the PAGE.0 prologue, and 'PAGE.13') extend it to about ch 13, so a viewer resumes reading around ch 14. Paired with Io Sakisaka's complete manga: 49 numbered story chapters across 13 volumes; AniList counts 53 incl. extras, so the final arc extends to 53. Post-anime arc boundaries are approximate. The 2014 live-action film is excluded.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 13], - "arc": "Reawakening: Futaba & Kou Reunite (Class 2-3 friend group; incl. OVAs)" - }, - { "chapters": [14, 32], "arc": "Kou's Past & the Love Rivals" }, - { "chapters": [33, 53], "arc": "Touma Arc & Futaba's Choice (Final)" } - ] -} diff --git a/src/data/mappings/aoashi.json b/src/data/mappings/aoashi.json deleted file mode 100644 index 2631cce..0000000 --- a/src/data/mappings/aoashi.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "anilistAnimeId": 134732, - "anilistMangaId": 107279, - "title": "Aoashi", - "sourceNotes": "Season 1 (24 eps, Apr-Sep 2022) adapts manga chapters 1-117. Manga complete at 410 chapters (40 volumes). Aoashi 2nd Season (24 eps) is announced for October 2026 but has not yet aired, so its adaptation range is not yet mapped here; chapters 118-410 remain manga-only for now. Arc boundaries from the Ao Ashi fandom wiki's Story Arcs page.", - "mappings": [ - { "episodes": [1, 5], "chapters": [1, 22], "arc": "Selection Exams Arc" }, - { - "episodes": [6, 10], - "chapters": [23, 46], - "arc": "Esperion Beginnings Arc" - }, - { - "episodes": [11, 13], - "chapters": [47, 61], - "arc": "Tokyo Metropolis League Kicks Off! Arc" - }, - { - "episodes": [14, 17], - "chapters": [62, 75], - "arc": "Fullback Training Arc" - }, - { - "episodes": [17, 18], - "chapters": [76, 83], - "arc": "Esperion B vs. Tama Sports Arc" - }, - { - "episodes": [19, 24], - "chapters": [84, 117], - "arc": "Esperion B vs. Musashino Youth Arc" - }, - { - "chapters": [118, 410], - "arc": "A-Team / Premier League East and beyond (manga-only, not yet adapted)" - } - ] -} diff --git a/src/data/mappings/apothecary-diaries.json b/src/data/mappings/apothecary-diaries.json deleted file mode 100644 index 042f59b..0000000 --- a/src/data/mappings/apothecary-diaries.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "anilistAnimeId": 161645, - "anilistMangaId": 99026, - "title": "The Apothecary Diaries", - "sourceNotes": "Cumulative episodes across S1 (24) + S2 (24). The anime restructures LN volumes; manga (99026) is the closer adaptation. Arc-level approximation.", - "mappings": [ - { "episodes": [1, 6], "chapters": [1, 13], "arc": "Inner Court Mysteries" }, - { - "episodes": [7, 14], - "chapters": [14, 32], - "arc": "Outer Court & Pyrotechnics" - }, - { - "episodes": [15, 24], - "chapters": [33, 55], - "arc": "Garden Party / Lakan's Plot" - }, - { "episodes": [25, 36], "chapters": [56, 78], "arc": "Western Capital" }, - { - "episodes": [37, 48], - "chapters": [79, 100], - "arc": "Shrine Investigation" - } - ] -} diff --git a/src/data/mappings/arakawa-under-the-bridge.json b/src/data/mappings/arakawa-under-the-bridge.json deleted file mode 100644 index 66abd5b..0000000 --- a/src/data/mappings/arakawa-under-the-bridge.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "anilistAnimeId": 7647, - "anilistMangaId": 44154, - "title": "Arakawa Under the Bridge", - "sourceNotes": "Cumulative episodes across S1 (13) + S2 'x Bridge' (13) = 26, both by Shaft (2010). Manga complete at 410 chapters / 15 volumes; it is a gag/slice-of-life series told in short, loosely connected chapters. The anime does not adapt straight through — it skips around non-sequentially, picking the funniest/most plot-relevant bits — but by the end of S2 it has worked through roughly the first 267 chapters per fan chapter-guides, so the S1/S2 split below is an approximate midpoint rather than an official boundary. Chapters 268-410 are unadapted tail. A 2012 live-action film exists but is excluded (non-animated, not part of this anime/manga tracker).", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 135], - "arc": "Life Under the Bridge (Season 1)" - }, - { - "episodes": [14, 26], - "chapters": [136, 267], - "arc": "Life Under the Bridge (Season 2 / x Bridge)" - }, - { "chapters": [268, 410], "arc": "Unadapted continuation" } - ] -} diff --git a/src/data/mappings/arifureta.json b/src/data/mappings/arifureta.json deleted file mode 100644 index ee2df6e..0000000 --- a/src/data/mappings/arifureta.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 100668, - "anilistMangaId": 96834, - "title": "Arifureta: From Commonplace to World's Strongest", - "sourceNotes": "Cumulative episodes across S1 (13) + S2 (12, eps 14-25) + S3 (16, eps 26-41) = 41 total (AniList numbering; Wikipedia/fandom insert a recap special and run +1 from S2E1 onward). The source is Ryo Shirakome's light novel. The RoGa manga adaptation (AniList id 96834) is the linked manga, but it lags FAR behind the anime — at ~ch 92 it has only reached LN vol. 6 (roughly the end of S2) and AniList lists no chapter count — so this mapping uses LIGHT-NOVEL VOLUME numbers as the 'chapters' unit instead. The main LN ran 13 volumes (concluded 2022) plus a vol. 14 epilogue; the anime adapts vols. 1-10. Per-volume arc boundaries within each season are approximate. No theatrical films.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 4], - "arc": "S1: Great Orcus Labyrinth (the Abyss) / Reisen Gorge / Grun Desert / Heiligh Kingdom defense (LN vols 1-4)" - }, - { - "episodes": [14, 25], - "chapters": [5, 6], - "arc": "S2: next labyrinth / Divine Mountain (Noint, Eri's betrayal, Kaori's death & resurrection) (LN vols 5-6)" - }, - { - "episodes": [26, 41], - "chapters": [7, 10], - "arc": "S3: Hoelscher Empire / Haltina Woods (Sea of Trees) / Frost Caverns — the seven labyrinths conquered (LN vols 7-10)" - }, - { - "chapters": [11, 14], - "arc": "March on the Demon Lord's castle & finale + epilogue (LN vols 11-14), unadapted" - } - ] -} diff --git a/src/data/mappings/armed-girls-machiavellism.json b/src/data/mappings/armed-girls-machiavellism.json deleted file mode 100644 index cc9699b..0000000 --- a/src/data/mappings/armed-girls-machiavellism.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "anilistAnimeId": 21851, - "anilistMangaId": 85892, - "title": "Armed Girl's Machiavellism", - "sourceNotes": "12-episode single-cour anime (2017) adapting roughly the first six of the manga's 13 tankobon volumes, up to about chapter 30. Manga complete at 90 chapters. The anime follows the manga's 'Five Swords' structure, spending two-to-three episodes per heroine (Rin Onigawara, Mary Kikakujo, Warabi Hanasaka, Satori Tamaba, Tsukuyo Inaba); exact chapter boundaries per arc are not individually published, so the ~30-chapter adapted range is divided evenly across the five arcs as an approximation.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 6], - "arc": "Rin Onigawara, the Magnificent Blade" - }, - { - "episodes": [3, 4], - "chapters": [7, 12], - "arc": "Mary Kikakujo, the Fair Sword" - }, - { - "episodes": [5, 6], - "chapters": [13, 18], - "arc": "Warabi Hanasaka, the Love-Crazed Blade" - }, - { - "episodes": [7, 9], - "chapters": [19, 24], - "arc": "Satori Tamaba, the Dubious Sword" - }, - { - "episodes": [10, 12], - "chapters": [25, 30], - "arc": "Tsukuyo Inaba, the Terrifying Blade" - }, - { "chapters": [31, 90], "arc": "Unadapted Arcs" } - ] -} diff --git a/src/data/mappings/ascendance-of-a-bookworm.json b/src/data/mappings/ascendance-of-a-bookworm.json deleted file mode 100644 index cdebeba..0000000 --- a/src/data/mappings/ascendance-of-a-bookworm.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "anilistAnimeId": 108268, - "anilistMangaId": 87383, - "title": "Ascendance of a Bookworm", - "sourceNotes": "Cumulative episodes across S1 (14, 2019) + S2 \"Part 2\" (12, 2020, eps 15-26) + S3 (10, 2022, eps 27-36) = 36 total; use the S1 anime id 108268. Source is Miya Kazuki's light novel, split by AniList into per-Part entries (id 87383 is the linked Part 1 novel, \"Daughter of a Soldier\"). Because the manga adaptations lag far behind, this maps by LIGHT NOVEL VOLUME across the whole 33-volume main series: the `chapters` tuples are overall LN volume numbers (1-33), NOT manga chapters. The 5 Parts are Part 1 \"Daughter of a Soldier\" (vols 1-3), Part 2 \"Apprentice Shrine Maiden\" (vols 4-7), Part 3 \"Adopted Daughter of an Archduke\" (vols 8-12), Part 4 \"Founder of the Royal Academy's So-Called Library Committee\" (vols 13-21), and Part 5 \"Avatar of a Goddess\" (vols 22-33); the LN concluded in 2023 at 33 volumes. Seasons 1-3 adapt Parts 1-2 in full, so a reader resumes at vol 8 (Part 3 Vol 1). Season 4 \"Adopted Daughter of an Archduke\" (id 171110, Part 3) began airing April 2026 and was still releasing as of this writing, so Part 3 onward is listed as an unadapted/ongoing tail. Per-volume episode boundaries within each season are approximate. No theatrical films.", - "mappings": [ - { - "episodes": [1, 14], - "chapters": [1, 3], - "arc": "Part 1: Daughter of a Soldier (S1, LN vols 1-3)" - }, - { - "episodes": [15, 26], - "chapters": [4, 5], - "arc": "Part 2: Apprentice Shrine Maiden - first half (S2, LN vols 4-5)" - }, - { - "episodes": [27, 36], - "chapters": [6, 7], - "arc": "Part 2: Apprentice Shrine Maiden - conclusion (S3, LN vols 6-7)" - }, - { - "chapters": [8, 12], - "arc": "Part 3: Adopted Daughter of an Archduke (LN vols 8-12; Season 4 airing 2026, not yet complete)" - }, - { - "chapters": [13, 21], - "arc": "Part 4: Founder of the Royal Academy's So-Called Library Committee (LN vols 13-21, unadapted)" - }, - { - "chapters": [22, 33], - "arc": "Part 5: Avatar of a Goddess (LN vols 22-33, unadapted)" - } - ] -} diff --git a/src/data/mappings/ashita-no-joe.json b/src/data/mappings/ashita-no-joe.json deleted file mode 100644 index 38ac264..0000000 --- a/src/data/mappings/ashita-no-joe.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 2402, - "anilistMangaId": 31303, - "title": "Ashita no Joe", - "sourceNotes": "1970 TV series (79 eps) covering roughly the first half of the manga through Rikiishi. Ashita no Joe 2 (1980) adapts the remainder; chapter ranges approximate.", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 14], "arc": "Doya-gai / Tange Dan" }, - { - "episodes": [13, 30], - "chapters": [15, 38], - "arc": "Juvenile Reformatory" - }, - { - "episodes": [31, 52], - "chapters": [39, 65], - "arc": "Pro Debut / East Japan Rookie King" - }, - { "episodes": [53, 79], "chapters": [66, 90], "arc": "Rikiishi Toru" }, - { "chapters": [91, 130], "arc": "Carlos Rivera / Wandering" }, - { "chapters": [131, 155], "arc": "Harimao / World Bantamweight" }, - { "chapters": [156, 171], "arc": "Jose Mendoza" } - ] -} diff --git a/src/data/mappings/asobi-asobase.json b/src/data/mappings/asobi-asobase.json deleted file mode 100644 index fb652fd..0000000 --- a/src/data/mappings/asobi-asobase.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 101001, - "anilistMangaId": 97418, - "title": "Asobi Asobase", - "sourceNotes": "Gag manga — chapter ranges are approximate. Rin Suzukawa's skit-based comedy is complete at 15 volumes (132 main chapters; AniList counts 134 including extras). The 2018 Lerche TV anime is a single 12-episode season directed by Seiji Kishi, and each episode wedges together three to four unrelated short chapters rather than following any continuous arc, ending around volume 5 / chapter 47 with only a handful of chapters skipped. Because the adaptation samples short gags rather than mapping cleanly, the per-episode chapter ranges below are coarse approximations, not exact matches. The canon OVA (a separate side entry) adapts a couple of stray chapters and there are no theatrical films. A reader continues past the anime from roughly chapter 48 to the finale at chapter 134.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 24], - "arc": "Episodes 1-6 (assorted sketches; gag manga, approximate)" - }, - { - "episodes": [7, 12], - "chapters": [25, 47], - "arc": "Episodes 7-12 (assorted sketches through vol 5; gag manga, approximate)" - }, - { - "chapters": [48, 134], - "arc": "Later Stories to the Finale (unadapted; gag manga, approximate)" - } - ] -} diff --git a/src/data/mappings/assassination-classroom.json b/src/data/mappings/assassination-classroom.json deleted file mode 100644 index 37f5316..0000000 --- a/src/data/mappings/assassination-classroom.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "anilistAnimeId": 20755, - "anilistMangaId": 69883, - "title": "Assassination Classroom", - "sourceNotes": "Cumulative eps 1-47 across S1 (22) + S2 (25). Adapts the `Ansatsu Kyoushitsu` manga (188 ch, 21 vols, FINISHED). The S1 finale lands around ch 69 (end of first term); S2 finishes the manga through graduation. Arc-level approximation.", - "mappings": [ - { "episodes": [1, 4], "chapters": [1, 12], "arc": "Assassination Begins" }, - { - "episodes": [5, 10], - "chapters": [13, 30], - "arc": "First Term (Karasuma / Irina / Midterms)" - }, - { - "episodes": [11, 15], - "chapters": [31, 50], - "arc": "Test of Courage / Itona Horibe" - }, - { - "episodes": [16, 22], - "chapters": [51, 69], - "arc": "Summer Island / Takaoka Rematch / End of First Term" - }, - { - "episodes": [23, 29], - "chapters": [70, 100], - "arc": "Second Term / Reaper" - }, - { - "episodes": [30, 36], - "chapters": [101, 140], - "arc": "School Festival / Civil War / Yanagisawa" - }, - { - "episodes": [37, 43], - "chapters": [141, 179], - "arc": "Final Decision / Korosensei's Past" - }, - { "episodes": [44, 47], "chapters": [180, 188], "arc": "Graduation" } - ], - "movies": [ - { - "anilistId": 198373, - "title": "Assassination Classroom: Our Time", - "year": 2026, - "note": "10th-anniversary film adapting previously unadapted class-life chapters; a continuation of the main story." - } - ] -} diff --git a/src/data/mappings/assassins-pride.json b/src/data/mappings/assassins-pride.json deleted file mode 100644 index 4767450..0000000 --- a/src/data/mappings/assassins-pride.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 104722, - "anilistMangaId": 99350, - "title": "Assassin's Pride", - "sourceNotes": "LN-based; ranges are by NOVEL VOLUME (not chapters) of Kei Amagi's \"Assassin's Pride\" light novel (AniList id 99350; 13-volume main series complete in 2021, plus 2 \"Secret Garden\" side-story volumes). The single 12-episode 2019 anime adapts roughly volumes 1-5 but NON-SEQUENTIALLY and loosely: eps 1-3 = Vol 1 (Melida gains mana under tutor Kufa), eps 4-6 = Vol 2 (the Luna Lumiere / \"Queen Selection Battle\" tournament with twins Mule & Salacha), eps 7-9 = Vol 5 (\"The Abyssal Feast\" detour), eps 10-12 = Vol 3 (\"Court of Fate\" / Labyrinth Library, Mule & Salacha return). Volume 4 (\"Sakura Revolt Railway\") is skipped entirely; adaptation guides recommend readers resume at Vol 6. Chapters[] therefore encode volume numbers, and the sequence is intentionally out of numeric order to follow episode progression. Vols 6-13 are unadapted.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 1], - "arc": "The Incompetent Gifted Girl (Vol 1)" - }, - { - "episodes": [4, 6], - "chapters": [2, 2], - "arc": "Luna Lumiere / Queen Selection Battle (Vol 2)" - }, - { - "episodes": [7, 9], - "chapters": [5, 5], - "arc": "The Abyssal Feast (Vol 5)" - }, - { - "episodes": [10, 12], - "chapters": [3, 3], - "arc": "Court of Fate / Labyrinth Library (Vol 3)" - }, - { - "chapters": [6, 13], - "arc": "Post-anime volumes (Vols 6-13, unadapted; Vol 4 skipped)" - } - ] -} diff --git a/src/data/mappings/asterisk-war.json b/src/data/mappings/asterisk-war.json deleted file mode 100644 index 48937c2..0000000 --- a/src/data/mappings/asterisk-war.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 21131, - "anilistMangaId": 81459, - "title": "The Asterisk War", - "sourceNotes": "Source is Yuu Miyazaki's light novel (AniList id 81459, type MANGA / format NOVEL, 139 chapters across 17 volumes). Mapped by LIGHT NOVEL volume rather than the manga adaptation (id 78369), which only ran 5 volumes / 37 chapters before stalling and never reaches the anime's endpoint. Cumulative episodes span the first TV cour (id 21131, 12 eps, 2015) plus the sequel 'Asterisk War 2' (id 21390, eps 13-24, 2016) = 24 total. Season 1 (eps 1-12) adapts LN vols 1-3; Season 2 (eps 13-24) adapts LN vols 4-6 — the entirety of the Phoenix Festa. Chapter ranges are proportional estimates converting LN volume boundaries onto AniList's 139-chapter count (~8 ch/vol), so they are approximate. LN vols 7-17 (the Gryps Festa and beyond) are unadapted.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 6], - "arc": "Introduction - Ayato transfers to Seidoukan, meets Julis-Alexia von Riessfeld (LN vol 1)" - }, - { - "episodes": [4, 8], - "chapters": [7, 16], - "arc": "Kirin Toudou arc - Ayato befriends Kirin and frees her from her uncle's control (LN vols 1-2)" - }, - { - "episodes": [9, 12], - "chapters": [17, 25], - "arc": "Phoenix Festa - qualifiers & early rounds (S1, LN vol 3)" - }, - { - "episodes": [13, 20], - "chapters": [26, 41], - "arc": "Phoenix Festa - main tournament, Allekant puppets & Flora rescue subplot (S2, LN vols 4-5)" - }, - { - "episodes": [21, 24], - "chapters": [42, 49], - "arc": "Phoenix Festa - finals & finale (S2, LN vol 6)" - }, - { - "chapters": [50, 139], - "arc": "Gryps Festa onward (LN vols 7-17, unadapted)" - } - ] -} diff --git a/src/data/mappings/astra-lost-in-space.json b/src/data/mappings/astra-lost-in-space.json deleted file mode 100644 index a7859d8..0000000 --- a/src/data/mappings/astra-lost-in-space.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "anilistAnimeId": 107663, - "anilistMangaId": 87442, - "title": "ASTRA LOST IN SPACE", - "sourceNotes": "Single-cour 12-episode adaptation (Lerche, 2019) of Kenta Shinohara's completed manga; episodes are cumulative within one season. The manga is complete at 49 collected chapters across 5 tankobon volumes (Vol 1 \"Planet Camp\" ch 1-7, Vol 2 \"Star of Hope\" ch 8-18, Vol 3 \"Secrets\" ch 19-28, Vol 4 \"Revelation\" ch 29-38, Vol 5 \"Friend-Ship\" ch 39-49). AniList lists 53 chapters, reflecting the Shonen Jump+ digital chapter split; ranges here follow the 49-chapter collected/volume numbering. Boundaries are anchored by the direct title matches between volume finales and episode titles (ep 1 \"Planet Camp\", ep 4 \"Star of Hope\", ep 6 \"Secret\", ep 9 \"Revelation\", ep 12 \"Friend-Ship\"), so arcs are volume-aligned; episode 1 is a double-length premiere covering all of Volume 1.", - "mappings": [ - { - "episodes": [1, 1], - "chapters": [1, 7], - "arc": "Planet Camp" - }, - { - "episodes": [2, 4], - "chapters": [8, 18], - "arc": "Star of Hope" - }, - { - "episodes": [5, 6], - "chapters": [19, 28], - "arc": "Secrets" - }, - { - "episodes": [7, 9], - "chapters": [29, 38], - "arc": "Revelation" - }, - { - "episodes": [10, 12], - "chapters": [39, 49], - "arc": "Friend-Ship" - } - ] -} diff --git a/src/data/mappings/attack-on-titan.json b/src/data/mappings/attack-on-titan.json deleted file mode 100644 index 9ceae81..0000000 --- a/src/data/mappings/attack-on-titan.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "anilistAnimeId": 16498, - "anilistMangaId": 53390, - "title": "Attack on Titan", - "sourceNotes": "Cumulative episodes across S1 (25) + S2 (12) + S3 (12+10) + Final Season parts (16+12+special). Arc-level approximation.", - "mappings": [ - { "episodes": [1, 3], "chapters": [1, 4], "arc": "Fall of Shiganshina" }, - { "episodes": [4, 13], "chapters": [5, 18], "arc": "Battle of Trost" }, - { "episodes": [14, 25], "chapters": [19, 34], "arc": "Female Titan" }, - { "episodes": [26, 37], "chapters": [35, 50], "arc": "Clash of Titans" }, - { "episodes": [38, 49], "chapters": [51, 70], "arc": "Uprising" }, - { - "episodes": [50, 59], - "chapters": [71, 90], - "arc": "Return to Shiganshina" - }, - { "episodes": [60, 75], "chapters": [91, 116], "arc": "Marley" }, - { "episodes": [76, 87], "chapters": [117, 130], "arc": "War for Paradis" }, - { "episodes": [88, 98], "chapters": [131, 139], "arc": "Final Chapters" } - ] -} diff --git a/src/data/mappings/azumanga-daioh.json b/src/data/mappings/azumanga-daioh.json deleted file mode 100644 index c18b86a..0000000 --- a/src/data/mappings/azumanga-daioh.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 66, - "anilistMangaId": 30085, - "title": "Azumanga Daioh", - "sourceNotes": "Single 26-episode TV season (J.C.Staff, 2002), no cumulative arithmetic needed. Paired with Kiyohiko Azuma's original Azumanga Daioh yonkoma (4-koma) manga (id 30085), complete at 69 chapters across 4 tankobon volumes — the 1-69 numbering is Anime News Network's retroactive catalog numbering, since the strips were serialized unnumbered in Dengeki Daioh (1999-2002). The manga is organized by calendar month, and both manga and anime follow the cast through three high-school years (April 1999 to graduation March 2002); each of the four volumes covers roughly one year with the second/third volumes straddling a year boundary. The anime year transitions fall at ep 10 (second years, Kagura joins the class) and ep 20 (final/third year, entrance-exam prep). 4-koma slice-of-life source — chapter ranges per school year are approximate and do not map 1:1 to episodes.", - "mappings": [ - { - "episodes": [1, 9], - "chapters": [1, 24], - "arc": "First Year (cast introduced, Osaka transfers in) — vol 1 + early vol 2" - }, - { - "episodes": [10, 19], - "chapters": [25, 48], - "arc": "Second Year (Kagura joins the class, summer trips) — late vol 2 + vol 3" - }, - { - "episodes": [20, 26], - "chapters": [49, 69], - "arc": "Third Year (entrance exams, Okinawa trip, graduation) — vol 4" - } - ] -} diff --git a/src/data/mappings/baccano.json b/src/data/mappings/baccano.json deleted file mode 100644 index 6fbcdb3..0000000 --- a/src/data/mappings/baccano.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 2251, - "anilistMangaId": 31342, - "title": "Baccano!", - "sourceNotes": "Source is Ryohgo Narita's LIGHT NOVEL (AniList id 31342, format NOVEL). IMPORTANT: the units below are LN VOLUMES, not chapters - the 'chapters' values are LN volume numbers. The 22-volume main Dengeki Bunko series is used; AniList exposes no volume count for the novel, so 22 is sourced externally. The minor manga adaptation is deliberately ignored. anilistAnimeId 2251 = the 2007 TV anime, counted here as 16 episodes (13 TV eps + the 3 'Bangai-hen' specials, AniList id 3901). The anime adapts the first three LN arcs INTERWOVEN and NON-CHRONOLOGICALLY: vol 1 '1930 The Rolling Bootlegs', vols 2-3 '1931 The Grand Punk Railroad' (the Flying Pussyfoot transcontinental train), and vol 4 '1932 Drug & The Dominoes'. Because the three timelines are braided across the TV run, the per-arc episode ranges overlap and are APPROXIMATE. A reader resumes at LN vol 5 ('1933 The Slash').", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 1], - "arc": "1930 - The Rolling Bootlegs (LN vol 1; woven across the TV run, approximate)" - }, - { - "episodes": [1, 13], - "chapters": [2, 3], - "arc": "1931 - The Grand Punk Railroad / Flying Pussyfoot (LN vols 2-3; woven across the TV run, approximate)" - }, - { - "episodes": [1, 16], - "chapters": [4, 4], - "arc": "1932 - Drug & The Dominoes (LN vol 4; resolves late and across the 3 specials, approximate)" - }, - { - "chapters": [5, 22], - "arc": "Unadapted later LN arcs from 1933 onward (e.g. The Slash, Alice in Jails); LN vols 5-22" - } - ] -} diff --git a/src/data/mappings/baka-and-test.json b/src/data/mappings/baka-and-test.json deleted file mode 100644 index a4a032e..0000000 --- a/src/data/mappings/baka-and-test.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 6347, - "anilistMangaId": 42295, - "title": "Baka and Test - Summon the Beasts", - "sourceNotes": "LN-based; mapped to the Baka to Test to Shoukanjuu light novel (AniList id 42295), complete at 18 volumes — 12 main-story volumes plus 6 side-story/short-story volumes (3.5, 6.5, 7.5, 9.5, 10.5, 12.5). Chapter numbering here follows the main-story \"Question\" sequence (Vol 1 = ch 1-10, Vol 2 = 11-18, Vol 3 = 19-26, Vol 4 = 27-33, Vol 5 = 34-41, Vol 6 = 42-48, per the fandom volume pages). AniList's 143-chapter total additionally counts the interleaved side-story volumes, which the anime does not adapt — the unadapted tail entry extends to 143 to cover Vols 7-12 plus those side volumes. Cumulative episodes across S1 (13) + S2 \"Ni!\" (13) = 26. Ranges are APPROXIMATE: the Silver Link adaptation is non-linear and heavily filler-laden (community guides note \"much of season 1 was filler\" and advise reading the novels from the start rather than continuing from a fixed point); the two seasons together cover roughly LN volumes 1-6, with season 2 ending around the summer Test of Courage / haunted-house battle (~Vol 6). No theatrical films exist (only an OVA, \"Matsuri,\" and TV specials).", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 26], - "arc": "Exam Summoning Battles — Season 1 (Vols 1-3)" - }, - { - "episodes": [14, 26], - "chapters": [27, 48], - "arc": "Summer & Test of Courage — Season 2 \"Ni!\" (Vols 4-6)" - }, - { - "chapters": [49, 143], - "arc": "Unadapted light-novel arcs (Vols 7-12 + side-story volumes)" - } - ] -} diff --git a/src/data/mappings/bakemonogatari.json b/src/data/mappings/bakemonogatari.json deleted file mode 100644 index 6f5cf85..0000000 --- a/src/data/mappings/bakemonogatari.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 5081, - "anilistMangaId": 101311, - "title": "Bakemonogatari", - "sourceNotes": "First season of the Monogatari Series anime (15 eps, 2009, SHAFT). Paired with the Oh! Great manga retelling (193 chapters / 25 vols, 2018-2024). The manga covers far more material than Bakemonogatari alone, continuing through later arcs in the Monogatari series. Other Monogatari Series anime seasons (Nise, Kizu, Owari, etc.) are separate AniList entries.", - "mappings": [ - { "episodes": [1, 2], "chapters": [1, 12], "arc": "Hitagi Crab" }, - { "episodes": [3, 5], "chapters": [13, 28], "arc": "Mayoi Snail" }, - { "episodes": [6, 8], "chapters": [29, 44], "arc": "Suruga Monkey" }, - { "episodes": [9, 10], "chapters": [45, 56], "arc": "Nadeko Snake" }, - { "episodes": [11, 15], "chapters": [57, 75], "arc": "Tsubasa Cat" }, - { "chapters": [76, 193], "arc": "Later Monogatari arcs (continuing manga)" } - ] -} diff --git a/src/data/mappings/baki-hanma.json b/src/data/mappings/baki-hanma.json deleted file mode 100644 index 04229bd..0000000 --- a/src/data/mappings/baki-hanma.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "anilistAnimeId": 124195, - "anilistMangaId": 37760, - "title": "Baki Hanma", - "sourceNotes": "Cumulative eps 1-39 across Hanma Baki (2021, 12 eps) + Hanma Baki Season 2 (2023, 27 eps split into two 13/14-ep cours). Adapts the `Hanma Baki: Son of Ogre` manga (314 ch). Successor to `baki.json`; precedes `baki-dou` (Baki-Dou 2014 manga, anime adaptation aired 2026). Arc-level approximation.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 75], - "arc": "Pickle Wars (Prehistoric Era) Part 1" - }, - { - "episodes": [13, 25], - "chapters": [76, 148], - "arc": "Pickle Wars (Prehistoric Era) Part 2" - }, - { "episodes": [26, 39], "chapters": [149, 314], "arc": "Father vs Son" } - ] -} diff --git a/src/data/mappings/baki.json b/src/data/mappings/baki.json deleted file mode 100644 index 5c9b71c..0000000 --- a/src/data/mappings/baki.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 97888, - "anilistMangaId": 35157, - "title": "Baki", - "sourceNotes": "Netflix 2018 Baki + 2020 Great Raitai Tournament Saga — cumulative eps 1-39 (26 + 13). Both adapt the 'Baki' (a.k.a. 'New Grappler Baki') manga (276 ch). The Maximum Tournament arc (~ch 105-220) is skipped by this lineage — that arc was adapted by the 2001 anime `Grappler Baki Maximum Tournament` and is not animated here. See `baki-hanma.json` for the next manga (Hanma Baki).", - "mappings": [ - { - "episodes": [1, 26], - "chapters": [1, 104], - "arc": "Most Evil Death Row Convicts" - }, - { - "episodes": [27, 39], - "chapters": [221, 276], - "arc": "Great Raitai Tournament (China Tournament)" - } - ] -} diff --git a/src/data/mappings/bakuman.json b/src/data/mappings/bakuman.json deleted file mode 100644 index 4417dca..0000000 --- a/src/data/mappings/bakuman.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "anilistAnimeId": 7674, - "anilistMangaId": 39711, - "title": "Bakuman.", - "sourceNotes": "Cumulative episodes across S1 (25) + S2 (25) + S3 (25) = 75. Source manga (AniList 39711) complete at 176 chapters / 20 volumes. Per the furansujapon anime-manga correspondence, Season 1 adapts ch 1-33, Season 2 ch 34-89, and Season 3 ch 90-176. Bakuman is a continuous narrative with no formal arc titles, so arcs here are named by the successive manga Ashirogi Muto create; internal chapter/episode boundaries are approximate and season-aligned. Confirmed anchors: Detective Trap (their first serialization) is cancelled at ch 53, and Reversi (final work) prep begins around ch 152-153 and runs to the finale at ch 176.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 16], - "arc": "Dreams and Reality" - }, - { - "episodes": [13, 25], - "chapters": [17, 33], - "arc": "Debut and Serialization Bid" - }, - { - "episodes": [26, 34], - "chapters": [34, 53], - "arc": "Detective Trap" - }, - { - "episodes": [35, 50], - "chapters": [54, 89], - "arc": "Run, Daihatsu Tanto!" - }, - { - "episodes": [51, 68], - "chapters": [90, 152], - "arc": "Perfect Crime Party (PCP)" - }, - { - "episodes": [69, 75], - "chapters": [153, 176], - "arc": "Reversi" - } - ] -} diff --git a/src/data/mappings/banana-fish.json b/src/data/mappings/banana-fish.json deleted file mode 100644 index 7ceabe4..0000000 --- a/src/data/mappings/banana-fish.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "anilistAnimeId": 100388, - "anilistMangaId": 30756, - "title": "Banana Fish", - "sourceNotes": "Manga complete at 110 chapters / 19 volumes (Akimi Yoshida, 1985-1994). Anime complete at 24 episodes (MAPPA, 2018) and is a faithful, near-complete adaptation of the entire manga, ending with Ash's death (volume 19, ch ~110). The setting is updated from the 1980s to the 2010s but the story beats are preserved. The manga has no clean official arc names; ranges below are derived from the 19-volume structure (~3 chapters/volume early on, ~5-6 later) and align the 24 episodes roughly one-volume-per-episode. Chapter boundaries are approximate. Excludes the side story 'Private Opinion' and the spin-off 'Garden of Light' (Angel Eyes), which the anime did not adapt as numbered chapters.", - "mappings": [ - { - "episodes": [1, 5], - "chapters": [1, 15], - "arc": "Banana Fish (Ash & Eiji meet; the drug surfaces)" - }, - { - "episodes": [6, 11], - "chapters": [16, 35], - "arc": "Imprisonment & Escape (Golzine, Dawson, the conspiracy)" - }, - { - "episodes": [12, 17], - "chapters": [36, 65], - "arc": "The Truth of Banana Fish (Cape Cod, Foxx, Yut-Lung)" - }, - { - "episodes": [18, 24], - "chapters": [66, 110], - "arc": "The Final Battle (New York showdown; Ash's end)" - } - ] -} diff --git a/src/data/mappings/banished-from-the-heros-party.json b/src/data/mappings/banished-from-the-heros-party.json deleted file mode 100644 index ed7526d..0000000 --- a/src/data/mappings/banished-from-the-heros-party.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "anilistAnimeId": 126213, - "anilistMangaId": 104475, - "title": "Banished from the Hero's Party, I Decided to Live a Quiet Life in the Countryside", - "sourceNotes": "Light-novel-based; ranges are by LN VOLUME (the source, AniList id 104475), not manga chapters — AniList lists no chapter count for the source and the community episode↔source guides all track volumes. The \"chapters\" fields therefore hold volume numbers. Cumulative episodes across S1 (13) + S2 (12) = 25. S1 adapts volumes 1-4 (condensing four volumes by trimming action to keep the slow-life tone). S2 adapts volumes 5, 8 and 9, deliberately SKIPPING volumes 6 and 7 (so after S2 the LN resumes at volume 10). Within-season per-volume episode boundaries are approximate. LN complete at 15 volumes (final vol. released July 2025); volumes 10-15 are unadapted.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 1], - "arc": "Red's Apothecary in Zoltan (Vol. 1)" - }, - { - "episodes": [5, 8], - "chapters": [2, 2], - "arc": "Rit and the Bighawk Incident (Vol. 2)" - }, - { - "episodes": [9, 11], - "chapters": [3, 3], - "arc": "Ruti and the Devil's Blessing (Vol. 3)" - }, - { - "episodes": [12, 13], - "chapters": [4, 4], - "arc": "Confrontation with Ares (Vol. 4)" - }, - { - "episodes": [14, 17], - "chapters": [5, 5], - "arc": "The New Hero Van (Vol. 5)" - }, - { - "chapters": [6, 7], - "arc": "Skipped by the anime (Vol. 6-7)" - }, - { - "episodes": [18, 21], - "chapters": [8, 8], - "arc": "Zoltan in Turmoil (Vol. 8)" - }, - { - "episodes": [22, 25], - "chapters": [9, 9], - "arc": "The Contract Demon (Vol. 9)" - }, - { - "chapters": [10, 15], - "arc": "Unadapted (Vol. 10-15)" - } - ] -} diff --git a/src/data/mappings/barakamon.json b/src/data/mappings/barakamon.json deleted file mode 100644 index e3deb22..0000000 --- a/src/data/mappings/barakamon.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 20722, - "anilistMangaId": 47051, - "title": "Barakamon", - "sourceNotes": "Single-season TV anime (12 eps, 2014, Kinema Citrus) adapts Satsuki Yoshino's manga through the end of Volume 6 / Act 52, so a viewer resumes reading at Act 53. The main story concluded at Act 134 across 18 volumes (Dec 2018); AniList counts 146 chapters / 19 volumes because it also includes the 2023 limited-revival 'Barakamon 18+1' (Vol 19) and the interstitial '.5' bonus acts, so the unadapted tail extends to 146. The Handa-kun prequel spin-off and the Mijikamon ONA shorts are separate entries and are excluded. There are no theatrical films. This is pure slice-of-life with no named arcs, and the anime reorders/condenses chapters, so episode-to-chapter groupings are coarse and approximate.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 16], - "arc": "Exiled to Gotō Island (Handa Arrives & Meets Naru)" - }, - { - "episodes": [4, 7], - "chapters": [17, 34], - "arc": "Island Summer (Beach, Tokyo Visitors & Fishing)" - }, - { - "episodes": [8, 12], - "chapters": [35, 52], - "arc": "Festivals, the Tokyo Exhibition & Coming Home (anime portion)" - }, - { - "chapters": [53, 146], - "arc": "Continued Island Life → Conclusion (unadapted tail; ch 135-146 are the 2023 '18+1' revival)" - } - ] -} diff --git a/src/data/mappings/beast-tamer.json b/src/data/mappings/beast-tamer.json deleted file mode 100644 index 5e2d59f..0000000 --- a/src/data/mappings/beast-tamer.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "anilistAnimeId": 150695, - "anilistMangaId": 108115, - "title": "Beast Tamer", - "sourceNotes": "Single-cour, 13 episodes, adapted primarily from the light novel (covering LN Vols. 1-2 plus the first two chapters of Vol. 3); the tie-in manga runs at a different pace, with manga ch. 69 marking the recommended restart point after the anime. Manga ongoing (current ch. 102, 11 volumes as of March 2026). No distinct named arcs — broad coverage entries used.", - "mappings": [ - { "episodes": [1, 13], "chapters": [1, 68], "arc": "Anime Adaptation" }, - { "chapters": [69, 102], "arc": "Post-Anime Story (Unadapted)" } - ] -} diff --git a/src/data/mappings/beastars.json b/src/data/mappings/beastars.json deleted file mode 100644 index 263c487..0000000 --- a/src/data/mappings/beastars.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "anilistAnimeId": 107660, - "anilistMangaId": 98587, - "title": "Beastars", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (12) + Final Season Part 1 (12) + Final Season Part 2 (12). Manga complete at 196 chapters; anime adapts the full run. Arc boundaries from Beastars Wiki.", - "mappings": [ - { "episodes": [1, 5], "chapters": [1, 17], "arc": "Drama Club" }, - { "episodes": [6, 12], "chapters": [18, 49], "arc": "Meteor Festival" }, - { - "episodes": [13, 24], - "chapters": [50, 98], - "arc": "Murder Incident Solution" - }, - { - "episodes": [25, 29], - "chapters": [99, 123], - "arc": "Interspecies Relations" - }, - { - "episodes": [30, 48], - "chapters": [124, 196], - "arc": "Revenge of the Love Failure (Final Arc)" - } - ] -} diff --git a/src/data/mappings/beck-mongolian-chop-squad.json b/src/data/mappings/beck-mongolian-chop-squad.json deleted file mode 100644 index afceed4..0000000 --- a/src/data/mappings/beck-mongolian-chop-squad.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "anilistAnimeId": 57, - "anilistMangaId": 30145, - "title": "Beck: Mongolian Chop Squad", - "sourceNotes": "26 episodes. Manga complete at 103 chapters across 34 volumes. The anime is a close adaptation through episode 24, then compresses and diverges more freely from the start of the American tour arc (manga ch. 23) through its ch. 33 finale; chapters 34-103 (later albums, tours, and international record deals) are unadapted manga-only continuation.", - "mappings": [ - { - "episodes": [1, 24], - "chapters": [1, 22], - "arc": "Formation and Rise in Japan" - }, - { "episodes": [25, 26], "chapters": [23, 33], "arc": "American Tour" }, - { "chapters": [34, 103], "arc": "Unadapted manga continuation" } - ] -} diff --git a/src/data/mappings/beelzebub.json b/src/data/mappings/beelzebub.json deleted file mode 100644 index 0614f57..0000000 --- a/src/data/mappings/beelzebub.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 9513, - "anilistMangaId": 40010, - "title": "Beelzebub", - "sourceNotes": "Single 60-episode TV anime (2011-2012). Main manga complete at 240 chapters (final chapter 240 'Goodbub!! Ishiyama High') across 27 volumes, plus 6 extra 'Beelzebub Another' chapters in vol 28 (28 vols total). (AniList lists 252 by also counting specials/bonus entries; the canonical numbered main run ends at 240.) The anime is a fairly faithful adaptation through chapter 121 (reached in episode 59), then diverges with an anime-original ending in episode 60 (excluded from the chapter mapping). Per-arc episode anchors (animefillerguide): Tohoshinki arc ends ch 40 at ep 22; Demon World arc ends ch 47 at ep 24; Saint Ishiyama/Rokkisei arc ends ch 76 at ep 36; Prince En arc ends ch 113 at ep 50; ep 59 covers ch 119-121 (mid Akumano Academy arc). Anime contains scattered filler. Chapters 122-240 (rest of Akumano Academy plus all later arcs and the manga's conclusion) are entirely unadapted (chapters-only tail).", - "mappings": [ - { - "episodes": [1, 22], - "chapters": [1, 40], - "arc": "Tohoshinki Arc" - }, - { - "episodes": [23, 24], - "chapters": [41, 47], - "arc": "Demon World Arc" - }, - { - "episodes": [25, 36], - "chapters": [48, 76], - "arc": "Saint Ishiyama Academy / Rokkisei Arc" - }, - { - "episodes": [37, 50], - "chapters": [77, 113], - "arc": "Prince En Arc" - }, - { - "episodes": [51, 59], - "chapters": [114, 121], - "arc": "Akumano Academy Arc (anime diverges; ep 60 is anime-original)" - }, - { - "chapters": [122, 240], - "arc": "Akumano Academy conclusion & later arcs through finale (unadapted)" - } - ] -} diff --git a/src/data/mappings/berserk-of-gluttony.json b/src/data/mappings/berserk-of-gluttony.json deleted file mode 100644 index 180167e..0000000 --- a/src/data/mappings/berserk-of-gluttony.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "anilistAnimeId": 156039, - "anilistMangaId": 101625, - "title": "Berserk of Gluttony", - "sourceNotes": "Single 12-episode season, adapted at a clean pace of 2 episodes per manga volume (5 chapters each). Adapts manga (THE COMIC) volumes 1-6, chapters 1-30; viewers are pointed to pick the manga back up at ch. 31. Manga ongoing (current ch. 79 as of July 2026, ~15 volumes released). Note: AniList's direct 'ADAPTATION' edge from the anime points to Isshiki Ichika's original light novel (id 100687), with the manga marked as an 'ALTERNATIVE' adaptation of that same novel — the manga is used here as the source of truth for chapters/arcs since it is the visual medium this repo's chapter-based navigation is built around. A second season has been announced but not yet released.", - "mappings": [ - { "episodes": [1, 2], "chapters": [1, 5], "arc": "Awakening of Gluttony" }, - { - "episodes": [3, 4], - "chapters": [6, 10], - "arc": "Hart Estate & the Crowned Beast" - }, - { - "episodes": [5, 6], - "chapters": [11, 15], - "arc": "Journey to Galia / The Girl of Wrath" - }, - { - "episodes": [7, 8], - "chapters": [16, 20], - "arc": "The Twilight Swordsman / Village of Lost Memories" - }, - { - "episodes": [9, 10], - "chapters": [21, 25], - "arc": "The Guardian of Lust" - }, - { - "episodes": [11, 12], - "chapters": [26, 30], - "arc": "Domain of E / Death March" - } - ] -} diff --git a/src/data/mappings/berserk.json b/src/data/mappings/berserk.json deleted file mode 100644 index 3c626a6..0000000 --- a/src/data/mappings/berserk.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "anilistAnimeId": 33, - "anilistMangaId": 30002, - "title": "Berserk (1997)", - "sourceNotes": "1997 TV series; covers Black Swordsman intro + Golden Age arc (manga ch ~1–94). Conviction arc onward is adapted by the 2016/2017 series and the Golden Age movies. Arc-level approximation.", - "mappings": [ - { - "episodes": [1, 1], - "chapters": [1, 8], - "arc": "Black Swordsman (prologue)" - }, - { "episodes": [2, 6], "chapters": [9, 32], "arc": "Band of the Hawk" }, - { "episodes": [7, 13], "chapters": [33, 56], "arc": "Hundred-Year War" }, - { "episodes": [14, 19], "chapters": [57, 75], "arc": "Conspiracy" }, - { "episodes": [20, 25], "chapters": [76, 94], "arc": "Eclipse" }, - { "chapters": [95, 176], "arc": "Conviction" }, - { "chapters": [177, 306], "arc": "Millennium Falcon" }, - { "chapters": [307, 383], "arc": "Fantasia" } - ] -} diff --git a/src/data/mappings/beyond-the-boundary.json b/src/data/mappings/beyond-the-boundary.json deleted file mode 100644 index b1c038d..0000000 --- a/src/data/mappings/beyond-the-boundary.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 18153, - "anilistMangaId": 80117, - "title": "Beyond the Boundary", - "sourceNotes": "S1 anime (12 eps, 2013, Kyoto Animation) adapts Nagomu Torii's light novel. AniList has no manga-adaptation entry for this series, so this maps to the light novel (id 80117), treating its 3 published volumes as 'chapters' 1-3; boundaries are approximate because KyoAni heavily reordered and added original material. The film 'I'll Be Here -Future-' (2015) is a canon sequel with new content (included below); 'I'll Be Here -Past-' (2015) is a recap re-edit of eps 1-12 and is excluded.", - "mappings": [ - { - "episodes": [1, 7], - "chapters": [1, 2], - "arc": "Hollow Shadow Arc (Mirai & Akihito)" - }, - { - "episodes": [8, 12], - "chapters": [3, 3], - "arc": "Beyond the Boundary Arc (climax)" - } - ], - "movies": [ - { - "anilistId": 20963, - "title": "Beyond the Boundary -I'LL BE HERE-: Future", - "year": 2015, - "afterEpisode": 12, - "note": "Canon sequel film with new content continuing after the TV series." - } - ] -} diff --git a/src/data/mappings/black-bullet.json b/src/data/mappings/black-bullet.json deleted file mode 100644 index 12778f5..0000000 --- a/src/data/mappings/black-bullet.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 20457, - "anilistMangaId": 75559, - "title": "Black Bullet", - "sourceNotes": "Single 13-episode TV anime (2014); no sequels, so episodes are not cumulative. The source is Shiden Kanzaki's light novel (7 volumes, completed 2017). The linked Black Bullet manga (AniList id 75559, type MANGA) is a short, incomplete adaptation — only 20 chapters / 4 volumes covering the opening — so this mapping uses LIGHT-NOVEL VOLUME numbers as the 'chapters' unit instead. The anime adapts LN vols 1-4; vols 5-7 (Rentaro Satomi, Fugitive / Purgatory Strider / The Bullet That Changed the World) were never animated. Episode-to-volume boundaries are approximate (sources vary; some cite vols 1-3). No theatrical films — the lone 'Tenchuu*Girls' release is an OVA short and is omitted.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 1], - "arc": "Civil Security introduction — Those Who Would Be Gods (Rentaro & Enju, Kagetane Hiruko) (LN vol 1)" - }, - { - "episodes": [5, 7], - "chapters": [2, 2], - "arc": "Seitenshi Assassination plot — Against a Perfect Sniper (Tina Sprout) (LN vol 2)" - }, - { - "episodes": [8, 13], - "chapters": [3, 4], - "arc": "Third Kanto Battle / Legacy of the Seven Stars — the war for Tokyo Area vs the Gastrea Aldebaran (LN vols 3-4)" - }, - { - "chapters": [5, 7], - "arc": "Rentaro Satomi, Fugitive / Purgatory Strider / The Bullet That Changed the World (LN vols 5-7, unadapted)" - } - ] -} diff --git a/src/data/mappings/black-butler.json b/src/data/mappings/black-butler.json deleted file mode 100644 index 10ec45c..0000000 --- a/src/data/mappings/black-butler.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "anilistAnimeId": 4898, - "anilistMangaId": 33866, - "title": "Black Butler", - "sourceNotes": "Original 2008 S1 anime (24 eps). Eps 1-15 faithfully adapt the first three manga arcs (~ch 1-25); eps 16-24 diverge into an anime-original ending. Black Butler II (S2, id 6707) is entirely anime-original. The 2014+ re-adaptations (Book of Circus, Book of Murder, Book of the Atlantic, Public School Arc) re-adapt later manga arcs faithfully under separate AniList IDs and would each warrant their own mapping. Manga ongoing (~220 chapters).", - "mappings": [ - { "episodes": [1, 6], "chapters": [1, 9], "arc": "Jack the Ripper" }, - { - "episodes": [7, 12], - "chapters": [10, 17], - "arc": "Indian Curry / Highland Manor" - }, - { - "episodes": [13, 15], - "chapters": [18, 25], - "arc": "Houndsworth (S1 diverges into anime-original ending at ep 16)" - } - ], - "movies": [ - { - "anilistId": 21425, - "title": "Black Butler: Book of the Atlantic", - "year": 2017, - "chapters": [51, 66], - "note": "Adapts the Luxury Liner arc; follows the Book of Circus continuity rather than the 2008 series." - } - ] -} diff --git a/src/data/mappings/black-clover.json b/src/data/mappings/black-clover.json deleted file mode 100644 index 5ba37f9..0000000 --- a/src/data/mappings/black-clover.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "anilistAnimeId": 97940, - "anilistMangaId": 86123, - "title": "Black Clover", - "sourceNotes": "Single 170-episode anime run across 4 seasons. Anime adapted through ch ~270 (start of Spade Kingdom Raid). Manga ongoing (current ch. 392); unadapted tail included. Arc boundaries from Black Clover Wiki.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 10], - "arc": "Magic Knights Entrance" - }, - { - "episodes": [14, 19], - "chapters": [11, 21], - "arc": "Dungeon Exploration" - }, - { - "episodes": [20, 27], - "chapters": [22, 37], - "arc": "Royal Capital Assault" - }, - { - "episodes": [28, 39], - "chapters": [38, 56], - "arc": "Eye of the Midnight Sun" - }, - { "episodes": [40, 51], "chapters": [57, 74], "arc": "Seabed Temple" }, - { "episodes": [52, 65], "chapters": [75, 101], "arc": "Witches' Forest" }, - { "episodes": [66, 96], "chapters": [102, 149], "arc": "Royal Knights" }, - { - "episodes": [97, 157], - "chapters": [150, 228], - "arc": "Elf Reincarnation" - }, - { - "episodes": [158, 167], - "chapters": [229, 260], - "arc": "Heart Kingdom Joint Struggle" - }, - { - "episodes": [168, 170], - "chapters": [261, 331], - "arc": "Spade Kingdom Raid" - }, - { "chapters": [332, 392], "arc": "Judgment Day (Final Arc)" } - ], - "movies": [ - { - "anilistId": 131680, - "title": "Black Clover: Sword of the Wizard King", - "year": 2023, - "afterEpisode": 170, - "note": "Canon side-story film set after the Spade Kingdom arc." - } - ] -} diff --git a/src/data/mappings/black-lagoon.json b/src/data/mappings/black-lagoon.json deleted file mode 100644 index c5a1249..0000000 --- a/src/data/mappings/black-lagoon.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "anilistAnimeId": 889, - "anilistMangaId": 30735, - "title": "Black Lagoon", - "sourceNotes": "Cumulative episodes: TV Season 1 'Black Lagoon' (id 889, eps 1-12) + TV Season 2 'The Second Barrage' (id 1519, eps 13-24) + OVA 'Roberta's Blood Trail' (id 4901, eps 25-29). Manga is ongoing (chapter 0 prologue, latest published ch. 122 as of mid-2026; 13 volumes collected through ch. 116). The TV anime reorders several early arcs relative to the manga, so per-episode chapter splits are approximate; the firm anchors are the cumulative resume points: chapter 44 after the TV run (ep 24) and chapter 77 after the OVA (ep 29). Everything from ch. 77 onward is unadapted (chapters-only tail). Note the OVA's ending diverges from the manga arc's ending.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [0, 10], - "arc": "The Black Lagoon / Ring-Ding Ship Chase / Rasta Blasta" - }, - { - "episodes": [13, 15], - "chapters": [11, 20], - "arc": "Bloodsport Fairy Tale (Hansel & Gretel)" - }, - { - "episodes": [16, 18], - "chapters": [38, 43], - "arc": "Greenback Jane" - }, - { - "episodes": [19, 24], - "chapters": [21, 37], - "arc": "Fujiyama Gangsta Paradise (Japan / Washimine yakuza)" - }, - { - "episodes": [25, 29], - "chapters": [44, 76], - "arc": "El Baile de la Muerte (Roberta's Blood Trail, OVA)" - }, - { - "chapters": [77, 101], - "arc": "The Wired Red Wild Card (unadapted)" - }, - { - "chapters": [102, 109], - "arc": "L'homme Sombre (unadapted)" - }, - { - "chapters": [110, 116], - "arc": "New Girl in the Hood / Where the Chips Fall (unadapted)" - }, - { - "chapters": [117, 122], - "arc": "El Requiem de los Desalmados (unadapted, ongoing)" - } - ] -} diff --git a/src/data/mappings/black-summoner.json b/src/data/mappings/black-summoner.json deleted file mode 100644 index 77c2545..0000000 --- a/src/data/mappings/black-summoner.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "anilistAnimeId": 145260, - "anilistMangaId": 101746, - "title": "Black Summoner", - "sourceNotes": "Single 12-episode season (2022). Manga ongoing (current ch. 194 as of July 2026); both anime and manga adapt the same Doufu Mayoi light novel. The anime adapts manga chapters 1-36 (all of LN Volume 1-2 material). Arc split follows the anime's own turn from the early Black Wind bandits material into the S-Rank Promotion Exam starting episode 7; chapter split within that range is approximate.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 18], - "arc": "Reincarnation & the Black Wind Bandits" - }, - { - "episodes": [7, 12], - "chapters": [19, 36], - "arc": "S-Rank Promotion Exam" - }, - { "chapters": [37, 194], "arc": "Unadapted Manga (Post-Anime, Ongoing)" } - ] -} diff --git a/src/data/mappings/blade-dance-of-the-elementalers.json b/src/data/mappings/blade-dance-of-the-elementalers.json deleted file mode 100644 index a2e8027..0000000 --- a/src/data/mappings/blade-dance-of-the-elementalers.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "anilistAnimeId": 20663, - "anilistMangaId": 73509, - "title": "Blade Dance of the Elementalers", - "sourceNotes": "Single season, 12 episodes. Adapted from Yu Shimizu's 20-volume light novel, but both the anime and the manga (Hyoju Issei, complete at 43 chapters / 6 volumes) cover only the Areishia Spirit Academy Arc (light novel Vol. 1-3), so the two are a clean 1:1 match with no unadapted tail.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 43], - "arc": "Areishia Spirit Academy Arc" - } - ] -} diff --git a/src/data/mappings/blast-of-tempest.json b/src/data/mappings/blast-of-tempest.json deleted file mode 100644 index 2abeb70..0000000 --- a/src/data/mappings/blast-of-tempest.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 14075, - "anilistMangaId": 45205, - "title": "Blast of Tempest", - "sourceNotes": "Single continuous 24-episode run (Bones, 2012-2013) that adapted the complete manga and concluded roughly alongside it, so no anime-original ending. Manga complete at 50 chapters / 10 volumes on AniList (some sources count ~44 numbered chapters plus side/extra chapters). Pacing is roughly 2 chapters per episode. Episode 13 (\"Philosophy of Dreams\") is largely a recap/bridge told from Mahiro's POV. The story has a clear two-part structure homaging Shakespeare: the first cour (eps 1-12) is \"The Tempest\" (Hakaze and the Kusaribe clan's conflict over the Tree of Exodus), and the second cour (eps 13-24) is \"Hamlet\" (the mystery of who killed Aika). Chapter boundaries within each half are approximate; the split follows the ep 12/13 cour break.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 25], - "arc": "The Tempest (Tree of Exodus)" - }, - { - "episodes": [13, 24], - "chapters": [26, 50], - "arc": "Hamlet (Aika's Death)" - } - ] -} diff --git a/src/data/mappings/bleach-tybw.json b/src/data/mappings/bleach-tybw.json deleted file mode 100644 index 37d145f..0000000 --- a/src/data/mappings/bleach-tybw.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 116674, - "anilistMangaId": 30012, - "title": "Bleach: Thousand-Year Blood War", - "sourceNotes": "TYBW arc only (manga ch ~480–686). Cumulative episode numbering across S1 (13) + S2 (13) + S3 (14). Chapter ranges approximate.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [480, 541], - "arc": "TYBW Part 1 — The Blood Warfare" - }, - { - "episodes": [14, 26], - "chapters": [542, 605], - "arc": "TYBW Part 2 — The Separation" - }, - { - "episodes": [27, 40], - "chapters": [606, 686], - "arc": "TYBW Part 3 — The Conflict" - } - ] -} diff --git a/src/data/mappings/bleach.json b/src/data/mappings/bleach.json deleted file mode 100644 index 01050f1..0000000 --- a/src/data/mappings/bleach.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "anilistAnimeId": 269, - "anilistMangaId": 30012, - "title": "Bleach", - "sourceNotes": "Original 2004-2012 anime (366 episodes) covering manga chapters 1-479. Filler arcs (Bount eps 64-109, Amagai eps 168-189, Zanpakutō Unknown Tales / Beast Swords eps 230-265, Gotei 13 Invading Army eps 317-342, Past Arc / Turn Back the Pendulum eps 206-212) omitted — they adapt no main-numbered chapters. Manga complete at 706 chapters; Thousand-Year Blood War (chapters 480-686) is covered by `bleach-tybw`.", - "mappings": [ - { - "episodes": [1, 20], - "chapters": [1, 70], - "arc": "Substitute Shinigami / Agent of the Shinigami" - }, - { - "episodes": [21, 41], - "chapters": [71, 117], - "arc": "Soul Society: The Sneak Entry" - }, - { - "episodes": [42, 63], - "chapters": [118, 181], - "arc": "Soul Society: The Rescue" - }, - { - "episodes": [110, 131], - "chapters": [182, 229], - "arc": "Arrancar: The Arrival" - }, - { - "episodes": [132, 151], - "chapters": [230, 251], - "arc": "Arrancar: The Hueco Mundo Sneak Entry" - }, - { - "episodes": [152, 167], - "chapters": [252, 286], - "arc": "Arrancar: The Fierce Fight" - }, - { - "episodes": [190, 205], - "chapters": [287, 315], - "arc": "Arrancar vs. Shinigami" - }, - { - "episodes": [213, 229], - "chapters": [316, 340], - "arc": "Arrancar: Decisive Battle of Karakura" - }, - { - "episodes": [266, 316], - "chapters": [341, 423], - "arc": "Arrancar: Downfall (Hueco Mundo Finale)" - }, - { - "episodes": [343, 366], - "chapters": [424, 479], - "arc": "The Lost Substitute Shinigami / Fullbring" - } - ], - "movies": [ - { - "anilistId": 1686, - "title": "Bleach the Movie: Memories of Nobody", - "year": 2006, - "afterEpisode": 117, - "note": "Side story (anime-original)." - }, - { - "anilistId": 2889, - "title": "Bleach the Movie: The DiamondDust Rebellion", - "year": 2007, - "afterEpisode": 137, - "note": "Side story (anime-original)." - }, - { - "anilistId": 4835, - "title": "Bleach the Movie: Fade to Black", - "year": 2008, - "afterEpisode": 196, - "note": "Side story (anime-original)." - }, - { - "anilistId": 8247, - "title": "Bleach the Movie: Hell Verse", - "year": 2010, - "afterEpisode": 299, - "note": "Side story (anime-original)." - } - ] -} diff --git a/src/data/mappings/blend-s.json b/src/data/mappings/blend-s.json deleted file mode 100644 index 20b7399..0000000 --- a/src/data/mappings/blend-s.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 97994, - "anilistMangaId": 93940, - "title": "Blend-S", - "sourceNotes": "Single 12-episode TV season (2017, A-1 Pictures). Paired with Miyuki Nakayama's original Blend-S 4-koma (id 93940), a Manga Time Kirara Carat slice-of-life serial; AniList lists it as complete at 115 chapters / 8 volumes. 4-koma source — chapter ranges are approximate: the gag-style vignettes do not map 1:1 to episodes, so the 12 episodes adapt roughly the early chapters/volumes (several 4-koma per episode) in loose chronological order. There are no story arcs, so the adaptation is treated as one episodic entry plus an unadapted manga tail. No theatrical films exist, so no movies are listed.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 45], - "arc": "Café Stile everyday life (Maika joins the staff; the cast's café antics) — roughly vols 1-3, approximate" - }, - { - "chapters": [46, 115], - "arc": "Later 4-koma vignettes (vols 4-8) — manga only, approximate continuation" - } - ] -} diff --git a/src/data/mappings/blood-blockade-battlefront.json b/src/data/mappings/blood-blockade-battlefront.json deleted file mode 100644 index 99bca2e..0000000 --- a/src/data/mappings/blood-blockade-battlefront.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 20727, - "anilistMangaId": 42994, - "title": "Blood Blockade Battlefront", - "sourceNotes": "Cumulative episodes across S1 'Blood Blockade Battlefront' (12) + S2 'Kekkai Sensen & Beyond' (12, eps 13-24) = 24 total. Paired with Yasuhiro Nightow's original manga (AniList id 42994), complete at 10 volumes (AniList lists 33 chapters, including .5 interstitials; Wikipedia counts 30 numbered chapters). The anime adapts the episodic manga NON-LINEARLY and wraps it in heavy anime-original framing (the Black & White twins, Femt, and the Blood Breed / King of Despair throughline of the S1 finale are largely anime-original); per-arc chapter boundaries are therefore approximate. S2 is more faithful and ends on the manga's actual finale, 'Spectral Eyes, Phantom Vision' (vol 10).", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 14], - "arc": "Season 1 (Libra / Leonardo & the All-Seeing Eyes) — manga vols 1-6, non-linear + anime-original" - }, - { - "episodes": [13, 24], - "chapters": [15, 33], - "arc": "Season 2 '& Beyond' (vols 6-10) incl. 'Spectral Eyes, Phantom Vision' finale" - } - ] -} diff --git a/src/data/mappings/blood-c.json b/src/data/mappings/blood-c.json deleted file mode 100644 index 5e1595f..0000000 --- a/src/data/mappings/blood-c.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 10490, - "anilistMangaId": 56182, - "title": "Blood-C", - "sourceNotes": "Single 12-episode TV season (2011, Production I.G / CLAMP). Paired with Ranmaru Kotone's tie-in manga (4 volumes, complete at 17 chapters), which was written alongside the anime and covers both the TV series and the follow-up film Blood-C: The Last Dark in its final volume. Original anime; manga is a close tie-in adaptation, not the source material. Chapter split between the TV story and the film is approximate since exact per-chapter tables were not available.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 13], - "arc": "Elder Bairn Hunt in Sonozaki Town (TV series)" - }, - { - "chapters": [14, 17], - "arc": "The Last Dark (film-only continuation, see movies)" - } - ], - "movies": [ - { - "anilistId": 10681, - "title": "BLOOD-C: The Last Dark", - "year": 2012, - "chapters": [14, 17], - "afterEpisode": 12, - "note": "Direct canon sequel film concluding the Blood-C story; adapted in the manga's fourth volume." - } - ] -} diff --git a/src/data/mappings/blood-lad.json b/src/data/mappings/blood-lad.json deleted file mode 100644 index b1219a8..0000000 --- a/src/data/mappings/blood-lad.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 11633, - "anilistMangaId": 51614, - "title": "Blood Lad", - "sourceNotes": "Single-cour 2013 TV anime (10 episodes, Brain's Base) adapting Yuuki Kodama's manga (complete, 85 chapters / 17 volumes per AniList). The anime covers roughly volumes 1-4, ending mid-story on the resurrection quest, so a viewer resumes the manga around chapter 24. Chapter boundaries are approximate, derived from the volume-to-episode pacing (~5 chapters per volume); the action-comedy's episodic structure makes exact cut points fuzzy. The 'Wagahai wa Neko de wa Nai' OVA, the 'Kanketsu Kinen' ONA, the side-story spinoff 'Bloody Brat', and the light novel are separate entries; there are no theatrical films.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 5], - "arc": "Staz & Fuyumi — A Vampire's Promise" - }, - { - "episodes": [3, 5], - "chapters": [6, 12], - "arc": "The Demon World & Wolf" - }, - { - "episodes": [6, 7], - "chapters": [13, 17], - "arc": "The Human World & Bell's Treasure" - }, - { - "episodes": [8, 10], - "chapters": [18, 23], - "arc": "The Resurrection Quest (Braz & Liz Blood)" - }, - { - "chapters": [24, 85], - "arc": "Beyond the Anime (unadapted)" - } - ] -} diff --git a/src/data/mappings/bloom-into-you.json b/src/data/mappings/bloom-into-you.json deleted file mode 100644 index d4f45b4..0000000 --- a/src/data/mappings/bloom-into-you.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "anilistAnimeId": 101573, - "anilistMangaId": 86218, - "title": "Bloom Into You", - "sourceNotes": "Single-cour TV anime (13 episodes, 2018) by Nakatani Nio's yuri manga, complete at 45 chapters across 8 volumes. The anime adapts chapters 1-24 (volumes 1-4) faithfully, ending around the student council play preparations; a reader resumes at chapter 25, which begins the manga-exclusive second half (the play performance and the Yuu-Touko resolution). AniList reports 53 chapters because it counts the per-volume bonus/interlude chapters; the canonical main-story numbering ends at 45, which this mapping uses. Episode-to-chapter boundaries are approximate.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 7], - "arc": "Yuu & Touko / Student Council" - }, - { - "episodes": [5, 8], - "chapters": [8, 15], - "arc": "Sayaka & the Play Proposal" - }, - { - "episodes": [9, 11], - "chapters": [16, 22], - "arc": "Play Preparations / Rising Feelings" - }, - { - "episodes": [12, 13], - "chapters": [23, 24], - "arc": "Suddenly Suffocating (Anime Finale)" - }, - { - "chapters": [25, 34], - "arc": "The Student Council Play (unadapted)" - }, - { - "chapters": [35, 45], - "arc": "After the Play / Resolution (unadapted)" - } - ] -} diff --git a/src/data/mappings/blue-box.json b/src/data/mappings/blue-box.json deleted file mode 100644 index 230a7b4..0000000 --- a/src/data/mappings/blue-box.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 170942, - "anilistMangaId": 132182, - "title": "Blue Box", - "sourceNotes": "S1 (25 eps across 2 cours, 2024-25) is a faithful ~3-chapters-per-episode adaptation of Kouji Miura's ongoing Weekly Shonen Jump manga, covering ch 1 through ch 80 (the finale adapts ch 77-80, with ch 80's content brought slightly forward). A viewer resumes reading at ch 81. Episode-to-chapter boundaries follow published episode guides; arc groupings are an approximate segmentation of this sports-romance. The manga is ongoing (ch 247 as of June 2026, 25 volumes); the unadapted tail is chapters-only. A Season 2 (AniList id 189123, Electric Circus) is announced but unreleased, so episode numbering is not yet cumulative.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 12], - "arc": "Chinatsu Moves In: Taiki, Badminton & the Road to Nationals" - }, - { - "episodes": [5, 9], - "chapters": [13, 26], - "arc": "Summer Inter-High: The Aquarium Date & the Tournament" - }, - { - "episodes": [10, 13], - "chapters": [27, 41], - "arc": "Second Term: Hina & Shifting Feelings" - }, - { - "episodes": [14, 19], - "chapters": [42, 62], - "arc": "Summer Training Camp" - }, - { - "episodes": [20, 25], - "chapters": [63, 80], - "arc": "Sports Festival, the Amusement Park & Hina's Confession (S1 Finale)" - }, - { - "chapters": [81, 247], - "arc": "Beyond the Anime (manga-only, ongoing)" - } - ] -} diff --git a/src/data/mappings/blue-exorcist.json b/src/data/mappings/blue-exorcist.json deleted file mode 100644 index c845af6..0000000 --- a/src/data/mappings/blue-exorcist.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "anilistAnimeId": 9919, - "anilistMangaId": 43492, - "title": "Blue Exorcist", - "sourceNotes": "Cumulative episodes across five TV cours: Season 1 (2011, 25 eps) + Kyoto Saga (2017, eps 26-37) + Shimane Illuminati Saga (2024, eps 38-49) + Beyond the Snow Saga (2024, eps 50-61) + Blue Night / Yosuga Saga (2025, eps 62-73) = 73 total. Season 1 adapts the manga faithfully only through ~episode 17 (chapters 1-15); episodes 18-25 are an anime-original Satan/Gehenna Gate ending (no manga chapters). The 2017 Kyoto Saga rebooted continuity to follow the manga from the Impure King arc onward, so later cours track the manga closely. Manga ongoing in its final stretch: latest published chapter 166 (Vol. 34, May 2026), on hiatus with ch 167 resuming July 2026; the unadapted 'Of One Cloth' / Society arc (ch 121-166+) is listed chapters-only. Post-Illuminati arc names are fan/cour labels and per-episode chapter boundaries are approximate — refine via PR.", - "mappings": [ - { - "episodes": [1, 17], - "chapters": [1, 15], - "arc": "True Cross Academy / Exwire Exam (Introduction)" - }, - { - "episodes": [26, 37], - "chapters": [16, 34], - "arc": "Kyoto Impure King Arc (Kyoto Saga)" - }, - { - "episodes": [38, 49], - "chapters": [38, 68], - "arc": "Shimane Illuminati Arc" - }, - { - "episodes": [50, 61], - "chapters": [69, 99], - "arc": "Beyond the Snow Saga" - }, - { - "episodes": [62, 73], - "chapters": [100, 120], - "arc": "Blue Night / Yosuga Saga" - }, - { - "chapters": [121, 166], - "arc": "Of One Cloth / Society Arc (ongoing, current ch 166)" - } - ], - "movies": [ - { - "anilistId": 11737, - "title": "Blue Exorcist: The Movie", - "year": 2012, - "afterEpisode": 25, - "note": "Anime-original side story expanding the Phantom Train omake (Vol. 6); self-contained and non-canon." - } - ] -} diff --git a/src/data/mappings/blue-lock.json b/src/data/mappings/blue-lock.json deleted file mode 100644 index ebffd85..0000000 --- a/src/data/mappings/blue-lock.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "anilistAnimeId": 137822, - "anilistMangaId": 106130, - "title": "BLUE LOCK", - "sourceNotes": "Cumulative episodes across S1 (24) + S2 'Blue Lock VS. U-20 Japan' (14) = 38 episodes. S1 ends mid-Third-Selection (~ch. 94); S2 finishes the U-20 arc (~ch. 151). Manga ongoing in Weekly Shonen Magazine (current ~ch. 350); the entire Neo Egoist League arc is unadapted. Arc/season chapter boundaries are approximate.", - "mappings": [ - { - "episodes": [1, 5], - "chapters": [1, 38], - "arc": "Introduction / First Selection" - }, - { "episodes": [6, 19], "chapters": [39, 86], "arc": "Second Selection" }, - { "episodes": [20, 28], "chapters": [87, 108], "arc": "Third Selection" }, - { - "episodes": [29, 38], - "chapters": [109, 151], - "arc": "U-20 Arc (vs U-20 Japan)" - }, - { "chapters": [152, 350], "arc": "Neo Egoist League (unadapted, ongoing)" } - ], - "movies": [ - { - "anilistId": 163147, - "title": "BLUE LOCK THE MOVIE -EPISODE NAGI-", - "year": 2024, - "afterEpisode": 24, - "note": "Retells the early Blue Lock selection arcs from Seishiro Nagi's POV plus his backstory; adapts the spin-off manga 'Blue Lock -Episode Nagi-' (parallel continuity to S1)." - } - ] -} diff --git a/src/data/mappings/blue-period.json b/src/data/mappings/blue-period.json deleted file mode 100644 index 3f37456..0000000 --- a/src/data/mappings/blue-period.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 128705, - "anilistMangaId": 107237, - "title": "Blue Period", - "sourceNotes": "The 12-episode ONA adapts manga chapters 1-25 (volumes 1-6), ending with the Tokyo University of the Arts (Geidai) entrance-exam results in chapter 25 'No Regrets'. Pacing is a steady ~2 chapters/episode; the four section ranges are firm but the internal per-episode split points are approximations. Manga is ongoing (serialized in Monthly Afternoon); latest chapter approximately 87 with 19 volumes as of mid-2026. The only Blue Period film is a 2024 live-action movie, excluded here as it is not an anime adaptation.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 6], - "arc": "Yatora discovers art / decides to pursue Geidai" - }, - { - "episodes": [4, 6], - "chapters": [7, 16], - "arc": "Prep school / cram school & mock exams" - }, - { - "episodes": [7, 9], - "chapters": [17, 21], - "arc": "Primary (first-stage) entrance exam" - }, - { - "episodes": [10, 12], - "chapters": [22, 25], - "arc": "Secondary exam & final results" - }, - { - "chapters": [26, 87], - "arc": "University (Geidai) arc (unadapted, Vol. 7 onward)" - } - ] -} diff --git a/src/data/mappings/bna.json b/src/data/mappings/bna.json deleted file mode 100644 index 1929961..0000000 --- a/src/data/mappings/bna.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "anilistAnimeId": 110354, - "anilistMangaId": 119126, - "title": "BNA", - "sourceNotes": "Single season, 12 episodes. Original Trigger anime (directed by Yoh Yoshinari); the manga by Asano is a close, episodic tie-in adaptation running roughly one chapter per anime episode. It is incomplete relative to the TV series, ending at its sole collected volume (10 chapters, concluding September 2022) without covering the anime's final two episodes.", - "mappings": [ - { - "episodes": [1, 10], - "chapters": [1, 10], - "arc": "Anima City (episodic, ~1 chapter per episode)" - } - ] -} diff --git a/src/data/mappings/boarding-school-juliet.json b/src/data/mappings/boarding-school-juliet.json deleted file mode 100644 index 305acc4..0000000 --- a/src/data/mappings/boarding-school-juliet.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "anilistAnimeId": 101310, - "anilistMangaId": 86279, - "title": "Boarding School Juliet", - "sourceNotes": "Single 12-episode TV season (LIDEN FILMS, 2018) with no filler. Episode-to-chapter basis from the AnimeFillerGuide conversion: the anime adapts manga chapters 1-19 (through Volume 4), roughly 1.5 chapters per episode. Manga by Yousuke Kaneda is complete at 16 volumes; the story concludes with the \"West Arc\" at chapter 119, and AniList lists 121 chapters counting the volume bonus/extra chapters, so the final chapters-only entry extends to 121. Tail-arc chapter boundaries (post-episode 12) are grouped from Wikipedia volume ranges and ANN chapter titles and are approximate.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 3], - "arc": "Introduction & Confession" - }, - { - "episodes": [3, 4], - "chapters": [4, 7], - "arc": "Princess Char & Hasuki" - }, - { - "episodes": [5, 7], - "chapters": [8, 12], - "arc": "Dahlia Sports Festival" - }, - { - "episodes": [8, 10], - "chapters": [13, 15], - "arc": "Prefects & Char's Present" - }, - { - "episodes": [11, 12], - "chapters": [16, 19], - "arc": "Juliet's Birthday" - }, - { - "chapters": [20, 27], - "arc": "Summer Break / Beach" - }, - { - "chapters": [28, 37], - "arc": "Autumn Festival & Mid-terms" - }, - { - "chapters": [38, 52], - "arc": "School Festival & Prefect Exam" - }, - { - "chapters": [53, 73], - "arc": "Family & Home Visit" - }, - { - "chapters": [74, 89], - "arc": "Prefect Election" - }, - { - "chapters": [90, 100], - "arc": "Exhibition Match & Servant Wars" - }, - { - "chapters": [101, 121], - "arc": "West Arc (Finale)" - } - ] -} diff --git a/src/data/mappings/bocchi-the-rock.json b/src/data/mappings/bocchi-the-rock.json deleted file mode 100644 index 955e55e..0000000 --- a/src/data/mappings/bocchi-the-rock.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 130003, - "anilistMangaId": 111258, - "title": "Bocchi the Rock!", - "sourceNotes": "S1 only (12 eps). 4-koma source — chapter ranges are approximate and follow narrative beats rather than strict 4-koma counts. Refine via PR.", - "mappings": [ - { "episodes": [1, 3], "chapters": [1, 12], "arc": "Forming Kessoku Band" }, - { "episodes": [4, 6], "chapters": [13, 24], "arc": "First Live / Starry" }, - { - "episodes": [7, 9], - "chapters": [25, 36], - "arc": "Summer Festival / Costumes" - }, - { "episodes": [10, 12], "chapters": [37, 48], "arc": "Bushibu Festival" }, - { "chapters": [49, 70], "arc": "School Trip / New Songs" }, - { "chapters": [71, 95], "arc": "Second-Year Arc" } - ] -} diff --git a/src/data/mappings/bofuri.json b/src/data/mappings/bofuri.json deleted file mode 100644 index b6ea801..0000000 --- a/src/data/mappings/bofuri.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "anilistAnimeId": 106479, - "anilistMangaId": 103852, - "title": "BOFURI: I Don't Want to Get Hurt, so I'll Max Out My Defense.", - "sourceNotes": "Cumulative episodes across S1 (12, 2020) + S2 (12, 2023, eps 13-24) = 24 total; use the S1 anime id 106479. Source is Yuumikan's light novel (AniList id 103852, 19 volumes; web novel concluded Feb 2025). The Jiro Oimoto manga (AniList id 103853) is far behind the anime -- only ~ch 38 / vol 7 as of mid-2026, covering through roughly S1 ep 11 -- so it cannot anchor a 24-episode mapping. This therefore maps by LIGHT NOVEL VOLUME: the `chapters` tuples are LN volume numbers (1-19), NOT manga chapters. S1 adapts LN vols 1-4 and S2 adapts LN vols 5-8, so a reader resumes at vol 9 after the anime; vols 9-19 are unadapted. Arcs are named by NewWorld Online in-game events per the episode titles. Volume-to-episode boundaries are approximate.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 1], - "arc": "Beginnings & First Event (1st-2nd Stratum)" - }, - { - "episodes": [4, 5], - "chapters": [2, 2], - "arc": "Second Event (Underwater / Silverwing)" - }, - { - "episodes": [6, 8], - "chapters": [3, 3], - "arc": "Maple Tree Formation & Third Event" - }, - { - "episodes": [9, 12], - "chapters": [4, 4], - "arc": "Fourth Event (Guild War)" - }, - { - "episodes": [13, 14], - "chapters": [5, 5], - "arc": "Christmas Event & Strata 4-6 Exploration" - }, - { - "episodes": [15, 16], - "chapters": [6, 6], - "arc": "Seventh Event (Tower Conquest)" - }, - { - "episodes": [17, 18], - "chapters": [7, 7], - "arc": "Stratum 7 Exploration & Monster Taming" - }, - { - "episodes": [19, 24], - "chapters": [8, 8], - "arc": "Eighth Event (Final Guild Battle)" - }, - { - "chapters": [9, 19], - "arc": "Post-Eighth Event (LN vols 9-19, unadapted)" - } - ] -} diff --git a/src/data/mappings/brynhildr-in-the-darkness.json b/src/data/mappings/brynhildr-in-the-darkness.json deleted file mode 100644 index 2adaada..0000000 --- a/src/data/mappings/brynhildr-in-the-darkness.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 20534, - "anilistMangaId": 64377, - "title": "Brynhildr in the Darkness", - "sourceNotes": "Single-cour 13-episode TV anime (ARMS, 2014); a separate bonus OVA (AniList id 20866) is excluded as side content rather than counted as a 14th episode, matching this repo's OVA convention. Manga complete at 181 chapters / 18 volumes. The anime heavily compresses and reorders manga material to reach a stopping point around chapter 100 by its finale; no official or fan-sourced episode-by-episode breakdown exists, so the single TV-run entry below is an approximate aggregate rather than a scene-accurate boundary. Chapters 101-181 continue the manga-only story past where the anime ends.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 100], - "arc": "TV Anime (heavily condensed adaptation)" - }, - { "chapters": [101, 181], "arc": "Unadapted continuation" } - ] -} diff --git a/src/data/mappings/btooom.json b/src/data/mappings/btooom.json deleted file mode 100644 index eb46936..0000000 --- a/src/data/mappings/btooom.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "anilistAnimeId": 14345, - "anilistMangaId": 50593, - "title": "Btooom!", - "sourceNotes": "Manga complete at 125 chapters / 26 volumes (Comic Bunch, 2009-2018), ending with two alternate finales (a 'light' and a 'dark' ending published as separate versions of the final volume). Single-season anime (Madhouse, 2012) = 12 episodes, a faithful no-filler adaptation covering only the first 50 chapters (~volumes 1-9, the end of Phase 1 of the BTOOOM! survival game). The anime stops at a cliffhanger and was never continued; readers resume at chapter 51 (volume 10). The unadapted tail (ch 51-125) covers Phase 2 of the game (rules change: two-player teams, 14 chips instead of 8), Kira's backstory, the introduction of Kaname Date, the assault on Tyrannos Japan, and the final confrontation through the dual endings. Tail arc boundaries below are approximate (volume math ~4.8 chapters/volume); only the anime/manga split at chapter 50 and the overall ending at chapter 125 are firmly documented. No theatrical films.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 50], - "arc": "Survival Game / Phase 1 (Season 1)" - }, - { - "chapters": [51, 90], - "arc": "Phase 2 (unadapted)" - }, - { - "chapters": [91, 125], - "arc": "Tyrannos Japan Assault & Finale (unadapted)" - } - ] -} diff --git a/src/data/mappings/bubble.json b/src/data/mappings/bubble.json deleted file mode 100644 index 6202eee..0000000 --- a/src/data/mappings/bubble.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "anilistAnimeId": 142455, - "anilistMangaId": 146480, - "title": "Bubble", - "sourceNotes": "Original Netflix theatrical anime film (single ONA entry on AniList, 2022). The tie-in manga retells the same story as a close adaptation, complete at 8 chapters.", - "mappings": [{ "episodes": [1, 1], "chapters": [1, 8], "arc": "Full Story" }] -} diff --git a/src/data/mappings/bungo-stray-dogs.json b/src/data/mappings/bungo-stray-dogs.json deleted file mode 100644 index bbf6f40..0000000 --- a/src/data/mappings/bungo-stray-dogs.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "anilistAnimeId": 21311, - "anilistMangaId": 85307, - "title": "Bungo Stray Dogs", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (12, eps 13-24) + S3 (12, eps 25-36) + S4 (13, eps 37-49) + S5 (11, eps 50-60) = 60 total. Manga ongoing (~110+ chapters / 28 volumes as of 2026). S3 ends at ch 53; S5 picks up at ch 78. Arc chapter boundaries approximate — refine via PR.", - "mappings": [ - { "episodes": [1, 3], "chapters": [1, 7], "arc": "Azure Apostle" }, - { "episodes": [4, 12], "chapters": [8, 21], "arc": "Port Mafia / Kyouka" }, - { "episodes": [13, 16], "chapters": [22, 26], "arc": "Dark Era (Prequel)" }, - { "episodes": [17, 24], "chapters": [27, 41], "arc": "Guild Arc" }, - { - "episodes": [25, 36], - "chapters": [42, 53], - "arc": "Cannibalism / Guild Aftermath" - }, - { - "episodes": [37, 49], - "chapters": [54, 77], - "arc": "Hunting Dogs / Decay of Angels Setup" - }, - { - "episodes": [50, 60], - "chapters": [78, 110], - "arc": "Kamui Revelation / Vampire Outbreak" - } - ], - "movies": [ - { - "anilistId": 98384, - "title": "Bungo Stray Dogs: DEAD APPLE", - "year": 2018, - "afterEpisode": 24, - "note": "Canon film set between S2 and S3." - } - ] -} diff --git a/src/data/mappings/bunny-drop.json b/src/data/mappings/bunny-drop.json deleted file mode 100644 index ceae451..0000000 --- a/src/data/mappings/bunny-drop.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "anilistAnimeId": 10162, - "anilistMangaId": 33468, - "title": "Bunny Drop", - "sourceNotes": "Single season, 11 episodes. Manga complete at 62 chapters, split into two halves by a 10-year time skip at Chapter 25. The anime adapts only Part 1 (Daikichi raising young Rin), ending at Chapter 24; Part 2 (teenage Rin, chapters 25-62) is unadapted and manga-only.", - "mappings": [ - { "episodes": [1, 11], "chapters": [1, 24], "arc": "Raising Rin (Part 1)" }, - { "chapters": [25, 62], "arc": "Ten-Year Time Skip (Part 2)" } - ] -} diff --git a/src/data/mappings/bunny-girl-senpai.json b/src/data/mappings/bunny-girl-senpai.json deleted file mode 100644 index b695f1e..0000000 --- a/src/data/mappings/bunny-girl-senpai.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "anilistAnimeId": 101291, - "anilistMangaId": 91170, - "title": "Rascal Does Not Dream of Bunny Girl Senpai", - "sourceNotes": "Source is Hajime Kamoshida's light novel series, which AniList splits into one media entry per volume and which has no unified manga adaptation (only fragmentary per-arc manga). This mapping therefore uses LIGHT-NOVEL VOLUME NUMBERS as the 'chapters' axis; anilistMangaId 91170 is LN vol 1 ('Bunny Girl Senpai'), the representative source entry. The 2018 TV anime (13 eps) adapts LN vols 1-5: Mai (eps 1-3, vol 1), Tomoe (4-6, vol 2), Futaba (7-8, vol 3), Nodoka (9-10, vol 4), Kaede (11-13, vol 5). Three canon films continue the story (vols 6-9). 15 main LN volumes were published through July 2025; vols 10+ are unadapted by these works (later covered by the 2025 TV continuation).", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 1], - "arc": "Bunny Girl Senpai (Mai Sakurajima) — LN vol 1" - }, - { - "episodes": [4, 6], - "chapters": [2, 2], - "arc": "Petite Devil Kohai (Tomoe Koga) — LN vol 2" - }, - { - "episodes": [7, 8], - "chapters": [3, 3], - "arc": "Logical Witch (Rio Futaba) — LN vol 3" - }, - { - "episodes": [9, 10], - "chapters": [4, 4], - "arc": "Siscon Idol (Nodoka Toyohama) — LN vol 4" - }, - { - "episodes": [11, 13], - "chapters": [5, 5], - "arc": "Sister Home Alone (Kaede Azusagawa) — LN vol 5" - }, - { - "chapters": [6, 15], - "arc": "Post-TV LN arcs (Dreaming Girl → ongoing; vols 6-9 adapted by the films, vols 10+ by the 2025 TV continuation)" - } - ], - "movies": [ - { - "anilistId": 104157, - "title": "Rascal Does Not Dream of a Dreaming Girl", - "year": 2019, - "chapters": [6, 7], - "afterEpisode": 13, - "note": "Canon sequel film adapting the Dreaming Girl arc (LN vols 6-7), resolving the Shoko Makinohara / Mai storyline." - }, - { - "anilistId": 154967, - "title": "Rascal Does Not Dream of a Sister Venturing Out", - "year": 2023, - "chapters": [8, 8], - "afterEpisode": 13, - "note": "Canon film of the University arc (LN vol 8: Odekake Sister)." - }, - { - "anilistId": 161474, - "title": "Rascal Does Not Dream of a Knapsack Kid", - "year": 2023, - "chapters": [9, 9], - "afterEpisode": 13, - "note": "Canon film of the University arc (LN vol 9: Randoseru Girl)." - } - ] -} diff --git a/src/data/mappings/burn-the-witch.json b/src/data/mappings/burn-the-witch.json deleted file mode 100644 index 9ce6a9f..0000000 --- a/src/data/mappings/burn-the-witch.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 116673, - "anilistMangaId": 116827, - "title": "BURN THE WITCH", - "sourceNotes": "3-episode ONA (streamed format of the Oct. 2020 theatrical film) retelling Tite Kubo's Burn the Witch. Manga complete at 5 chapters (the redrawn 'Chapter 0.8' one-shot plus Chapters 1-4, collected in Volume 1); a second manga season has been announced but is not yet reflected in AniList's chapter count. Ep 1 adapts Chapter 0.8; Ep 2 adapts Chapters 1-2; Ep 3 adapts Chapters 3-4.", - "mappings": [ - { - "episodes": [1, 1], - "chapters": [1, 1], - "arc": "Chapter 0.8: Don't Judge a Book by Its Cover" - }, - { - "episodes": [2, 2], - "chapters": [2, 3], - "arc": "Witches Blow a New Pipe / Ghillie Suit" - }, - { - "episodes": [3, 3], - "chapters": [4, 5], - "arc": "She Makes Me Special / If a Lion Could Speak" - } - ] -} diff --git a/src/data/mappings/by-the-grace-of-the-gods.json b/src/data/mappings/by-the-grace-of-the-gods.json deleted file mode 100644 index 024d31e..0000000 --- a/src/data/mappings/by-the-grace-of-the-gods.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 115740, - "anilistMangaId": 101793, - "title": "By the Grace of the Gods", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (12). Manga ongoing (current ch. 71 as of mid-2026, art by Ranran, serialized on Manga UP! since 2017); AniList does not track a live chapter count for this series, so the figures here are sourced from publisher chapter listings. Season 1 corresponds to roughly the manga's first 40 chapters (the manga only caught up to the Season 1 anime content around ch. 40); Season 2's precise endpoint within the manga is less well documented online and is approximated here as the current published chapter.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 40], - "arc": "Arrival & Laundry Business (Season 1)" - }, - { - "episodes": [13, 24], - "chapters": [41, 71], - "arc": "Expanding Business (Season 2)" - } - ] -} diff --git a/src/data/mappings/call-of-the-night.json b/src/data/mappings/call-of-the-night.json deleted file mode 100644 index 5f894d0..0000000 --- a/src/data/mappings/call-of-the-night.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "anilistAnimeId": 141391, - "anilistMangaId": 111233, - "title": "Call of the Night", - "sourceNotes": "The main manga is complete at 200 chapters / 20 volumes (serialized Aug 2019 - Jan 2024; AniList's listed 203 over-counts split chapters). The separate 8-chapter 'Paradise Arc' (Rakuen-hen, AniList id 194075) is a standalone sequel and is not part of this 1-200 numbering. TV Season 1 (id 141391, 13 eps) adapts ch 1-46. TV Season 2 (id 175914, 12 eps, cumulative eps 14-25) adapts ch 47-97; the ep 25 finale is partly anime-original around ch 97, so the continue-reading point is ch 98. The back half of the manga (Hokkaido trip, Kiku/Mahiru arc, Haruka final arc, through the ch 200 finale) is unadapted. Per-arc chapter splits are approximate.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 46], - "arc": "Falling for the night (Nazuna, Akira, early vampires)" - }, - { - "episodes": [14, 25], - "chapters": [47, 97], - "arc": "Detective pursuit, the other vampires & festival arc" - }, - { - "chapters": [98, 164], - "arc": "Hokkaido trip & Kiku / Mahiru arc (unadapted)" - }, - { - "chapters": [165, 200], - "arc": "Haruka final arc & ending (unadapted)" - } - ] -} diff --git a/src/data/mappings/campfire-cooking-in-another-world.json b/src/data/mappings/campfire-cooking-in-another-world.json deleted file mode 100644 index 2347c5e..0000000 --- a/src/data/mappings/campfire-cooking-in-another-world.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 156067, - "anilistMangaId": 99049, - "title": "Campfire Cooking in Another World with my Absurd Skill", - "sourceNotes": "LN-based mapping (AniList source is the light novel, id 99049, by Ren Eguchi). Because the LN's chapters reset per volume, the chapters[] ranges here are LN VOLUME numbers, not sequential chapter numbers; within-season episode splits are approximate since the LN is episodic (cooking/travel) with no formal arc names — the dish-themed volume subtitles stand in as arc names. Cumulative episodes across S1 (12) + S2 (12) = 24. Community episode-to-source guides anchor the adaptation: Season 1 (ep 1-12) ends partway through Volume 2 (continue at Vol 2 Ch 8), and Season 2 (ep 13-24) ends at the close of Volume 5 (continue at Volume 6), so Vol 2 straddles the S1/S2 boundary. Light novel is ongoing (17 volumes as of late 2025). No theatrical films or OVAs.", - "mappings": [ - { - "episodes": [1, 7], - "chapters": [1, 1], - "arc": "Ginger-Fried Pork and the Legendary Beast (Vol. 1)" - }, - { - "episodes": [8, 14], - "chapters": [2, 2], - "arc": "Winged Gyoza and the Phantom Dragon (Vol. 2)" - }, - { - "episodes": [15, 17], - "chapters": [3, 3], - "arc": "Beef Stew and the Unexplored Labyrinth (Vol. 3)" - }, - { - "episodes": [18, 20], - "chapters": [4, 4], - "arc": "Barbeque and God's Blessings (Vol. 4)" - }, - { - "episodes": [21, 24], - "chapters": [5, 5], - "arc": "Mixed Tempura and the Sea Monster (Vol. 5)" - }, - { - "chapters": [6, 17], - "arc": "Meat Soboro Rice Bowls and the Holy Seal onward (Vol. 6+, unadapted)" - } - ] -} diff --git a/src/data/mappings/campione.json b/src/data/mappings/campione.json deleted file mode 100644 index 95600a3..0000000 --- a/src/data/mappings/campione.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 12293, - "anilistMangaId": 62735, - "title": "Campione!", - "sourceNotes": "Source is Jou Taketsuki's light novel (AniList 62735), complete at 168 chapters across 21 volumes plus an EX volume; a separate, shorter 3-volume/11-chapter manga adaptation (AniList 70363) also exists but tracks the anime far less closely and is not used here. The 13-episode anime adapts Volumes 1-5 (approx. ch. 1-40, estimated from AniList's continuous chapter count at ~8 chapters/volume) in a non-linear order: episode 1 is largely reconstructed from Volume 3's prologue material before episodes 2-4 cover Volume 1 and episodes 5-7 cover Volume 2, and episode 13 closes with an anime-original confrontation rather than following Volume 5's ending beat-for-beat. No named story arcs beyond the volume subtitles, so the anime run is grouped as one approximate block; the unadapted tail (Volumes 6-21) is left chapters-only.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 40], - "arc": "TV Anime (Volumes 1-5)" - }, - { - "chapters": [41, 168], - "arc": "Post-Anime (Light Novel-Only)" - } - ] -} diff --git a/src/data/mappings/cardcaptor-sakura.json b/src/data/mappings/cardcaptor-sakura.json deleted file mode 100644 index f4e1b1f..0000000 --- a/src/data/mappings/cardcaptor-sakura.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "anilistAnimeId": 232, - "anilistMangaId": 30106, - "title": "Cardcaptor Sakura", - "sourceNotes": "Original 1998-2000 anime (70 eps) adapts the full Cardcaptor Sakura manga (50 ch / 12 vols) with significant episodic padding. The Clear Card sequel anime (id 97881) adapts the 'Clear Card-hen' sequel manga, a separate AniList entry.", - "mappings": [ - { - "episodes": [1, 35], - "chapters": [1, 24], - "arc": "Clow Cards Arc (Capture)" - }, - { - "episodes": [36, 46], - "chapters": [25, 30], - "arc": "Eriol Arrives / Card Transformation Begins" - }, - { - "episodes": [47, 70], - "chapters": [31, 50], - "arc": "Sakura Cards / Eriol Reveal / Finale" - } - ], - "movies": [ - { - "anilistId": 371, - "title": "Cardcaptor Sakura: The Movie", - "year": 1999, - "afterEpisode": 35, - "note": "Canon side story between S1 and S2." - }, - { - "anilistId": 372, - "title": "Cardcaptor Sakura the Movie 2: The Sealed Card", - "year": 2000, - "afterEpisode": 70, - "note": "Canon finale film concluding the original series." - } - ] -} diff --git a/src/data/mappings/carole-tuesday.json b/src/data/mappings/carole-tuesday.json deleted file mode 100644 index 7f65937..0000000 --- a/src/data/mappings/carole-tuesday.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "anilistAnimeId": 101281, - "anilistMangaId": 111526, - "title": "Carole & Tuesday", - "sourceNotes": "Original 24-episode anime (2019, dir. Shinichirō Watanabe); the Morito Yamataka manga is a close tie-in adaptation of the anime (not the other way around) and only retells roughly the first half of the story, stopping after about anime episode 12. Manga complete at 16 chapters (ended July 2020); no manga content exists for the anime's back half (eps 13-24).", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 16], - "arc": "Alba City to Mars Brightest (Part 1)" - } - ] -} diff --git a/src/data/mappings/case-study-of-vanitas.json b/src/data/mappings/case-study-of-vanitas.json deleted file mode 100644 index 2b26794..0000000 --- a/src/data/mappings/case-study-of-vanitas.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 131646, - "anilistMangaId": 86568, - "title": "The Case Study of Vanitas", - "sourceNotes": "Cumulative episodes across Part 1 (12) + Part 2 'The Case Study of Vanitas Part 2' (12, eps 13-24) = 24 total. Studio Bones adapts Jun Mochizuki's 'Vanitas no Carte' (Monthly Gangan Joker) chapters (mémoires) 1-55; the anime ends on Mémoire 55 'Après la pluie: His Wish', so a viewer resumes reading at ch 56 ('Faire un gâteau: Bittersweet', Vol 10). Manga is ongoing — it returned from a 2024-25 hiatus and the latest published chapter is 68 (released Jun 23, 2026). Arc boundaries are approximate, anchored to chapter titles vs. volume boundaries and to the reported Part-2 split (eps 13-19 ≈ ch 21-43). No theatrical films exist.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 5], - "arc": "Parisian Excursion (Vampire of the Blue Moon)" - }, - { - "episodes": [4, 7], - "chapters": [6, 13], - "arc": "Bal Masqué" - }, - { - "episodes": [8, 12], - "chapters": [14, 20], - "arc": "Hunters of the Dark (Catacombs)" - }, - { - "episodes": [13, 19], - "chapters": [21, 42], - "arc": "Beast of Gévaudan" - }, - { - "episodes": [20, 24], - "chapters": [43, 55], - "arc": "Beast of Gévaudan: Chloé's Resolution" - }, - { - "chapters": [56, 68], - "arc": "Post-Gévaudan (ongoing, unadapted)" - } - ] -} diff --git a/src/data/mappings/cautious-hero.json b/src/data/mappings/cautious-hero.json deleted file mode 100644 index a43b6e7..0000000 --- a/src/data/mappings/cautious-hero.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "anilistAnimeId": 105156, - "anilistMangaId": 105724, - "title": "Cautious Hero: The Hero Is Overpowered but Overly Cautious", - "sourceNotes": "Source is Light Hiraga's light novel (AniList id 105723, ongoing), but chapter counts here track the completed manga adaptation by Koyuki (AniList id 105724, 36 chapters / 6 volumes, FINISHED 2018-2022). The single-cour 12-episode 2019 TV anime and the manga both adapt the complete Gaeabrande Salvation arc (LN vols 1-3), so the manga ends exactly where the anime ends and there is no unadapted manga tail. The light novel itself continues past Gaeabrande into the Ixphoria arc and beyond, but neither the manga nor the anime covers it. Episodes are mapped proportionally across the 36 chapters (~3 chapters/episode); sub-arc boundaries are approximate.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 6], - "arc": "Gaeabrande: Summoning & Cautious Preparation" - }, - { - "episodes": [3, 4], - "chapters": [7, 12], - "arc": "Dragonkin Village & Chaos Machina (1st Heavenly King)" - }, - { - "episodes": [5, 6], - "chapters": [13, 18], - "arc": "Divine Realm Training (Great Dragon God)" - }, - { - "episodes": [7, 8], - "chapters": [19, 24], - "arc": "Mseiltinge / Mseroute, the Nymphomaniac Heavenly King" - }, - { - "episodes": [9, 10], - "chapters": [25, 30], - "arc": "Death Magla & Kilkapul (Heavenly Kings)" - }, - { - "episodes": [11, 12], - "chapters": [31, 36], - "arc": "The Truth & Demon Lord Finale" - } - ] -} diff --git a/src/data/mappings/cells-at-work.json b/src/data/mappings/cells-at-work.json deleted file mode 100644 index d9eab39..0000000 --- a/src/data/mappings/cells-at-work.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 100977, - "anilistMangaId": 86778, - "title": "Cells at Work!", - "sourceNotes": "Cumulative episodes across S1 'Cells at Work!' (13) + S2 'Cells at Work!!' (8) = 21 TV episodes (eps 14-21 are S2). The manga is complete: 29 numbered chapters across 6 volumes (AniList lists 30, which counts the Vol. 6 'Psoriasis' Special). The show is episodic and freely reorders/combines chapters, so the chapter map is approximate. Confirmed anchors: S1 ends on ch 18 (Hemorrhagic Shock Pt. 2); S2 draws mainly from Vol. 5 (ch 20-25) plus part of Vol. 6, finishing the core story around ch 28. The manga's final chapter 29 ('Novel Coronavirus' / COVID finale) and the Psoriasis Special were NOT adapted in the TV run. The 'Common Cold' special, the recap 'Specials' set, and the CODE BLACK spin-off are excluded.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 18], - "arc": "Season 1 (episodic; immune cells, scrape wound, influenza, allergy, cancer, heat stroke)" - }, - { - "episodes": [14, 21], - "chapters": [19, 28], - "arc": "Cells at Work!! / Season 2 (episodic; acne, stomach ulcer, thymocytes, cancer cell return)" - }, - { - "chapters": [29, 29], - "arc": "Novel Coronavirus (manga finale, unadapted) + Psoriasis Special" - } - ] -} diff --git a/src/data/mappings/chaika-the-coffin-princess.json b/src/data/mappings/chaika-the-coffin-princess.json deleted file mode 100644 index 8c0b179..0000000 --- a/src/data/mappings/chaika-the-coffin-princess.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 20462, - "anilistMangaId": 62097, - "title": "Chaika -The Coffin Princess-", - "sourceNotes": "Cumulative episodes across Season 1 (12) + Avenging Battle (10) = 22. Manga (Shinta Sakayama, Monthly Shonen Ace, Oct. 2011-Dec. 2014) complete at 33 chapters across 5 volumes, finishing the same month as the TV anime's second season; treated here as the primary chapter source since it tracks the anime's two-cour pacing closely, rather than Ichiro Sakaki's original 12-volume/60-chapter light novel (AniList id 62831), which the anime does not fully adapt. Chapter boundaries between the two seasons are approximate, split proportionally to the manga's total length; no theatrical films exist for this franchise.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 18], - "arc": "Season 1: Gathering the Coffin's Contents" - }, - { "episodes": [13, 22], "chapters": [19, 33], "arc": "Avenging Battle" } - ] -} diff --git a/src/data/mappings/chained-soldier.json b/src/data/mappings/chained-soldier.json deleted file mode 100644 index 2f6d45e..0000000 --- a/src/data/mappings/chained-soldier.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "anilistAnimeId": 141821, - "anilistMangaId": 106064, - "title": "Chained Soldier", - "sourceNotes": "Cumulative episodes across S1 (12, Seven Arcs, 2024) + S2 (12, Passione, 2026) = 24 episodes, adapting the manga through roughly chapter 86 with no filler. Source manga \"Mato Seihei no Slave\" (AniList 106064) by Takahiro/Youhei Takemura is ongoing (~21 volumes, current ch. 182 as of mid-2026). Episode-to-chapter boundaries follow the AnimeFillerGuide conversion table; arc names are community/volume names from the fandom wiki and Wikipedia (mostly unofficial). Some episode-to-chapter overlaps (flashback panels) were normalized to contiguous ranges. The final chapters-only entry covers the large unadapted tail (ch. 87 to current 182).", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 4], - "arc": "Birth of a Slave" - }, - { - "episodes": [3, 4], - "chapters": [5, 13], - "arc": "Kyouka & the 7th Squad" - }, - { - "episodes": [5, 8], - "chapters": [14, 26], - "arc": "Intersquad Tournament" - }, - { - "episodes": [9, 10], - "chapters": [27, 33], - "arc": "Reunion" - }, - { - "episodes": [11, 11], - "chapters": [34, 40], - "arc": "Tenka vs Aoba" - }, - { - "episodes": [12, 12], - "chapters": [41, 45], - "arc": "Homecoming" - }, - { - "episodes": [13, 14], - "chapters": [46, 52], - "arc": "Congregation of Commanders" - }, - { - "episodes": [15, 18], - "chapters": [53, 65], - "arc": "The Azuma Banquet" - }, - { - "episodes": [19, 22], - "chapters": [66, 79], - "arc": "Yokohama Showdown" - }, - { - "episodes": [23, 24], - "chapters": [80, 86], - "arc": "Slave: Heaven" - }, - { - "chapters": [87, 182], - "arc": "Post-Anime Arcs (Unadapted)" - } - ] -} diff --git a/src/data/mappings/chainsaw-man.json b/src/data/mappings/chainsaw-man.json deleted file mode 100644 index 0107197..0000000 --- a/src/data/mappings/chainsaw-man.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "anilistAnimeId": 127230, - "anilistMangaId": 105778, - "title": "Chainsaw Man", - "sourceNotes": "Cumulative episodes across S1 (12) + Reze-hen movie (1). Manga at 232 chapters / 24 vols (status FINISHED per AniList as of 2026-06). Adapted material covers Public Safety arcs 1-4 (anime S1) + Bomb Girl / Reze (movie). All Academy Saga (Part 2) arcs unadapted.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 12], - "arc": "Introduction / Bat Devil" - }, - { - "episodes": [5, 7], - "chapters": [13, 21], - "arc": "Eternity Devil (Hotel)" - }, - { "episodes": [8, 12], "chapters": [22, 38], "arc": "Katana Man" }, - { - "episodes": [13, 13], - "chapters": [39, 52], - "arc": "Bomb Girl / Reze (Movie)" - }, - { "chapters": [53, 70], "arc": "International Assassins" }, - { "chapters": [71, 79], "arc": "Gun Devil" }, - { "chapters": [80, 97], "arc": "Control Devil" }, - { "chapters": [98, 111], "arc": "Justice Devil" }, - { "chapters": [112, 120], "arc": "Dating Denji" }, - { "chapters": [121, 131], "arc": "Falling Devil" }, - { "chapters": [132, 155], "arc": "Chainsaw Man Church" }, - { "chapters": [156, 232], "arc": "Academy Saga (Part 2)" } - ], - "movies": [ - { - "anilistId": 171627, - "title": "Chainsaw Man - The Movie: Reze Arc", - "year": 2025, - "chapters": [39, 52], - "afterEpisode": 12, - "note": "Canon Bomb Girl / Reze arc; counted as ep 13 in this mapping's cumulative numbering." - } - ] -} diff --git a/src/data/mappings/charlotte.json b/src/data/mappings/charlotte.json deleted file mode 100644 index 5520474..0000000 --- a/src/data/mappings/charlotte.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 20997, - "anilistMangaId": 105941, - "title": "Charlotte", - "sourceNotes": "Single-cour, 13-episode anime with a complete 45-chapter, 6-volume manga tie-in written by Jun Maeda (the anime's original creator), which follows the TV story faithfully. Charlotte tells one continuous story rather than discrete named arcs, so boundaries below are grouped by story beat and scaled proportionally (~3.5 chapters/episode) off the confirmed Volume 1 = Ch. 1-8 split; treat chapter numbers as approximate.", - "mappings": [ - { - "episodes": [1, 7], - "chapters": [1, 24], - "arc": "Hoshinoumi Student Council / Ayumi's Tragedy" - }, - { - "episodes": [8, 10], - "chapters": [25, 33], - "arc": "Sala Shane & the Stolen Ability" - }, - { - "episodes": [11, 13], - "chapters": [34, 45], - "arc": "Twilight Frontier / World Tour Finale" - } - ] -} diff --git a/src/data/mappings/cheat-skill.json b/src/data/mappings/cheat-skill.json deleted file mode 100644 index b5e64f8..0000000 --- a/src/data/mappings/cheat-skill.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 153845, - "anilistMangaId": 116062, - "title": "I Got a Cheat Skill in Another World and Became Unrivaled in The Real World, Too", - "sourceNotes": "Source is Miku's light novel (20 volumes as of March 2026, ongoing). The linked manga adaptation (AniList id 116062, art by Kazuomi Minatogawa, serialized since Dec 2019) lags FAR behind the anime — only ~ch 37 / 7 volumes as of mid-2026, not yet reaching the anime's endpoint, and AniList lists no chapter count — so this mapping uses LIGHT-NOVEL VOLUME numbers as the 'chapters' unit instead (same approach as arifureta.json). The single-cour 13-episode 2023 TV anime adapts LN vols 1-4 (it rearranges events heavily and closes at the end of vol 4; a viewer resumes reading at vol 5). Per-volume episode boundaries are approximate. A 2024 TV special ('The Legendary Dragon Awakens') and an announced Season 2 are separate and not mapped here. No theatrical films.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 1], - "arc": "The Great Devil's Nest & Ōsei Academy — Yūya gains the leveling Cheat skill, transforms, and starts his dual real-world / isekai life (LN vol 1)" - }, - { - "episodes": [5, 6], - "chapters": [2, 2], - "arc": "New Family & the Sage — Night the fenrir, magic training, and academy life (LN vol 2)" - }, - { - "episodes": [7, 10], - "chapters": [3, 3], - "arc": "Princess Lexia & Luna the Assassin — the woods, study trip, and Owen's tutelage (LN vol 3)" - }, - { - "episodes": [11, 13], - "chapters": [4, 4], - "arc": "To the Royal Capital — the Evil God's demon assailant and the Yūya & Kaori finale (LN vol 4)" - }, - { - "chapters": [5, 20], - "arc": "Beyond the Anime (unadapted LN vols 5-20)" - } - ] -} diff --git a/src/data/mappings/chihayafuru.json b/src/data/mappings/chihayafuru.json deleted file mode 100644 index baae7c2..0000000 --- a/src/data/mappings/chihayafuru.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 10800, - "anilistMangaId": 43245, - "title": "Chihayafuru", - "sourceNotes": "Anime spans 3 seasons (Madhouse): S1 id 10800 = eps 1-25, S2 id 14397 = eps 26-50, S3 id 101215 = eps 51-74 (cumulative 74 episodes). Manga complete at 248 chapters/verses across 50 volumes (2007-2022). Season boundaries follow the tankobon volume table: S1 = vols 1-7 (verses 1-41), S2 = vols 8-13 (verses 42-73), S3 = vols 14-27 (verses 74-143). Season 3 ends at verse 143 (vol 27); the manga continues from verse 144. Verses 144-248 (vols 28-50) are unadapted. Chihayafuru is structured around karuta tournaments rather than discretely named arcs, so mappings are grouped by season's competition focus.", - "mappings": [ - { - "episodes": [1, 25], - "chapters": [1, 41], - "arc": "High School Debut & Tokyo Qualifiers (Season 1)" - }, - { - "episodes": [26, 50], - "chapters": [42, 73], - "arc": "Class A Promotion & Team Nationals (Season 2)" - }, - { - "episodes": [51, 74], - "chapters": [74, 143], - "arc": "Master & Queen Challenge (Season 3)" - }, - { - "chapters": [144, 248], - "arc": "Final Tournaments & Conclusion (unadapted)" - } - ] -} diff --git a/src/data/mappings/chillin-in-another-world.json b/src/data/mappings/chillin-in-another-world.json deleted file mode 100644 index dcfab8f..0000000 --- a/src/data/mappings/chillin-in-another-world.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "anilistAnimeId": 170130, - "anilistMangaId": 107120, - "title": "Chillin' in Another World with Level 2 Super Cheat Powers", - "sourceNotes": "Single 12-episode season adapts manga chapters 1-26. Manga ongoing (current ch. 73); unadapted continuation included at the tail. Laid-back slice-of-life isekai with no distinct named story arcs.", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 26], "arc": "Anime Adaptation" }, - { "chapters": [27, 73], "arc": "Manga-Only Continuation" } - ] -} diff --git a/src/data/mappings/chivalry-of-a-failed-knight.json b/src/data/mappings/chivalry-of-a-failed-knight.json deleted file mode 100644 index 31b19a7..0000000 --- a/src/data/mappings/chivalry-of-a-failed-knight.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 21092, - "anilistMangaId": 85370, - "title": "Chivalry of a Failed Knight", - "sourceNotes": "Single 12-episode TV season (2015). Source is Riku Misora's light novel; paired here with the Megumu Soramichi manga adaptation (id 85370, 48 ch on AniList, complete — ANN cites the finale as ch 45). The anime covers only the Selection Battle (LN vols 1-3, roughly manga ch 1-34); the manga runs a bit further into LN vol 4, so its tail (ch 35-48) is unadapted. Per-episode chapter boundaries are proportional estimates — no published 1:1 episode-to-chapter guide exists.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 34], - "arc": "Selection Battle (Hagun qualifiers / Sword Eater incident, LN vols 1-3)" - }, - { - "chapters": [35, 48], - "arc": "Seven Stars Sword Art Festival (opening, LN vol 4) — manga only" - } - ] -} diff --git a/src/data/mappings/chobits.json b/src/data/mappings/chobits.json deleted file mode 100644 index 66703be..0000000 --- a/src/data/mappings/chobits.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "anilistAnimeId": 59, - "anilistMangaId": 30107, - "title": "Chobits", - "sourceNotes": "Single-cour 26-episode TV anime (2002), a full faithful adaptation of the complete manga (88 chapters across 8 volumes). The manga has no formally named story arcs; broad divisions below are anchored to episodes 9 and 18, which Wikipedia notes are clip/recap episodes marking natural breaks in the story. The anime softens some of the manga's more philosophical tone and adds minor original material without altering the plot.", - "mappings": [ - { "episodes": [1, 9], "chapters": [1, 30], "arc": "Chi's Awakening" }, - { - "episodes": [10, 18], - "chapters": [31, 60], - "arc": "The Secret of Persocoms" - }, - { "episodes": [19, 26], "chapters": [61, 88], "arc": "The Truth About Chi" } - ] -} diff --git a/src/data/mappings/chunibyo.json b/src/data/mappings/chunibyo.json deleted file mode 100644 index fe2aec6..0000000 --- a/src/data/mappings/chunibyo.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 14741, - "anilistMangaId": 70099, - "title": "Love, Chunibyo & Other Delusions", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 'Ren' / Heart Throb (12, eps 13-24) = 24 total. No canonical manga adaptation exists, so this maps to the Torako light novel (AniList id 70099, light-novel format, 4 volumes / 51 'chapters', FINISHED). The KyoAni anime is largely anime-original and deviates heavily from the novel, so chapter boundaries are nominal/approximate.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 26], - "arc": "Far East Magical Napping Society of Summer (S1: Dark Flame Master & the Wicked Eye)" - }, - { - "episodes": [13, 24], - "chapters": [27, 51], - "arc": "Heart Throb (S2 'Ren': Sophia Ring SP Saturn 7 / Satone)" - } - ], - "movies": [ - { - "anilistId": 98762, - "title": "Love, Chunibyo & Other Delusions: Take on Me", - "year": 2018, - "afterEpisode": 24, - "note": "Canon new-story KyoAni film and series finale, set after S2 (Rikka & Yuuta's runaway journey)." - } - ] -} diff --git a/src/data/mappings/citrus.json b/src/data/mappings/citrus.json deleted file mode 100644 index a473823..0000000 --- a/src/data/mappings/citrus.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "anilistAnimeId": 97832, - "anilistMangaId": 80145, - "title": "Citrus", - "sourceNotes": "The 2018 TV anime (12 eps, single season) adapts Saburouta's complete yuri manga (50 chapters across 10 volumes; AniList id 80145, FINISHED) covering roughly volumes 1-6. Mapped against the original Citrus manga, not the Citrus+ sequel (id 103884). At ~5 chapters per volume the anime ends partway through volume 6, leaving chapters 31-50 (the rest of the Aihara family / engagement resolution through the wedding) unadapted. Internal episode-to-chapter boundaries are approximate.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 4], - "arc": "Transfer & Step-Sisters (Yuzu meets council president Mei, learns they're new step-sisters)" - }, - { - "episodes": [3, 4], - "chapters": [5, 9], - "arc": "Harumin & the Chairman (growing tension; Mei's grandfather and the Aihara household)" - }, - { - "episodes": [5, 6], - "chapters": [10, 14], - "arc": "Matsuri (Yuzu's manipulative childhood friend tests the sisters' bond)" - }, - { - "episodes": [7, 8], - "chapters": [15, 18], - "arc": "Aftermath & Deepening Feelings" - }, - { - "episodes": [9, 10], - "chapters": [19, 22], - "arc": "Sara & Nina (the twins; school trip)" - }, - { - "episodes": [11, 12], - "chapters": [23, 30], - "arc": "Engagement Crisis (Mei's arranged marriage; finale)" - }, - { - "chapters": [31, 50], - "arc": "Aihara Resolution & Wedding (unadapted manga tail, vols 7-10)" - } - ] -} diff --git a/src/data/mappings/clannad.json b/src/data/mappings/clannad.json deleted file mode 100644 index 4707a55..0000000 --- a/src/data/mappings/clannad.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "anilistAnimeId": 2167, - "anilistMangaId": 32598, - "title": "CLANNAD", - "sourceNotes": "Cumulative episodes span both seasons: CLANNAD S1 (23 broadcast eps) + CLANNAD: After Story (24 eps) = 47 total, so After Story E1 = episode 24 and the finale E24 = episode 47 (the BD/DVD OVAs 'Another World: Tomoyo Chapter' and 'Another World: Kyou Chapter' are alternate-timeline extras and are not counted). The anime adapts Key's visual novel and is organized by character routes: S1 covers the common/school-life intro plus the Fuko, Kotomi, Tomoyo/Sunohara side routes and Nagisa's Theater Club main route; After Story opens with the Sunohara/Mei, Misae and Yukine side arcs before the main After Story scenario (graduation, work, marriage, Nagisa's death, and the Tomoya/Ushio finale). Mapped to CLANNAD: Official Comic (manga by Juri Misaki), 45 chapters across 8 volumes, complete. IMPORTANT: this manga adaptation primarily follows the main Nagisa/Theater Club scenario and After Story and does NOT adapt the side character routes in the depth the anime does, so the chapter ranges aligned to the side-route episodes (Fuko, Kotomi, Tomoyo, Sunohara, Misae, Yukine) are APPROXIMATE; only the cumulative endpoints (last entry reaches ch. 45) are reliable. The 2007 theatrical film (AniList 1723) is an alternate-continuity retelling and is excluded, so no movies are listed.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 4], - "arc": "Common route / School life - meeting Nagisa & forming the Theater Club" - }, - { - "episodes": [5, 9], - "chapters": [5, 7], - "arc": "Fuko Ibuki route (approximate - condensed in manga)" - }, - { - "episodes": [10, 14], - "chapters": [8, 10], - "arc": "Kotomi Ichinose route (approximate - condensed in manga)" - }, - { - "episodes": [15, 16], - "chapters": [11, 12], - "arc": "Tomoyo Sakagami & Sunohara - student council & 3-on-3 (approximate - condensed in manga)" - }, - { - "episodes": [17, 23], - "chapters": [13, 20], - "arc": "Nagisa Furukawa main route - Theater Club & school festival" - }, - { - "episodes": [24, 26], - "chapters": [21, 22], - "arc": "After Story: Youhei Sunohara & Mei (approximate - condensed in manga)" - }, - { - "episodes": [27, 28], - "chapters": [23, 24], - "arc": "After Story: Misae Sagara (approximate - condensed in manga)" - }, - { - "episodes": [29, 30], - "chapters": [25, 26], - "arc": "After Story: Yukine Miyazawa (approximate - condensed in manga)" - }, - { - "episodes": [31, 38], - "chapters": [27, 34], - "arc": "After Story: graduation, work & marriage (Okazaki & Furukawa families)" - }, - { - "episodes": [39, 44], - "chapters": [35, 42], - "arc": "After Story: Nagisa's death & the Tomoya/Ushio journey" - }, - { - "episodes": [45, 47], - "chapters": [43, 45], - "arc": "After Story finale - the illusionary world & resolution" - } - ] -} diff --git a/src/data/mappings/classroom-of-the-elite.json b/src/data/mappings/classroom-of-the-elite.json deleted file mode 100644 index 8b9ead8..0000000 --- a/src/data/mappings/classroom-of-the-elite.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 98659, - "anilistMangaId": 94970, - "title": "Classroom of the Elite", - "sourceNotes": "Source is Syougo Kinugasa's light novel. The Yuyu Ichino manga adaptation (AniList id 96798) only reaches LN vol 5 and has been stalled since 2022 — far less complete than the three-season anime — so this mapping uses the 'Year 1' LIGHT NOVEL instead (AniList id 94970, which lists 110 chapters across vols 1-11.5). Cumulative episodes across S1 (12) + S2 (13, eps 13-25) + S3 (13, eps 26-38) = 38 total; together the three seasons adapt all of Year 1 (LN vols 1-11.5). Chapter boundaries are proportional to LN-volume coverage and therefore approximate.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 43], - "arc": "Year 1, First Term: Entrance Exam → Uninhabited Island Special Exam (S1; LN vols 1-4.5)" - }, - { - "episodes": [13, 25], - "chapters": [44, 72], - "arc": "Year 1, Second Term: Sports & Cultural Festivals, Paper Shuffle (S2; LN vols 4.5-7.5)" - }, - { - "episodes": [26, 38], - "chapters": [73, 110], - "arc": "Year 1, Third Term: Mixed Training Camp → Year-End Exams (S3; LN vols 7.5-11.5)" - } - ] -} diff --git a/src/data/mappings/claymore.json b/src/data/mappings/claymore.json deleted file mode 100644 index 5296815..0000000 --- a/src/data/mappings/claymore.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "anilistAnimeId": 1818, - "anilistMangaId": 30583, - "title": "Claymore", - "sourceNotes": "The 2007 Madhouse anime (26 eps) faithfully adapts roughly the first 26 'Scenes' (chapters) of the manga across eps 1-22, then DIVERGES into an ANIME-ORIGINAL ending in eps 23-26 (an invented conclusion to the Awakened-Beings storyline) while the manga was only at ~Scene 27. The manga is complete at 159 Scenes; the entire back half (the Battle of the North, the 7-year timeskip, the Organization hunt, and the final Priscilla arc) is UNADAPTED and listed as a chapters-only tail. Episode-to-Scene boundaries within the adapted portion are approximate.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 6], - "arc": "Darkness in Paradise (Clare & Raki, early hunts)" - }, - { - "episodes": [5, 9], - "chapters": [7, 18], - "arc": "Teresa of the Faint Smile (Clare's origin flashback)" - }, - { - "episodes": [10, 15], - "chapters": [19, 28], - "arc": "Slashers / Rabona (Ophelia)" - }, - { - "episodes": [16, 22], - "chapters": [29, 40], - "arc": "Endless Gravestones / Northern Campaign Setup (Rigaldo)" - }, - { - "chapters": [50, 67], - "arc": "Battle of the North / Pieta (unadapted)" - }, - { - "chapters": [68, 89], - "arc": "Seven-Year Timeskip / Seven Ghosts (unadapted)" - }, - { - "chapters": [90, 137], - "arc": "Organization Hunt / Abyss Feeders (unadapted)" - }, - { - "chapters": [138, 159], - "arc": "Final Priscilla Arc (unadapted)" - } - ] -} diff --git a/src/data/mappings/clevatess.json b/src/data/mappings/clevatess.json deleted file mode 100644 index a078527..0000000 --- a/src/data/mappings/clevatess.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 178869, - "anilistMangaId": 122693, - "title": "Clevatess", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (13) = 25 total; anilistAnimeId is S1's id per convention. S1 adapts manga ch. 1-24 (resume post-anime at ch. 25); S2 began airing July 2026 adapting the Solsein Magic Academy arc onward, but it's too early in its run for confirmed per-episode chapter boundaries, so only S1 is mapped precisely for now. Manga ongoing (Yuji Iwahara, LINE Manga since Aug 2020), current ch. ~52 across 13 volumes as of mid-2026; AniList lists chapters as null so this figure is approximate. Arc names sourced from the Clevatess Fandom wiki.", - "mappings": [ - { - "episodes": [1, 1], - "chapters": [1, 3], - "arc": "Clevatess' Departure Arc" - }, - { - "episodes": [2, 12], - "chapters": [4, 24], - "arc": "Hiden Furnace War / Black Dragon & Black Tower / Legend of the Hero" - }, - { - "chapters": [25, 52], - "arc": "Solsein Magic Academy Arc (S2, ongoing) / unadapted" - } - ] -} diff --git a/src/data/mappings/code-geass.json b/src/data/mappings/code-geass.json deleted file mode 100644 index 6518797..0000000 --- a/src/data/mappings/code-geass.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 1575, - "anilistMangaId": 31528, - "title": "Code Geass: Lelouch of the Rebellion", - "sourceNotes": "S1 anime (25 eps, 2006) paired with the Majiko! manga retelling (40 chapters / 8 vols). The anime is the original work; the manga is a faithful retelling. R2 (sequel anime, 25 eps) and its corresponding R2 manga (id 133106, 27 ch) are separate AniList entries and not covered here.", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 18], "arc": "Stage 1: Zero Rises" }, - { - "episodes": [13, 25], - "chapters": [19, 40], - "arc": "Stage 2: Black Knights Rebellion → S1 Finale" - } - ], - "movies": [ - { - "anilistId": 97880, - "title": "Code Geass: Lelouch of the Re;surrection", - "year": 2019, - "note": "Sequel film following the compilation-movie continuity, not the TV timeline." - } - ] -} diff --git a/src/data/mappings/combatants-will-be-dispatched.json b/src/data/mappings/combatants-will-be-dispatched.json deleted file mode 100644 index 3d602bf..0000000 --- a/src/data/mappings/combatants-will-be-dispatched.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 116588, - "anilistMangaId": 101809, - "title": "Combatants Will Be Dispatched!", - "sourceNotes": "Single cour: one 12-episode season (2021), so episodes are not cumulative across seasons. The source is Natsume Akatsuki's light novel (AniList id 101809, NOVEL, status RELEASING — 7 volumes published through 2022, ongoing). AniList lists no chapter count for the LN and its Kadokawa manga adaptation (id 101808, 73 ch, FINISHED) is a side adaptation, so — following community \"where does the anime leave off\" guides that track LIGHT-NOVEL VOLUMES — this maps by LN VOLUME: the `chapters` tuples are volume numbers (1-7), NOT manga chapters. The anime adapts LN vols 1-3 at roughly one volume per four episodes and concludes at the end of vol 3, so a reader resumes at vol 4. Per-volume episode boundaries are approximate. No theatrical films or OVAs.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 1], - "arc": "Agent Six arrives / the Kingdom of Grace vs. the Demon Lord's Army (LN vol 1)" - }, - { - "episodes": [5, 8], - "chapters": [2, 2], - "arc": "Capturing the Tower of Duster & Heine of the Flames (LN vol 2)" - }, - { - "episodes": [9, 12], - "chapters": [3, 3], - "arc": "Fortifying the base / territory expansion & the Undead Festival (LN vol 3)" - }, - { - "chapters": [4, 7], - "arc": "Continued conquest of the planet (LN vols 4-7), unadapted" - } - ] -} diff --git a/src/data/mappings/cowboy-bebop.json b/src/data/mappings/cowboy-bebop.json deleted file mode 100644 index c62611e..0000000 --- a/src/data/mappings/cowboy-bebop.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 1, - "anilistMangaId": 30173, - "title": "Cowboy Bebop", - "sourceNotes": "Anime-original 1998 series (26 eps). Paired with the Cain Kuga manga adaptation (11 chapters / 3 vols, 1999) which retells select arcs and adds side stories. No tight chapter-to-episode correspondence; the anime is the canonical telling. Shooting Star (id 30174) is a separate prequel manga.", - "mappings": [ - { - "episodes": [1, 26], - "chapters": [1, 11], - "arc": "Loose adaptation (no per-arc alignment)" - } - ], - "movies": [ - { - "anilistId": 5, - "title": "Cowboy Bebop: The Movie - Knockin' on Heaven's Door", - "year": 2001, - "afterEpisode": 22, - "note": "Side story set between eps 22 and 23." - } - ] -} diff --git a/src/data/mappings/d-frag.json b/src/data/mappings/d-frag.json deleted file mode 100644 index fdd8697..0000000 --- a/src/data/mappings/d-frag.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 20031, - "anilistMangaId": 44721, - "title": "D-Frag!", - "sourceNotes": "Single-season, 12-episode TV anime (Brain's Base, 2014) adapts manga ch. 1-36 (~vol. 1-4), covering the Game Creation Club (Provisional)'s formation through its showdown with the ex-Student Council. Manga ongoing (current ch. ~176). Episodic gag-comedy source with no formally named story arcs beyond this stretch.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 36], - "arc": "Game Creation Club (Provisional) Founding" - }, - { - "chapters": [37, 176], - "arc": "Unadapted (manga continues past the anime)" - } - ] -} diff --git a/src/data/mappings/daemons-of-the-shadow-realm.json b/src/data/mappings/daemons-of-the-shadow-realm.json deleted file mode 100644 index c7d3292..0000000 --- a/src/data/mappings/daemons-of-the-shadow-realm.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "anilistAnimeId": 195600, - "anilistMangaId": 136899, - "title": "Daemons of the Shadow Realm", - "sourceNotes": "Source is the Yomi no Tsugai manga by Hiromu Arakawa (AniList 136899), ongoing since 2021; 12 volumes / latest chapter 54 as of mid-2026. The 2026 TV anime by Bones Film is a single continuous 24-episode run billed as two cours, so episode numbers are already cumulative (no season split). Arc names come from the Yomi no Tsugai fandom wiki and are unofficial. The anime lightly condenses/reorders chapters (e.g. it drops ch. 4 \"Ai and Makoto\" and compresses the 8-chapter Kagemori arc into ~5 episodes). Episode-to-chapter alignment is confirmed on the wiki only through episode 14 (= chapter 18); the Fujimurayama Warehouse arc episode range (ep 12-24) is estimated to fill the remaining episodes, taking the arc's final chapter (31) as the projected season endpoint. The Nishino Village Investigation arc (ch. 32-50) and the current Okinawa arc (ch. 51-54) are unadapted.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 3], - "arc": "Higashi Village Raid" - }, - { - "episodes": [4, 8], - "chapters": [4, 11], - "arc": "Kagemori Mansion" - }, - { - "episodes": [9, 11], - "chapters": [12, 15], - "arc": "Tadera's Mayoiga" - }, - { - "episodes": [12, 24], - "chapters": [16, 31], - "arc": "Fujimurayama Warehouse" - }, - { - "chapters": [32, 50], - "arc": "Nishino Village Investigation" - }, - { - "chapters": [51, 54], - "arc": "Okinawa" - } - ] -} diff --git a/src/data/mappings/dagashi-kashi.json b/src/data/mappings/dagashi-kashi.json deleted file mode 100644 index cd6becb..0000000 --- a/src/data/mappings/dagashi-kashi.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 21365, - "anilistMangaId": 85966, - "title": "Dagashi Kashi", - "sourceNotes": "Episodic gag manga — chapter ranges are approximate. Kotoyama's Dagashi Kashi ran in Weekly Shounen Sunday and is complete at 186 chapters / 11 volumes (AniList manga id 85966). Cumulative episodes across S1 (12 eps, 2016, feel.) + S2 (12 eps, 2018, TMS/Tezuka Productions, aired as ~12-min TV shorts) = 24. The adaptation samples short, self-contained candy gags out of chapter order rather than following any continuous arc: per fan episode-to-chapter guides, S1 pulls scattered chapters from roughly 1-68 (with original material) and S2 runs more linearly through the mid-80s to chapter 126-127 (partially adapting 127 for the finale), skipping many chapters along the way. Because the source is non-sequential vignette comedy, the ranges below are coarse approximations, not 1:1 matches. A reader continues past the anime from chapter 128 to the manga's conclusion at 186. No theatrical films exist, so no movies are listed.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 68], - "arc": "Season 1 — Hotaru arrives to recruit Kokonotsu for the Shikada dagashi shop (episodic candy gags; non-sequential sampling, approximate)" - }, - { - "episodes": [13, 24], - "chapters": [69, 127], - "arc": "Season 2 — the shop vs. the new convenience store; Hajime Owari joins (episodic; more linear, approximate, ends near ch. 126-127)" - }, - { - "chapters": [128, 186], - "arc": "Later chapters to the finale (unadapted; episodic, approximate)" - } - ] -} diff --git a/src/data/mappings/daily-lives-of-high-school-boys.json b/src/data/mappings/daily-lives-of-high-school-boys.json deleted file mode 100644 index 8e25a32..0000000 --- a/src/data/mappings/daily-lives-of-high-school-boys.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "anilistAnimeId": 11843, - "anilistMangaId": 56144, - "title": "Daily Lives of High School Boys", - "sourceNotes": "Gag sketch manga — chapter ranges are approximate. Yasunobu Yamauchi's comedy is complete at 138 chapters / 7 volumes. The 2012 Sunrise TV anime is a single 12-episode season, with each episode stitching together several unrelated short sketches drawn from across the run rather than following any continuous arc. Because the adaptation reorders and samples gags throughout all 7 volumes, there are no real arc boundaries; the mapping below is a coarse approximation. The 6 short Specials are a separate side entry and there are no theatrical films.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 138], - "arc": "Episodes 1-12 (assorted sketches, vols 1-7)" - } - ] -} diff --git a/src/data/mappings/dandadan.json b/src/data/mappings/dandadan.json deleted file mode 100644 index 4a9aa68..0000000 --- a/src/data/mappings/dandadan.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 171018, - "anilistMangaId": 132029, - "title": "Dandadan", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (12) = 24. Manga ongoing (23 tankōbon vols as of April 2026, ~184 chapters estimated). S3 announced but unaired — unadapted tail covers post-Kaiju arcs. Final-arc chapter cap is approximate; refine via PR.", - "mappings": [ - { "episodes": [1, 3], "chapters": [1, 8], "arc": "Turbo Granny" }, - { "episodes": [4, 7], "chapters": [9, 20], "arc": "Acrobatic Silky" }, - { "episodes": [8, 12], "chapters": [21, 33], "arc": "Serpo (Kito Family)" }, - { - "episodes": [13, 18], - "chapters": [34, 50], - "arc": "Cursed House (Jiji)" - }, - { "episodes": [19, 21], "chapters": [51, 60], "arc": "Evil Eye" }, - { - "episodes": [22, 24], - "chapters": [61, 71], - "arc": "Space Kaiju (Vamola)" - }, - { "chapters": [72, 184], "arc": "Post-Kaiju Arcs (Ongoing)" } - ] -} diff --git a/src/data/mappings/danganronpa-the-animation.json b/src/data/mappings/danganronpa-the-animation.json deleted file mode 100644 index 6ff29d5..0000000 --- a/src/data/mappings/danganronpa-the-animation.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "anilistAnimeId": 16592, - "anilistMangaId": 89313, - "title": "Danganronpa: The Animation", - "sourceNotes": "13-episode anime (Jul-Sep 2013). Manga complete at 17 chapters across 4 volumes (Shonen Ace, May 2013-Sep 2014), a close retelling of the same story. Arc boundaries follow the anime's own episode-title structure (Prologue / \"(Not) Normal Arc\" / Finale); precise chapter breakpoints within the middle block are approximate since no dedicated fan chapter guide was found.", - "mappings": [ - { - "episodes": [1, 1], - "chapters": [1, 1], - "arc": "Prologue (Welcome to Despair High School)" - }, - { "episodes": [2, 11], "chapters": [2, 14], "arc": "(Not) Normal Arc" }, - { - "episodes": [12, 13], - "chapters": [15, 17], - "arc": "Goodbye, Despair High School (Finale)" - } - ] -} diff --git a/src/data/mappings/dangers-in-my-heart.json b/src/data/mappings/dangers-in-my-heart.json deleted file mode 100644 index 285e13c..0000000 --- a/src/data/mappings/dangers-in-my-heart.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "anilistAnimeId": 153152, - "anilistMangaId": 101557, - "title": "The Dangers in My Heart", - "sourceNotes": "Cumulative episodes across S1 (12 ep, 2023) + S2 (13 ep, 2024) = 25 total; S2 is a direct sequel so episode 13 is its premiere. Uses the S1 anime id (153152). Paired with Norio Sakurai's manga 'Boku no Kokoro no Yabai Yatsu' (Tonari no Young Jump), ending with its 14th volume (announced Jan 2026); latest available chapter is ~193 per MangaDex, so the unadapted tail covers ch 114–193. Firm anchors from reading guides + MangaDex tankobon boundaries: S1 ends at ch 57 (end of vol 4), S2 ends at ch 113 (end of vol 8) with the library confession/first kiss — a viewer resumes reading at ch 114. The work-study trip to Akita Shoten is ch 24–27; Valentine's lands in S2 ep 4 (overall ep 16). Internal per-episode boundaries are approximate (~4.3–4.75 ch/ep); the S1/S2 endpoints are exact.", - "mappings": [ - { - "season": 1, - "episodes": [1, 4], - "chapters": [1, 23], - "arc": "S1 · Library Encounters (Meeting Yamada)" - }, - { - "season": 1, - "episodes": [5, 8], - "chapters": [24, 40], - "arc": "S1 · Work-Study Trip & Growing Closer" - }, - { - "season": 1, - "episodes": [9, 12], - "chapters": [41, 57], - "arc": "S1 · Winter Break & New Year" - }, - { - "season": 2, - "episodes": [13, 16], - "chapters": [58, 75], - "arc": "S2 · New Term & Valentine's" - }, - { - "season": 2, - "episodes": [17, 20], - "chapters": [76, 94], - "arc": "S2 · White Day & Class Trip" - }, - { - "season": 2, - "episodes": [21, 25], - "chapters": [95, 113], - "arc": "S2 · Photoshoot & Library Confession (Kana arc)" - }, - { - "chapters": [114, 193], - "arc": "Coupledom & Final Volume (ongoing, unadapted)" - } - ] -} diff --git a/src/data/mappings/danmachi.json b/src/data/mappings/danmachi.json deleted file mode 100644 index 7d9f668..0000000 --- a/src/data/mappings/danmachi.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 20920, - "anilistMangaId": 85161, - "title": "Is It Wrong to Try to Pick Up Girls in a Dungeon?", - "sourceNotes": "Cumulative episodes across S1 (13) + S2 (12, eps 14-25) + S3 (12, eps 26-37) + S4 (22, eps 38-59) = 59 total, all adapting Fujino Omori's light novels. The only main-story manga is the Kunieda adaptation (id 85161, 89 ch / 10 vols, Young Gangan), which was discontinued in 2018 partway through the Apollo Familia / War Game arc (LN vol ~1-5) and therefore covers only roughly anime Season 1. Seasons 2-4 (eps 14-59, LN vol 6-14+: Ishtar, Xenos/Knossos, etc.) have no manga counterpart and are not mapped here. S1 arc-to-chapter boundaries are approximate.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 26], - "arc": "Hestia Familia: the Minotaur & meeting Lili" - }, - { - "episodes": [5, 8], - "chapters": [27, 54], - "arc": "Soma Familia (Lili) & Bell's awakening" - }, - { - "episodes": [9, 10], - "chapters": [55, 68], - "arc": "18th-Floor expedition (the black Goliath)" - }, - { - "episodes": [11, 13], - "chapters": [69, 89], - "arc": "Apollo Familia & War Game (manga discontinued mid-arc)" - } - ], - "movies": [ - { - "anilistId": 101166, - "title": "Is It Wrong to Try to Pick Up Girls in a Dungeon?: Arrow of the Orion", - "year": 2019, - "afterEpisode": 13, - "note": "Anime-original canon side-story film (later novelized by Omori); set after Season 1, before Season 2. Not part of the manga." - } - ] -} diff --git a/src/data/mappings/darling-in-the-franxx.json b/src/data/mappings/darling-in-the-franxx.json deleted file mode 100644 index 7928e6f..0000000 --- a/src/data/mappings/darling-in-the-franxx.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 99423, - "anilistMangaId": 100937, - "title": "DARLING in the FRANXX", - "sourceNotes": "Single-cour, 24-episode anime with a complete 60-chapter, 8-volume manga tie-in by Kentaro Yabuki. The manga parallels the anime's overall plot through roughly its midpoint (volume 5, ch. 36) despite scattered scene-level differences (e.g. the anime's Boys vs. Girls conflict in Ep. 8 never happens in the manga). From volume 6 (ch. 37) on, Yabuki rewrote the final act into an alternate, happier ending that skips the anime's back-half space-battle arcs entirely, so episode alignment for the tail is approximate and the two versions diverge in substance, not just detail.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 24], - "arc": "Plantation 13 / Squad 13 Formation" - }, - { - "episodes": [13, 15], - "chapters": [25, 36], - "arc": "The Nines / Plantation 26" - }, - { - "episodes": [16, 24], - "chapters": [37, 60], - "arc": "Manga-Original Final Act (diverges from the anime's ending)" - } - ] -} diff --git a/src/data/mappings/darwins-game.json b/src/data/mappings/darwins-game.json deleted file mode 100644 index b3302f0..0000000 --- a/src/data/mappings/darwins-game.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 105190, - "anilistMangaId": 78881, - "title": "Darwin's Game", - "sourceNotes": "Single-cour TV anime (11 episodes, 2020) adapting FLIPFLOPs' manga (completed 2024 at 125 chapters / 30 volumes). The anime covers chapters 1-31, ending partway through volume 8; a viewer should resume reading at chapter 31 (around page 23). The adaptation compresses and skips material, so episode-to-chapter boundaries are approximate. No theatrical films exist.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 8], - "arc": "Introduction / First Game (Shibuya)" - }, - { - "episodes": [4, 6], - "chapters": [9, 20], - "arc": "Hunting Game (Shibuya Treasure Hunt)" - }, - { - "episodes": [7, 11], - "chapters": [21, 31], - "arc": "Sunset Ravens vs Eighth" - }, - { - "chapters": [32, 125], - "arc": "Post-Eighth War & Final Arcs (unadapted)" - } - ] -} diff --git a/src/data/mappings/date-a-live.json b/src/data/mappings/date-a-live.json deleted file mode 100644 index bee8e7c..0000000 --- a/src/data/mappings/date-a-live.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "anilistAnimeId": 15583, - "anilistMangaId": 67523, - "title": "Date A Live", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (10, eps 13-22) + S3 (12, eps 23-34) + S4 (12, eps 35-46) + S5 (12, eps 47-58) = 58 total. The Date A Live manga adaptation (id 67163) was discontinued in 2013 after ~6 chapters covering only the start of S1, so this maps to Koushi Tachibana's light novel instead (AniList id 67523, type MANGA, 146 chapters across 22 volumes). The anime adapts LN vols 1-19 by season — S1 vols 1-4, S2 vols 5-7, S3 vols 8-12, S4 vols 13-16, S5 vols 17-19 — leaving vols 20-22 (the Tohka finale) unadapted. Chapter ranges are proportional estimates converting those volume boundaries onto AniList's 146-chapter count, so they are approximate.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 27], - "arc": "Tohka / Yoshino / Kurumi / Kotori (S1, LN vols 1-4)" - }, - { - "episodes": [13, 22], - "chapters": [28, 46], - "arc": "Yamai Twins / Miku (S2, LN vols 5-7)" - }, - { - "episodes": [23, 34], - "chapters": [47, 80], - "arc": "Natsumi / Origami (S3, LN vols 8-12)" - }, - { - "episodes": [35, 46], - "chapters": [81, 106], - "arc": "Nia / Mukuro (S4, LN vols 13-16)" - }, - { - "episodes": [47, 58], - "chapters": [107, 126], - "arc": "Kurumi Ragnarok / Mio Finale (S5, LN vols 17-19)" - }, - { - "chapters": [127, 146], - "arc": "Tohka World / Tohka Good End (LN vols 20-22, unadapted)" - } - ], - "movies": [ - { - "anilistId": 20741, - "title": "Date A Live: Mayuri Judgment", - "year": 2015, - "afterEpisode": 22, - "note": "Author-supervised original film (not from the light novel) introducing the spirit Mayuri; set after S2." - } - ] -} diff --git a/src/data/mappings/days-with-my-stepsister.json b/src/data/mappings/days-with-my-stepsister.json deleted file mode 100644 index 770edd9..0000000 --- a/src/data/mappings/days-with-my-stepsister.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "anilistAnimeId": 152681, - "anilistMangaId": 130837, - "title": "Days with My Stepsister", - "sourceNotes": "Single-cour 12-episode TV anime (2024). Source material is Mikawa Ghost's light novel; the official manga adaptation (AniList id 130837) tracks the story chapter-by-chapter and has since caught up past the anime's coverage, so it is used here for finer-grained chapter mapping instead of LN volumes. The anime adapts manga chapters 1-23 (roughly LN vols. 1-4). Manga ongoing (current ch. ~36 as of mid-2026).", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 7], - "arc": "Meeting as Stepsiblings (Vol. 1)" - }, - { "episodes": [4, 6], "chapters": [8, 11], "arc": "Settling In (Vol. 2)" }, - { - "episodes": [7, 9], - "chapters": [12, 17], - "arc": "Growing Closer (Vol. 2-3)" - }, - { "episodes": [10, 12], "chapters": [18, 23], "arc": "Vol. 4" }, - { "chapters": [24, 36], "arc": "Unadapted (manga ahead of anime)" } - ] -} diff --git a/src/data/mappings/dead-mount-death-play.json b/src/data/mappings/dead-mount-death-play.json deleted file mode 100644 index 605933e..0000000 --- a/src/data/mappings/dead-mount-death-play.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "anilistAnimeId": 157198, - "anilistMangaId": 100868, - "title": "Dead Mount Death Play", - "sourceNotes": "Cumulative episodes across Part 1 (12) + Part 2 (12) = 24 total. Manga ongoing (current ch. 152 across 17+ volumes). The anime adapts manga chapters 1-81 (through the start of Vol. 10); viewers are pointed to pick the manga back up at ch. 82. Episode-to-chapter ranges are sourced directly from the fandom wiki's per-episode 'Adapted From' chapter listings; arc names are drawn from the manga's own in-story volume 'Episode' titles (e.g. Vol. 1 = 'Episode 1: The Calamity, Alive and Well'). A couple of episodes straddle two volumes' worth of material — the shared boundary chapter is credited to the earlier episode/arc for a clean split.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 8], - "arc": "The Calamity, Alive and Well" - }, - { - "episodes": [5, 6], - "chapters": [9, 17], - "arc": "The Energy of the Abandoned" - }, - { - "episodes": [7, 9], - "chapters": [18, 25], - "arc": "The Evil Bones of the Frontier" - }, - { "episodes": [10, 12], "chapters": [26, 34], "arc": "The Storage Attack" }, - { - "episodes": [13, 15], - "chapters": [35, 45], - "arc": "The Way of the Jesting Dragons" - }, - { - "episodes": [16, 17], - "chapters": [46, 52], - "arc": "The Sudden Turning of the Celestial Sphere" - }, - { - "episodes": [18, 20], - "chapters": [53, 64], - "arc": "Order of a Parallel World" - }, - { - "episodes": [21, 22], - "chapters": [65, 72], - "arc": "Barrier of Coursing Blood" - }, - { - "episodes": [23, 24], - "chapters": [73, 81], - "arc": "The Beautiful Woman's Pilgrimage / The Saint's Aid (partial)" - }, - { "chapters": [82, 152], "arc": "Manga-only continuation (unadapted arcs)" } - ] -} diff --git a/src/data/mappings/deadman-wonderland.json b/src/data/mappings/deadman-wonderland.json deleted file mode 100644 index e6c82a1..0000000 --- a/src/data/mappings/deadman-wonderland.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "anilistAnimeId": 6880, - "anilistMangaId": 33986, - "title": "Deadman Wonderland", - "sourceNotes": "Manga complete at 58 chapters / 13 volumes (Monthly Shonen Ace, 2007-2013). Single-season anime (Manglobe, 2011) = 12 episodes, no filler, adapting only the first 21 chapters (~volumes 1-5). The anime ends mid-story and was never continued; readers resume at chapter 22. The unadapted tail (ch 22-58) covers the rest of the manga: the Scar Chain escape arc, the Forgeries / Mockingbird arc (artificial Deadmen engineered to wipe out the real ones), and the final confrontation with Shiro / the Wretched Egg. Tail chapter boundaries below are approximate, anchored to volume math (~4.5 chapters/volume; e.g. volume 6 = ch 22-26) and the fandom wiki's arc descriptions; exact arc cutoffs within the unadapted portion are not precisely documented. A non-canon OVA ('The Red Knife Wielder') exists but is excluded. No theatrical films.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 21], - "arc": "Deadman Wonderland Prison / Carnival Corpse (Season 1)" - }, - { - "chapters": [22, 34], - "arc": "Scar Chain Escape (unadapted)" - }, - { - "chapters": [35, 50], - "arc": "Forgeries / Return to Deadman Wonderland (unadapted)" - }, - { - "chapters": [51, 58], - "arc": "Wretched Egg Finale (unadapted)" - } - ] -} diff --git a/src/data/mappings/death-march.json b/src/data/mappings/death-march.json deleted file mode 100644 index b3611e9..0000000 --- a/src/data/mappings/death-march.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 97907, - "anilistMangaId": 86511, - "title": "Death March to the Parallel World Rhapsody", - "sourceNotes": "Source is Hiro Ainana's light novel; mapped here against Ayamegumu's manga adaptation (AniList 86511), which is ongoing at ~ch 136 / 19 volumes (plus extra chapters) as of mid-2026 per MangaDex. The single 2018 TV anime (12 eps, Silver Link x Connect) adapts roughly the first 3 light-novel volumes, which correspond to manga volumes 1-7 (ch 1-44), so a viewer resumes reading at manga ch 45 (vol 8). Episode-to-chapter boundaries are approximate since the manga paces these arcs more slowly than the anime. A sequel anime was announced in Dec 2024 but had not aired as of this mapping. No theatrical films.", - "mappings": [ - { - "episodes": [1, 1], - "chapters": [1, 3], - "arc": "Arrival & the Black Dragon (death march, isekai transport, Meteor Shower, leveling)" - }, - { - "episodes": [2, 3], - "chapters": [4, 12], - "arc": "Seiryuu City & the Soldier Zena (city tour, the inn, romance, demon scam begins)" - }, - { - "episodes": [4, 6], - "chapters": [13, 18], - "arc": "The Cradle Labyrinth & the Slaves (frees Liza/Tama/Pochi, defeats the demon, gains Arisa & Lulu, city defense)" - }, - { - "episodes": [7, 9], - "chapters": [19, 30], - "arc": "The Maze of Trazayuya & Princess Mia (departure, camping, the labyrinth, undead Zen, rescuing the elf princess)" - }, - { - "episodes": [10, 12], - "chapters": [31, 44], - "arc": "Labyrinth City Celivera & the Noble's Quarter (journey home, the potion conspiracy, the underworld descent)" - }, - { - "chapters": [45, 136], - "arc": "Beyond the Anime (ongoing, unadapted)" - } - ] -} diff --git a/src/data/mappings/death-note.json b/src/data/mappings/death-note.json deleted file mode 100644 index 2c8dc15..0000000 --- a/src/data/mappings/death-note.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "anilistAnimeId": 1535, - "anilistMangaId": 30021, - "title": "Death Note", - "sourceNotes": "37-episode 2006-2007 anime (Madhouse) is a faithful adaptation of the full Death Note manga (12 vols / 108 chapters, 2003-2006). Both complete.", - "mappings": [ - { - "episodes": [1, 7], - "chapters": [1, 19], - "arc": "Introduction / Light vs L's Investigation" - }, - { "episodes": [8, 25], "chapters": [20, 58], "arc": "Yotsuba / L's Death" }, - { - "episodes": [26, 37], - "chapters": [59, 108], - "arc": "Near & Mello / Finale" - } - ] -} diff --git a/src/data/mappings/delicious-in-dungeon.json b/src/data/mappings/delicious-in-dungeon.json deleted file mode 100644 index d265dde..0000000 --- a/src/data/mappings/delicious-in-dungeon.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "anilistAnimeId": 153518, - "anilistMangaId": 86082, - "title": "Delicious in Dungeon", - "sourceNotes": "24-episode Season 1 (2024, Trigger) adapts manga chapters 1-52, with ep 24 ending on ch 52 'Bacon and Eggs' (end of the Sixth Floor arc); new readers continue at ch 53. Ryoko Kui's manga is COMPLETE at 97 numbered chapters across 14 volumes. AniList id 86082 lists 111 chapters = the 97 numbered chapters + 14 per-volume bonus/omake side stories; this mapping uses the numbered count, so the unadapted Season 2+ tail extends to ch 97. The anime lightly reorders the manga's non-linear chapters, so a few episode boundaries (e.g. ep 14) blend adjacent floors; the ranges below reflect the dominant mapping. No theatrical films.", - "mappings": [ - { - "episodes": [1, 10], - "chapters": [1, 22], - "arc": "Upper floors: entering the dungeon to rescue Falin, learning to eat monsters (floors 1-4)" - }, - { - "episodes": [11, 13], - "chapters": [23, 30], - "arc": "Red Dragon & Falin's resurrection (Marcille's forbidden magic)" - }, - { - "episodes": [14, 17], - "chapters": [31, 38], - "arc": "Fifth Floor — Falin retaken and turned into the Chimera" - }, - { - "episodes": [18, 24], - "chapters": [39, 52], - "arc": "Sixth Floor — changelings & the cursed Golden Country" - }, - { - "chapters": [53, 62], - "arc": "Dwarf City Ruins — the Winged Lion (the Demon) appears (unadapted)" - }, - { - "chapters": [63, 72], - "arc": "Lunatic Magician (Thistle) (unadapted)" - }, - { - "chapters": [73, 85], - "arc": "New Dungeon Lord (unadapted)" - }, - { - "chapters": [86, 91], - "arc": "Winged Lion / Demon climax (unadapted)" - }, - { - "chapters": [92, 97], - "arc": "Falin & finale (unadapted)" - } - ] -} diff --git a/src/data/mappings/demon-king-daimao.json b/src/data/mappings/demon-king-daimao.json deleted file mode 100644 index a6e8fbd..0000000 --- a/src/data/mappings/demon-king-daimao.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 7088, - "anilistMangaId": 44923, - "title": "Demon King Daimao", - "sourceNotes": "Single-cour 12-episode TV anime (Artland, 2010). The story originates in a 13-volume light novel (AniList 48926), but the anime tracks most closely with the separate manga adaptation illustrated for Champion Red (AniList 44923), which ran Sept. 2008-Dec. 2013 and is complete at 5 volumes / 50 chapters, covering the same early-story ground as the anime's 12 episodes (roughly the first 5 of the light novel's 13 volumes). No distinct named story arcs are documented for this title; the anime is a straightforward chronological adaptation with no filler. The light novel continues for 8 more volumes beyond where the anime/manga end, but that content was never adapted into this manga.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 25], - "arc": "Enrollment at Constant Magical Academy" - }, - { - "episodes": [7, 12], - "chapters": [26, 50], - "arc": "The Demon King's Trials" - } - ] -} diff --git a/src/data/mappings/demon-lord-retry.json b/src/data/mappings/demon-lord-retry.json deleted file mode 100644 index 7882a7a..0000000 --- a/src/data/mappings/demon-lord-retry.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "anilistAnimeId": 104252, - "anilistMangaId": 104689, - "title": "Demon Lord, Retry!", - "sourceNotes": "12-episode 2019 adaptation of Kurone Kanzaki's light novel; the chapter source of truth is Amaru Minotake's manga (5 vols, 27 ch, FINISHED), which the anime fully adapts across its run. Chapter anchors come from community sync notes (ep1=ch1, ep2=ch2-3, ep3=ch4-5, ep8=ch11-12, ep9=ch12-14); remaining episode boundaries are extrapolated and APPROXIMATE. The 2024 sequel series 'Demon Lord, Retry! R' (AniList anime id 168500) adapts the separate 'R' manga continuity and is out of scope for this mapping.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 5], - "arc": "The Demon Lord's Descent & Founding Rabbi Village (Vol. 1)" - }, - { - "episodes": [4, 7], - "chapters": [6, 11], - "arc": "The Hot Spring Resort & the Satanist Cult's Attack (Vol. 2)" - }, - { - "episodes": [8, 9], - "chapters": [12, 14], - "arc": "The Bastille Dungeon Expedition (Vol. 3)" - }, - { - "episodes": [10, 12], - "chapters": [15, 27], - "arc": "The Hellgondo Front & Series Finale (Vols. 4-5)" - } - ] -} diff --git a/src/data/mappings/demon-slayer.json b/src/data/mappings/demon-slayer.json deleted file mode 100644 index 65e0f70..0000000 --- a/src/data/mappings/demon-slayer.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "anilistAnimeId": 101922, - "anilistMangaId": 87216, - "title": "Demon Slayer: Kimetsu no Yaiba", - "sourceNotes": "Cumulative episodes across S1 (26) + Mugen Train TV (7) + Entertainment District (11) + Swordsmith Village (11) + Hashira Training (8). Arc-level approximation.", - "mappings": [ - { "episodes": [1, 5], "chapters": [1, 10], "arc": "Final Selection" }, - { - "episodes": [6, 10], - "chapters": [11, 21], - "arc": "Asakusa / Drum House" - }, - { "episodes": [11, 21], "chapters": [22, 45], "arc": "Mt. Natagumo" }, - { "episodes": [22, 26], "chapters": [46, 53], "arc": "Rehabilitation" }, - { "episodes": [27, 33], "chapters": [54, 69], "arc": "Mugen Train" }, - { - "episodes": [34, 44], - "chapters": [70, 97], - "arc": "Entertainment District" - }, - { - "episodes": [45, 55], - "chapters": [98, 127], - "arc": "Swordsmith Village" - }, - { "episodes": [56, 63], "chapters": [128, 136], "arc": "Hashira Training" }, - { "chapters": [137, 180], "arc": "Infinity Castle" }, - { "chapters": [181, 205], "arc": "Sunrise Countdown" } - ], - "movies": [ - { - "anilistId": 112151, - "title": "Demon Slayer -Kimetsu no Yaiba- The Movie: Mugen Train", - "year": 2020, - "chapters": [54, 69], - "afterEpisode": 26, - "note": "Canon Mugen Train arc; later retold as TV eps 27-33." - }, - { - "title": "Demon Slayer: Kimetsu no Yaiba -To the Swordsmith Village-", - "year": 2023, - "afterEpisode": 44, - "note": "World Tour bridge screening: Entertainment District recap + early premiere of the Swordsmith Village opening episode. No AniList entry." - }, - { - "title": "Demon Slayer: Kimetsu no Yaiba -To the Hashira Training-", - "year": 2024, - "afterEpisode": 55, - "note": "World Tour bridge screening: Swordsmith Village recap + early premiere of the Hashira Training opening episode. No AniList entry." - }, - { - "anilistId": 178788, - "title": "Demon Slayer: Kimetsu no Yaiba Infinity Castle", - "year": 2025, - "chapters": [137, 156], - "afterEpisode": 63, - "note": "Part 1 of the Infinity Castle trilogy; first theatrical-only continuation of the story." - } - ] -} diff --git a/src/data/mappings/detective-conan.json b/src/data/mappings/detective-conan.json deleted file mode 100644 index 65bc890..0000000 --- a/src/data/mappings/detective-conan.json +++ /dev/null @@ -1,240 +0,0 @@ -{ - "anilistAnimeId": 235, - "anilistMangaId": 31061, - "title": "Detective Conan", - "sourceNotes": "Long-running case-of-the-week mystery series airing since 1996 (1,207+ episodes as of mid-2026, ~47% filler) alongside an ongoing manga (1,164+ chapters as of mid-2026). Because the anime interleaves original filler cases between canon manga adaptations rather than adapting story-by-story, this is an initial seed anchored on the well-known Black Organization mythology beats; the vast case-of-the-week middle is not individually mapped. Refine per-episode mappings via PR.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 5], - "arc": "Shinichi Kudo Shrinks / Series Pilot" - }, - { - "episodes": [54, 58], - "chapters": [114, 121], - "arc": "First Black Organization Appearances (Gin & Vodka)" - }, - { - "episodes": [129, 129], - "chapters": [176, 181], - "arc": "Haibara Ai's Introduction" - }, - { - "episodes": [176, 178], - "chapters": [238, 242], - "arc": "Reunion with the Black Organization" - }, - { - "episodes": [188, 193], - "chapters": [251, 260], - "arc": "The Desperate Revival" - }, - { - "episodes": [309, 311], - "chapters": [380, 383], - "arc": "Contact with the Black Organization" - }, - { - "episodes": [385, 387], - "chapters": [470, 474], - "arc": "Black Organization Intelligence Gathering" - }, - { "episodes": [425, 425], "chapters": [499, 504], "arc": "Black Impact" }, - { - "episodes": [491, 504], - "chapters": [585, 609], - "arc": "Clash of Red and Black" - }, - { - "episodes": [701, 704], - "chapters": [818, 824], - "arc": "The Pitch-Black Mystery Train" - }, - { - "episodes": [779, 783], - "chapters": [891, 898], - "arc": "The Scarlet Series" - }, - { - "episodes": [784, 1207], - "chapters": [899, 1164], - "arc": "Modern Era: Rum Arc Onward (ongoing, approximate)" - } - ], - "movies": [ - { - "anilistId": 779, - "title": "Detective Conan: The Time-Bombed Skyscraper", - "year": 1997, - "note": "Side story (anime-original)." - }, - { - "anilistId": 780, - "title": "Detective Conan: The Fourteenth Target", - "year": 1998, - "note": "Side story (anime-original)." - }, - { - "anilistId": 781, - "title": "Detective Conan: The Last Wizard of the Century", - "year": 1999, - "note": "Side story (anime-original)." - }, - { - "anilistId": 1363, - "title": "Detective Conan: Captured in Her Eyes", - "year": 2000, - "note": "Side story (anime-original)." - }, - { - "anilistId": 1364, - "title": "Detective Conan: Countdown to Heaven", - "year": 2001, - "note": "Side story (anime-original)." - }, - { - "anilistId": 1365, - "title": "Detective Conan: The Phantom of Baker Street", - "year": 2002, - "note": "Side story (anime-original)." - }, - { - "anilistId": 1366, - "title": "Detective Conan: Crossroad in the Ancient Capital", - "year": 2003, - "note": "Side story (anime-original)." - }, - { - "anilistId": 1367, - "title": "Detective Conan: Magician of the Silver Sky", - "year": 2004, - "note": "Side story (anime-original)." - }, - { - "anilistId": 1505, - "title": "Detective Conan: Strategy Above the Depths", - "year": 2005, - "note": "Side story (anime-original)." - }, - { - "anilistId": 1506, - "title": "Detective Conan: The Private Eyes' Requiem", - "year": 2006, - "note": "Side story (anime-original)." - }, - { - "anilistId": 2171, - "title": "Detective Conan: Jolly Roger in the Deep Azure", - "year": 2007, - "note": "Side story (anime-original)." - }, - { - "anilistId": 4447, - "title": "Detective Conan: Full Score of Fear", - "year": 2008, - "note": "Side story (anime-original)." - }, - { - "anilistId": 5460, - "title": "Detective Conan: The Raven Chaser", - "year": 2009, - "note": "Side story (anime-original)." - }, - { - "anilistId": 6467, - "title": "Detective Conan: The Lost Ship in the Sky", - "year": 2010, - "note": "Side story (anime-original)." - }, - { - "anilistId": 9963, - "title": "Detective Conan: Quarter of Silence", - "year": 2011, - "note": "Side story (anime-original)." - }, - { - "anilistId": 12117, - "title": "Detective Conan: The Eleventh Striker", - "year": 2012, - "note": "Side story (anime-original)." - }, - { - "anilistId": 14735, - "title": "Detective Conan: Private Eye in the Distant Sea", - "year": 2013, - "note": "Side story (anime-original)." - }, - { - "anilistId": 20546, - "title": "Detective Conan: Dimensional Sniper", - "year": 2014, - "note": "Side story (anime-original)." - }, - { - "anilistId": 21646, - "title": "Detective Conan: Sunflowers of Inferno", - "year": 2015, - "note": "Side story (anime-original)." - }, - { - "anilistId": 21470, - "title": "Detective Conan: The Darkest Nightmare", - "year": 2016, - "note": "Side story (anime-original)." - }, - { - "anilistId": 98222, - "title": "Detective Conan: The Crimson Love Letter", - "year": 2017, - "note": "Side story (anime-original)." - }, - { - "anilistId": 100653, - "title": "Detective Conan: Zero the Enforcer", - "year": 2018, - "note": "Side story (anime-original)." - }, - { - "anilistId": 106206, - "title": "Detective Conan: The Fist of Blue Sapphire", - "year": 2019, - "note": "Side story (anime-original)." - }, - { - "anilistId": 113653, - "title": "Detective Conan: The Scarlet Bullet", - "year": 2021, - "note": "Side story (anime-original); no 2020 film due to COVID-19." - }, - { - "anilistId": 142219, - "title": "Detective Conan: The Bride of Halloween", - "year": 2022, - "note": "Side story (anime-original)." - }, - { - "anilistId": 156841, - "title": "Detective Conan: Black Iron Submarine", - "year": 2023, - "note": "Side story (anime-original)." - }, - { - "anilistId": 169754, - "title": "Detective Conan: The Million-Dollar Pentagram", - "year": 2024, - "note": "Side story (anime-original)." - }, - { - "anilistId": 185212, - "title": "Detective Conan: One-Eyed Flashback", - "year": 2025, - "note": "Side story (anime-original)." - }, - { - "anilistId": 198369, - "title": "Detective Conan: Fallen Angel of the Highway", - "year": 2026, - "note": "Side story (anime-original); 30th-anniversary commemorative film." - } - ] -} diff --git a/src/data/mappings/devil-is-a-part-timer.json b/src/data/mappings/devil-is-a-part-timer.json deleted file mode 100644 index 371b35a..0000000 --- a/src/data/mappings/devil-is-a-part-timer.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "anilistAnimeId": 15809, - "anilistMangaId": 66723, - "title": "The Devil is a Part-Timer!", - "sourceNotes": "Source is a light novel (21 vols); this maps against the MANGA adaptation (AniList id 66723, 24 volumes, complete July 2025). AniList lists no chapter count; MangaUpdates gives 127 numbered chapters / 24 volumes. Cumulative episodes across S1 (2013, 13 eps) + S2 'Hataraku Maou-sama!!' (2022, 12 eps) + S2 Part 2 / '2nd Season' (2023, 12 eps) = 37 TV episodes (S2 = eps 14-25, S2P2 = eps 26-37). Major caveat: neither the anime nor the manga adapts the full LN. The manga covers the main Tokyo story (LN vols ~1-10) in its vols 1-19 (ch ~1-99), then its vols 20-24 (ch ~100-127) pivot to the PREQUEL '0/0-II' light novels (the Ente Isla origin of the Devil King's Army), which the anime never adapted. The anime's 37 eps cover only LN vols ~1-9 (manga ch ~1-89). Anime-to-LN boundaries (S1 = LN 1-2; S2 = LN 3,4,5,5.5) come from the Fandom FAQ; the manga-chapter alignment in the middle rows is approximate because the manga runs ~2 tankobon per LN volume and pads with unnumbered extras.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 21], - "arc": "Sasazuka / the Hero arrives (LN vols 1-2)" - }, - { - "episodes": [14, 19], - "chapters": [22, 37], - "arc": "Sariel / lifeguard & Sentucky (LN vol 3)" - }, - { - "episodes": [20, 25], - "chapters": [38, 49], - "arc": "Sephirah / Crestia Bell (LN vols 4-5)" - }, - { - "episodes": [26, 31], - "chapters": [50, 69], - "arc": "Farfarello / Malebranche, Acieth appears (LN vols 6-7)" - }, - { - "episodes": [32, 37], - "chapters": [70, 89], - "arc": "Driving test / Ente Isla buildup (LN vols 8-9)" - }, - { - "chapters": [90, 99], - "arc": "Ente Isla campaign aftermath / return to Japan (LN ~vol 10, unadapted by anime)" - }, - { - "chapters": [100, 127], - "arc": "Prequel: Devil King's Army origin (LN '0'/'0-II'; manga finale, never animated)" - } - ] -} diff --git a/src/data/mappings/devilman-crybaby.json b/src/data/mappings/devilman-crybaby.json deleted file mode 100644 index 7ab1d57..0000000 --- a/src/data/mappings/devilman-crybaby.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "anilistAnimeId": 98460, - "anilistMangaId": 31474, - "title": "Devilman Crybaby", - "sourceNotes": "10-episode Netflix ONA (2018, dir. Masaaki Yuasa) adapting Go Nagai's original 1972 Devilman manga, which is complete at 53 chapters across 5 tankobon volumes (AniList id 31474). Chapter ranges follow the five-volume structure (Vol 1 Sabbath/Amon, Vol 2 Sirene, Vol 3 Jinmen & demon hunts, Vol 4 the demon reveal/witch hunts/global war, Vol 5 Armageddon) and are approximate, because Crybaby heavily compresses and modernizes the source: it collapses the manga's lengthy demon-hunting middle and the entire apocalyptic finale (Ryo's televised demon reveal, the witch hunts, Miki's death, and Armageddon with the Satan reveal) into just the final two episodes. Boundaries drawn from the Devilman fandom episode guide and the Wikipedia volume list.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 11], - "arc": "The Sabbath & the Birth of Devilman (Amon)" - }, - { - "episodes": [4, 5], - "chapters": [12, 22], - "arc": "Sirene the Demoness" - }, - { - "episodes": [6, 8], - "chapters": [23, 32], - "arc": "Jinmen & the Demon Hunts" - }, - { - "episodes": [9, 9], - "chapters": [33, 43], - "arc": "The Demon Reveal & the Witch Hunts (Miki's Death)" - }, - { - "episodes": [10, 10], - "chapters": [44, 53], - "arc": "Armageddon (Satan's War)" - } - ] -} diff --git a/src/data/mappings/devils-line.json b/src/data/mappings/devils-line.json deleted file mode 100644 index 0235144..0000000 --- a/src/data/mappings/devils-line.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 99531, - "anilistMangaId": 86648, - "title": "Devils' Line", - "sourceNotes": "Single-cour, 12-episode anime adapting roughly the first six of fourteen manga volumes. Manga (Ryo Hanada, Morning Two) is complete at 80 chapters ('Lines'); no named-arc breakdown was found for this series (chapters are numbered, not titled by arc), so broad volume-range entries are used per episode-to-chapter sync guides, which place the anime's ending around chapter 38. A separate 2018 OVA, 'Anytime Anywhere,' bundled with manga volume 12, retells a parents' backstory side-story rather than continuing the main chapter sequence, so it is not folded into the cumulative episode numbering here.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 38], - "arc": "TV Anime Adaptation (Vols. 1-6)" - }, - { "chapters": [39, 80], "arc": "Unadapted (Vols. 7-14)" } - ] -} diff --git a/src/data/mappings/dgray-man.json b/src/data/mappings/dgray-man.json deleted file mode 100644 index 6f144c7..0000000 --- a/src/data/mappings/dgray-man.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "anilistAnimeId": 1482, - "anilistMangaId": 30024, - "title": "D.Gray-man", - "sourceNotes": "Cumulative episodes across original anime (103 eps, manga ch 1-157) + D.Gray-man HALLOW (13 eps, cumulative eps 104-116, manga ch 165-208). Phantom Thief G arc (eps 68-79) is anime-original and omitted. Manga ongoing (indefinite hiatus, ~252 chapters published).", - "mappings": [ - { - "episodes": [1, 9], - "chapters": [1, 21], - "arc": "Introduction / The Rewinding Town" - }, - { - "episodes": [10, 29], - "chapters": [22, 65], - "arc": "Mater / Krory's Castle / Ghost of Mater" - }, - { "episodes": [30, 51], "chapters": [66, 104], "arc": "Edo / Asia Branch" }, - { - "episodes": [52, 67], - "chapters": [105, 128], - "arc": "The Black Order Invasion" - }, - { - "episodes": [80, 103], - "chapters": [129, 157], - "arc": "Generals' Reunion / Ark of Noah Boarding" - }, - { - "episodes": [104, 116], - "chapters": [165, 208], - "arc": "Ark of Noah / Alma Karma (Hallow)" - }, - { "chapters": [209, 252], "arc": "14th Noah / Apocryphos (unadapted)" } - ] -} diff --git a/src/data/mappings/digimon-adventure.json b/src/data/mappings/digimon-adventure.json deleted file mode 100644 index 74248c1..0000000 --- a/src/data/mappings/digimon-adventure.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "anilistAnimeId": 552, - "anilistMangaId": 32387, - "title": "Digimon Adventure", - "sourceNotes": "Anime-original 1999 series (54 eps, Toei). Paired with the Hongying Studios manga adaptation (35 chapters). The anime is the canonical telling; the manga is a loose retelling. Digimon Adventure 02, Digimon Adventure: (2020 reboot), and the Tri/Last Evolution movies are separate AniList entries.", - "mappings": [ - { - "episodes": [1, 21], - "chapters": [1, 12], - "arc": "File Island (Devimon)" - }, - { - "episodes": [22, 39], - "chapters": [13, 22], - "arc": "Server Continent (Etemon)" - }, - { - "episodes": [40, 45], - "chapters": [23, 28], - "arc": "Real World (Myotismon)" - }, - { - "episodes": [46, 54], - "chapters": [29, 35], - "arc": "Dark Masters / Apocalymon" - } - ], - "movies": [ - { - "anilistId": 2961, - "title": "Digimon Adventure (Movie)", - "year": 1999, - "note": "Theatrical prologue short film; Hikari's first Digimon encounter." - }, - { - "anilistId": 2397, - "title": "Digimon Adventure: Our War Game!", - "year": 2000, - "afterEpisode": 54, - "note": "Canon film set between Adventure and 02." - } - ] -} diff --git a/src/data/mappings/do-you-love-your-mom-and-her-two-hit-multi-target-attacks.json b/src/data/mappings/do-you-love-your-mom-and-her-two-hit-multi-target-attacks.json deleted file mode 100644 index 332d9ec..0000000 --- a/src/data/mappings/do-you-love-your-mom-and-her-two-hit-multi-target-attacks.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 104723, - "anilistMangaId": 98280, - "title": "Do You Love Your Mom and Her Two-Hit Multi-Target Attacks?", - "sourceNotes": "Single-cour 12-episode TV anime (J.C. Staff, 2019). Sourced from Dachima Inaka's light novel (11 volumes, 79 chapters, complete) rather than the separate 5-volume/30-chapter manga adaptation, since AniList's ADAPTATION edge on the anime points to the novel. The finale wraps up with the tower-ascent climax, ending with light novel Volume 3; chapter boundary is approximated at ~7 chapters/volume since no official episode-to-chapter guide was found. A 1-episode OVA ('Do You Love Your Mom on the Shore?') was bundled with the Blu-ray release but is not a theatrical film, so it is omitted here. No distinct named story arcs, so broad season-based entries are used.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 22], - "arc": "Season 1 (Volumes 1-3)" - }, - { - "chapters": [23, 79], - "arc": "Unadapted (Volumes 4-11)" - } - ] -} diff --git a/src/data/mappings/domestic-girlfriend.json b/src/data/mappings/domestic-girlfriend.json deleted file mode 100644 index da5f1bd..0000000 --- a/src/data/mappings/domestic-girlfriend.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "anilistAnimeId": 103139, - "anilistMangaId": 85802, - "title": "Domestic Girlfriend", - "sourceNotes": "Single 12-episode TV season (2019) heavily condenses Kei Sasuga's manga ch 1-72, skipping several chapters along the way (e.g., 25-28 and 37-41), so a viewer resumes reading at ch 73. The manga is complete at 276 chapters / 28 volumes (AniList lists 299, counting bonus/extra chapters). The manga has no officially-labeled arcs, so the adapted-segment chapter ranges and the two unadapted tail groupings (ch 73-276) are approximate, descriptive labels.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 10], - "arc": "First Love and a New Family" - }, - { - "episodes": [5, 8], - "chapters": [11, 33], - "arc": "A Forbidden Triangle" - }, - { - "episodes": [9, 12], - "chapters": [34, 72], - "arc": "Hina's Departure" - }, - { - "chapters": [73, 180], - "arc": "The Aspiring Novelist (unadapted)" - }, - { - "chapters": [181, 276], - "arc": "Reunion and Resolution (unadapted, final)" - } - ] -} diff --git a/src/data/mappings/dorohedoro.json b/src/data/mappings/dorohedoro.json deleted file mode 100644 index 7eb5bb8..0000000 --- a/src/data/mappings/dorohedoro.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 105228, - "anilistMangaId": 31133, - "title": "Dorohedoro", - "sourceNotes": "Manga complete at 167 main chapters across 23 volumes (the 14-page 2020 special is sometimes counted as a 168th). AniList lists the manga as 191 chapters because it also counts the per-volume 'Bonus Curse' omake shorts and the special; all real chapter references and 'where to continue' guides use the 167-chapter main-story scale, which this mapping follows. Chapter ranges therefore do NOT match AniList's 191 figure. Anime: Season 1 (MAPPA, 2020) = eps 1-12; Season 2 (2025 ONA) = eps 13-23 (cumulative), total 23 canon episodes. Season 1 adapts roughly chapters 1-42 (it skips chapter 11 and reorders panels; ch 42 is split, with guides telling readers to resume at ch 41-42). Season 2 adapts roughly chapters 42-83, ending around volume 14 with readers pointed to continue at chapter 84. Because the anime reorders panels, S1/S2 split chapter 42; ranges below are made disjoint as 1-42 / 43-83 for clarity. Dorohedoro has no canonical arc-naming scheme (the wiki organizes by volume), so the labels below are descriptive. No theatrical films exist; the Netflix 'episode 13' Ma no Omake is a bundle of comedic OVA shorts, not story canon, and is excluded from the episode count. Unadapted tail (ch 84-167) is the back half of the story (post-En's-death) through the finale; a Season 3 has been announced.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 42], - "arc": "The Hole / En Family Conflict (Season 1)" - }, - { - "episodes": [13, 23], - "chapters": [43, 83], - "arc": "En Family Conflict to En's Death (Season 2)" - }, - { - "chapters": [84, 167], - "arc": "Aftermath / Cross-Eyes Occupation to Finale (unadapted)" - } - ] -} diff --git a/src/data/mappings/dororo.json b/src/data/mappings/dororo.json deleted file mode 100644 index a162888..0000000 --- a/src/data/mappings/dororo.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "anilistAnimeId": 101347, - "anilistMangaId": 31658, - "title": "Dororo", - "sourceNotes": "Tezuka's original manga is short (19 chapters / 4 volumes, 1967-1969) and was cancelled mid-run, then hastily concluded; Tezuka invented the 'Nue' (manga ch. 19) to wrap it up, leaving an open/unfinished ending. The 2019 anime (24 eps, MAPPA/Tezuka Productions) follows the core premise but DIVERGES and EXPANDS heavily: it reorders the manga's demon encounters, promotes flashback-only characters (Mio) into present-day arcs, and adds an entirely anime-original second half/finale (Tahomaru's full arc, Nui-no-Kata's sacrifice, Daigo's territory war, and Hyakkimaru being made whole) that has NO manga source. Mapping is COARSE and APPROXIMATE: episodes do not follow manga chapter order, and chapter ranges are best-fit groupings, not literal adaptations. The final entry extends to ch. 19 (manga complete) despite the original finale.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 8], - "arc": "Origins & Early Demons (Daigo, Hyakkimaru, Jukai, Bandai, Cursed Sword)" - }, - { - "episodes": [5, 12], - "chapters": [9, 9], - "arc": "Mio, Dororo's Past & Banmon (anime-expanded; mostly original)" - }, - { - "episodes": [13, 20], - "chapters": [10, 19], - "arc": "Remaining Manga Demons Compressed (Hakumen-Fudo, Maimai-Onba, Shiranui, Cape of No Mercy, Amanojaku, Nue)" - }, - { - "episodes": [21, 24], - "chapters": [19, 19], - "arc": "Anime-Original Finale (Daigo's territory war, Tahomaru, Nui, final battle)" - } - ] -} diff --git a/src/data/mappings/dr-stone.json b/src/data/mappings/dr-stone.json deleted file mode 100644 index b1ab793..0000000 --- a/src/data/mappings/dr-stone.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "anilistAnimeId": 105333, - "anilistMangaId": 98416, - "title": "Dr. Stone", - "sourceNotes": "Cumulative episodes across S1 (24) + Stone Wars (11) + Ryusui special (1) + New World Part 1 (11) + New World Part 2 (11) + Science Future Part 1 (12) + Science Future Part 2 (12) = 82 eps. Science Future Part 3 (cour 3) currently airing — not yet mapped. Arc-level approximation; manga ends at ch 232 (+ ch 233-236 epilogue).", - "mappings": [ - { "episodes": [1, 7], "chapters": [1, 13], "arc": "Stone Formula" }, - { "episodes": [8, 14], "chapters": [14, 25], "arc": "Village Origins" }, - { "episodes": [15, 22], "chapters": [26, 44], "arc": "Village Games" }, - { "episodes": [23, 24], "chapters": [45, 58], "arc": "Communications" }, - { "episodes": [25, 35], "chapters": [59, 83], "arc": "Stone Wars" }, - { - "episodes": [36, 36], - "chapters": [84, 91], - "arc": "Age of Exploration (Ryusui)" - }, - { "episodes": [37, 58], "chapters": [92, 138], "arc": "Treasure Island" }, - { - "episodes": [59, 82], - "chapters": [139, 205], - "arc": "Age of Exploration Saga (Source of DNA / Corn City / Petroleum)" - }, - { - "chapters": [206, 236], - "arc": "Moon Mission (Science Future Part 3 / finale)" - } - ] -} diff --git a/src/data/mappings/dragon-ball-super.json b/src/data/mappings/dragon-ball-super.json deleted file mode 100644 index c17f911..0000000 --- a/src/data/mappings/dragon-ball-super.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "anilistAnimeId": 21175, - "anilistMangaId": 86508, - "title": "Dragon Ball Super", - "sourceNotes": "Dragon Ball Super (2015) anime — 131 episodes paired with the Toyotaro manga (ongoing). Anime and manga developed in parallel and diverge in pacing: Battle of Gods / Resurrection 'F' are heavily expanded in the anime (the manga compresses both into ~5 chapters), and several anime arcs (Copy-Vegeta bridge, Tournament of Power expansions) have no direct manga counterpart. Chapter ranges are arc-level approximations. Manga arcs beyond the anime (Galactic Patrol Prisoner, Granolah Survivor, Super Hero, Black Frieza) are unmapped here.", - "mappings": [ - { "episodes": [1, 14], "chapters": [1, 3], "arc": "Battle of Gods" }, - { "episodes": [15, 27], "chapters": [4, 5], "arc": "Resurrection 'F'" }, - { "episodes": [28, 46], "chapters": [6, 13], "arc": "Universe 6" }, - { - "episodes": [47, 76], - "chapters": [14, 22], - "arc": "Future Trunks / Goku Black" - }, - { - "episodes": [77, 131], - "chapters": [23, 42], - "arc": "Universal Survival / Tournament of Power" - }, - { "chapters": [43, 67], "arc": "Galactic Patrol Prisoner (Moro)" }, - { "chapters": [68, 87], "arc": "Granolah the Survivor" }, - { "chapters": [88, 104], "arc": "Super Hero / Black Frieza" } - ], - "movies": [ - { - "anilistId": 101302, - "title": "Dragon Ball Super: Broly", - "year": 2018, - "afterEpisode": 131, - "note": "Canon film following the Universe Survival arc." - }, - { - "anilistId": 133898, - "title": "Dragon Ball Super: Super Hero", - "year": 2022, - "afterEpisode": 131, - "note": "Canon film set after Broly." - } - ] -} diff --git a/src/data/mappings/dragon-ball-z.json b/src/data/mappings/dragon-ball-z.json deleted file mode 100644 index 22b2605..0000000 --- a/src/data/mappings/dragon-ball-z.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "anilistAnimeId": 813, - "anilistMangaId": 30042, - "title": "Dragon Ball Z", - "sourceNotes": "Dragon Ball Z (1989) anime — 291 episodes covering manga chapters 195–519 (Saiyan saga through Majin Buu / end of manga). DBZ has substantial anime filler (Garlic Jr., Other World Tournament, etc.) not in the manga; chapter ranges here count only manga-adapted episodes.", - "mappings": [ - { "episodes": [1, 39], "chapters": [195, 241], "arc": "Saiyan Saga" }, - { "episodes": [40, 117], "chapters": [242, 329], "arc": "Frieza Saga" }, - { - "episodes": [118, 194], - "chapters": [330, 420], - "arc": "Android & Cell Saga" - }, - { "episodes": [195, 291], "chapters": [421, 519], "arc": "Majin Buu Saga" } - ], - "movies": [ - { - "anilistId": 894, - "title": "Dragon Ball Z: Dead Zone", - "year": 1989, - "note": "Side story (theatrical)." - }, - { - "anilistId": 895, - "title": "Dragon Ball Z: The World's Strongest", - "year": 1990, - "note": "Side story (theatrical)." - }, - { - "anilistId": 896, - "title": "Dragon Ball Z: The Tree of Might", - "year": 1990, - "note": "Side story (theatrical)." - }, - { - "anilistId": 897, - "title": "Dragon Ball Z: Lord Slug", - "year": 1991, - "note": "Side story (theatrical)." - }, - { - "anilistId": 898, - "title": "Dragon Ball Z: Cooler's Revenge", - "year": 1991, - "note": "Side story (theatrical)." - }, - { - "anilistId": 899, - "title": "Dragon Ball Z: The Return of Cooler", - "year": 1992, - "note": "Side story (theatrical)." - }, - { - "anilistId": 900, - "title": "Dragon Ball Z: Super Android 13!", - "year": 1992, - "note": "Side story (theatrical)." - }, - { - "anilistId": 901, - "title": "Dragon Ball Z: Broly - The Legendary Super Saiyan", - "year": 1993, - "note": "Side story (theatrical)." - }, - { - "anilistId": 902, - "title": "Dragon Ball Z: Bojack Unbound", - "year": 1993, - "note": "Side story (theatrical)." - }, - { - "anilistId": 903, - "title": "Dragon Ball Z: Broly - Second Coming", - "year": 1994, - "note": "Side story (theatrical)." - }, - { - "anilistId": 904, - "title": "Dragon Ball Z: Bio-Broly", - "year": 1994, - "note": "Side story (theatrical)." - }, - { - "anilistId": 905, - "title": "Dragon Ball Z: Fusion Reborn", - "year": 1995, - "note": "Side story (theatrical)." - }, - { - "anilistId": 906, - "title": "Dragon Ball Z: Wrath of the Dragon", - "year": 1995, - "note": "Side story (theatrical)." - }, - { - "anilistId": 14837, - "title": "Dragon Ball Z: Battle of Gods", - "year": 2013, - "note": "Canon film set after the Majin Buu arc; later retold in Dragon Ball Super." - }, - { - "anilistId": 20778, - "title": "Dragon Ball Z: Resurrection 'F'", - "year": 2015, - "note": "Canon film set after the Majin Buu arc; later retold in Dragon Ball Super." - } - ] -} diff --git a/src/data/mappings/dragon-ball.json b/src/data/mappings/dragon-ball.json deleted file mode 100644 index 8b21f6c..0000000 --- a/src/data/mappings/dragon-ball.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "anilistAnimeId": 223, - "anilistMangaId": 30042, - "title": "Dragon Ball", - "sourceNotes": "Original Dragon Ball (1986) anime — 153 episodes covering manga chapters 1–194 (through the 23rd World Tournament / end of the Piccolo Jr. saga). Subsequent manga arcs (Saiyan onward, ch 195+) are adapted by `Dragon Ball Z`; see that mapping.", - "mappings": [ - { "episodes": [1, 13], "chapters": [1, 22], "arc": "Emperor Pilaf" }, - { - "episodes": [14, 28], - "chapters": [23, 53], - "arc": "21st World Tournament" - }, - { "episodes": [29, 68], "chapters": [54, 103], "arc": "Red Ribbon Army" }, - { - "episodes": [69, 83], - "chapters": [104, 112], - "arc": "Fortuneteller Baba" - }, - { - "episodes": [84, 101], - "chapters": [113, 135], - "arc": "22nd World Tournament" - }, - { "episodes": [102, 122], "chapters": [136, 165], "arc": "King Piccolo" }, - { - "episodes": [123, 153], - "chapters": [166, 194], - "arc": "Piccolo Jr. / 23rd World Tournament" - } - ], - "movies": [ - { - "anilistId": 502, - "title": "Dragon Ball: Curse of the Blood Rubies", - "year": 1986, - "note": "Standalone theatrical retelling of the Emperor Pilaf arc." - }, - { - "anilistId": 891, - "title": "Dragon Ball: Sleeping Princess in Devil's Castle", - "year": 1987, - "note": "Side story (anime-original)." - }, - { - "anilistId": 892, - "title": "Dragon Ball: Mystical Adventure", - "year": 1988, - "note": "Standalone theatrical side story." - }, - { - "anilistId": 893, - "title": "Dragon Ball: The Path to Power", - "year": 1996, - "note": "10th-anniversary theatrical retelling of the early Red Ribbon arcs." - } - ] -} diff --git a/src/data/mappings/dragon-maid.json b/src/data/mappings/dragon-maid.json deleted file mode 100644 index c26ec27..0000000 --- a/src/data/mappings/dragon-maid.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "anilistAnimeId": 21776, - "anilistMangaId": 86303, - "title": "Miss Kobayashi's Dragon Maid", - "sourceNotes": "Cumulative episodes across S1 (13) + S2 'S' (12, eps 14-25) = 25 total. Paired with the Coolkyousinnjya manga (ongoing, ~19 volumes / ch. ~190 as of 2026, serialized in Monthly Action / Manga Action). The manga is largely episodic slice-of-life and KyoAni adapts it out of order, so chapter boundaries are approximate; volume anchors are firmer (S1 ~vols 1-3, S2 ~vols 4-6, film ~vol 8).", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 34], - "arc": "Tohru & Kobayashi / Kanna's School → Tohru's Father (S1, vols 1-3)" - }, - { - "episodes": [14, 25], - "chapters": [35, 64], - "arc": "Ilulu's Introduction / Elma's Daily Life (Dragon Maid S, vols 4-6)" - }, - { - "chapters": [65, 190], - "arc": "Kanna's Father / Chaos-Harmony War & later episodic arcs (unadapted by TV; partly covered by the 2025 film)" - } - ], - "movies": [ - { - "anilistId": 181839, - "title": "Miss Kobayashi's Dragon Maid: A lonely dragon wants to be loved", - "year": 2025, - "afterEpisode": 25, - "note": "Canon KyoAni film set after Dragon Maid S, adapting the Kanna's father / Chaos-Harmony arc (~manga vol 8)." - } - ] -} diff --git a/src/data/mappings/drifters.json b/src/data/mappings/drifters.json deleted file mode 100644 index d98083f..0000000 --- a/src/data/mappings/drifters.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 21123, - "anilistMangaId": 43801, - "title": "Drifters", - "sourceNotes": "Manga ongoing (RELEASING; Kouta Hirano, 2009-). AniList reports no chapter total; the Drifters Wiki / Wikipedia list 7 volumes through ~chapter 97 (latest chapters uncollected). Volume-to-chapter map: V1 1-11, V2 12-22, V3 23-35, V4 36-47, V5 48-59, V6 60-71, V7 72-86, with ch 87-97 not yet in tankobon. The 12-episode TV anime (Hoods Entertainment, 2016; id 21123) adapts roughly chapters 1-44; a manga reader continues at ch 45 after the TV series. A 3-episode OVA continuation (id 97988, sequel to the TV series) carries the story to about chapter 56 — those are listed here CUMULATIVELY as episodes 13-15. Everything from ~ch 57 onward is manga only. The standalone 1-episode 'Drifters (OVA)' (id 16932) and 'Special edition' recap (id 122922) are excluded. Episode-to-chapter ranges are approximate.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 14], - "arc": "Arrival (Toyohisa is drawn into the new world; meets Nobunaga & Yoichi)" - }, - { - "episodes": [5, 8], - "chapters": [15, 30], - "arc": "The Octobrist Organization & Carneades Fort" - }, - { - "episodes": [9, 12], - "chapters": [31, 44], - "arc": "Battle for Carneades / the Elf Village (TV finale)" - }, - { - "episodes": [13, 15], - "chapters": [45, 56], - "arc": "Orte Empire & the dwarves (OVA continuation)" - }, - { - "chapters": [57, 97], - "arc": "Later chapters (manga only, ongoing)" - } - ] -} diff --git a/src/data/mappings/duke-of-death-and-his-maid.json b/src/data/mappings/duke-of-death-and-his-maid.json deleted file mode 100644 index 8bf5696..0000000 --- a/src/data/mappings/duke-of-death-and-his-maid.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "anilistAnimeId": 129277, - "anilistMangaId": 100293, - "title": "The Duke of Death and His Maid", - "sourceNotes": "Cumulative episodes across S1 (12, 2021) + S2 (12, 2023) + S3 (12, 2024) = 36 eps. Manga complete at 223 chapters over 16 volumes (AniList's raw chapter count of 240 includes bonus .5-numbered omake chapters not part of the main numbered sequence). Episodic Victorian-fantasy romantic comedy with no named story arcs on the fandom wiki; boundaries follow the well-documented restart points where each new season resumes the manga: S1 adapts ch. 1-68, S2 resumes at ch. 69 through ch. 141, S3 resumes at ch. 142 through the finale at ch. 223, making the TV adaptation a complete one.", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 68], "arc": "Season 1" }, - { "episodes": [13, 24], "chapters": [69, 141], "arc": "Season 2" }, - { "episodes": [25, 36], "chapters": [142, 223], "arc": "Season 3" } - ] -} diff --git a/src/data/mappings/durarara.json b/src/data/mappings/durarara.json deleted file mode 100644 index 3a81082..0000000 --- a/src/data/mappings/durarara.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 6746, - "anilistMangaId": 44841, - "title": "Durarara!!", - "sourceNotes": "S1 anime (24 eps, 2010) covers light novel vol 1-3. Paired with the Akiyo Satorigi manga adaptation (22 chapters, finished). The Durarara!! x2 sequels (Shou/Ten/Ketsu, 36 cumulative eps) and the Durarara!! SH spinoff are separate AniList entries.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 11], - "arc": "Dollars / Headless Rider Mystery (S1 First Cour)" - }, - { - "episodes": [13, 24], - "chapters": [12, 22], - "arc": "Yagiri Pharmaceuticals / Saika (S1 Second Cour)" - } - ] -} diff --git a/src/data/mappings/dusk-maiden-of-amnesia.json b/src/data/mappings/dusk-maiden-of-amnesia.json deleted file mode 100644 index b416550..0000000 --- a/src/data/mappings/dusk-maiden-of-amnesia.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 12445, - "anilistMangaId": 45805, - "title": "Dusk Maiden of Amnesia", - "sourceNotes": "Single 12-episode TV season (2012, Silver Link); a bonus 13th episode included only on the season 6 BD/DVD is not counted here. Manga (Tasogare Otome x Amnesia) complete at 54 chapters (10 volumes, 2009-2013). The anime faithfully adapts the opening Seven Mysteries chapters through ch 24 (vol 6) across eps 1-6, then becomes anime-original for eps 7-12 with an invented ending that diverges from the manga's actual conclusion — those episodes are left unmapped. Chapters 25-54 (the manga's true back half and ending) were never adapted.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 24], - "arc": "Seven Mysteries of Seikyou Academy (opening chapters)" - }, - { - "chapters": [25, 54], - "arc": "Later Seven Mysteries + true ending (unadapted; anime diverges from ep 7 onward)" - } - ] -} diff --git a/src/data/mappings/edens-zero.json b/src/data/mappings/edens-zero.json deleted file mode 100644 index 6ba949a..0000000 --- a/src/data/mappings/edens-zero.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 119683, - "anilistMangaId": 101860, - "title": "EDENS ZERO", - "sourceNotes": "Cumulative episodes across S1 (25) + S2 (25) = 50 total; use the S1 anime id 119683. Manga complete at 293 chapters (33 volumes). Arc boundaries from the series' fandom wiki; S2 ends mid-Nero 66 arc (ep. 50 covers through ch. 140), leaving the remainder of the manga unadapted on TV.", - "mappings": [ - { "episodes": [1, 3], "chapters": [1, 3], "arc": "Intro Arc" }, - { "episodes": [4, 6], "chapters": [4, 11], "arc": "Norma Arc" }, - { "episodes": [7, 7], "chapters": [12, 14], "arc": "Skull Fairy Arc" }, - { "episodes": [8, 12], "chapters": [15, 28], "arc": "Guilst Arc" }, - { "episodes": [13, 17], "chapters": [29, 43], "arc": "Digitalis Arc" }, - { "episodes": [18, 18], "chapters": [44, 48], "arc": "Mildian Arc" }, - { - "episodes": [19, 25], - "chapters": [49, 68], - "arc": "Sun Jewel Arc (S1 finale)" - }, - { "episodes": [26, 36], "chapters": [69, 99], "arc": "Belial Gore Arc" }, - { "episodes": [37, 38], "chapters": [100, 104], "arc": "Edens One Arc" }, - { "episodes": [39, 40], "chapters": [105, 111], "arc": "Red Cave Arc" }, - { "episodes": [41, 48], "chapters": [112, 133], "arc": "Foresta Arc" }, - { - "episodes": [49, 50], - "chapters": [134, 140], - "arc": "Sandra Arc / Nero 66 Arc (S2 finale)" - }, - { "chapters": [141, 169], "arc": "Nero 66 Arc (unadapted tail)" }, - { "chapters": [170, 180], "arc": "X495 Arc (unadapted)" }, - { "chapters": [181, 220], "arc": "Lendard Arc (unadapted)" }, - { "chapters": [221, 247], "arc": "Edens Zero Reunion Arc (unadapted)" }, - { "chapters": [248, 255], "arc": "Miltz Arc (unadapted)" }, - { - "chapters": [256, 293], - "arc": "Edens One War Arc (unadapted, series finale)" - } - ] -} diff --git a/src/data/mappings/elfen-lied.json b/src/data/mappings/elfen-lied.json deleted file mode 100644 index b5d1bf7..0000000 --- a/src/data/mappings/elfen-lied.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 226, - "anilistMangaId": 30933, - "title": "Elfen Lied", - "sourceNotes": "TV anime (13 eps, 2004, Arms) adapts Lynn Okamoto's manga but compresses and heavily reorders the multi-chapter flashbacks, and by the finale diverges into an anime-original ending. It loosely covers roughly the first six volumes (through ch. ~61; readers are advised to continue the manga around ch. 62). The manga is complete: AniList lists 113 chapters (commonly cited as 107 numbered chapters plus extras) across 12 volumes. Per-arc chapter ranges are approximate due to the anime's reordering.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 15], - "arc": "Lucy's Escape & Maple House (Kouta, Yuka, Nyu)" - }, - { - "episodes": [5, 9], - "chapters": [16, 40], - "arc": "Nana, Bando & Mayu's Past" - }, - { - "episodes": [10, 13], - "chapters": [41, 61], - "arc": "Kakuzawa Conspiracy & Lucy's Origin (anime-original ending)" - }, - { - "chapters": [62, 113], - "arc": "Unadapted (Diclonius War & the manga's true conclusion)" - } - ] -} diff --git a/src/data/mappings/eminence-in-shadow.json b/src/data/mappings/eminence-in-shadow.json deleted file mode 100644 index c3abee6..0000000 --- a/src/data/mappings/eminence-in-shadow.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 130298, - "anilistMangaId": 108428, - "title": "The Eminence in Shadow", - "sourceNotes": "Cumulative episodes across S1 (20) + S2 (12, eps 21-32) = 32 total. Paired with the Anri Sakano manga adaptation (ongoing, ~60 chapters). Both adapt the Daisuke Aizawa light novel. Per-arc chapter boundaries approximate.", - "mappings": [ - { - "episodes": [1, 10], - "chapters": [1, 20], - "arc": "Shadow Garden Founding / Diabolos Cult Intro" - }, - { - "episodes": [11, 20], - "chapters": [21, 40], - "arc": "Oriana Kingdom (S1 Finale)" - }, - { - "episodes": [21, 32], - "chapters": [41, 60], - "arc": "Mitsugoshi / John Smith (S2)" - } - ] -} diff --git a/src/data/mappings/engaged-to-the-unidentified.json b/src/data/mappings/engaged-to-the-unidentified.json deleted file mode 100644 index 1430545..0000000 --- a/src/data/mappings/engaged-to-the-unidentified.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 20483, - "anilistMangaId": 51097, - "title": "Engaged to the Unidentified", - "sourceNotes": "Single 12-episode TV season (2014, Doga Kobo). Source is Cherry-Arai's 4-koma manga (16 volumes, complete at 187 chapters). 4-koma source — chapter ranges are approximate: the anime adapts roughly the first third of the manga, with its final episode largely anime-original; fan consensus places the resume point for continuing the story at chapter 57. The remainder of the manga (unadapted at the time the anime aired) is included at the tail.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 56], - "arc": "Kobeni moves in with the Mitsumine family (early slice-of-life vignettes)" - }, - { - "chapters": [57, 187], - "arc": "Continued slice-of-life (unadapted, manga concludes at ch. 187)" - } - ] -} diff --git a/src/data/mappings/erased.json b/src/data/mappings/erased.json deleted file mode 100644 index dc77653..0000000 --- a/src/data/mappings/erased.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "anilistAnimeId": 21234, - "anilistMangaId": 69325, - "title": "Erased", - "sourceNotes": "The 12-episode TV anime adapts the COMPLETE main story: 44 chapters across 8 volumes (Vol. 8 = ch. 41-44, 'The Town Without Me'). AniList lists 49 chapters because it includes a side-story epilogue volume ('RE'); the main story is 44 chapters and the manga is complete (finished March 2016). The anime's ending DIVERGES from the manga: the manga's extended present-day cat-and-mouse confrontation with Yashiro spans chapters 37-44 and climaxes on a bridge, whereas the anime compresses this into roughly two episodes and relocates the final showdown to a hospital rooftop trap (also shrinking Kumi's role and cutting Yashiro's extended backstory). Endpoints (ep 1 = ch 1, ep 12 = ch 44) are firm; internal boundaries are anchored to manga volume breaks and are approximate, with the ep 11/12 split being the softest due to the compressed finale. No canonical anime film exists; the 2016 Erased film and the Netflix series are live-action (excluded).", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 6], - "arc": "Present-day 'Revival' setup & Sachiko's murder" - }, - { - "episodes": [3, 7], - "chapters": [7, 24], - "arc": "Back to 1988 — befriending & saving Kayo Hinazuki" - }, - { - "episodes": [8, 9], - "chapters": [25, 30], - "arc": "Continued 1988 rescue / the killer closing in" - }, - { - "episodes": [10, 11], - "chapters": [31, 36], - "arc": "Frozen-lake confrontation & the 15-year coma" - }, - { - "episodes": [12, 12], - "chapters": [37, 44], - "arc": "Present-day finale — confronting Yashiro (anime ending diverges)" - } - ] -} diff --git a/src/data/mappings/eromanga-sensei.json b/src/data/mappings/eromanga-sensei.json deleted file mode 100644 index 8285f03..0000000 --- a/src/data/mappings/eromanga-sensei.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 21685, - "anilistMangaId": 85471, - "title": "Eromanga Sensei", - "sourceNotes": "Source is Tsukasa Fushimi's light novel (13 vols, AniList 85166). Paired here with the manga adaptation by Rin (AniList 85471): 79 chapters / 12 vols, serialized May 2014 - May 2021 (FINISHED). The 2017 TV anime (12 eps) adapts roughly LN vols 1-5, so a viewer can resume the manga at ch. 34. A 2-ep OVA exists (AniList 100523) but is omitted; there are no theatrical films. Episode-to-chapter boundaries are APPROXIMATE because the anime reorders and condenses material relative to both the LN and the manga; treat the chapter ranges as coarse guides rather than exact cut points.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 8], - "arc": "Eromanga-sensei Revealed (Sagiri & Masamune become a team)" - }, - { - "episodes": [4, 6], - "chapters": [9, 16], - "arc": "Elf Yamada (rival author & illustration showdown)" - }, - { - "episodes": [7, 9], - "chapters": [17, 25], - "arc": "Muramasa Senju (the genius novelist)" - }, - { - "episodes": [10, 12], - "chapters": [26, 33], - "arc": "Stepping Outside (Sagiri's resolve & family backstory)" - }, - { - "chapters": [34, 79], - "arc": "Beyond the Anime (unadapted manga continuation through the finale)" - } - ] -} diff --git a/src/data/mappings/failure-frame.json b/src/data/mappings/failure-frame.json deleted file mode 100644 index 318fb4e..0000000 --- a/src/data/mappings/failure-frame.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "anilistAnimeId": 173694, - "anilistMangaId": 110989, - "title": "Failure Frame: I Became the Strongest and Annihilated Everything with Low-Level Spells", - "sourceNotes": "Single 12-episode season (Seven Arcs, 2024) adapts light novel volumes 1-4; the anilistMangaId here points at the separate manga adaptation (AniList's light-novel entry doesn't track a chapter count), which covers the same content through approx. chapter 44 (community continuation point cited as vol. 9, ch. 44.2). Manga ongoing (current ch. 70 as of mid-2026). No widely established named arcs for this fast-paced revenge-isekai story, so mapping uses broad coverage entries.", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 44], "arc": "TV Anime Adaptation" }, - { "chapters": [45, 70], "arc": "Unadapted Chapters" } - ] -} diff --git a/src/data/mappings/fairy-tail.json b/src/data/mappings/fairy-tail.json deleted file mode 100644 index 8fe9371..0000000 --- a/src/data/mappings/fairy-tail.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "anilistAnimeId": 6702, - "anilistMangaId": 30598, - "title": "Fairy Tail", - "sourceNotes": "Cumulative episodes across original 2009 series (175 eps) + 2014 series (eps 176-277) + Final Series (eps 278-328) = 328 total. Manga complete at 545 chapters (AniList lists 549 incl. extras). Three filler arcs (Daphne eps 72-85, Key of the Starry Sky eps 151-175, Eclipse Celestial Spirits eps 227-233) are omitted. Chapter boundaries for later arcs are approximate — refine via PR.", - "mappings": [ - { - "episodes": [1, 9], - "chapters": [1, 21], - "arc": "Lullaby (Macao / Daybreak / Eisenwald)" - }, - { "episodes": [10, 19], "chapters": [22, 44], "arc": "Galuna Island" }, - { "episodes": [20, 29], "chapters": [45, 69], "arc": "Phantom Lord" }, - { "episodes": [30, 32], "chapters": [70, 78], "arc": "Loke" }, - { "episodes": [33, 39], "chapters": [79, 110], "arc": "Tower of Heaven" }, - { - "episodes": [40, 48], - "chapters": [111, 148], - "arc": "Battle of Fairy Tail / Fighting Festival" - }, - { "episodes": [49, 71], "chapters": [149, 187], "arc": "Oración Seis" }, - { "episodes": [86, 122], "chapters": [188, 235], "arc": "Edolas" }, - { - "episodes": [123, 150], - "chapters": [236, 302], - "arc": "Tenrou Island / Grimoire Heart" - }, - { - "episodes": [176, 226], - "chapters": [303, 388], - "arc": "Grand Magic Games" - }, - { "episodes": [228, 233], "chapters": [389, 416], "arc": "Sun Village" }, - { "episodes": [234, 265], "chapters": [417, 466], "arc": "Tartaros" }, - { "episodes": [278, 284], "chapters": [467, 486], "arc": "Avatar" }, - { "episodes": [285, 328], "chapters": [487, 549], "arc": "Alvarez Empire" } - ], - "movies": [ - { - "anilistId": 12049, - "title": "Fairy Tail: Phoenix Priestess", - "year": 2012, - "note": "Side story (anime-original)." - }, - { - "anilistId": 21191, - "title": "Fairy Tail: Dragon Cry", - "year": 2017, - "afterEpisode": 277, - "note": "Canon side-story film between the 2014 series and the Final Series." - } - ] -} diff --git a/src/data/mappings/familiar-of-zero.json b/src/data/mappings/familiar-of-zero.json deleted file mode 100644 index 528db9a..0000000 --- a/src/data/mappings/familiar-of-zero.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 1195, - "anilistMangaId": 35450, - "title": "The Familiar of Zero", - "sourceNotes": "Cumulative episodes across S1 (13) + 'Knight of the Twin Moons'/S2 (12, eps 14-25) + 'Rondo of Princesses'/S3 (12, eps 26-37) + 'F'/S4 (12, eps 38-49) = 49 total; the four J.C.Staff TV series (2006/2007/2008/2012) are sequels, so episodes are numbered continuously. The Nana Mochizuki manga adaptation (id 31154) is incomplete (only ~36 ch / 7 vols, ending around LN vol 3), so this maps to Noboru Yamaguchi's complete LIGHT NOVEL instead (AniList id 35450, type MANGA, 222 chapters across 22 volumes). The LN ran 20 volumes (2004-2011); Yamaguchi died in 2013 leaving it unfinished, and the final two volumes (21-22, 2016/2017) were completed posthumously by another author from his notes. Mapping is by LN VOLUME (cleaner than the truncated manga): S1 ~vols 1-3, S2 ~vols 4-6, S3 ~vols 7-9, S4 'F' loosely covers later volumes with heavy anime-original content and an original ending (the LN was unfinished when F aired). Chapter ranges are proportional estimates converting those volume boundaries onto AniList's 222-chapter count, so per-season boundaries are APPROXIMATE. The LN's true conclusion (vols 21-22) is unadapted. No theatrical films exist (the only side entry is the 'Seductive Beach' OVA, omitted).", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 30], - "arc": "S1: The Familiar of Zero (LN vols 1-3)" - }, - { - "episodes": [14, 25], - "chapters": [31, 61], - "arc": "S2: Knight of the Twin Moons / Futatsuki no Kishi (LN vols 4-6)" - }, - { - "episodes": [26, 37], - "chapters": [62, 91], - "arc": "S3: Rondo of Princesses / Princesses no Rondo (LN vols 7-9)" - }, - { - "episodes": [38, 49], - "chapters": [92, 172], - "arc": "S4: F (later LN volumes; anime-original ending)" - }, - { - "chapters": [173, 222], - "arc": "Final Arc (LN vols 18-22; unadapted, conclusion completed posthumously)" - } - ] -} diff --git a/src/data/mappings/faraway-paladin.json b/src/data/mappings/faraway-paladin.json deleted file mode 100644 index 627d7bf..0000000 --- a/src/data/mappings/faraway-paladin.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 132473, - "anilistMangaId": 101521, - "title": "The Faraway Paladin", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 \"The Lord of Rust Mountains\" (12, eps 13-24). Light-novel sourced (Kanata Yanagino), but the LN is on hiatus, so the community syncs the anime to the ongoing manga adaptation (Mutsumi Okubashi) — used here as the chapter basis. Manga ongoing (current ch. ~75, June 2026). S1 covers manga ch 1-28 (continue reading at Vol 6, ch 29); S2 covers ch 29-66 (continue at Vol 14, ch 67). Because the anime adapts the LN directly while the manga expands the same story more slowly, per-arc manga chapter ranges are approximate.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 28], - "arc": "The Boy in the City of the Dead" - }, - { - "episodes": [13, 24], - "chapters": [29, 66], - "arc": "The Lord of the Rust Mountains" - }, - { - "chapters": [67, 75], - "arc": "The Torch Port Ensemble (unadapted)" - } - ] -} diff --git a/src/data/mappings/farming-life-in-another-world.json b/src/data/mappings/farming-life-in-another-world.json deleted file mode 100644 index c07f835..0000000 --- a/src/data/mappings/farming-life-in-another-world.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 146850, - "anilistMangaId": 100456, - "title": "Farming Life in Another World", - "sourceNotes": "Light-novel-sourced (Isekai Nonbiri Nouka), but the community aligns the anime to the manga adaptation (AniList 100456), which is the numbering used by every \"where to start reading\" guide; ranges are therefore given in manga chapters. Cumulative episodes across S1 (12) + S2 (12) = 24. The adaptation is extremely loose slice-of-life: it plucks, condenses, re-orders and rewrites arcs rather than following the source linearly, so per-episode chapter boundaries are not knowable and these ranges are approximate season-level spans. Anchors from reading guides: after S1 you resume at manga Vol. 3 Ch. 25 (S1 ≈ ch. 1-24), and S2 makes a large jump and ends around manga Ch. 314, skipping many intervening arcs. Manga ongoing (current ch. 319 as of July 2026).", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 24], - "arc": "Big Tree Village Founding" - }, - { - "episodes": [13, 24], - "chapters": [25, 314], - "arc": "Village Expansion" - }, - { - "chapters": [315, 319], - "arc": "Beyond the Anime (unadapted)" - } - ] -} diff --git a/src/data/mappings/fate-apocrypha.json b/src/data/mappings/fate-apocrypha.json deleted file mode 100644 index 020a0b8..0000000 --- a/src/data/mappings/fate-apocrypha.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "anilistAnimeId": 98035, - "anilistMangaId": 63005, - "title": "Fate/Apocrypha", - "sourceNotes": "Single 25-episode, 2-cour TV series (no multiple seasons), so episode numbers are absolute. Based on Yuuichirou Higashide's 5-volume light novel (complete; AniList novel entry 63005). Chapter ranges here are by LN VOLUME (1-5) — the numbering fan/episode guides use — not AniList's flat 26-\"chapter\" count. First cour (eps 1-12) adapts vols 1-3: ep 12 \"The Holy Man Returns Triumphant\" matches vol 3's title \"Triumphal Return of the Saint.\" Second cour (eps 13-25) covers vols 4-5 but diverges heavily with anime-original material, so back-half volume boundaries are approximate. Two recap episodes (12.5, 19.5) are excluded from the counts.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 1], - "arc": "Great Holy Grail War" - }, - { - "episodes": [5, 8], - "chapters": [2, 2], - "arc": "Round Dance of Black / Festival of Red" - }, - { - "episodes": [9, 12], - "chapters": [3, 3], - "arc": "Triumphal Return of the Saint" - }, - { - "episodes": [13, 19], - "chapters": [4, 4], - "arc": "Cup of Purgatory" - }, - { - "episodes": [20, 25], - "chapters": [5, 5], - "arc": "Evil Dragon and the Holy Woman" - } - ] -} diff --git a/src/data/mappings/fate-stay-night.json b/src/data/mappings/fate-stay-night.json deleted file mode 100644 index ff4f26d..0000000 --- a/src/data/mappings/fate-stay-night.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 356, - "anilistMangaId": 30715, - "title": "Fate/stay night", - "sourceNotes": "Original 2006 Studio DEEN anime (24 eps) adapts the 'Fate' route of the Type-Moon visual novel. Paired with the Datto Nishiwaki manga (87 chapters / 20 vols, 2005-2012) which also adapts the Fate route. The UBW (2014-2015, id 19603) and Heaven's Feel (movie trilogy) anime adapt different VN routes and have their own AniList entries.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 40], - "arc": "Fate Route: Holy Grail War Begins" - }, - { - "episodes": [13, 24], - "chapters": [41, 87], - "arc": "Fate Route: Saber's Wish / Finale" - } - ] -} diff --git a/src/data/mappings/fate-strange-fake.json b/src/data/mappings/fate-strange-fake.json deleted file mode 100644 index e234f41..0000000 --- a/src/data/mappings/fate-strange-fake.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 166617, - "anilistMangaId": 50006, - "title": "Fate/strange Fake", - "sourceNotes": "S1 anime is 13 episodes (2024-2026), adapting the Snowfield false Holy Grail War from Ryohgo Narita's light novel through roughly volume 6 (ep. 13 draws from ch. 20 of vol. 6). The Shidzuki Morii manga adaptation is far behind the anime (5 volumes published, only reaching early-series content), so this mapping uses LIGHT-NOVEL VOLUME NUMBERS as the 'chapters' axis instead, following the Ascendance of a Bookworm / Bottom-Tier Character Tomozaki convention. The light novel is ongoing at 9 published volumes (through March 2024) with a 10th and final volume expected in 2026; volume boundaries within S1 are approximate. No qualifying theatrical films — the 'Whispers of Dawn' special (July 2023) was a TV/con-screening prequel, not a Japanese theatrical release.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 6], - "arc": "Snowfield False Holy Grail War (LN vols 1-6)" - }, - { - "chapters": [7, 9], - "arc": "War's climax, unadapted by the anime (LN vols 7-9)" - } - ] -} diff --git a/src/data/mappings/fate-zero.json b/src/data/mappings/fate-zero.json deleted file mode 100644 index e39e972..0000000 --- a/src/data/mappings/fate-zero.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 10087, - "anilistMangaId": 55191, - "title": "Fate/Zero", - "sourceNotes": "Cumulative episodes across S1 (13) + S2 (12, eps 14-25) = 25 total. Paired with the Shinjiro manga adaptation (74 chapters / 16 vols, finished). Both adapt the Gen Urobuchi light novel.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 35], - "arc": "4th Holy Grail War: Opening Salvos (S1)" - }, - { - "episodes": [14, 25], - "chapters": [36, 74], - "arc": "4th Holy Grail War: Endgame (S2)" - } - ] -} diff --git a/src/data/mappings/fire-force.json b/src/data/mappings/fire-force.json deleted file mode 100644 index 6d633ff..0000000 --- a/src/data/mappings/fire-force.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "anilistAnimeId": 105310, - "anilistMangaId": 86310, - "title": "Fire Force", - "sourceNotes": "Cumulative episodes across S1 (24) + S2 (24) + S3 Part 1 (12) + S3 Part 2 (13). Manga complete at 305 chapters; anime adapted the full run. Virtually no filler. Arc boundaries from Fire Force Wiki / Deltia's arc guide.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 32], - "arc": "Introduction / Vs. Special Fire Force Companies 5 & 1" - }, - { - "episodes": [13, 24], - "chapters": [33, 90], - "arc": "Preacher Pursuit / Asakusa / Vulcan / Netherworld" - }, - { - "episodes": [25, 36], - "chapters": [91, 130], - "arc": "Vs. Special Fire Force Company 4 / Fifth Pillar" - }, - { - "episodes": [37, 48], - "chapters": [131, 174], - "arc": "Chinese Peninsula" - }, - { - "episodes": [49, 60], - "chapters": [175, 228], - "arc": "Vs. Holy Sol Temple / Haijima Industries" - }, - { - "episodes": [61, 73], - "chapters": [229, 305], - "arc": "Great Cataclysm / Tokyo Empire / Final" - } - ] -} diff --git a/src/data/mappings/fist-of-the-north-star.json b/src/data/mappings/fist-of-the-north-star.json deleted file mode 100644 index c98daa6..0000000 --- a/src/data/mappings/fist-of-the-north-star.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "anilistAnimeId": 967, - "anilistMangaId": 31149, - "title": "Fist of the North Star", - "sourceNotes": "Cumulative episodes span two TV series: 'Hokuto no Ken' (id 967, eps 1-109) and 'Hokuto no Ken 2' (id 1356, eps 110-152). The 1984-1988 anime is heavily padded with filler (including recap episodes ~78-82), so episode boundaries are approximate and arcs are mapped coarsely. Chapter numbers use the continuous 1-245 scheme from the tankobon volumes (Raoh's death = ch 134, end of Part 1; Land of Asura begins ch 162). Manga complete at 245 chapters. The anime stopped before the manga's final chapters (~211-245), which are left unadapted.", - "mappings": [ - { - "episodes": [1, 22], - "chapters": [1, 35], - "arc": "Shin / Southern Cross (KING)" - }, - { - "episodes": [23, 57], - "chapters": [36, 79], - "arc": "Toki & Raoh Introduction / Cassandra Prison" - }, - { - "episodes": [58, 72], - "chapters": [80, 116], - "arc": "Rei / Mamiya / Yuda" - }, - { - "episodes": [73, 82], - "chapters": [117, 152], - "arc": "Souther / Holy Emperor (Nanto)" - }, - { - "episodes": [83, 100], - "chapters": [153, 161], - "arc": "Nanto Five Chariot Stars / Juza of the Clouds" - }, - { - "episodes": [101, 109], - "chapters": [134, 134], - "arc": "Raoh Final Battle (end of Part 1)" - }, - { - "episodes": [110, 130], - "chapters": [162, 196], - "arc": "Land of Asura (Asuka)" - }, - { - "episodes": [131, 152], - "chapters": [197, 210], - "arc": "Hokuto vs Hokuto / Kaioh" - }, - { - "chapters": [211, 245], - "arc": "Final Chapters (unadapted)" - } - ], - "movies": [ - { - "anilistId": 1358, - "title": "Fist of the North Star", - "year": 1986, - "chapters": [1, 72], - "note": "Compressed alternate-continuity retelling of the early story through the first battle with Raoh; Toki is omitted and Yuria's fate is changed. Not in continuity with the TV series." - } - ] -} diff --git a/src/data/mappings/flying-witch.json b/src/data/mappings/flying-witch.json deleted file mode 100644 index 32b35b6..0000000 --- a/src/data/mappings/flying-witch.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "anilistAnimeId": 21284, - "anilistMangaId": 76258, - "title": "Flying Witch", - "sourceNotes": "12-episode anime is a slow, faithful slice-of-life adaptation with no distinct named arcs; it covers manga chapters 1-21 (through part of volume 4), skipping very little. Manga ongoing (current ch. ~90 as of early 2026).", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 21], "arc": "Anime Adaptation" }, - { "chapters": [22, 90], "arc": "Manga-only Continuation" } - ] -} diff --git a/src/data/mappings/food-wars.json b/src/data/mappings/food-wars.json deleted file mode 100644 index 52fb3f5..0000000 --- a/src/data/mappings/food-wars.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "anilistAnimeId": 20923, - "anilistMangaId": 75757, - "title": "Food Wars!: Shokugeki no Soma", - "sourceNotes": "Cumulative episodes across S1 'Food Wars!' (24) + S2 'The Second Plate' (13) + S3 'The Third Plate' (24, split into two 12-ep cours: Part 1 eps 38-49 and Part 2 'Totsuki Train' eps 50-61) + S4 'The Fourth Plate' (12) + S5 'The Fifth Plate' (13) = 86 TV episodes. The five seasons adapt the entire 315-chapter main manga; the 3-chapter 'Le Dessert' epilogue (ch 316-318) was not adapted in the TV run. Firm boundaries: S2 ends at ch 116 (Stagiaire), S4 ends the Central conflict at ch 263, S5 (BLUE) runs ch 264-315 to the manga's end. Chapter ranges follow Wikipedia's chapter list; the Stagiaire/Moon-Banquet split differs slightly between Wikipedia and Fandom, and internal per-arc splits are approximations.", - "mappings": [ - { - "episodes": [1, 7], - "chapters": [1, 13], - "arc": "Introduction / Friends and Bonds (Saiba Joichiro intro)" - }, - { - "episodes": [8, 17], - "chapters": [14, 34], - "arc": "Totsuki Training Camp" - }, - { - "episodes": [18, 18], - "chapters": [35, 38], - "arc": "Karaage Wars / transition" - }, - { - "episodes": [19, 24], - "chapters": [39, 60], - "arc": "Autumn Election: Preliminaries" - }, - { - "episodes": [25, 34], - "chapters": [61, 104], - "arc": "Autumn Election: Main Tournament" - }, - { - "episodes": [35, 37], - "chapters": [105, 116], - "arc": "Stagiaire (work placement)" - }, - { - "episodes": [38, 49], - "chapters": [117, 171], - "arc": "Moon Banquet Festival / Central (Azami takeover)" - }, - { - "episodes": [50, 73], - "chapters": [172, 263], - "arc": "Totsuki Train / Regiment de Cuisine (Team Shokugeki)" - }, - { - "episodes": [74, 86], - "chapters": [264, 315], - "arc": "BLUE (Hot Spring & Beach Exam lead-in, then BLUE tournament; manga finale)" - }, - { "chapters": [316, 318], "arc": "Le Dessert (epilogue, unadapted)" } - ] -} diff --git a/src/data/mappings/fragrant-flower.json b/src/data/mappings/fragrant-flower.json deleted file mode 100644 index 4734581..0000000 --- a/src/data/mappings/fragrant-flower.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 181444, - "anilistMangaId": 140475, - "title": "The Fragrant Flower Blooms With Dignity", - "sourceNotes": "Single-cour TV anime by CloverWorks (13 episodes, Jul 6 - Sep 28 2025) adapting Saka Mikami's ongoing manga (Kaoru Hana wa Rin to Saku), serialized in Magazine Pocket. AniList lists chapters as null; per fan episode-to-chapter guides the anime covers manga ch 1-39 (ep 13 also touches ch 40), so a viewer resumes reading at ch 40. As of June 2026 the manga is at ~ch 193 across 23 tankobon volumes (vol 23 = ch 173-179; ch 180+ uncollected), used here as the unadapted-tail endpoint. This is a slow-burn romance with loose arcs, so the groupings below are approximate and built by clustering the episode-to-chapter mapping into story phases.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 7], - "arc": "Meeting Across the Divide (Rintaro & Kaoruko at the Waguri bakery; Chidori vs Kikyo)" - }, - { - "episodes": [5, 8], - "chapters": [8, 19], - "arc": "Merging Worlds (Subaru's feelings; friend groups intertwine; Rintaro's circle finds out)" - }, - { - "episodes": [9, 12], - "chapters": [20, 36], - "arc": "Awakening Feelings (Rintaro grapples with his growing feelings amid school events & outings)" - }, - { - "episodes": [13, 13], - "chapters": [37, 39], - "arc": "Confession at the Festival (the two become a couple)" - }, - { - "chapters": [40, 193], - "arc": "Dating Life & Beyond (unadapted, ongoing; ch 40 is where to resume reading)" - } - ] -} diff --git a/src/data/mappings/frieren.json b/src/data/mappings/frieren.json deleted file mode 100644 index 8777b32..0000000 --- a/src/data/mappings/frieren.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "anilistAnimeId": 154587, - "anilistMangaId": 118586, - "title": "Frieren: Beyond Journey's End", - "sourceNotes": "S1 only (28 eps). Arc names from major manga story beats; chapter ranges approximate.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 9], - "arc": "Aftermath of the Demon King" - }, - { - "episodes": [5, 11], - "chapters": [10, 26], - "arc": "Heiter & Fern / Sein" - }, - { - "episodes": [12, 16], - "chapters": [27, 41], - "arc": "Northern Lands / Granat" - }, - { - "episodes": [17, 28], - "chapters": [42, 62], - "arc": "First-Class Mage Exam" - }, - { "chapters": [63, 89], "arc": "First-Class Mage Exam (cont.)" }, - { "chapters": [90, 147], "arc": "Aureole / Northern Continent" } - ] -} diff --git a/src/data/mappings/from-old-country-bumpkin-to-master-swordsman.json b/src/data/mappings/from-old-country-bumpkin-to-master-swordsman.json deleted file mode 100644 index 5c6c202..0000000 --- a/src/data/mappings/from-old-country-bumpkin-to-master-swordsman.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 179955, - "anilistMangaId": 145675, - "title": "From Old Country Bumpkin to Master Swordsman", - "sourceNotes": "Single-cour S1 (12 eps, Apr-Jun 2025); S2 confirmed for 2026 (not covered here). Source is Shigeru Sagazaki's light novel (10 vols as of Dec 2025); the Kazuki Sato manga adaptation (9 vols / ch. 1-40 as of June 2026) tracks the light novel roughly one manga volume per LN volume. S1 corresponds to approximately the first two source volumes (manga ch. 1-10); precise episode-to-chapter boundaries are not documented anywhere yet, so this is an approximate seed — refine via PR.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 10], - "arc": "Beryl Becomes Special Instructor / Reunion with Former Students" - }, - { "chapters": [11, 40], "arc": "Unadapted continuation (ongoing)" } - ] -} diff --git a/src/data/mappings/fruits-basket-2019.json b/src/data/mappings/fruits-basket-2019.json deleted file mode 100644 index 27915b6..0000000 --- a/src/data/mappings/fruits-basket-2019.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "anilistAnimeId": 105334, - "anilistMangaId": 30102, - "title": "Fruits Basket (2019)", - "sourceNotes": "2019 reboot adapts the full manga (138 ch) across S1 (25) + S2 (25) + S3 The Final (13). Arc-level approximation.", - "mappings": [ - { "episodes": [1, 11], "chapters": [1, 28], "arc": "Meet the Sohmas" }, - { - "episodes": [12, 25], - "chapters": [29, 54], - "arc": "Summer & School Festival" - }, - { - "episodes": [26, 38], - "chapters": [55, 84], - "arc": "Akito's Curse Begins to Crack" - }, - { - "episodes": [39, 50], - "chapters": [85, 113], - "arc": "Breaking the Curse" - }, - { - "episodes": [51, 63], - "chapters": [114, 138], - "arc": "Resolution & Goodbye" - } - ], - "movies": [ - { - "anilistId": 136192, - "title": "Fruits Basket -prelude-", - "year": 2022, - "afterEpisode": 63, - "note": "Recap plus new prequel content (Kyoko and Katsuya's story)." - } - ] -} diff --git a/src/data/mappings/full-dive.json b/src/data/mappings/full-dive.json deleted file mode 100644 index 5b651da..0000000 --- a/src/data/mappings/full-dive.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "anilistAnimeId": 126791, - "anilistMangaId": 127668, - "title": "Full Dive: This Ultimate Next-Gen Full Dive RPG Is Even Shittier than Real Life!", - "sourceNotes": "Single-cour, 12-episode anime adapting the first light novel volume. The manga tie-in (Kino, Monthly Comic Alive) was cancelled after 11 chapters in Jan. 2022, covering only roughly the first half of the anime's run (through about episode 6); AniList does not track a chapter count for it since it stopped without a defined ending. Episodes 7-12 have no manga equivalent as a result. Original light novel; manga is a close but incomplete tie-in adaptation.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 11], - "arc": "Kiwame Quest: First Login (Vol. 1)" - } - ] -} diff --git a/src/data/mappings/full-metal-panic.json b/src/data/mappings/full-metal-panic.json deleted file mode 100644 index 6f7a63a..0000000 --- a/src/data/mappings/full-metal-panic.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "anilistAnimeId": 71, - "anilistMangaId": 40892, - "title": "Full Metal Panic!", - "sourceNotes": "Cumulative episodes across S1 (24) + The Second Raid (13) + Invisible Victory (12) = 49; Full Metal Panic? Fumoffu (12 eps) is a non-canon gag side-story and is excluded from arc numbering. Source is the light novel (72 chapters across 12 volumes, complete); chapter ranges assume an even ~6 chapters per volume since no published per-chapter table of contents was found, so boundaries are approximate. S1 adapts vol. 1-3 (Boy Meets Girl through Into the Blue); The Second Raid adapts vol. 4-5 (Ending Day by Day); vol. 6 (Dancing Very Merry Christmas) is a side story that was never animated; Invisible Victory adapts vol. 7-9. Vol. 10-12 (Forever Stand by Me) is the unadapted novel-only finale.", - "mappings": [ - { - "episodes": [1, 7], - "chapters": [1, 6], - "arc": "Fighting: Boy Meets Girl" - }, - { - "episodes": [8, 12], - "chapters": [7, 12], - "arc": "Running: One Night Stand" - }, - { - "episodes": [13, 24], - "chapters": [13, 18], - "arc": "Swaying: Into the Blue" - }, - { - "episodes": [25, 31], - "chapters": [19, 24], - "arc": "Ending Day by Day (Part 1)" - }, - { - "episodes": [32, 37], - "chapters": [25, 30], - "arc": "Ending Day by Day (Part 2)" - }, - { - "episodes": [38, 41], - "chapters": [37, 42], - "arc": "Continuing On My Own" - }, - { - "episodes": [42, 45], - "chapters": [43, 48], - "arc": "Burning One Man Force" - }, - { "episodes": [46, 49], "chapters": [49, 54], "arc": "Come Make My Day" }, - { - "chapters": [55, 72], - "arc": "Forever Stand by Me (unadapted novel finale)" - } - ] -} diff --git a/src/data/mappings/fullmetal-alchemist-brotherhood.json b/src/data/mappings/fullmetal-alchemist-brotherhood.json deleted file mode 100644 index 8fb8ba1..0000000 --- a/src/data/mappings/fullmetal-alchemist-brotherhood.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "anilistAnimeId": 5114, - "anilistMangaId": 30025, - "title": "Fullmetal Alchemist: Brotherhood", - "sourceNotes": "Arc-level approximation; Brotherhood is a fairly linear ~1.7 ch/ep adaptation of the manga. Refine via PR.", - "mappings": [ - { "episodes": [1, 3], "chapters": [1, 5], "arc": "Liore" }, - { - "episodes": [4, 10], - "chapters": [6, 28], - "arc": "State Alchemy & Lab 5" - }, - { - "episodes": [11, 14], - "chapters": [29, 41], - "arc": "Hughes & Return to Liore" - }, - { - "episodes": [15, 19], - "chapters": [42, 53], - "arc": "Devil's Nest / Greed" - }, - { - "episodes": [20, 30], - "chapters": [54, 75], - "arc": "Briggs & Father's Plot" - }, - { - "episodes": [31, 43], - "chapters": [76, 93], - "arc": "Promised Day Build-up" - }, - { "episodes": [44, 58], "chapters": [94, 107], "arc": "Promised Day" }, - { "episodes": [59, 64], "chapters": [108, 108], "arc": "Epilogue" } - ], - "movies": [ - { - "anilistId": 9135, - "title": "Fullmetal Alchemist: The Sacred Star of Milos", - "year": 2011, - "afterEpisode": 20, - "note": "Side story (anime-original), set around eps 20-21." - } - ] -} diff --git a/src/data/mappings/future-diary.json b/src/data/mappings/future-diary.json deleted file mode 100644 index 87ee771..0000000 --- a/src/data/mappings/future-diary.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "anilistAnimeId": 10620, - "anilistMangaId": 30584, - "title": "The Future Diary", - "sourceNotes": "Single 26-episode TV anime (2011) faithfully adapting Sakae Esuno's complete manga (59 chapters / 12 volumes). Episode-to-chapter boundaries follow the manga's volume groupings and are approximate (the anime runs ~2.3 chapters per episode). The 'Redial' OVA is a short coda and a separate AniList entry.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 13], - "arc": "The Survival Game Begins (Yuki & Yuno; 3rd Diary Holder)" - }, - { - "episodes": [7, 10], - "chapters": [14, 23], - "arc": "6th & 9th Diary Holders (the cult, the bomber Minene) and escape" - }, - { - "episodes": [11, 15], - "chapters": [24, 33], - "arc": "4th, 7th & 8th Diary Holders (detective, the couple, the orphanage)" - }, - { - "episodes": [16, 20], - "chapters": [34, 43], - "arc": "Diary Holders Converge / Yuno's Truth" - }, - { - "episodes": [21, 26], - "chapters": [44, 59], - "arc": "Endgame & Conclusion (Final Battle, 1st vs Yuno)" - } - ] -} diff --git a/src/data/mappings/gabriel-dropout.json b/src/data/mappings/gabriel-dropout.json deleted file mode 100644 index 3a15b8c..0000000 --- a/src/data/mappings/gabriel-dropout.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "anilistAnimeId": 21878, - "anilistMangaId": 86864, - "title": "Gabriel DropOut", - "sourceNotes": "Single 12-episode TV season (Doga Kobo, 2017). Adapts Ukami's 4-koma manga non-linearly (shuffled) across volumes 1-4, roughly chapters 1-38, skipping only two chapters plus a few minor gags; episode 12 is anime-original, so the adapted range is mapped to episodes 1-11. Because the source is a 4-koma with a shuffled adaptation order, the single adapted entry covers volumes 1-4 rather than a per-episode split, and the unadapted tail is broken out by volume for reading reference. Readers should continue from chapter 39. AniList lists no chapter count on the manga entry; per MangaDex the manga is ongoing (16 volumes, current ~ch. 122). A separate 2-episode OVA exists but is not theatrical; the series has no theatrical films.", - "mappings": [ - { - "episodes": [1, 11], - "chapters": [1, 38], - "arc": "Volumes 1-4 (anime-adapted, non-linear)" - }, - { - "chapters": [39, 44], - "arc": "Volume 5" - }, - { - "chapters": [45, 51], - "arc": "Volume 6" - }, - { - "chapters": [52, 57], - "arc": "Volume 7" - }, - { - "chapters": [58, 63], - "arc": "Volume 8" - }, - { - "chapters": [64, 71], - "arc": "Volume 9" - }, - { - "chapters": [72, 77], - "arc": "Volume 10" - }, - { - "chapters": [78, 83], - "arc": "Volume 11" - }, - { - "chapters": [84, 89], - "arc": "Volume 12" - }, - { - "chapters": [90, 97], - "arc": "Volume 13" - }, - { - "chapters": [98, 106], - "arc": "Volume 14" - }, - { - "chapters": [107, 116], - "arc": "Volume 15" - }, - { - "chapters": [117, 122], - "arc": "Volume 16" - } - ] -} diff --git a/src/data/mappings/gachiakuta.json b/src/data/mappings/gachiakuta.json deleted file mode 100644 index d7fb861..0000000 --- a/src/data/mappings/gachiakuta.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 178025, - "anilistMangaId": 144946, - "title": "Gachiakuta", - "sourceNotes": "Season 1 was a split-cour, two-cour run totaling 24 episodes, both cours airing in 2025 (eps 1-12 Jul-Sep, eps 13-24 Oct-Dec). Manga by Kei Urana (Weekly Shonen Magazine) is ONGOING (roughly ch 168 / 18 volumes by mid-2026). The anime adapts ch 1-87, stopping partway into the Heritage Mural arc; remaining arcs are an unadapted manga-only tail. A second season is confirmed. Per-episode chapter boundaries follow AnimeFillerGuide's mapping (0 filler).", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 6], - "arc": "Ground Wanderer (Rudo framed, falls to the Ground)" - }, - { - "episodes": [4, 8], - "chapters": [7, 24], - "arc": "Workplace Observation & Raiders Trap" - }, - { - "episodes": [9, 13], - "chapters": [25, 43], - "arc": "Successor Spellcaster & The Lady of Penta" - }, - { - "episodes": [14, 22], - "chapters": [44, 81], - "arc": "Trash Storm" - }, - { - "episodes": [23, 24], - "chapters": [82, 87], - "arc": "Heritage Mural (opening; anime stops mid-arc)" - }, - { - "chapters": [88, 168], - "arc": "Heritage Mural finale → Doll Festival — manga only, ongoing" - } - ] -} diff --git a/src/data/mappings/gamers.json b/src/data/mappings/gamers.json deleted file mode 100644 index df2e451..0000000 --- a/src/data/mappings/gamers.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 97766, - "anilistMangaId": 94309, - "title": "Gamers!", - "sourceNotes": "Single 12-episode TV anime by Pine Jam (Summer 2017). The separate manga adaptation (AniList id 98786) is a slower, self-contained 7-volume / 33-chapter retelling that only covers the early light novel and does not span the anime's range, so this maps to Sekina Aoi's source light novel instead (AniList id 94309, type MANGA, 66 chapters across 12 volumes). The anime adapts LN volumes 1-5; volumes 6-12 are unadapted. This is a romcom built almost entirely on overlapping misunderstandings, so the love web threads through every episode and arc boundaries are coarse. Chapter ranges are proportional estimates mapping the LN volume boundaries onto AniList's 66-chapter count (about 5.5 ch/vol), and the episode-to-volume splits are approximate.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 6], - "arc": "Game Club Invitation (Amano declines Tendou; Uehara introduced, LN vol 1)" - }, - { - "episodes": [3, 5], - "chapters": [7, 11], - "arc": "Crossed Flags (Chiaki rivalry, Tendou's slump, Aguri appears, LN vol 2)" - }, - { - "episodes": [6, 8], - "chapters": [12, 17], - "arc": "Game Over Misunderstanding Spiral (the love web tangles, LN vol 3)" - }, - { - "episodes": [9, 10], - "chapters": [18, 22], - "arc": "Account Hack & Next Stage (Chiaki's secret, LN vol 4)" - }, - { - "episodes": [11, 12], - "chapters": [23, 28], - "arc": "Youth Continues (climax and partial resolution, LN vol 5)" - }, - { - "chapters": [29, 66], - "arc": "Post-anime romance (LN vols 6-12, unadapted)" - } - ] -} diff --git a/src/data/mappings/gangsta.json b/src/data/mappings/gangsta.json deleted file mode 100644 index 055b149..0000000 --- a/src/data/mappings/gangsta.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 20773, - "anilistMangaId": 54903, - "title": "Gangsta.", - "sourceNotes": "S1 anime (12 eps, 2015) adapts roughly manga ch 1-28 (through about vol 5); the finale (ep 12) covers ch 26-28, so a viewer resumes reading at ch 29 (vol 6). Paired with Kohske's manga, which is on a long hiatus due to the author's health: the latest published chapter is 56 (Dec 2020) across 8 volumes; AniList does not track a chapter count for this series. Serialization is announced to resume with ch 57 in July 2026. Internal episode/chapter splits are approximate; the Gangsta:Cursed. spin-off and the 'Postman' one-shot are excluded.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 9], - "arc": "Ergastulum & the Handymen (Worick, Nicolas & Alex; Twilight underworld intro)" - }, - { - "episodes": [5, 8], - "chapters": [10, 19], - "arc": "Worick & Nicolas' Past (Twilight law, the Corsica family & the four families)" - }, - { - "episodes": [9, 12], - "chapters": [20, 28], - "arc": "The Guild & the Twilight Hunt (anime finale)" - }, - { - "chapters": [29, 56], - "arc": "The Twilight Massacre & Aftermath (unadapted tail; latest ch 56, on hiatus)" - } - ] -} diff --git a/src/data/mappings/gantz.json b/src/data/mappings/gantz.json deleted file mode 100644 index 26f0ceb..0000000 --- a/src/data/mappings/gantz.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "anilistAnimeId": 384, - "anilistMangaId": 30564, - "title": "Gantz", - "sourceNotes": "Manga complete at 383 chapters / 37 volumes, structured in 3 phases (Phase 1 'Missions' ch 1-237, Phase 2 'Katastrophe' ch 238-303, Phase 3 'Invasion' ch 304-383) and 15 named mission arcs. TV anime is 26 episodes: Season 1 'Gantz' (2004) = eps 1-13, Season 2 'Gantz: Second Stage' (2004) = eps 14-26 (cumulative). The anime caught up to the still-running manga and Hiroya Oku told the director to invent an original ending: episodes 1-21 faithfully adapt through the Buddhist Temple Alien Mission (~chapter 91), then episodes 22-26 are anime-original (the 'Kurono Alien' material) with NO manga counterpart. Readers continue the manga at roughly chapter 92. Early arc chapter cutoffs are soft (Fandom mission-arc definitions vs. Wikipedia's volume grouping differ by a few chapters); the ch 92-108 'Kill Kei Kurono / Shorty' arc range is derived to fill the gap. The 2016 CG film GANTZ:O adapts the Nurarihyon (Osaka) Alien Mission, chapters 228-283.", - "mappings": [ - { - "episodes": [1, 5], - "chapters": [1, 25], - "arc": "Onion Alien Mission" - }, - { - "episodes": [6, 14], - "chapters": [26, 55], - "arc": "Tanaka Alien Mission" - }, - { - "episodes": [15, 21], - "chapters": [56, 91], - "arc": "Buddhist Temple Alien Mission" - }, - { - "chapters": [92, 108], - "arc": "Kill Kei Kurono / Shorty Alien Mission (unadapted)" - }, - { - "chapters": [109, 164], - "arc": "Dinosaur Alien Mission (unadapted)" - }, - { - "chapters": [165, 173], - "arc": "Ring Alien Mission (unadapted)" - }, - { - "chapters": [174, 186], - "arc": "Kill Tae Kojima Mission (unadapted)" - }, - { - "chapters": [187, 227], - "arc": "Oni Alien Mission (unadapted)" - }, - { - "chapters": [228, 283], - "arc": "Nurarihyon (Osaka) Alien Mission (unadapted by TV; adapted by GANTZ:O film)" - }, - { - "chapters": [284, 299], - "arc": "Italian Alien Mission (unadapted)" - }, - { - "chapters": [300, 313], - "arc": "The Invasion Begins (unadapted)" - }, - { - "chapters": [314, 328], - "arc": "Alien Ship Takeover Mission (unadapted)" - }, - { - "chapters": [329, 352], - "arc": "United Rescue (unadapted)" - }, - { - "chapters": [353, 368], - "arc": "Destroy the Tower Mission (unadapted)" - }, - { - "chapters": [369, 383], - "arc": "The Final Challenge (unadapted)" - } - ], - "movies": [ - { - "anilistId": 21496, - "title": "GANTZ:O", - "year": 2016, - "chapters": [228, 283], - "note": "CG film adapting the Nurarihyon / Osaka Alien Mission arc, which the TV anime never reached." - } - ] -} diff --git a/src/data/mappings/gargantia-on-the-verdurous-planet.json b/src/data/mappings/gargantia-on-the-verdurous-planet.json deleted file mode 100644 index 7e0abe1..0000000 --- a/src/data/mappings/gargantia-on-the-verdurous-planet.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "anilistAnimeId": 16524, - "anilistMangaId": 80169, - "title": "Gargantia on the Verdurous Planet", - "sourceNotes": "Original anime (13 episodes, Production I.G, 2013); the manga by Wataru Mitogawa is a close tie-in adaptation (complete at 13 chapters) that follows the TV series scene-for-scene with no distinct arcs. Two Blu-ray-exclusive OVA episodes and their own manga/novel side stories exist in a separate continuity and are not covered here.", - "mappings": [ - { "episodes": [1, 13], "chapters": [1, 13], "arc": "Original Series" } - ] -} diff --git a/src/data/mappings/gate.json b/src/data/mappings/gate.json deleted file mode 100644 index e3e900d..0000000 --- a/src/data/mappings/gate.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "anilistAnimeId": 20994, - "anilistMangaId": 71733, - "title": "Gate", - "sourceNotes": "Cumulative episode numbering spans both TV cours: S1 'Gate' eps 1-12 (2015) + S2 'Gate Part 2' eps 13-24 (2016), both A-1 Pictures; the anime id is S1's. Ranges map onto Satoru Sao's manga adaptation (AniList: FINISHED, 143 chapters across 28 volumes; the main run ends with a ch 143 finale plus a 143.2 epilogue). The manga reorders and expands the light-novel material relative to the anime, so episode-to-chapter ranges are approximate. The 24-episode anime covers roughly ch 1-66 (through the Rondel / Oprichnina confrontation); ch 67-143 (the full-scale Japan-Empire civil war, Zorzal's downfall, and conclusion) are unadapted.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 8], - "arc": "Ginza Incident & the Special Region (Battle of Alnus, first Flame Dragon)" - }, - { - "episodes": [5, 7], - "chapters": [9, 15], - "arc": "Battle of Italica" - }, - { - "episodes": [8, 10], - "chapters": [16, 24], - "arc": "Japan Beyond the Gate (Diet hearing & the Ginza counterattack)" - }, - { - "episodes": [11, 14], - "chapters": [25, 34], - "arc": "Coda Village & Imperial Capital diplomacy (Yao, Zorzal, the earthquake)" - }, - { - "episodes": [15, 17], - "chapters": [35, 47], - "arc": "Tuka's grief & the Flame Dragon decisive battle (Dark Elves)" - }, - { - "episodes": [18, 24], - "chapters": [48, 66], - "arc": "Magic City of Rondel & the Imperial coup / Oprichnina (anime finale)" - }, - { - "chapters": [67, 143], - "arc": "Japan-Empire civil war, Zorzal's downfall & conclusion (unadapted)" - } - ] -} diff --git a/src/data/mappings/genius-princes-guide-raising-nation-debt.json b/src/data/mappings/genius-princes-guide-raising-nation-debt.json deleted file mode 100644 index e7de743..0000000 --- a/src/data/mappings/genius-princes-guide-raising-nation-debt.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 129190, - "anilistMangaId": 111631, - "title": "The Genius Prince's Guide to Raising a Nation Out of Debt", - "sourceNotes": "Light-novel-based (source: GA Bunko LN by Toru Toba, AniList id 111631; the \"chapters\" ranges below denote LN VOLUME numbers, not chapters, since AniList lists no chapter counts and community episode guides track the LN by volume). The single 12-episode 2022 TV series adapts LN volumes 1-5 at a fast pace and ends heading into volume 6 (per wheredoestheanimeleaveoff). Volume boundaries: Vol 1 = the Marden war / selling-the-kingdom opener (ep 1-2), Vol 2 = the political-marriage and Cavarin conspiracy/rebellion (ep 3-5), Vol 3 = the Levetia Holy Elite / Spirit Festival arc (ep 6-7), Vols 4-5 = the Mealtars merchant-city Summit of Imperial Heirs (ep 8-12). LN ongoing; 12 volumes published (latest Sept 2022). Volume-level ranges are approximate given the compressed adaptation. No theatrical films.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 1], - "arc": "Selling the Kingdom (Marden War)" - }, - { - "episodes": [3, 5], - "chapters": [2, 2], - "arc": "Political Marriage & Cavarin Rebellion" - }, - { - "episodes": [6, 7], - "chapters": [3, 3], - "arc": "Levetia Holy Elite" - }, - { - "episodes": [8, 12], - "chapters": [4, 5], - "arc": "Mealtars Summit of Imperial Heirs" - }, - { - "chapters": [6, 12], - "arc": "Continuing Volumes (unadapted)" - } - ] -} diff --git a/src/data/mappings/ghost-in-the-shell.json b/src/data/mappings/ghost-in-the-shell.json deleted file mode 100644 index 17bde3f..0000000 --- a/src/data/mappings/ghost-in-the-shell.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "anilistAnimeId": 177699, - "anilistMangaId": 31023, - "title": "The Ghost in the Shell", - "sourceNotes": "2026 Science SARU TV series (THE GHOST IN THE SHELL), the first faithful TV adaptation of Shirow's original manga; premiered 2026-07-07 and airs weekly, total episode count TBA — extend episode ranges via PR as episodes air. Episode titles name the manga chapters they adapt (ep 1 = 'Prologue + Super Spartan i', ep 2 = 'Super Spartan ii + Junk Jungle i'), so boundaries fall on chapter halves; ranges are rounded to whole chapters. Manga complete at 11 chapters / 1 volume; arcs are the manga's own episodic case chapters, with the Puppet Master storyline seeded in ch 3 and concluding in ch 9-11. The Oshii films are separate-continuity theatrical adaptations of the same manga; SAC, Arise, and SAC_2045 films belong to other continuities and are excluded.", - "mappings": [ - { - "episodes": [1, 1], - "chapters": [1, 2], - "arc": "Prologue / Super Spartan" - }, - { "chapters": [3, 3], "arc": "Junk Jungle" }, - { - "chapters": [4, 5], - "arc": "Megatech Machine (Revolt of the Robot / The Making of a Cyborg)" - }, - { "chapters": [6, 6], "arc": "Robot Rondo" }, - { "chapters": [7, 7], "arc": "Phantom Fund" }, - { "chapters": [8, 8], "arc": "Dumb Barter" }, - { - "chapters": [9, 11], - "arc": "Puppet Master (Bye Bye Clay / Brain Drain / Ghost Coast)" - } - ], - "movies": [ - { - "anilistId": 43, - "title": "Ghost in the Shell", - "year": 1995, - "note": "Oshii's separate-continuity theatrical adaptation; condenses the Puppet Master plot (ch 3 + 9-11) with the cyborg-birth imagery of ch 5. The 2008 'Ghost in the Shell 2.0' re-edit is excluded." - }, - { - "anilistId": 468, - "title": "Ghost in the Shell 2: Innocence", - "year": 2004, - "chapters": [6, 6], - "note": "Sequel to the 1995 film; expands manga ch 6 'Robot Rondo' (the Locus Solus gynoid case)." - } - ] -} diff --git a/src/data/mappings/gintama.json b/src/data/mappings/gintama.json deleted file mode 100644 index b1fee3f..0000000 --- a/src/data/mappings/gintama.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "anilistAnimeId": 918, - "anilistMangaId": 30044, - "title": "Gintama", - "sourceNotes": "Cumulative episodes across Gintama (201) + Gintama' (51) + Enchousen (13) + Gintama° (51) + Gintama. (12) + Porori-hen (13) + Silver Soul (12) + Silver Soul Kouhan-sen (14). Heavy filler/skits in early seasons; arc ranges trace the canon serious arcs. Chapter ranges approximate.", - "mappings": [ - { - "episodes": [1, 57], - "chapters": [1, 85], - "arc": "Introduction / Early Yorozuya" - }, - { "episodes": [58, 61], "chapters": [86, 102], "arc": "Benizakura Arc" }, - { "episodes": [62, 73], "chapters": [104, 123], "arc": "Yagyu Arc" }, - { "episodes": [86, 87], "chapters": [128, 137], "arc": "Mitsuba Arc" }, - { - "episodes": [139, 146], - "chapters": [156, 167], - "arc": "Shinsengumi Crisis Arc" - }, - { - "episodes": [139, 152], - "chapters": [168, 187], - "arc": "Yoshiwara in Flames Arc" - }, - { - "episodes": [177, 181], - "chapters": [194, 209], - "arc": "Owee Arc / Kintaro" - }, - { "episodes": [210, 214], "chapters": [210, 228], "arc": "Renho Arc" }, - { - "episodes": [227, 236], - "chapters": [229, 252], - "arc": "Thorny Arc / Kabukicho Stray Cat" - }, - { - "episodes": [253, 256], - "chapters": [253, 272], - "arc": "Scandal Arc / Diviner Arc" - }, - { - "episodes": [257, 261], - "chapters": [274, 309], - "arc": "Kabukicho Four Devas Arc" - }, - { - "episodes": [266, 307], - "chapters": [310, 352], - "arc": "Soul Switch / Courtesan of a Nation Arc" - }, - { - "episodes": [308, 316], - "chapters": [353, 370], - "arc": "Shogun Assassination Arc" - }, - { - "episodes": [317, 328], - "chapters": [380, 398], - "arc": "Farewell Shinsengumi Arc" - }, - { - "episodes": [329, 341], - "chapters": [399, 489], - "arc": "Rakuyou Decisive Battle Arc" - }, - { - "episodes": [342, 367], - "chapters": [596, 704], - "arc": "Silver Soul Arc" - }, - { "chapters": [705, 709], "arc": "Finale" } - ], - "movies": [ - { - "anilistId": 7472, - "title": "Gintama: The Movie", - "year": 2010, - "note": "All-new-animation theatrical remake of the Benizakura arc." - }, - { - "anilistId": 15335, - "title": "Gintama: The Final Chapter - Be Forever Yorozuya", - "year": 2013, - "note": "Canon anime-original film." - }, - { - "anilistId": 114129, - "title": "Gintama: THE VERY FINAL", - "year": 2021, - "chapters": [705, 709], - "afterEpisode": 367, - "note": "Adapts the manga's final chapters; concludes the story after the Silver Soul arc." - }, - { - "anilistId": 197474, - "title": "Gintama the Movie 2026: Yoshiwara in Flames", - "year": 2026, - "note": "All-new-animation theatrical remake of the Yoshiwara in Flames arc with added characters." - } - ] -} diff --git a/src/data/mappings/girlfriend-girlfriend.json b/src/data/mappings/girlfriend-girlfriend.json deleted file mode 100644 index d83aa3f..0000000 --- a/src/data/mappings/girlfriend-girlfriend.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "anilistAnimeId": 126192, - "anilistMangaId": 116266, - "title": "Girlfriend, Girlfriend", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (eps 13-24). Manga complete at 144 chapters (16 volumes). S1 adapts ch 1-36 (vols 1-4); S2 adapts ch 37-91; ch 92-144 are unadapted. This is an episodic shonen gag-romcom with no formal arc names in the source (the manga is organized only by volume), so arcs below are named descriptively by story beat. The anime reorders a few chapters (e.g. ep 5 pulls ch 19, ep 7 pulls ch 37-38 early), so per-arc chapter ranges are contiguous approximations of each block's dominant span. Roughly 3-4 chapters per episode. Per-episode chapter boundaries sourced from the Kanojo mo Kanojo Fandom wiki episode pages.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 13], - "arc": "Nagisa's Confession (The Second Girlfriend)" - }, - { - "episodes": [5, 9], - "chapters": [14, 26], - "arc": "Rika's Challenge (The Third Girlfriend)" - }, - { - "episodes": [10, 12], - "chapters": [27, 36], - "arc": "Hot Springs Trip" - }, - { - "episodes": [13, 16], - "chapters": [37, 54], - "arc": "Summer Break & Shino" - }, - { - "episodes": [17, 20], - "chapters": [55, 73], - "arc": "Culture Festival" - }, - { - "episodes": [21, 24], - "chapters": [74, 91], - "arc": "The Girlfriends' Getaway" - }, - { - "chapters": [92, 144], - "arc": "Mirika's Resolve & Finale (unadapted)" - } - ] -} diff --git a/src/data/mappings/girls-last-tour.json b/src/data/mappings/girls-last-tour.json deleted file mode 100644 index 492056d..0000000 --- a/src/data/mappings/girls-last-tour.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 99420, - "anilistMangaId": 85412, - "title": "Girls' Last Tour", - "sourceNotes": "Single-cour 2017 TV anime (12 eps) paired with Tsukumizu's complete post-apocalyptic slice-of-life manga 'Shoujo Shuumatsu Ryokou' (47 chapters / 6 tankobon vols, finished). The anime adapts roughly manga volumes 1-4 at a pace of ~3 episodes per volume, ending around the close of Vol 4 (~ch 32). Volume-to-chapter anchors (~8 chapters each): V1=1-8, V2=9-16, V3=17-24, V4=25-32, V5=33-40, V6=41-47. This is an episodic, segment-based show (each episode adapts 2-3 short chapters in order, e.g. ep 1 = 'Starry Sky'/'War'), so chapter boundaries are APPROXIMATE and grouped per volume rather than per episode. Vols 5-6 (ch 33-47), covering Chito and Yuuri's final ascent to the topmost layer, are unadapted, so a viewer resumes reading around ch 33. No theatrical films; the 'Shoujo Shuumatsu Jugyou' ONA shorts and anthology/special comics are separate side entries and are omitted.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 8], - "arc": "Departure: Chito & Yuuri ascend the ruined lower city (Starry Sky, Bath, City, Streetlights) — Vol 1" - }, - { - "episodes": [4, 6], - "chapters": [9, 16], - "arc": "The Temple, the Rains & Takeoff (Photograph, Sound of Rain, Technology) — Vol 2" - }, - { - "episodes": [7, 9], - "chapters": [17, 24], - "arc": "The Labyrinthine Factory, the Aquarium & Life (Labyrinth, Memory, Aquarium) — Vol 3" - }, - { - "episodes": [10, 12], - "chapters": [25, 32], - "arc": "The Train Upward, Culture & Friends (Train, Destruction, Connection) — Vol 4 finale" - }, - { - "chapters": [33, 47], - "arc": "The Final Ascent to the Topmost Layer (Vols 5-6, unadapted)" - } - ] -} diff --git a/src/data/mappings/girls-und-panzer.json b/src/data/mappings/girls-und-panzer.json deleted file mode 100644 index 802a549..0000000 --- a/src/data/mappings/girls-und-panzer.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "anilistAnimeId": 14131, - "anilistMangaId": 72223, - "title": "Girls und Panzer", - "sourceNotes": "Anime is 12 TV episodes (2012-2013; excludes the two non-canon .5 recap episodes). Manga (Ryōichi Saitaniya, complete at 21 chapters / 4 volumes) is a tie-in retelling from Yukari Akiyama's POV serialized concurrently with the TV broadcast; original anime, so chapter boundaries below are approximate proportional splits rather than a scene-exact adaptation.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 7], - "arc": "Introductions & St. Gloriana Practice Match" - }, - { - "episodes": [5, 6], - "chapters": [8, 10], - "arc": "Saunders University Match" - }, - { - "episodes": [7, 7], - "chapters": [11, 13], - "arc": "Anzio High School Match" - }, - { - "episodes": [8, 9], - "chapters": [14, 17], - "arc": "Pravda High School Match" - }, - { - "episodes": [10, 12], - "chapters": [18, 21], - "arc": "Kuromorimine Championship Final" - } - ], - "movies": [ - { - "anilistId": 18617, - "title": "Girls und Panzer der Film", - "year": 2015, - "afterEpisode": 12, - "note": "Canon sequel film: Ooarai faces the University Selection Team in an exhibition match to save the school." - }, - { - "anilistId": 99938, - "title": "Girls und Panzer das Finale - Part 1", - "year": 2017, - "afterEpisode": 12, - "note": "Part 1 of the six-part das Finale film series, canon continuation following der Film into the World Tank Selection Tournament." - }, - { - "anilistId": 107208, - "title": "Girls und Panzer das Finale - Part 2", - "year": 2019, - "afterEpisode": 12, - "note": "Part 2 of das Finale." - }, - { - "anilistId": 124115, - "title": "Girls und Panzer das Finale - Part 3", - "year": 2021, - "afterEpisode": 12, - "note": "Part 3 of das Finale." - }, - { - "anilistId": 132420, - "title": "Girls und Panzer das Finale - Part 4", - "year": 2023, - "afterEpisode": 12, - "note": "Part 4 of das Finale." - } - ] -} diff --git a/src/data/mappings/given.json b/src/data/mappings/given.json deleted file mode 100644 index a8f9de1..0000000 --- a/src/data/mappings/given.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "anilistAnimeId": 108430, - "anilistMangaId": 87347, - "title": "Given", - "sourceNotes": "The 11-episode TV anime (2019) adapts the original manga's first arc, chapters 1-16 (volumes 1-3), ending after the first live performance and Ritsuka's confession to Mafuyu. The story is continued ONLY in theatrical films, not further TV. Numbering caveat: the original manga is complete (9 volumes, finale March 2023); its official cumulative chapter count is 49, but AniList lists 51 because the scanlation count splits decimal/bonus chapters (16.5, 40.1, etc.) — same finale, two conventions. Chapter ranges below use the linear count; the final film carries the story to the manga's finale (chapter 49 official / 51 on AniList). Volume boundaries (V1 1-6, V2 7-11, V3 12-16, V4 17-21, V5 22-28) are confirmed; the internal per-episode and per-film splits beyond the confirmed endpoints are approximations. A separate sequel manga 'Given: 10th Mix' (set ~10 years later) is NOT covered by the films. The 'On the Other Hand' OVA is a side-story, excluded.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 6], - "arc": "Mafuyu joins the band / Uenoyama teaches him guitar (Vol. 1)" - }, - { - "episodes": [4, 8], - "chapters": [7, 11], - "arc": "Writing the song / rehearsals & emotional buildup (Vol. 2)" - }, - { - "episodes": [9, 11], - "chapters": [12, 16], - "arc": "First live performance, the confession, band resolution (Vol. 3)" - }, - { - "chapters": [17, 28], - "arc": "Haruki / Akihiko / Ugetsu arc (film: Given the Movie)" - }, - { - "chapters": [29, 42], - "arc": "Hiiragi / Shizusumi arc (film: Hiiragi Mix)" - }, - { - "chapters": [43, 51], - "arc": "Final Mafuyu / Ritsuka arc to the finale (film: To the Sea)" - } - ], - "movies": [ - { - "anilistId": 111734, - "title": "Given the Movie", - "year": 2020, - "chapters": [17, 28], - "afterEpisode": 11, - "note": "Canon continuation; adapts the Haruki/Akihiko/Ugetsu arc (Vols. 4-5). Starts at chapter 17 (confirmed); ending at chapter 28 is guide consensus." - }, - { - "anilistId": 162987, - "title": "given The Movie: Hiiragi Mix", - "year": 2024, - "chapters": [29, 42], - "afterEpisode": 11, - "note": "Part 1 of the two-part sequel 'Given: The Double Album'. Adapts the Hiiragi/Shizusumi arc (Vols. 6-8). Chapter span approximate; official sources give no chapter numbers." - }, - { - "anilistId": 175199, - "title": "given The Movie: To the Sea", - "year": 2024, - "chapters": [43, 51], - "afterEpisode": 11, - "note": "Part 2 of the sequel; completes the manga at its finale (chapter 49 official / 51 on AniList). Start chapter approximate; the finale endpoint is firm." - } - ] -} diff --git a/src/data/mappings/gleipnir.json b/src/data/mappings/gleipnir.json deleted file mode 100644 index 949c327..0000000 --- a/src/data/mappings/gleipnir.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 108241, - "anilistMangaId": 86607, - "title": "Gleipnir", - "sourceNotes": "S1 anime (13 eps, 2020) adapts roughly the first five volumes (about ch 1-36); episode 13 ('We Two Are One') is an anime-original ending, so a viewer resumes reading at ch 37. Paired with Sun Takeda's complete manga: 88 chapters across 14 volumes (serialization ended April 2023), and AniList confirms 88 ch / 14 vols, so the final arc extends to 88. Per-episode chapter boundaries are approximate (the adaptation is loose), as is the pact/coin-hunt/Elena split. The live-action material is excluded; there are no films.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 9], - "arc": "The Pact: Shuichi & Clair (Monster Secret; Elena & the Coins Revealed)" - }, - { - "episodes": [4, 9], - "chapters": [10, 27], - "arc": "The Coin Hunt (Gatherers & the War for the Wish)" - }, - { - "episodes": [10, 13], - "chapters": [28, 36], - "arc": "Elena Confrontation (anime-original ending)" - }, - { - "chapters": [37, 88], - "arc": "Post-Anime: The Spaceship & Final Arc (unadapted)" - } - ] -} diff --git a/src/data/mappings/go-go-loser-ranger.json b/src/data/mappings/go-go-loser-ranger.json deleted file mode 100644 index 5359506..0000000 --- a/src/data/mappings/go-go-loser-ranger.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 158417, - "anilistMangaId": 127564, - "title": "Go! Go! Loser Ranger!", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (12) = 24. Manga ongoing in Weekly Shonen Magazine (currently on hiatus; ch. 221 as of July 2026). S1 adapts ch. 1-51 (Introduction / Pylon's Nest training arcs); S2 adapts ch. 52-124 (Green Squad / Dream School Life through the Monster Protection Society War and Three Way Melee climax), matching fan sync guides that place the post-S2 restart at Vol. 14 Ch. 125. Later manga-only arcs (Akabane, Sentoin Hunt, New Sentai) are unadapted. Anime pacing is uneven, compressing many chapters per episode especially late in each season, so within-season episode/chapter splits are approximate.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 23], - "arc": "R1000 / Introduction Arc" - }, - { - "episodes": [7, 12], - "chapters": [24, 51], - "arc": "Pylon's Nest Arc" - }, - { - "episodes": [13, 16], - "chapters": [52, 72], - "arc": "Green Squad / Dream School Life Arc" - }, - { - "episodes": [17, 20], - "chapters": [73, 102], - "arc": "Monster Protection Society Arc" - }, - { - "episodes": [21, 24], - "chapters": [103, 124], - "arc": "Three Way Melee" - }, - { - "chapters": [125, 221], - "arc": "Post-anime arcs (Akabane, Sentoin Hunt, New Sentai; manga only, ongoing)" - } - ] -} diff --git a/src/data/mappings/goblin-slayer.json b/src/data/mappings/goblin-slayer.json deleted file mode 100644 index fbfcb4d..0000000 --- a/src/data/mappings/goblin-slayer.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "anilistAnimeId": 101165, - "anilistMangaId": 87320, - "title": "Goblin Slayer", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (12, eps 13-24) = 24 total. The Goblin's Crown movie wraps the S1 arc and is a separate AniList entry. Manga ongoing (~99 chapters). Episode-to-chapter pacing is approximate — the anime adapts both the light novel and the manga.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 35], - "arc": "Cave / Cow Girl Farm / Sword Maiden Introduction (S1)" - }, - { - "episodes": [13, 24], - "chapters": [36, 75], - "arc": "Water Town / Dark Elf (S2)" - }, - { "chapters": [76, 99], "arc": "Currently-publishing arcs (unadapted)" } - ], - "movies": [ - { - "anilistId": 108623, - "title": "Goblin Slayer: Goblin's Crown", - "year": 2020, - "afterEpisode": 12, - "note": "Canon film between S1 and S2 (LN vol 5)." - } - ] -} diff --git a/src/data/mappings/god-of-high-school.json b/src/data/mappings/god-of-high-school.json deleted file mode 100644 index 9800e14..0000000 --- a/src/data/mappings/god-of-high-school.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 116006, - "anilistMangaId": 85141, - "title": "The God of High School", - "sourceNotes": "Single 13-episode cours by MAPPA (2020). Paired with Yongje Park's original Korean webtoon (AniList type MANGA, FINISHED at 569 webtoon episodes counted as chapters). The anime adapts only the early portion of the webtoon (roughly episodes 1-112, ending the National Tournament), then compresses, reorders, and diverges with an original divine-awakening finale. Per-arc chapter boundaries are approximate. A large unadapted tail (Sage Realm onward) runs from ch 113 to the 569 ending.", - "mappings": [ - { - "episodes": [1, 7], - "chapters": [1, 55], - "arc": "The God of High School — Seoul Preliminary & Main Tournament" - }, - { - "episodes": [8, 11], - "chapters": [56, 90], - "arc": "The Nationals (team tournament)" - }, - { - "episodes": [12, 13], - "chapters": [91, 112], - "arc": "Nox / Ragnarok conflict & Sun Wukong reveal (anime-original finale; diverges and compresses)" - }, - { - "chapters": [113, 569], - "arc": "Sage Realm → Ragnarok World Tournament → RE: Fight with God (unadapted)" - } - ] -} diff --git a/src/data/mappings/golden-boy.json b/src/data/mappings/golden-boy.json deleted file mode 100644 index 7900d0d..0000000 --- a/src/data/mappings/golden-boy.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 268, - "anilistMangaId": 31458, - "title": "GOLDEN BOY", - "sourceNotes": "6-episode 1995-96 OVA (Shueisha/KSS), each episode a self-contained job/adventure of Kintaro Oe. Manga by Tatsuya Egawa ran 1992-1997 (complete, 104 chapters, natively numbered Chapter 0-103; this mapping uses sequential position 1-104 to match AniList's total). Only the OVA's first four episodes draw directly from the manga's opening chapters (Lesson 0-4, positions 1-5), matching by title and plot; the manga's Chapter 2 (\"A Flower Troubles the Highlands\") and Chapter 5 (\"No Breaks Blue Sky\") were not adapted. Episode 5 has no confirmed manga source and episode 6 is explicitly anime-original per the Golden Boy Wiki. The remaining ~98 manga chapters (the \"Study\"-numbered chapters onward) were never adapted into the OVA at all.", - "mappings": [ - { - "episodes": [1, 1], - "chapters": [1, 1], - "arc": "Computer Studies (Lesson 0)" - }, - { - "episodes": [2, 2], - "chapters": [2, 2], - "arc": "Temptation of the Maiden (Lesson 1)" - }, - { - "episodes": [3, 3], - "chapters": [4, 4], - "arc": "Danger! The Virgin's First Love (Lesson 3)" - }, - { - "episodes": [4, 4], - "chapters": [5, 5], - "arc": "Swimming in the Sea of Love (Lesson 4)" - }, - { - "chapters": [6, 104], - "arc": "Unadapted manga (Lesson 2, Lesson 5, and all Study-numbered chapters)" - } - ] -} diff --git a/src/data/mappings/golden-kamuy.json b/src/data/mappings/golden-kamuy.json deleted file mode 100644 index 1facd79..0000000 --- a/src/data/mappings/golden-kamuy.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "anilistAnimeId": 99699, - "anilistMangaId": 86559, - "title": "Golden Kamuy", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (12) + S3 (12) + S4 (13) + Final Season / S5 (13). Manga complete at 314 chapters; S1-S4 cover vols 1-24 (~ch 245), Final Season adapts most of the manga's final arc with a sequel announced for the remainder. Arc-to-chapter pacing is approximate (numerous concurrent character threads). Arc boundaries from Golden Kamuy Wiki (arc names are unofficial).", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 50], "arc": "Introduction / Otaru" }, - { - "episodes": [13, 24], - "chapters": [51, 100], - "arc": "Mainland Hokkaido Hunt" - }, - { - "episodes": [25, 36], - "chapters": [101, 150], - "arc": "Abashiri Prison / Journey to Karafuto" - }, - { - "episodes": [37, 49], - "chapters": [151, 225], - "arc": "Karafuto Circus / Return to Hokkaido" - }, - { - "episodes": [50, 62], - "chapters": [226, 300], - "arc": "Final Arc (Hokkaido Showdown)" - }, - { - "chapters": [301, 314], - "arc": "Final Arc Conclusion (unadapted; sequel announced)" - } - ], - "movies": [ - { - "anilistId": 196115, - "title": "Golden Kamuy: Sapporo Beer Koujou-hen", - "year": 2025, - "chapters": [301, 314], - "afterEpisode": 62, - "note": "Continuation film adapting the Sapporo Beer Factory portion of the final arc (range approximate)." - } - ] -} diff --git a/src/data/mappings/golden-time.json b/src/data/mappings/golden-time.json deleted file mode 100644 index 47f1c3f..0000000 --- a/src/data/mappings/golden-time.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "anilistAnimeId": 17895, - "anilistMangaId": 66873, - "title": "Golden Time", - "sourceNotes": "Single 24-episode 2013-2014 anime. Paired with the Umechazuke manga adaptation (complete, 52 ch across 9 volumes), which adapts the full Yuyuko Takemiya light novel (8 vols) from beginning to ending. Both cover the same story, though the manga follows the light novel's ending more faithfully than the anime's eps 22-24. No per-chapter concordance exists for this continuous college romance, so chapter boundaries are proportional estimates anchored to the LN-volume structure.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 9], - "arc": "Freshman Start (college entrance / meeting Koko, Mitsuo, Linda)" - }, - { - "episodes": [5, 7], - "chapters": [10, 16], - "arc": "Becoming a Couple (ghost-Banri / Banri and Koko get together)" - }, - { - "episodes": [8, 13], - "chapters": [17, 28], - "arc": "Festival Club & Summer" - }, - { - "episodes": [14, 19], - "chapters": [29, 41], - "arc": "Linda's Past & Resurfacing Memories" - }, - { - "episodes": [20, 24], - "chapters": [42, 52], - "arc": "Climax & Resolution" - } - ] -} diff --git a/src/data/mappings/gosick.json b/src/data/mappings/gosick.json deleted file mode 100644 index 3b50c85..0000000 --- a/src/data/mappings/gosick.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "anilistAnimeId": 8425, - "anilistMangaId": 31313, - "title": "Gosick", - "sourceNotes": "Source is Kazuki Sakuraba's LIGHT NOVEL (AniList id 31313, format NOVEL); the minor 29-chapter manga adaptation (id 36248) is deliberately ignored. IMPORTANT: the units below are LN VOLUME numbers, not chapters - AniList exposes no count for the novel. The main series is 9 volumes (I-VII plus VIII split into VIII(1) and VIII(2), counted here as vols 8-9); four additional \"GosickS\" short-story collections sit between the main volumes. The single 24-episode Bones anime (2011) adapts main volumes 1-8 in near-linear order and weaves GosickS side stories into the interstitial episodes (eps 4-5 Cuiaran/false Avril; eps 11-12 Jacqueline's past and Kujo's flashback). LN complete at 9 main volumes (VIII(2), Jul 2011); the anime covers the whole main story through the \"Twilight of the Gods\" finale, so there is no meaningful unadapted tail. Per-arc boundaries are approximate, sourced from Wikipedia's episode list and fandom guides. No theatrical films exist.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 1], - "arc": "The Queen Berry (LN vol 1)" - }, - { - "episodes": [4, 5], - "chapters": [1, 1], - "arc": "Cuiaran / the false Avril (GosickS side-story material, woven in)" - }, - { - "episodes": [6, 8], - "chapters": [2, 2], - "arc": "The Crime That Has No Name / Village of the Grey Wolves (LN vol 2)" - }, - { - "episodes": [9, 10], - "chapters": [3, 3], - "arc": "Beneath the Blue Rose (LN vol 3)" - }, - { - "episodes": [11, 12], - "chapters": [4, 4], - "arc": "GosickS interludes - Jacqueline's past & Kujo's flashback (side stories, woven in)" - }, - { - "episodes": [13, 15], - "chapters": [4, 4], - "arc": "A Fool Represents the Case / Leviathan (LN vol 4)" - }, - { - "episodes": [16, 17], - "chapters": [5, 5], - "arc": "Beelzebub's Skull (LN vol 5)" - }, - { - "episodes": [18, 18], - "chapters": [6, 6], - "arc": "Night of the Masquerade / the return train (LN vol 6)" - }, - { - "episodes": [19, 21], - "chapters": [7, 7], - "arc": "The Rose-coloured Life / Coco Rose (LN vol 7)" - }, - { - "episodes": [22, 24], - "chapters": [8, 9], - "arc": "Twilight of the Gods (LN vol 8, published as VIII(1) & VIII(2))" - } - ] -} diff --git a/src/data/mappings/grand-blue.json b/src/data/mappings/grand-blue.json deleted file mode 100644 index 1e473e4..0000000 --- a/src/data/mappings/grand-blue.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "anilistAnimeId": 100922, - "anilistMangaId": 87395, - "title": "Grand Blue Dreaming", - "sourceNotes": "Cumulative episodes across S1 (2018, 12 eps) + S2 (2025, 12 eps) = 24 TV episodes (eps 13-24 are S2). Manga is ongoing (Good! Afternoon / Kodansha); latest serialized chapter is 108 as of mid-2026, with Vol. 26 (April 2026) ending at ch 106. S1 adapts ch 1-21 (end of Vol. 5); S2 adapts ch 22-45 (end of Vol. 11). Chapters 46-108 are unadapted and form the source for Season 3 (announced, premiering 2026). Grand Blue has no official named arcs (it is episodic slice-of-life); arc labels below are descriptive groupings by event/volume. S1/S2 boundary chapters (21, 45) come from continuation guides aligned to volume structure rather than a per-episode table, so per-arc internal splits are approximate.", - "mappings": [ - { - "episodes": [1, 5], - "chapters": [1, 8], - "arc": "Peek-a-Boo Diving Club / college drinking culture (Vols 1-2)" - }, - { - "episodes": [6, 9], - "chapters": [9, 17], - "arc": "Diving license training and exam (Vols 3-4)" - }, - { - "episodes": [10, 12], - "chapters": [18, 21], - "arc": "Okinawa / Miyakojima trip, first open-water dives (Vol 5)" - }, - { - "episodes": [13, 17], - "chapters": [22, 28], - "arc": "Back to campus, new term and contests (Vols 6-7)" - }, - { - "episodes": [18, 20], - "chapters": [29, 37], - "arc": "Divemaster path / Chris arc (Vols 8-9)" - }, - { - "episodes": [21, 24], - "chapters": [38, 45], - "arc": "Izu trip and continued antics (Vols 10-11)" - }, - { - "chapters": [46, 108], - "arc": "Post-S2 unadapted tail: Christmas, later trips, instructor storylines (Vols 12-26+, Season 3 source)" - } - ] -} diff --git a/src/data/mappings/great-teacher-onizuka.json b/src/data/mappings/great-teacher-onizuka.json deleted file mode 100644 index 797ecd9..0000000 --- a/src/data/mappings/great-teacher-onizuka.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "anilistAnimeId": 245, - "anilistMangaId": 30336, - "title": "Great Teacher Onizuka", - "sourceNotes": "Single-season 1999 TV anime (43 eps) adapting Tooru Fujisawa's `GTO` manga (FINISHED; AniList counts 208 chapters incl. `.5`/extra installments, Wikipedia lists 200 across 25 vols). The anime caught up to the then-ongoing manga, so it reorders chapters heavily through the Okinawa trip (~ch 109) and then ends on an ANIME-ORIGINAL Onizuka-vs-Miyabi finale (eps 42-43) rather than adapting the manga's later arcs. Episode-to-chapter anchors are approximate, drawn from the `Everything Begins With Your Heart` GTO anime/manga comparison (eps 1-8 ≈ ch 1-28, eps 9-19 ≈ ch 28-67, eps 20-41 ≈ ch 68-109) plus the GTO fandom wiki; the anime interleaves chapters out of order so per-arc ranges are best-fit. The unadapted manga tail (Mayu, Urumi Kanzaki / school carnival, and the final Daimon/graduation arcs) is included as chapters-only. Live-action films/specials excluded, so no `movies`.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 14], - "arc": "The Legend Begins (Onizuka becomes a teacher; Yoshikawa's rooftop rescue)" - }, - { - "episodes": [4, 8], - "chapters": [15, 28], - "arc": "Kikuchi & the Campaign to Oust Onizuka" - }, - { - "episodes": [9, 15], - "chapters": [29, 50], - "arc": "Tomoko Nomura & Anko Uehara" - }, - { - "episodes": [16, 22], - "chapters": [51, 71], - "arc": "Fuyutsuki & Class 2-4's Crises" - }, - { - "episodes": [23, 36], - "chapters": [72, 97], - "arc": "Miyabi's Blackmail Scheme, Tomoko's Idol Debut & Murai's Mother (anime reorders ch 72-97)" - }, - { - "episodes": [37, 41], - "chapters": [98, 109], - "arc": "The Okinawa School Trip" - }, - { - "episodes": [42, 43], - "chapters": [110, 145], - "arc": "Onizuka vs Miyabi: The Finale (anime-original ending; the manga resolves Miyabi later across the Mayu and Urumi carnival arcs)" - }, - { - "chapters": [146, 208], - "arc": "Final Arcs & Graduation (unadapted manga tail: Daimon & the third-year finale)" - } - ] -} diff --git a/src/data/mappings/greatest-demon-lord-reborn-typical-nobody.json b/src/data/mappings/greatest-demon-lord-reborn-typical-nobody.json deleted file mode 100644 index e25c25e..0000000 --- a/src/data/mappings/greatest-demon-lord-reborn-typical-nobody.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "anilistAnimeId": 130586, - "anilistMangaId": 113484, - "title": "The Greatest Demon Lord Is Reborn as a Typical Nobody", - "sourceNotes": "LN-based; mapped against the Fujimi Fantasia Bunko light novel (AniList NOVEL entry 113484), which the community sync guides use — one story arc corresponds to one LN volume. Single 12-episode TV season (2022), so episodes are non-cumulative. The anime adapts LN volumes 1-3 (arcs 1-3), heavily reordering and adding original scenes; readers should continue at volume 4. LN complete at 10 volumes (AniList: 122 chapters). Volume 1 (21 chapters) and volume 2 (16 chapters) counts are documented on the series wiki; chapter boundaries for volumes 3-10 are approximate, evenly distributed to reach the 122-chapter total. The side-story volume 6.5 (\"The Wonderful Life of a Typical Nobody\") is excluded from this numbering. The separate manga (AniList 108441, 35 ch) is a minor, discontinued adaptation and is not the mapping basis.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 21], - "arc": "The Myth-Killing Honor Student" - }, - { - "episodes": [5, 8], - "chapters": [22, 37], - "arc": "The Raging Champion" - }, - { - "episodes": [9, 12], - "chapters": [38, 48], - "arc": "The Catastrophe of the Great Hero" - }, - { - "chapters": [49, 59], - "arc": "The Lonely Divine Scholar" - }, - { - "chapters": [60, 70], - "arc": "Papal Baptism" - }, - { - "chapters": [71, 81], - "arc": "Former Typical Nobody" - }, - { - "chapters": [82, 92], - "arc": "Clown of the Outer Gods (Evil God Clown)" - }, - { - "chapters": [93, 103], - "arc": "Goddess Awakening" - }, - { - "chapters": [104, 113], - "arc": "Dream of the Evil God" - }, - { - "chapters": [114, 122], - "arc": "Advent of the Great Demon King" - } - ] -} diff --git a/src/data/mappings/grimgar.json b/src/data/mappings/grimgar.json deleted file mode 100644 index 9028195..0000000 --- a/src/data/mappings/grimgar.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 21428, - "anilistMangaId": 86367, - "title": "Grimgar of Fantasy and Ash", - "sourceNotes": "S1 anime (12 eps, 2016) adapts roughly LIGHT NOVEL volumes 1-2 of Ao Jumonji's series. The linked manga adaptation (AniList id 86367) is SHORT and incomplete — only 16 chapters / 3 volumes (FINISHED) covering a fraction of the story — so this mapping uses LIGHT-NOVEL VOLUME numbers as the 'chapters' unit instead of manga chapters. Vol 1 runs through Manato's death and the immediate aftermath; vol 2 covers Merry joining and the Cyrene Mines / Death Spot climax (Moguzo's death). Per-arc volume boundaries are APPROXIMATE (only two volumes span all 12 episodes, so groupings are coarse and the vol-1/vol-2 boundary falls inside the middle arc). The LN is ongoing (~20 volumes by 2026); resume reading at vol 3 — its upper bound below is approximate. The OVA 2.5 special is a separate side entry; there are no theatrical films.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 1], - "arc": "Party formation & first goblins / Manato's death (LN vol 1)" - }, - { - "episodes": [5, 8], - "chapters": [1, 2], - "arc": "Grief & recruiting Merry the priest (LN vols 1-2)" - }, - { - "episodes": [9, 12], - "chapters": [2, 2], - "arc": "Cyrene Mines / Death Spots — the Deathspot battle & Moguzo's death (LN vol 2)" - }, - { - "chapters": [3, 20], - "arc": "Post-anime (LN vol 3 onward, ongoing & unadapted)" - } - ] -} diff --git a/src/data/mappings/guilty-crown.json b/src/data/mappings/guilty-crown.json deleted file mode 100644 index 6f0e8b9..0000000 --- a/src/data/mappings/guilty-crown.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 10793, - "anilistMangaId": 60871, - "title": "Guilty Crown", - "sourceNotes": "22-episode series. Manga (7 volumes, complete at 26 chapters) adapts the full story with some events and character fates changed from the anime (notably Inori's ending); a published chapter-to-episode guide was not found, so chapter ranges are proportioned across the anime's two halves (the OP/mood shift between episodes 11 and 12 marks the split).", - "mappings": [ - { - "episodes": [1, 11], - "chapters": [1, 13], - "arc": "GHQ & the Void Genome" - }, - { - "episodes": [12, 22], - "chapters": [14, 26], - "arc": "Second Genesis Outbreak" - } - ] -} diff --git a/src/data/mappings/gun-gale-online-alternative.json b/src/data/mappings/gun-gale-online-alternative.json deleted file mode 100644 index b66671c..0000000 --- a/src/data/mappings/gun-gale-online-alternative.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "anilistAnimeId": 100183, - "anilistMangaId": 100858, - "title": "Sword Art Online Alternative: Gun Gale Online", - "sourceNotes": "LN-based spin-off; ranges are by light novel VOLUME (Keiichi Sigsawa's \"GGO Alternative\" novels, AniList id 100858, chapters null there), not chapter numbers — the community maps this series volume-to-episode. GGO Alternative is its own franchise, so episode numbering starts at S1E1 (the SAO II \"parent\" relation is franchise-level only). Cumulative episodes across S1 (12, studio 3Hz, 2018; a mid-season recap ep 5.5 is not counted) + S2 \"GGO Alternative II\" (12, A-1 Pictures, 2024) = 24. S1 adapts Vol 1-3 (First & Second Squad Jam); S2 adapts Vol 4-5 (Third Squad Jam, ~8 eps) plus Vol 6 \"One Summer Day / Test Play\" (~4 eps). Source novels ongoing at 14 volumes (Vol 14 \"Invitation from Vivi\", Oct 2024); Vol 7-14 remain unadapted.", - "mappings": [ - { - "episodes": [1, 5], - "chapters": [1, 1], - "arc": "First Squad Jam" - }, - { - "episodes": [6, 12], - "chapters": [2, 3], - "arc": "Second Squad Jam" - }, - { - "episodes": [13, 20], - "chapters": [4, 5], - "arc": "Third Squad Jam (Betrayers' Choice)" - }, - { - "episodes": [21, 24], - "chapters": [6, 6], - "arc": "One Summer Day / Test Play" - }, - { - "chapters": [7, 9], - "arc": "Fourth Squad Jam" - }, - { - "chapters": [10, 10], - "arc": "Five Ordeals" - }, - { - "chapters": [11, 13], - "arc": "Fifth Squad Jam" - }, - { - "chapters": [14, 14], - "arc": "Invitation from Vivi" - } - ] -} diff --git a/src/data/mappings/gurren-lagann.json b/src/data/mappings/gurren-lagann.json deleted file mode 100644 index a303f2d..0000000 --- a/src/data/mappings/gurren-lagann.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 2001, - "anilistMangaId": 31648, - "title": "Gurren Lagann", - "sourceNotes": "27-episode series (episode 16 is a clip-show recap and is not adapted). Manga (10 volumes, complete at 65 chapters) follows the same overall plotline as the anime with added backstory filling gaps; chapter ranges are proportioned across the anime's three well-known arcs since a published chapter-to-episode guide was not found. The two theatrical films (Gurren-hen, Lagann-hen) are compressed, partially-diverging retellings rather than the central continuity and are omitted.", - "mappings": [ - { - "episodes": [1, 8], - "chapters": [1, 20], - "arc": "Team Gurren & Kamina's Sacrifice" - }, - { - "episodes": [9, 15], - "chapters": [21, 38], - "arc": "Team Dai-Gurren vs. the Spiral King" - }, - { - "episodes": [17, 27], - "chapters": [39, 65], - "arc": "Post-Timeskip: The Anti-Spiral War" - } - ] -} diff --git a/src/data/mappings/gushing-over-magical-girls.json b/src/data/mappings/gushing-over-magical-girls.json deleted file mode 100644 index 185eced..0000000 --- a/src/data/mappings/gushing-over-magical-girls.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 162780, - "anilistMangaId": 109017, - "title": "Gushing Over Magical Girls", - "sourceNotes": "Source is Akihiro Ononaka's manga (AniList 109017), ongoing (~ch. 63 as of June 2026, 12 volumes; the manga went on hiatus for the author's health from March 2024 to October 2025). The 13-episode Season 1 anime adapts chapters 1-24. No named story arcs; this is an episodic dark-comedy magical-girl parody, so the anime run is grouped as one block with the unadapted tail (including material for the announced Season 2) left as chapters-only.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 24], - "arc": "Season 1" - }, - { - "chapters": [25, 63], - "arc": "Post-Season 1 (Manga-Only)" - } - ] -} diff --git a/src/data/mappings/haganai.json b/src/data/mappings/haganai.json deleted file mode 100644 index c0c1d55..0000000 --- a/src/data/mappings/haganai.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "anilistAnimeId": 10719, - "anilistMangaId": 49087, - "title": "Haganai: I Don't Have Many Friends", - "sourceNotes": "Cumulative episodes across S1 'Haganai' (2011, 12 eps) + S2 'Haganai NEXT' (2013, eps 13-24) = 24 total; anilistAnimeId 10719 is the S1 TV anime. The franchise's true source is Yomi Hirasaka's LIGHT NOVEL (11 vols, 2009-2015), which the anime adapts directly. anilistMangaId 49087 is Itachi's manga adaptation (FINISHED, 109 ch / 20 vols, 2010-2021) -- an independent, parallel adaptation of the same LN, so its pacing and chapter boundaries do not line up exactly with the anime, and the manga's ending diverges from the LN. Season 1 adapts LN vol 1 through vol 4 ch 2; Season 2 NEXT adapts LN vol 4 through about three-quarters of vol 8. In manga terms, the two seasons together cover roughly chapters 1-64; the documented manga resume point after the anime is Vol 15, ch 65 (manga vol anchors: v1=ch1-5, v2=ch6-10, v3=ch11-15, v4=ch16-20, v5=ch21-24). The intra-anime S1/S2 chapter split (~ch 32) is approximate. No theatrical films.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 32], - "arc": "Season 1: Neighbors Club Formation & First Summer (through Yozora 'Sora' reveal)", - "note": "Adapts LN vol 1 to vol 4 ch 2. Manga chapter split is approximate." - }, - { - "episodes": [13, 24], - "chapters": [33, 64], - "arc": "Season 2 (NEXT): Sena Engagement, Yukimura's Secret & Mayoi Neko Overheat Film", - "note": "Adapts LN vol 4 to ~vol 8 (3/4). Manga chapter split is approximate." - }, - { - "chapters": [65, 109], - "arc": "Post-anime (resume at manga Vol 15) -- unadapted", - "note": "LN vol 8 (~3/4) onward through vol 11. Manga ending diverges from the LN." - } - ] -} diff --git a/src/data/mappings/haikyuu.json b/src/data/mappings/haikyuu.json deleted file mode 100644 index b21e0ac..0000000 --- a/src/data/mappings/haikyuu.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "anilistAnimeId": 20464, - "anilistMangaId": 65243, - "title": "Haikyu!!", - "sourceNotes": "Cumulative episodes across S1 (25) + S2 (25) + S3 (10) + S4 To the Top (25). Arc names by tournament; chapter ranges approximate.", - "mappings": [ - { "episodes": [1, 13], "chapters": [1, 24], "arc": "Karasuno Reborn" }, - { - "episodes": [14, 25], - "chapters": [25, 70], - "arc": "Interhigh Preliminaries" - }, - { - "episodes": [26, 38], - "chapters": [71, 110], - "arc": "Tokyo Training Camp" - }, - { - "episodes": [39, 50], - "chapters": [111, 148], - "arc": "Spring High Preliminaries" - }, - { - "episodes": [51, 60], - "chapters": [149, 189], - "arc": "Spring High vs Shiratorizawa" - }, - { - "episodes": [61, 85], - "chapters": [190, 292], - "arc": "Spring High Nationals" - }, - { - "chapters": [293, 369], - "arc": "Battle at the Garbage Dump (Final movies)" - }, - { "chapters": [370, 402], "arc": "Timeskip / Final" } - ], - "movies": [ - { - "anilistId": 153658, - "title": "HAIKYU!! The Dumpster Battle", - "year": 2024, - "chapters": [293, 330], - "afterEpisode": 85, - "note": "First of the two Final films; adapts the Karasuno vs Nekoma match (range approximate)." - } - ] -} diff --git a/src/data/mappings/hajime-no-ippo.json b/src/data/mappings/hajime-no-ippo.json deleted file mode 100644 index a11ee0d..0000000 --- a/src/data/mappings/hajime-no-ippo.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "anilistAnimeId": 263, - "anilistMangaId": 30007, - "title": "Hajime no Ippo", - "sourceNotes": "Cumulative episodes across S1 The Fighting! (75) + New Challenger (26) + Rising (25). Manga is ongoing; arc-level approximation, chapter ranges approximate.", - "mappings": [ - { - "episodes": [1, 25], - "chapters": [1, 60], - "arc": "Rookie Ippo / East Japan Rookie King" - }, - { - "episodes": [26, 41], - "chapters": [61, 99], - "arc": "All Japan Rookie King / Vs. Sendo" - }, - { - "episodes": [42, 63], - "chapters": [100, 152], - "arc": "Japan Featherweight Title / Vs. Date" - }, - { - "episodes": [64, 75], - "chapters": [153, 185], - "arc": "Title Defenses / Champion Road" - }, - { - "episodes": [76, 101], - "chapters": [186, 295], - "arc": "New Challenger / Vs. Sawamura / Vs. Volg (OPBF)" - }, - { - "episodes": [102, 126], - "chapters": [296, 431], - "arc": "Rising / Vs. Sendo II / Vs. Ricardo" - }, - { "chapters": [432, 700], "arc": "Post-Ricardo / Itagaki & Volg arcs" }, - { "chapters": [701, 1000], "arc": "Ippo's Retirement / Coach Ippo" }, - { "chapters": [1001, 1500], "arc": "Ongoing (post-retirement)" } - ] -} diff --git a/src/data/mappings/hanasaku-iroha.json b/src/data/mappings/hanasaku-iroha.json deleted file mode 100644 index 2f96d88..0000000 --- a/src/data/mappings/hanasaku-iroha.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 9289, - "anilistMangaId": 55408, - "title": "Hanasaku Iroha ~Blossoms for Tomorrow~", - "sourceNotes": "Single-season 26-episode TV anime (2011). The manga tie-in (complete at 24 chapters across 5 volumes) was serialized concurrently with the anime but on an altered timeline and pacing - same core story and cast, different scene ordering - so the chapter alignment below is a loose approximation rather than a precise scene-for-scene match.", - "mappings": [ - { "episodes": [1, 26], "chapters": [1, 24], "arc": "Kissuiso Inn Story" } - ], - "movies": [ - { - "anilistId": 14175, - "title": "Hanasaku Iroha the Movie ~ HOME SWEET HOME ~", - "year": 2013, - "afterEpisode": 20, - "note": "Canon side story exploring Ohana's mother Satsuki's past at Kissuiso; set between eps 20-21. Anime-original content, not adapted from the manga." - } - ] -} diff --git a/src/data/mappings/happy-sugar-life.json b/src/data/mappings/happy-sugar-life.json deleted file mode 100644 index 4c1e0ae..0000000 --- a/src/data/mappings/happy-sugar-life.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 101351, - "anilistMangaId": 86655, - "title": "Happy Sugar Life", - "sourceNotes": "Single season, 12 episodes. Manga complete at 62 chapters. The anime follows the manga closely but compresses pacing (roughly 1 chapter per episode early on, 3-4 chapters per episode by the finale) and skips Chapters 28-31 (Shio's parents backstory); ep. 12 ends at Chapter 48, leaving the manga's ending (Chapters 49-62) unadapted.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 48], - "arc": "Satou & Shio (TV Adaptation)" - }, - { "chapters": [49, 62], "arc": "Manga-Only Ending" } - ] -} diff --git a/src/data/mappings/harem-in-the-labyrinth-of-another-world.json b/src/data/mappings/harem-in-the-labyrinth-of-another-world.json deleted file mode 100644 index b643a96..0000000 --- a/src/data/mappings/harem-in-the-labyrinth-of-another-world.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 127090, - "anilistMangaId": 99462, - "title": "Harem in the Labyrinth of Another World", - "sourceNotes": "Single-cour anime (12 eps, 2022). Manga adaptation ongoing (current ch. 108 as of June 2026); the anime finishes at ch. 17 / part of ch. 18 (a reader resumes at manga vol. 7 ch. 45), so ch. 1-44 is the anime-covered range. No distinct named story arcs are used by the source; boundaries are broad. The 2-episode OVA (AniList id 151632) bundles bonus/side content and is not included in the cumulative episode count.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 44], - "arc": "Kadan's Dungeon City / Harem Formation" - }, - { "chapters": [45, 108], "arc": "Unadapted continuation (ongoing)" } - ] -} diff --git a/src/data/mappings/haruhi-suzumiya.json b/src/data/mappings/haruhi-suzumiya.json deleted file mode 100644 index cea8f8a..0000000 --- a/src/data/mappings/haruhi-suzumiya.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "anilistAnimeId": 849, - "anilistMangaId": 33083, - "title": "The Melancholy of Haruhi Suzumiya", - "sourceNotes": "Source is Nagaru Tanigawa's light novel series; the anime adapts LN volumes, so the units here are LN VOLUMES (the 'chapters' ranges are volume numbers), not manga chapters. anilistAnimeId 849 is the original 2006 TV anime (14 eps); the 2009 re-broadcast (id 4382) interleaved those with 14 new episodes for 28 total, presented in story-chronological order. Episodes are kept cumulative 1-28 by that standard Kadokawa chronological numbering. Note that broadcast order differs from story order and from LN publication order (e.g. ep 2 'The Boredom' is a vol-3 short slotted between vol-1 'Melancholy' parts), so volume ranges are coarse/approximate and do not increase monotonically. AniList splits each LN volume into its own NOVEL entry; 33083 is the series-root entry ('The Melancholy', vol 1). The TV run covers vols 1-3, 5-6; LN vol 4 'The Disappearance' is adapted as the 2010 film, not the series.", - "mappings": [ - { - "episodes": [1, 7], - "chapters": [1, 1], - "arc": "The Melancholy of Haruhi Suzumiya (vol 1; SOS Brigade formed)" - }, - { - "episodes": [8, 11], - "chapters": [3, 3], - "arc": "The Boredom of Haruhi Suzumiya (vol 3 shorts: Bamboo Leaf Rhapsody, Mysterique Sign, Remote Island Syndrome)" - }, - { - "episodes": [12, 19], - "chapters": [5, 5], - "arc": "Endless Eight (The Rampage of Haruhi Suzumiya, vol 5)" - }, - { - "episodes": [20, 24], - "chapters": [2, 2], - "arc": "The Sigh of Haruhi Suzumiya (vol 2; cultural-festival film arc)" - }, - { - "episodes": [25, 28], - "chapters": [5, 6], - "arc": "The Day of Sagittarius / The Wavering of Haruhi Suzumiya (vols 5-6: Live Alive, Someday in the Rain)" - } - ], - "movies": [ - { - "anilistId": 7311, - "title": "The Disappearance of Haruhi Suzumiya", - "year": 2010, - "afterEpisode": 28, - "note": "canon sequel film; adapts LN vol 4 (The Disappearance)" - } - ] -} diff --git a/src/data/mappings/heavenly-delusion.json b/src/data/mappings/heavenly-delusion.json deleted file mode 100644 index 3ff4cea..0000000 --- a/src/data/mappings/heavenly-delusion.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 155783, - "anilistMangaId": 101942, - "title": "Heavenly Delusion", - "sourceNotes": "13-ep single season (2023) by Production I.G adapts Masakazu Ishiguro's manga through roughly vol 6 into early vol 7. The two parallel timelines end at different points: the 'outside' journey (Maru & Kiruko) reaches ~ch 34, while the 'inside' Takahara Academy timeline runs to ~ch 39, with the anime pulling some Nursery-arc reveals (ch 36-38) forward into the finale. Because the timelines interleave, episode-to-chapter boundaries are approximate. Manga ongoing: 13 volumes / ~ch 83 as of late June 2026 (MangaDex / Wikipedia chapter list). A reader resumes cleanly around ch 40 (vol 7, 'Dreams of Hell'). No films.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 12], - "arc": "The Outside & Takahara Academy (Setup) — approx." - }, - { - "episodes": [5, 9], - "chapters": [13, 30], - "arc": "The Immortal Order & Wall Town — approx." - }, - { - "episodes": [10, 13], - "chapters": [31, 39], - "arc": "Robin Inazaki & Takahara Academy (Finale) — approx." - }, - { - "chapters": [40, 83], - "arc": "Ongoing (unadapted)" - } - ] -} diff --git a/src/data/mappings/heavens-lost-property.json b/src/data/mappings/heavens-lost-property.json deleted file mode 100644 index d7b0a9f..0000000 --- a/src/data/mappings/heavens-lost-property.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "anilistAnimeId": 5958, - "anilistMangaId": 38144, - "title": "Heaven's Lost Property", - "sourceNotes": "Cumulative episodes across S1 (13) + Forte S2 (12, eps 14-25). Manga complete at 97 chapters across 20 volumes per AniList; some fan chapter counts run only to ch. 77 plus extras, so boundaries below are approximate and scaled to the AniList numbering. S1 covers the Ikaros/Nymph introduction; Forte covers the Astraea/Chaos material before diverging into anime-original content near its finale. The Hiyori arc and the manga's ending were left unadapted by the TV series and are instead covered by two sequel films.", - "mappings": [ - { "episodes": [1, 13], "chapters": [1, 33], "arc": "Ikaros & Nymph Arc" }, - { - "episodes": [14, 25], - "chapters": [34, 56], - "arc": "Astraea & Chaos Arc" - }, - { "chapters": [57, 97], "arc": "Hiyori Arc / Final Arc (Unadapted on TV)" } - ], - "movies": [ - { - "anilistId": 9790, - "title": "Heaven's Lost Property the Movie: The Angeloid of Clockwork", - "year": 2011, - "chapters": [57, 75], - "afterEpisode": 25, - "note": "Adapts the Hiyori arc, which was skipped by the Forte TV adaptation." - }, - { - "anilistId": 12783, - "title": "Heaven's Lost Property Final: Eternally My Master", - "year": 2014, - "chapters": [76, 97], - "afterEpisode": 25, - "note": "Sequel film concluding Tomoki and Ikaros's story, adapting material through near the end of the manga." - } - ] -} diff --git a/src/data/mappings/hells-paradise.json b/src/data/mappings/hells-paradise.json deleted file mode 100644 index 4b9a46c..0000000 --- a/src/data/mappings/hells-paradise.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 128893, - "anilistMangaId": 100994, - "title": "Hell's Paradise: Jigokuraku", - "sourceNotes": "Cumulative episodes across S1 (13, eps 1-13) + S2 (12, eps 14-25). Manga complete at 127 chapters / 13 volumes (4 arcs). S1 adapted through ~chapter 45 (mid-Lord Tensen); S2 resumed there and stopped at chapter 94 (officially chapters 60-89 plus ch 94 pulled forward), roughly two-thirds through the Horai Arc. Chapters ~95-127 (back half of Horai + the entire Departure Arc) are UNADAPTED, set up for a potential S3. MAPPA reordered chapters for pacing, so within-arc episode boundaries are approximate. No theatrical films (only stage plays).", - "mappings": [ - { "episodes": [1, 5], "chapters": [1, 16], "arc": "Island" }, - { "episodes": [6, 18], "chapters": [17, 59], "arc": "Lord Tensen" }, - { - "episodes": [19, 25], - "chapters": [60, 94], - "arc": "Horai (partial; anime stops at ch 94)" - }, - { "chapters": [95, 110], "arc": "Horai (unadapted remainder)" }, - { "chapters": [111, 127], "arc": "Departure" } - ] -} diff --git a/src/data/mappings/hellsing-2001.json b/src/data/mappings/hellsing-2001.json deleted file mode 100644 index e11d6fe..0000000 --- a/src/data/mappings/hellsing-2001.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 270, - "anilistMangaId": 30267, - "title": "Hellsing", - "sourceNotes": "The 2001 Gonzo TV series (13 episodes) only loosely adapts Kouta Hirano's manga through roughly episode 6, then diverges into a wholly anime-original storyline (the vampire Incognito) with no manga basis — episodes 7-13 (Duel, Kill House, Red Rose Vertigo, Master of Monster, Transcend Force, Total Destruction, Hellfire) are original and are not mapped to chapters here. The early episodes compress Volume 1 material (Cheddar incident and Seras being turned, the Murder Club vampire pair, and Alexander Anderson's Sword Dancer introduction) plus the Valentine Brothers' assault on Hellsing HQ (Dead Zone), diverging around chapter 12. Chapter ranges are approximate because the adaptation reorders and abridges the source. Manga complete at 92 chapters / 10 volumes (per AniList). The faithful full-manga adaptation is Hellsing Ultimate (OVA, id 777), mapped separately as hellsing-ultimate.", - "mappings": [ - { - "episodes": [1, 1], - "chapters": [1, 2], - "arc": "The Undead (Cheddar Incident)" - }, - { - "episodes": [2, 2], - "chapters": [3, 3], - "arc": "Murder Club (Club M)" - }, - { - "episodes": [3, 4], - "chapters": [4, 6], - "arc": "Sword Dancer (Anderson & Iscariot)" - }, - { - "episodes": [5, 6], - "chapters": [7, 12], - "arc": "Dead Zone (Valentine Brothers' Attack)" - }, - { - "chapters": [13, 92], - "arc": "Millennium War & Final Battle (unadapted — 2001 anime goes original with Incognito; see Hellsing Ultimate)" - } - ] -} diff --git a/src/data/mappings/hellsing-ultimate.json b/src/data/mappings/hellsing-ultimate.json deleted file mode 100644 index ccba759..0000000 --- a/src/data/mappings/hellsing-ultimate.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "anilistAnimeId": 777, - "anilistMangaId": 30267, - "title": "Hellsing Ultimate", - "sourceNotes": "10-episode OVA series (2006-2012), each episode adapting one full manga volume. Manga complete at 92 chapters / 10 volumes. The earlier 2001 Hellsing TV series (id 270) is a separate anime with an anime-original ending and is not covered here. Per-OVA chapter ranges are estimated as ~9 chapters per volume.", - "mappings": [ - { - "episodes": [1, 1], - "chapters": [1, 9], - "arc": "Volume 1: The Hellsing Organization" - }, - { - "episodes": [2, 2], - "chapters": [10, 19], - "arc": "Volume 2: Order of the Knights of the Round Table" - }, - { - "episodes": [3, 3], - "chapters": [20, 28], - "arc": "Volume 3: Letztes Bataillon" - }, - { - "episodes": [4, 4], - "chapters": [29, 37], - "arc": "Volume 4: The Captain / Rip Van Winkle" - }, - { - "episodes": [5, 5], - "chapters": [38, 46], - "arc": "Volume 5: London Raid Begins" - }, - { - "episodes": [6, 6], - "chapters": [47, 55], - "arc": "Volume 6: Schrödinger" - }, - { - "episodes": [7, 7], - "chapters": [56, 64], - "arc": "Volume 7: Anderson vs Alucard" - }, - { - "episodes": [8, 8], - "chapters": [65, 73], - "arc": "Volume 8: Walter's Betrayal" - }, - { - "episodes": [9, 9], - "chapters": [74, 82], - "arc": "Volume 9: The Major's Speech" - }, - { - "episodes": [10, 10], - "chapters": [83, 92], - "arc": "Volume 10: Final Battle" - } - ] -} diff --git a/src/data/mappings/hensuki.json b/src/data/mappings/hensuki.json deleted file mode 100644 index 30a061b..0000000 --- a/src/data/mappings/hensuki.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 107961, - "anilistMangaId": 100827, - "title": "Hensuki: Are you willing to fall in love with a pervert, as long as she's a cutie?", - "sourceNotes": "Single 12-episode TV season (2019, Geek Toys), adapted from Ai Fuji's light novels. Mapped here against CHuN's manga adaptation (6 volumes, complete at 39 chapters), which follows the same heroine-by-heroine structure as the anime. Romantic-comedy harem with interleaved heroine vignettes rather than formal story arcs, so boundaries are coarse and follow manga volume breaks; chapter ranges are approximate.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 13], - "arc": "Sayuki, Yuika & Mao introduced (manga vols 1-2)" - }, - { - "episodes": [5, 8], - "chapters": [14, 26], - "arc": "Koharu & Ayano arcs; the panty investigation continues (manga vols 3-4)" - }, - { - "episodes": [9, 12], - "chapters": [27, 39], - "arc": "Identity reveals and the Mizuha finale (manga vols 5-6)" - } - ] -} diff --git a/src/data/mappings/hentai-prince-and-the-stony-cat.json b/src/data/mappings/hentai-prince-and-the-stony-cat.json deleted file mode 100644 index 3a7cf0e..0000000 --- a/src/data/mappings/hentai-prince-and-the-stony-cat.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 15225, - "anilistMangaId": 55876, - "title": "Hentai Prince & the Stony Cat", - "sourceNotes": "Single-cour, 12 episodes (2013). Source is the light novel (complete at 78 chapters across 13 volumes); a separate manga adaptation also exists but the novel is the anime's direct source. Chapter ranges assume an even ~6 chapters per volume, since no published per-chapter table of contents was found, so boundaries are approximate. The anime adapts volumes 1-5 only (vol. 1 spans episodes 1-4, vol. 2-5 roughly two episodes apiece); volumes 6-13 were never animated.", - "mappings": [ - { "episodes": [1, 4], "chapters": [1, 6], "arc": "Volume 1" }, - { "episodes": [5, 6], "chapters": [7, 12], "arc": "Volume 2" }, - { "episodes": [7, 8], "chapters": [13, 18], "arc": "Volume 3" }, - { "episodes": [9, 10], "chapters": [19, 24], "arc": "Volume 4" }, - { "episodes": [11, 12], "chapters": [25, 30], "arc": "Volume 5" }, - { "chapters": [31, 78], "arc": "Unadapted novel volumes (6-13)" } - ] -} diff --git a/src/data/mappings/hidden-dungeon.json b/src/data/mappings/hidden-dungeon.json deleted file mode 100644 index 0f2f5cc..0000000 --- a/src/data/mappings/hidden-dungeon.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 118375, - "anilistMangaId": 103850, - "title": "The Hidden Dungeon Only I Can Enter", - "sourceNotes": "Single 12-episode season (2021); episodes are non-cumulative. Based on Meguru Seto's light novel, but mapped against the Tomoyuki Hino manga (AniList id 103850), the source community guides use for episode-to-chapter tracking; the LN itself has no per-chapter numbering. The anime adapts manga chapters 1-38 (the end of Volume 5, the Phantom/Olivia arc), skipping a handful of chapters (12, 16, 24-25, 36) along the way, so ranges are approximate and volume-anchored. Manga complete at 111 chapters per AniList (Vol 1 = ch 1-7, Vol 2 = ch 8-14, Vol 3 = ch 15-22, Vol 4 ~ch 23-30, Vol 5 ~ch 31-38). Everything past ch 38 is unadapted. No theatrical films.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 7], - "arc": "Hidden Dungeon & Hero Academy" - }, - { - "episodes": [3, 6], - "chapters": [8, 22], - "arc": "Maria's Curse" - }, - { - "episodes": [7, 10], - "chapters": [23, 30], - "arc": "Academy Life & the Dryad" - }, - { - "episodes": [11, 12], - "chapters": [31, 38], - "arc": "The Phantom / Olivia's Liberation" - }, - { - "chapters": [39, 111], - "arc": "Beyond the Anime (unadapted manga)" - } - ] -} diff --git a/src/data/mappings/higehiro.json b/src/data/mappings/higehiro.json deleted file mode 100644 index 7a34122..0000000 --- a/src/data/mappings/higehiro.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "anilistAnimeId": 114232, - "anilistMangaId": 105791, - "title": "Higehiro: After Being Rejected, I Shaved and Took in a High School Runaway", - "sourceNotes": "Source is Shimesaba's light novel (AniList 104505, 5 vols / completed). Paired here with the completed manga adaptation 'Hige wo Soru. Soshite Joshikousei wo Hirou.' (AniList 105791, 67 ch / 13 vols, FINISHED). The single-cour 2021 TV anime (13 eps) adapts essentially the entire main story (LN vols 1-5), so the manga's 67 chapters and the anime's run end at the same story point and there is no unadapted tail. Episode-to-volume splits follow the LN structure (~vol 1: eps 1-3, vol 2: eps 4-6, vol 3: eps 7-9, vol 4: eps 10-11, vol 5: eps 12-13); chapter ranges are mapped proportionally across the manga and are approximate.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 14], - "arc": "Taking In Sayu (A New Life Together)" - }, - { - "episodes": [4, 6], - "chapters": [15, 28], - "arc": "Daily Life & Mishima's Feelings" - }, - { - "episodes": [7, 9], - "chapters": [29, 42], - "arc": "Friendships & Sayu's Past Resurfaces" - }, - { - "episodes": [10, 11], - "chapters": [43, 54], - "arc": "Her Brother Issa (The Truth Comes Out)" - }, - { - "episodes": [12, 13], - "chapters": [55, 67], - "arc": "Return to Hokkaido (Resolution)" - } - ] -} diff --git a/src/data/mappings/high-rise-invasion.json b/src/data/mappings/high-rise-invasion.json deleted file mode 100644 index 2aba182..0000000 --- a/src/data/mappings/high-rise-invasion.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 125428, - "anilistMangaId": 85388, - "title": "High-Rise Invasion", - "sourceNotes": "The 2021 Netflix ONA (Tenkuu Shinpan, id 125428) is a single 12-episode season that adapts roughly volumes 1-8 of Tsuina Miura (story) & Takahiro Oba (art)'s complete manga (id 85388). AniList counts the manga at 258 chapters across 21 volumes; fan/scanlation sources often cite ~169 'main' chapters, but ranges here follow AniList's 258-chapter count for consistency. Chapter ranges are proportional estimates converting volume boundaries onto that count (vols 1-8 ~= ch 1-98), so they are approximate; resume reading at ch 99. The separate 'Tenkuu Shinpan Arrive' spin-off (id 111034) is excluded, and there are no theatrical films.", - "mappings": [ - { - "episodes": [1, 1], - "chapters": [1, 12], - "arc": "Yuri Honjo's Arrival: Survival & Masks" - }, - { - "episodes": [2, 4], - "chapters": [13, 40], - "arc": "Mayuko Nise Alliance" - }, - { - "episodes": [5, 7], - "chapters": [41, 64], - "arc": "Sniper Mask & Forming Alliances" - }, - { - "episodes": [8, 9], - "chapters": [65, 82], - "arc": "Kuon Shinzaki & the God's Candidate" - }, - { - "episodes": [10, 12], - "chapters": [83, 98], - "arc": "Angels & Administrators (Anime Finale)" - }, - { - "chapters": [99, 258], - "arc": "Resolving the Tower (unadapted)" - } - ] -} diff --git a/src/data/mappings/high-school-dxd.json b/src/data/mappings/high-school-dxd.json deleted file mode 100644 index fec186a..0000000 --- a/src/data/mappings/high-school-dxd.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "anilistAnimeId": 11617, - "anilistMangaId": 60859, - "title": "High School DxD", - "sourceNotes": "Cumulative episodes across S1 'High School DxD' (12, eps 1-12) + S2 'High School DxD New' (12, eps 13-24) + S3 'High School DxD BorN' (12, eps 25-36) + S4 'High School DxD Hero' (12, eps 37-48) = 48 total; the S4 episode 0 special 'Holiness Behind the Gym' is excluded from the count. Paired with the Hiroji Mishima manga adaptation (complete at 78 ch / 11 vols). Both anime and manga adapt Ichiei Ishibumi's light novels, so per-arc chapter boundaries are approximate. The manga ran behind the anime and concluded around the early Heroic Oppai Dragon arc (~LN vol 7-8); S4 adapts later LN content (vols 9-10) the manga never fully reached, so the final entry's chapter range is nominal, extending to the manga's last chapter (78).", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 20], - "arc": "The Red Dragon Emperor's Awakening (Raynare & Riser Phenex) [LN vols 1-2]" - }, - { - "episodes": [13, 24], - "chapters": [21, 42], - "arc": "Excalibur of the Moonlit Schoolyard & Vampire of the Empty Classroom (Kokabiel / Peace Conference) [LN vols 3-4]" - }, - { - "episodes": [25, 36], - "chapters": [43, 64], - "arc": "Birth of the Breast Dragon Emperor / The Heroic Oppai Dragon (Diodora, Loki & Sairaorg) [LN vols 5-7]" - }, - { - "episodes": [37, 48], - "chapters": [65, 78], - "arc": "Hero: The Hero Faction (Cao Cao) [LN vols 9-10]" - } - ] -} diff --git a/src/data/mappings/high-school-prodigies-have-it-easy-even-in-another-world.json b/src/data/mappings/high-school-prodigies-have-it-easy-even-in-another-world.json deleted file mode 100644 index 4abd255..0000000 --- a/src/data/mappings/high-school-prodigies-have-it-easy-even-in-another-world.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 108388, - "anilistMangaId": 98044, - "title": "High School Prodigies Have It Easy Even In Another World", - "sourceNotes": "Single-cour 12-episode TV anime (2019). Sourced from Riku Misora's light novel (10 volumes, 50 chapters, complete) rather than the separate 13-volume/104-chapter manga adaptation, since AniList's ADAPTATION edge on the anime points to the novel. Fan guides indicate the anime's story concludes at the end of light novel Volume 3, with Volume 4 picking up where the anime leaves off; chapter boundary is approximated at ~5 chapters/volume since no official episode-to-chapter guide was found. No distinct named story arcs, so broad season-based entries are used.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 15], - "arc": "Season 1 (Volumes 1-3)" - }, - { - "chapters": [16, 50], - "arc": "Unadapted (Volumes 4-10)" - } - ] -} diff --git a/src/data/mappings/highschool-of-the-dead.json b/src/data/mappings/highschool-of-the-dead.json deleted file mode 100644 index 2af6d9d..0000000 --- a/src/data/mappings/highschool-of-the-dead.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 8074, - "anilistMangaId": 30669, - "title": "Highschool of the Dead", - "sourceNotes": "S1 anime (12 eps, 2010, Madhouse) faithfully adapts the manga's first ~18 Acts (tankobon vols 1-4) but reorders events from Episode 9 onward, ending at the very start of the 'Mall of the Dead' arc. The manga (chapters are called 'Acts') is permanently unfinished: 29 Acts collected across 7 volumes plus an uncollected Act.30 (May 2013); serialization stalled and writer Daisuke Sato died in 2017. AniList lists 30 chapters. Act boundaries follow the tankobon volumes; the anime's late-episode ordering diverges from the manga, so those ranges are approximate.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 3], - "arc": "Spring of the Dead (Fujimi Academy Outbreak)" - }, - { - "episodes": [3, 5], - "chapters": [4, 9], - "arc": "Escape Through the City" - }, - { - "episodes": [6, 8], - "chapters": [10, 14], - "arc": "Saya's Home & Takagi Estate" - }, - { - "episodes": [9, 12], - "chapters": [15, 18], - "arc": "Takagi Estate Defense & Mall Approach (anime-reordered finale)" - }, - { - "chapters": [19, 30], - "arc": "Unadapted (Mall of the Dead onward; manga left unfinished)" - } - ] -} diff --git a/src/data/mappings/hinamatsuri.json b/src/data/mappings/hinamatsuri.json deleted file mode 100644 index 76bfee2..0000000 --- a/src/data/mappings/hinamatsuri.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 100077, - "anilistMangaId": 66413, - "title": "Hinamatsuri", - "sourceNotes": "The 2018 TV anime by Feel (12 eps, single cour) adapts roughly volumes 1-8.5 of Masao Ohtake's manga, ending around chapter 47. Because Hinamatsuri is a skit-based comedy, the anime reorders and skips stories rather than adapting linearly, so the per-group chapter ranges are approximate and monotonic guides rather than exact episode-to-chapter matches. The manga is complete at 19 volumes; its final numbered chapter is 100 ('Their Lives Thereafter: Part 2'). AniList reports 132 chapters because it counts the '.5' extra/omake interstitials (e.g. ch 100.6) separately, so the main story is treated as ending at chapter 100. A reader resumes at chapter 48 to continue past the anime.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 12], - "arc": "Hina & Anzu Arrive (Nitta's Yakuza Household; Superpower Battles)" - }, - { - "episodes": [4, 6], - "chapters": [13, 24], - "arc": "Anzu's Homeless Redemption & the Nitta Family" - }, - { - "episodes": [7, 9], - "chapters": [25, 36], - "arc": "Anzu Working & Mao Stranded on the Island" - }, - { - "episodes": [10, 12], - "chapters": [37, 47], - "arc": "Hitomi's Bartender Double-Life & Yukimatsuri (Snow Festival)" - }, - { - "chapters": [48, 100], - "arc": "Later Stories (Hitomi's Career, Anzu Grows Up, Finale; unadapted)" - } - ] -} diff --git a/src/data/mappings/hokkaido-gals-are-super-adorable.json b/src/data/mappings/hokkaido-gals-are-super-adorable.json deleted file mode 100644 index a99c31a..0000000 --- a/src/data/mappings/hokkaido-gals-are-super-adorable.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 155963, - "anilistMangaId": 111403, - "title": "Hokkaido Gals Are Super Adorable!", - "sourceNotes": "Single-season, 12-episode TV anime (SILVER LINK./Blade, 2024) adapts manga ch. 1-32 (~through vol. 4). Manga complete at 123 chapters (14 vols). Slice-of-life romance source with no formally named arcs — largely one-to-a-few chapters per episode pacing.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 32], - "arc": "Anime-Adapted Chapters" - }, - { - "chapters": [33, 123], - "arc": "Unadapted (manga continues past the anime)" - } - ] -} diff --git a/src/data/mappings/horimiya.json b/src/data/mappings/horimiya.json deleted file mode 100644 index 64dc708..0000000 --- a/src/data/mappings/horimiya.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "anilistAnimeId": 124080, - "anilistMangaId": 72451, - "title": "Horimiya", - "sourceNotes": "Single-cour 2021 TV anime (13 eps). The adaptation is heavily abridged — it cherry-picks chapters out of order to compress the whole romance into 13 episodes, skipping large stretches of the 152-chapter (complete) manga. Episode→chapter ranges below are approximate and consolidated from a per-episode guide; the anime threads through roughly chapters 1–122 with many gaps. The skipped material was later adapted as \"Horimiya: The Missing Pieces\" (2023). Last entry extends to the final chapter 152 to cover the manga in full.", - "mappings": [ - { - "episodes": [1, 1], - "chapters": [1, 3], - "arc": "A Tiny Happenstance (meeting)" - }, - { - "episodes": [2, 3], - "chapters": [4, 13], - "arc": "Getting to Know Each Other" - }, - { - "episodes": [4, 5], - "chapters": [16, 25], - "arc": "Confession / Dating Begins" - }, - { "episodes": [6, 7], "chapters": [26, 37], "arc": "Summer / Festival" }, - { - "episodes": [8, 9], - "chapters": [38, 55], - "arc": "Ishikawa & Yoshikawa / New Term" - }, - { - "episodes": [10, 10], - "chapters": [58, 61], - "arc": "Winter / Until the Snow Melts" - }, - { - "episodes": [11, 12], - "chapters": [62, 103], - "arc": "Second Year / Student Council" - }, - { - "episodes": [13, 13], - "chapters": [104, 152], - "arc": "Graduation Finale (incl. abridged tail)" - } - ] -} diff --git a/src/data/mappings/how-heavy-dumbbells.json b/src/data/mappings/how-heavy-dumbbells.json deleted file mode 100644 index 9a53efb..0000000 --- a/src/data/mappings/how-heavy-dumbbells.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 107226, - "anilistMangaId": 97626, - "title": "How Heavy Are the Dumbbells You Lift?", - "sourceNotes": "Single 12-episode TV season (2019, Doga Kobo). Source is Yabako Sandrovich & MAAM's ongoing fitness-comedy manga (id 97626), serialized on Ura Sunday / MangaONE since 2016 and still RELEASING (AniList lists no chapter/volume totals; the Japanese serial is past ch. 189 as of late 2024, ~200 and counting). The show is an episodic gag/how-to-train comedy with no continuous story arcs — each episode strings together several short chapters and ends on a workout-instruction segment — so it adapts the early manga roughly in publication order. Per multiple episode guides the anime covers up to chapter 54 (episode 12 = chapters 52-54); readers are told to continue from chapter 55. Chapter ranges below are coarse ~4-5-chapters-per-episode approximations. No theatrical films exist (only a 2-episode \"Silverman Gym Intense Training Course\" special), so no movies are listed.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 13], - "arc": "Hibiki joins Silverman Gym & meets trainer Machio (approx.)" - }, - { - "episodes": [4, 6], - "chapters": [14, 27], - "arc": "Building the cast — Gina, boxing, and gym regulars (approx.)" - }, - { - "episodes": [7, 9], - "chapters": [28, 40], - "arc": "Summer, sports and escalating training antics (approx.)" - }, - { - "episodes": [10, 12], - "chapters": [41, 54], - "arc": "Muscle Beach finale & full-body workout send-off (approx.)" - }, - { - "chapters": [55, 200], - "arc": "Later gym vignettes — manga only, ongoing (approx.)" - } - ] -} diff --git a/src/data/mappings/how-not-to-summon-a-demon-lord.json b/src/data/mappings/how-not-to-summon-a-demon-lord.json deleted file mode 100644 index 192a726..0000000 --- a/src/data/mappings/how-not-to-summon-a-demon-lord.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 101004, - "anilistMangaId": 86338, - "title": "How NOT to Summon a Demon Lord", - "sourceNotes": "Source is a light novel by Yukiya Murasaki (AniList id 93368, on hiatus since 2022). anilistAnimeId is the 2018 TV season 1 (id 101004, 12 eps); season 2 'Ω/Omega' (id 117448, 10 eps) is a sequel, so episodes are cumulative (eps 13-22). Mapped to the ongoing manga adaptation (AniList id 86338, chapters null on AniList) using its main tankoubon chapter numbering, ~135 chapters as of June 2026. Per anime-to-manga guides, season 1 ends around Vol 9 Ch 41 and season 2 Ω ends around Vol 15 Ch 72.2; chapters 73+ are unadapted. Boundaries are approximate.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 41], - "arc": "Faltra City & the Demon Lord's Soul (Season 1)" - }, - { - "episodes": [13, 22], - "chapters": [42, 72], - "arc": "The Holy Knights & Horn (Season 2 Ω)" - }, - { - "chapters": [73, 135], - "arc": "Royal Capital and beyond (unadapted)" - } - ] -} diff --git a/src/data/mappings/hundred.json b/src/data/mappings/hundred.json deleted file mode 100644 index 7d9df69..0000000 --- a/src/data/mappings/hundred.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 21362, - "anilistMangaId": 88159, - "title": "Hundred", - "sourceNotes": "Single-cour, 12-episode anime adapting the first four of sixteen light novel volumes. Novel is complete at 116 chapters (ongoing-style web-novel chapter numbering, not tankobon chapters); no chapter-precise anime guide was found, so the vol. 1-4 boundary is approximated from the ~7.25 chapters/volume average (116 chapters / 16 volumes), covering roughly chapters 1-29. A separate 2-volume/13-chapter manga tie-in (Sasayuki) exists but only covers volume 1, so the novel is used as the source of truth per AniList's direct ADAPTATION relation. Chapters 30-116 are the unadapted remainder of the light novel, never covered by the anime.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 29], - "arc": "Little Garden Enrollment / Savage Incursions (Vols. 1-4)" - }, - { "chapters": [30, 116], "arc": "Unadapted (Vols. 5-16)" } - ] -} diff --git a/src/data/mappings/hunter-x-hunter-2011.json b/src/data/mappings/hunter-x-hunter-2011.json deleted file mode 100644 index a488b94..0000000 --- a/src/data/mappings/hunter-x-hunter-2011.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "anilistAnimeId": 11061, - "anilistMangaId": 30026, - "title": "Hunter x Hunter (2011)", - "sourceNotes": "Well-documented arc boundaries; chapter ranges aligned with manga arc boundaries.", - "mappings": [ - { "episodes": [1, 21], "chapters": [1, 38], "arc": "Hunter Exam" }, - { "episodes": [22, 26], "chapters": [39, 43], "arc": "Zoldyck Family" }, - { "episodes": [27, 36], "chapters": [44, 62], "arc": "Heavens Arena" }, - { "episodes": [37, 58], "chapters": [63, 119], "arc": "Yorknew City" }, - { "episodes": [59, 75], "chapters": [120, 154], "arc": "Greed Island" }, - { "episodes": [76, 136], "chapters": [155, 317], "arc": "Chimera Ant" }, - { - "episodes": [137, 148], - "chapters": [318, 339], - "arc": "13th Hunter Chairman Election" - }, - { "chapters": [340, 410], "arc": "Dark Continent / Succession Contest" } - ], - "movies": [ - { - "anilistId": 13271, - "title": "Hunter x Hunter: Phantom Rouge", - "year": 2013, - "note": "Side story (anime-original)." - }, - { - "anilistId": 19951, - "title": "Hunter x Hunter: The Last Mission", - "year": 2013, - "note": "Side story (anime-original)." - } - ] -} diff --git a/src/data/mappings/hyouka.json b/src/data/mappings/hyouka.json deleted file mode 100644 index 6c5db3b..0000000 --- a/src/data/mappings/hyouka.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 12189, - "anilistMangaId": 71629, - "title": "Hyouka", - "sourceNotes": "The 22-episode Kyoto Animation anime adapts the first four 'Classic Literature Club' novels by Honobu Yonezawa (Hyouka; The Credit Roll of the Fool; The Kudryavka Sequence; The Doll That Took a Detour) plus short stories. Paired with Task Ohna's ongoing manga adaptation (id 71629); per Wikipedia its first twelve tankobon volumes cover the same four novels as the anime (≈ chapters 1-50). The manga is still running (~66 ch across 16 vols, with a 17th vol in 2026) and has moved into novel 5 ('Approximating the Distance Between Two People'), which the anime did not cover. AniList lists no chapter count for this manga, so chapter numbers are estimated from the tankobon volumes; per-arc boundaries are approximate while the anime endpoints (the four novels) are firm.", - "mappings": [ - { - "episodes": [1, 5], - "chapters": [1, 12], - "arc": "Novel 1: Hyouka — reviving the Classics Club & the Sekitani Jun mystery" - }, - { - "episodes": [6, 11], - "chapters": [13, 25], - "arc": "Novel 2: The Credit Roll of the Fool — the student-film murder mystery" - }, - { - "episodes": [12, 17], - "chapters": [26, 38], - "arc": "Novel 3: The Kudryavka Sequence — the Kanya Festival & Juumonji thefts" - }, - { - "episodes": [18, 22], - "chapters": [39, 50], - "arc": "Novel 4: The Doll That Took a Detour — short stories & the Hina doll festival" - }, - { - "chapters": [51, 66], - "arc": "Novel 5: Approximating the Distance Between Two People (manga-only, ongoing)" - } - ] -} diff --git a/src/data/mappings/i-cant-understand-what-my-husband-is-saying.json b/src/data/mappings/i-cant-understand-what-my-husband-is-saying.json deleted file mode 100644 index 363ad08..0000000 --- a/src/data/mappings/i-cant-understand-what-my-husband-is-saying.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "anilistAnimeId": 20735, - "anilistMangaId": 85408, - "title": "I Can't Understand What My Husband Is Saying", - "sourceNotes": "Cumulative episodes across Season 1 (13, Oct-Dec 2014) + Season 2 '2nd Thread' (13, Apr-Jun 2015) = 26 total, using the first season's AniList id (20735). Manga complete at 52 chapters (4-koma slice-of-life by Coolkyousinnjya) — episodic/anthology adaptation, so episode-to-chapter boundaries are approximate. Season 1 ends around Kaoru's positive pregnancy test; Season 2 ends around the couple choosing baby names. The manga's final chapters, depicting Kaoru giving birth to daughter Sayoko, are never animated and are included at the tail as unadapted.", - "mappings": [ - { "episodes": [1, 13], "chapters": [1, 24], "arc": "Season 1" }, - { - "episodes": [14, 26], - "chapters": [25, 48], - "arc": "Season 2 (2nd Thread)" - }, - { "chapters": [49, 52], "arc": "Unadapted Ending (Sayoko's Birth)" } - ] -} diff --git a/src/data/mappings/i-parry-everything.json b/src/data/mappings/i-parry-everything.json deleted file mode 100644 index 60f7016..0000000 --- a/src/data/mappings/i-parry-everything.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 170695, - "anilistMangaId": 131041, - "title": "I Parry Everything", - "sourceNotes": "Single 12-episode season (OLM, 2024). The anime adapts Nabeshiki's light novel (12 volumes as of June 2026); the separately-illustrated KRSG manga tracks the same story but lags behind the anime's pace, having reached only ~ch. 19 by the time the anime finished airing. Manga ongoing (current ~ch. 26, approximate — AniList does not track a chapter count for this title). No distinct named arcs are documented for the story's opening stretch, so the season is treated as one broad entry; the chapter endpoint for the finale is an approximation pending a precise sync guide.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 21], - "arc": "Season 1: Noor's Arrival Through the Deridas Empire Invasion" - }, - { "chapters": [22, 26], "arc": "Unadapted (manga continuation)" } - ] -} diff --git a/src/data/mappings/iceblade-sorcerer.json b/src/data/mappings/iceblade-sorcerer.json deleted file mode 100644 index bb71416..0000000 --- a/src/data/mappings/iceblade-sorcerer.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 148116, - "anilistMangaId": 123093, - "title": "The Iceblade Sorcerer Shall Rule the World", - "sourceNotes": "Season 1 is 12 episodes. Manga complete at 132 chapters (16 volumes); it is the first of two manga adaptations of Nana Mikoshiba's light novel and covers the same three story arcs as anime Season 1 (Sword Sorcerer, Magic Chevalier, Sorcerer's Eyes / LN Vols 1-3) before ending in Jan 2024 — a separate 'reboot' manga (Hyouken no Majutsushi ga Sekai o Suberu II) began serialization in 2026 starting directly at the Magicks War arc (LN Vol 4), which Season 2 (announced for Oct 2026, not yet aired) will adapt, so it is out of scope here. No confirmed per-chapter arc breakdown was published for the first manga; chapter boundaries below are apportioned across the complete 132-chapter run in the same ratio as the episode counts of each arc (per the show's fandom wiki per-episode arc tags) and should be treated as approximate.", - "mappings": [ - { - "episodes": [1, 5], - "chapters": [1, 55], - "arc": "The Sword Sorcerer Arc" - }, - { - "episodes": [6, 9], - "chapters": [56, 99], - "arc": "The Magic Chevalier Arc" - }, - { - "episodes": [10, 12], - "chapters": [100, 132], - "arc": "Sorcerer's Eyes Arc" - } - ] -} diff --git a/src/data/mappings/ikoku-nikki.json b/src/data/mappings/ikoku-nikki.json deleted file mode 100644 index 2743639..0000000 --- a/src/data/mappings/ikoku-nikki.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "anilistAnimeId": 177385, - "anilistMangaId": 106331, - "title": "Ikoku Nikki", - "sourceNotes": "S1 only (13 eps) of an ongoing manga (~62 chapters). Arc-level approximation; chapter ranges approximate.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 10], - "arc": "Makio & Asa / New Cohabitation" - }, - { - "episodes": [5, 9], - "chapters": [11, 22], - "arc": "School Life & Friendships" - }, - { "episodes": [10, 13], "chapters": [23, 33], "arc": "Family & Grief" }, - { "chapters": [34, 50], "arc": "Unadapted (cont. cohabitation)" }, - { "chapters": [51, 62], "arc": "Unadapted (ongoing)" } - ] -} diff --git a/src/data/mappings/im-quitting-heroing.json b/src/data/mappings/im-quitting-heroing.json deleted file mode 100644 index 9de027d..0000000 --- a/src/data/mappings/im-quitting-heroing.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 140457, - "anilistMangaId": 102861, - "title": "I'm Quitting Heroing", - "sourceNotes": "Single 12-episode season (Spring 2022, EMT Squared). The show is sourced from Quantum's light novel (3 volumes, complete 2018), but community episode-to-source guides reference the concrete manga adaptation, which fully adapts the LN and is complete at 44 chapters / 8 volumes (2023) — so chapter ranges here use the manga's numbering. The anime adapts LN Volume 1, which equals manga chapters 1-16 (readers continue at manga ch. 17 / LN Vol. 2). The story is largely episodic (hero Leo joins the Demon Queen Echidna's army), so a per-episode chapter split isn't published; the adapted cour is mapped as one block. Chapters 17-44 (LN Vols. 2-3) are unadapted.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 16], - "arc": "Demon Queen's Castle (LN Vol. 1)" - }, - { - "chapters": [17, 44], - "arc": "Post-Anime (LN Vols. 2-3)" - } - ] -} diff --git a/src/data/mappings/im-sakamoto.json b/src/data/mappings/im-sakamoto.json deleted file mode 100644 index a7293b4..0000000 --- a/src/data/mappings/im-sakamoto.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "anilistAnimeId": 21595, - "anilistMangaId": 78649, - "title": "Haven't You Heard? I'm Sakamoto", - "sourceNotes": "Single 12-episode TV season (2016, Studio Deen). Nami Sano's gag manga is complete at 4 volumes; AniList counts 24 chapters (some sources cite ~28 due to differently numbered/half installments). Because the series is an episodic gag comedy with no continuous arcs — each ~22-min episode strings together several short vignettes — the anime adapts essentially the whole manga roughly in publication order. Episode-to-chapter boundaries below are coarse approximations (~2 chapters per episode).", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 6], - "arc": "Transfer-student Sakamoto's flawless debut & his first would-be rivals (approx.)" - }, - { - "episodes": [4, 6], - "chapters": [7, 12], - "arc": "Classmates' schemes backfire against Sakamoto's effortless cool (approx.)" - }, - { - "episodes": [7, 9], - "chapters": [13, 18], - "arc": "Yoshino, Acchan & the delinquents put Sakamoto to the test (approx.)" - }, - { - "episodes": [10, 12], - "chapters": [19, 24], - "arc": "Hayabusa rivalry & Sakamoto's unflappable send-off (approx.)" - } - ] -} diff --git a/src/data/mappings/im-standing-on-a-million-lives.json b/src/data/mappings/im-standing-on-a-million-lives.json deleted file mode 100644 index 236e26a..0000000 --- a/src/data/mappings/im-standing-on-a-million-lives.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 116242, - "anilistMangaId": 97371, - "title": "I'm Standing on a Million Lives", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (12). Manga ongoing (~24 volumes / current ch. ~120 as of mid-2026). The anime follows the manga's numbered \"quest\" arcs closely through cumulative episode 18 (S2 episode 6), after which S2's back half (eps 19-24) becomes an anime-original alternate take on the manga's Quest 6 (the Ihar-Nemore drug-cartel war), altered due to restrictions on depicting drug content, so it is not mapped to further chapters.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 12], - "arc": "Quest 1 (Troll) & Quest 2 (Radodorbo Cargo Delivery)" - }, - { - "episodes": [13, 24], - "chapters": [13, 25], - "arc": "Quest 3-5 (Island Battles, New Recruits, Aoyu's Farewell)" - }, - { - "chapters": [26, 120], - "arc": "Quest 6 onward: Ihar-Nemore Drug War (unadapted on TV, manga ongoing)" - } - ] -} diff --git a/src/data/mappings/infinite-stratos.json b/src/data/mappings/infinite-stratos.json deleted file mode 100644 index 921bade..0000000 --- a/src/data/mappings/infinite-stratos.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "anilistAnimeId": 9041, - "anilistMangaId": 53881, - "title": "Infinite Stratos", - "sourceNotes": "LN-based; ranges are by light novel volume (Izuru Yumizuru's novels; AniList lists the source as a NOVEL with null chapter counts, so \"chapters\" here are volume numbers). Cumulative episodes across S1 (12 eps, 2011) + S2/Infinite Stratos 2 (12 eps, 2013) = 24. Season 1 adapts volumes 1-3 (plus a little of 4); Season 2 adapts volumes 5-8 (the short-story vol 4 is largely skipped). The novel finished at 13 volumes (final volume Oct 2018), so volumes 9-13 are unadapted by the TV anime. Volume boundaries are approximate; the community episode↔source guide aligns roughly one story volume per ~4 episodes.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 1], - "arc": "IS Academy / Class Representative (Vol 1)" - }, - { - "episodes": [5, 8], - "chapters": [2, 2], - "arc": "Transfer Students / Interhigh (Vol 2)" - }, - { - "episodes": [9, 12], - "chapters": [3, 3], - "arc": "Silver Gospel (Vol 3)" - }, - { - "episodes": [13, 16], - "chapters": [5, 5], - "arc": "Phantom Task Awakens (Vol 5)" - }, - { - "episodes": [17, 20], - "chapters": [6, 7], - "arc": "School Festival / Tag Tournament (Vols 6-7)" - }, - { - "episodes": [21, 24], - "chapters": [8, 8], - "arc": "Kyoto Field Trip / World Purge (Vol 8)" - }, - { - "chapters": [9, 13], - "arc": "Post-anime Volumes (Unadapted)" - } - ] -} diff --git a/src/data/mappings/initial-d.json b/src/data/mappings/initial-d.json deleted file mode 100644 index d1ea31e..0000000 --- a/src/data/mappings/initial-d.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "anilistAnimeId": 185, - "anilistMangaId": 30375, - "title": "Initial D", - "sourceNotes": "Cumulative episodes across the five TV \"Stages\": First Stage (26) + Second Stage (13, Acts 27-39) + Fourth Stage (24) + Fifth Stage (14) + Final Stage (4) = 81 TV episodes; the 2001 Third Stage is a theatrical film that falls between Second and Fourth Stage (listed in movies[], not a TV episode). Source is Shuichi Shigeno's Initial D manga, complete at 719 chapters / 48 volumes (AniList counts 725, likely including bonus/omake pages; the final entry is extended to that AniList count). First Stage adapts ch 1-77 (vols 1-7); the manga splits into Part 1 \"Akina's Eight-Six\" (vols 1-17, through the Third Stage film) and Part 2 \"Project D\" (ch ~199-719), whose Kanagawa Expedition (ch 444-719) is covered by Fifth + Final Stage. Episode-within-stage boundaries are approximate (races don't split cleanly on act lines); stage-to-chapter boundaries are reliable.", - "mappings": [ - { - "episodes": [1, 8], - "chapters": [1, 21], - "arc": "Akina's Eight-Six / RedSuns (Keisuke Takahashi)" - }, - { - "episodes": [9, 13], - "chapters": [22, 33], - "arc": "Myogi NightKids (Takeshi Nakazato)" - }, - { - "episodes": [14, 18], - "chapters": [34, 43], - "arc": "NightKids Tape Deathmatch (Shingo Shoji)" - }, - { - "episodes": [19, 22], - "chapters": [44, 61], - "arc": "Impact Blue (Usui Pass, Mako & Sayuki)" - }, - { - "episodes": [23, 26], - "chapters": [62, 77], - "arc": "RedSuns Leader (Ryosuke Takahashi)" - }, - { - "episodes": [27, 39], - "chapters": [78, 145], - "arc": "Second Stage: Team Emperor & Saitama (Wataru Akiyama)" - }, - { - "episodes": [40, 63], - "chapters": [199, 443], - "arc": "Fourth Stage: Project D — Kanto Expedition" - }, - { - "episodes": [64, 77], - "chapters": [444, 667], - "arc": "Fifth Stage: Project D — Kanagawa Expedition" - }, - { - "episodes": [78, 81], - "chapters": [668, 725], - "arc": "Final Stage: God Foot vs God Hand (Shinji Dan)" - } - ], - "movies": [ - { - "anilistId": 187, - "title": "Initial D Third Stage", - "year": 2001, - "chapters": [146, 198], - "afterEpisode": 39, - "note": "Canon theatrical film bridging Second and Fourth Stage; adapts the finale of Part 1 (Kai Kogashiwa's MR2 race, Takumi and Natsuki's relationship, and the formation of Project D)." - }, - { - "anilistId": 20842, - "title": "New Initial D the Movie: Legend 1 - Awakening", - "year": 2014, - "chapters": [1, 21], - "note": "First of an all-new-animation theatrical remake trilogy retelling the First Stage material — Takumi's introduction and the downhill battle against Keisuke Takahashi's RedSuns FD." - }, - { - "anilistId": 20990, - "title": "New Initial D the Movie: Legend 2 - Racer", - "year": 2015, - "chapters": [22, 43], - "note": "Second remake film, re-adapting the NightKids battles against Takeshi Nakazato (GT-R R32) and Shingo Shoji." - }, - { - "anilistId": 21289, - "title": "New Initial D the Movie: Legend 3 - Dream", - "year": 2016, - "chapters": [44, 77], - "note": "Final remake film, re-adapting the Impact Blue Usui Pass battle and the climactic race against RedSuns leader Ryosuke Takahashi." - } - ] -} diff --git a/src/data/mappings/insomniacs-after-school.json b/src/data/mappings/insomniacs-after-school.json deleted file mode 100644 index 287f54e..0000000 --- a/src/data/mappings/insomniacs-after-school.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "anilistAnimeId": 143653, - "anilistMangaId": 110473, - "title": "Insomniacs After School", - "sourceNotes": "Single 13-episode cour (2023); no second season. Source manga by Makoto Ojiro is complete at 125 chapters / 14 volumes (Sept 2019 - Oct 2023). The anime adapts roughly chapters 1-57 (through the end of Vol. 6 / start of Vol. 7), then ends on an anime-original positive note; readers are advised to continue from around chapter 55. This is a slice-of-life romance with no canonical named story arcs, so arc labels are descriptive and boundaries are aligned to tankobon volume breaks (Vol. 1: 1-8, Vol. 2: 9-18, Vol. 3: 19-27, Vol. 4: 28-37, Vol. 5: 38-47, Vol. 6: 48-55, Vol. 7: 56-64). Episode ranges are apportioned proportionally across the ~57 adapted chapters (~4.4 chapters/episode); per-episode chapter boundaries are approximate. Chapters 58-125 are unadapted.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 8], - "arc": "Fellow Insomniacs" - }, - { - "episodes": [3, 4], - "chapters": [9, 18], - "arc": "Reviving the Astronomy Club" - }, - { - "episodes": [5, 6], - "chapters": [19, 27], - "arc": "Chasing the Stars" - }, - { - "episodes": [7, 9], - "chapters": [28, 37], - "arc": "Summer Fireworks" - }, - { - "episodes": [10, 11], - "chapters": [38, 47], - "arc": "New Semester" - }, - { - "episodes": [12, 13], - "chapters": [48, 57], - "arc": "The Last Star" - }, - { - "chapters": [58, 80], - "arc": "Second Year" - }, - { - "chapters": [81, 107], - "arc": "Growing Closer" - }, - { - "chapters": [108, 125], - "arc": "Final Nights" - } - ] -} diff --git a/src/data/mappings/interspecies-reviewers.json b/src/data/mappings/interspecies-reviewers.json deleted file mode 100644 index 966d8cb..0000000 --- a/src/data/mappings/interspecies-reviewers.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "anilistAnimeId": 110270, - "anilistMangaId": 101175, - "title": "Interspecies Reviewers", - "sourceNotes": "Single 12-episode season (2020); cumulative episodes 1-12 match the broadcast order. Source manga by Amahara/masha is ongoing (11 volumes, ~ch. 79 as of 2026); AniList reports null counts. This is an episodic anthology with no story arcs, so mappings are per-episode, named by the featured brothel/species. Each episode adapts roughly two manga chapters, but the anime freely REORDERS chapters relative to publication (e.g. Ep1 = ch 1,3,2; Ep5 = ch 10,12; Ep6 = ch 11,13), so listed [start,end] spans are approximate and can overlap between adjacent episodes. The anime skips ch. 22 and 24 and ends at ch. 27 (all but the final chapter of Vol. 3); manga readers should continue from ch. 28. Sex scenes in the anime are anime-original.", - "mappings": [ - { - "episodes": [1, 1], - "chapters": [1, 3], - "arc": "Elf, Birdmaid & Catgirl Brothels" - }, - { - "episodes": [2, 2], - "chapters": [4, 5], - "arc": "Fairy Brothel (Nectar)" - }, - { - "episodes": [3, 3], - "chapters": [6, 7], - "arc": "Genderswap Inn" - }, - { - "episodes": [4, 4], - "chapters": [8, 9], - "arc": "Salamander & Succubus Joints" - }, - { - "episodes": [5, 5], - "chapters": [10, 12], - "arc": "Cyclops & Mushroom Girls" - }, - { - "episodes": [6, 6], - "chapters": [11, 13], - "arc": "Will o' Wisp & Golem Girls" - }, - { - "episodes": [7, 7], - "chapters": [14, 15], - "arc": "Meidri's Secret & Egg-Laying Show" - }, - { - "episodes": [8, 8], - "chapters": [16, 17], - "arc": "Succubus Tower" - }, - { - "episodes": [9, 9], - "chapters": [18, 19], - "arc": "Ghost Brothel & Lotion" - }, - { - "episodes": [10, 10], - "chapters": [20, 21], - "arc": "Perfect-Score Brothel" - }, - { - "episodes": [11, 11], - "chapters": [23, 25], - "arc": "Philanthropist Succubi & Drunken Fools" - }, - { - "episodes": [12, 12], - "chapters": [26, 27], - "arc": "New Year's Weddings" - }, - { - "chapters": [28, 79], - "arc": "Unadapted (Vol. 3 finale onward)" - } - ] -} diff --git a/src/data/mappings/interviews-with-monster-girls.json b/src/data/mappings/interviews-with-monster-girls.json deleted file mode 100644 index eba12c5..0000000 --- a/src/data/mappings/interviews-with-monster-girls.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 97592, - "anilistMangaId": 86898, - "title": "Interviews with Monster Girls", - "sourceNotes": "Single 12-episode TV season (2017, A-1 Pictures), adapting Petos's episodic slice-of-life manga Demi-chan wa Kataritai (id 86898), which is complete at 78 chapters / 11 volumes. Episodic adaptation, roughly 2-3 chapters per episode — the anime samples and lightly reorders the early manga chapters rather than following continuous arcs, so per-episode chapter boundaries are approximate. The 12 episodes cover up to about chapter 34 (through volume 5). A canon ONA, \"The Demi-chans' Summer Break\" (2017), adapts a couple of stray chapters but is a non-theatrical special, so it is not listed as a film. No theatrical films exist, so no movies are listed. A reader continues past the anime from roughly chapter 35 to the finale at chapter 78.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 16], - "arc": "Meeting the Demi-chans (Hikari, Kyouko, Yuki and Sakie; Takahashi's interviews begin) — roughly vols 1-2, approximate" - }, - { - "episodes": [7, 12], - "chapters": [17, 34], - "arc": "Understanding the Demi-chans (deepening bonds and everyday troubles through summer) — roughly vols 3-5, approximate" - }, - { - "chapters": [35, 78], - "arc": "Later Chapters to the Finale (unadapted; vols 5-11, approximate)" - } - ] -} diff --git a/src/data/mappings/inu-x-boku-secret-service.json b/src/data/mappings/inu-x-boku-secret-service.json deleted file mode 100644 index 88db789..0000000 --- a/src/data/mappings/inu-x-boku-secret-service.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 11013, - "anilistMangaId": 47207, - "title": "Inu X Boku Secret Service", - "sourceNotes": "Single-cour 12-episode anime (David Production, 2012), a faithful no-filler adaptation of the early manga (Cocoa Fujiwara). Manga complete at 61 chapters / 11 volumes (2009-2014). The anime covers only the opening stretch of the story, ending roughly around chapter 14 (through volume 3); sources on the exact cutoff conflict (cited anywhere from ch. 10-14), so the boundary here is approximate - refine via PR. The manga continues well past the anime with a major unadapted Time Skip arc starting around chapter 19.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 14], - "arc": "Anime Story (Roppongi household, early spirit cases)" - }, - { - "chapters": [15, 61], - "arc": "Manga-only continuation (incl. Time Skip arc)" - } - ] -} diff --git a/src/data/mappings/inuyasha.json b/src/data/mappings/inuyasha.json deleted file mode 100644 index 7e7ca72..0000000 --- a/src/data/mappings/inuyasha.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "anilistAnimeId": 249, - "anilistMangaId": 30676, - "title": "InuYasha", - "sourceNotes": "Cumulative episodes across the original 2000-2004 anime (167 eps, manga vols 1-36 with interleaved filler) + The Final Act (26 eps, vols 34-56). Manga complete at 558 chapters. The original series's arc boundaries are loose because of interleaved filler; ranges below approximate the dominant manga material per anime block. The Final Act is a faithful, filler-free adaptation of the closing arcs.", - "mappings": [ - { - "episodes": [1, 32], - "chapters": [1, 60], - "arc": "Shikon Jewel Quest / Introduction" - }, - { - "episodes": [33, 100], - "chapters": [61, 212], - "arc": "Naraku and the Shard Hunt" - }, - { - "episodes": [101, 138], - "chapters": [213, 294], - "arc": "Band of Seven / Shichinintai" - }, - { - "episodes": [139, 167], - "chapters": [295, 336], - "arc": "Mount Hakurei / Naraku's Body" - }, - { "episodes": [168, 193], "chapters": [337, 558], "arc": "The Final Act" } - ], - "movies": [ - { - "anilistId": 452, - "title": "InuYasha the Movie: Affections Touching Across Time", - "year": 2001, - "afterEpisode": 54, - "note": "Side story (anime-original)." - }, - { - "anilistId": 450, - "title": "InuYasha the Movie 2: The Castle Beyond the Looking Glass", - "year": 2002, - "afterEpisode": 95, - "note": "Side story (anime-original)." - }, - { - "anilistId": 451, - "title": "InuYasha the Movie 3: Swords of an Honorable Ruler", - "year": 2003, - "afterEpisode": 136, - "note": "Side story (anime-original)." - }, - { - "anilistId": 449, - "title": "InuYasha the Movie 4: Fire on the Mystic Island", - "year": 2004, - "afterEpisode": 167, - "note": "Side story (anime-original)." - } - ] -} diff --git a/src/data/mappings/inuyashiki.json b/src/data/mappings/inuyashiki.json deleted file mode 100644 index 36f9d82..0000000 --- a/src/data/mappings/inuyashiki.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "anilistAnimeId": 97922, - "anilistMangaId": 85226, - "title": "Inuyashiki", - "sourceNotes": "Manga complete at 85 chapters / 10 volumes (Hiroya Oku, 2014-2017). Anime complete at 11 episodes (MAPPA, 2017), titled INUYASHIKI LAST HERO; it adapts the full manga to its conclusion with no filler. Volume-to-chapter boundaries from Wikipedia/Inu Yashiki Wiki: V1 1-8, V2 9-17, V3 18-26, V4 27-35, V5 36-44, V6 45-53, V7 54-61, V8 62-69, V9 70-77, V10 78-85. Episode-to-chapter ranges are approximate, distributing the 85 chapters across 11 episodes (~7-8 ch/episode) along the manga's three movements: Ichiro Inuyashiki's awakening, Hiro Shishigami's killing spree, and the meteor-strike finale.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 17], - "arc": "Awakening (Inuyashiki and Hiro gain machine bodies)" - }, - { - "episodes": [4, 6], - "chapters": [18, 44], - "arc": "Two Paths (Inuyashiki the healer; Hiro the killer)" - }, - { - "episodes": [7, 9], - "chapters": [45, 69], - "arc": "Shishigami vs. Japan (manhunt and escalation)" - }, - { - "episodes": [10, 11], - "chapters": [70, 85], - "arc": "Last Hero (the meteor and final confrontation)" - } - ] -} diff --git a/src/data/mappings/irregular-at-magic-high-school.json b/src/data/mappings/irregular-at-magic-high-school.json deleted file mode 100644 index 46b8fd6..0000000 --- a/src/data/mappings/irregular-at-magic-high-school.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "anilistAnimeId": 20458, - "anilistMangaId": 64127, - "title": "The Irregular at Magic High School", - "sourceNotes": "Cumulative episodes across S1 (26) + S2 'Visitor Arc' (13, eps 27-39) + S3 (13, eps 40-52) = 52 total. The manga adaptation is fragmented into many separate per-arc manga (Enrollment, Nine School Competition, Yokohama Disturbance, Visitor, Double Seven, Steeplechase, etc.) with no single unified entry, so this maps to the Tsutomu Sato light novel (32 main volumes, complete) and the 'chapters' ranges below are LIGHT-NOVEL VOLUME numbers. S1 adapts vols 1-4 and 6-7 (vol 5, a short-story interstitial, is skipped); S2 adapts vols 9-11; S3 adapts vols 12-15. LN vols 16-32 (Yotsuba Succession through Graduation) are unadapted. Vol 8 (Reminiscence) was adapted separately as the 2021 TV special, not the main series.", - "mappings": [ - { - "episodes": [1, 7], - "chapters": [1, 2], - "arc": "Enrollment Arc (S1)" - }, - { - "episodes": [8, 18], - "chapters": [3, 4], - "arc": "Nine School Competition Arc (S1)" - }, - { - "episodes": [19, 26], - "chapters": [6, 7], - "arc": "Yokohama Disturbance Arc (S1)" - }, - { - "episodes": [27, 39], - "chapters": [9, 11], - "arc": "Visitor Arc (S2)" - }, - { - "episodes": [40, 43], - "chapters": [12, 12], - "arc": "Double Seven Arc (S3)" - }, - { - "episodes": [44, 47], - "chapters": [13, 13], - "arc": "Steeplechase Arc (S3)" - }, - { - "episodes": [48, 52], - "chapters": [14, 15], - "arc": "Ancient City Insurrection (Koto Nairan) Arc (S3)" - }, - { - "chapters": [16, 32], - "arc": "Yotsuba Succession -> Master Clans Council -> Graduation (unadapted)" - } - ], - "movies": [ - { - "anilistId": 21684, - "title": "The Irregular at Magic High School: The Movie - The Girl Who Summons the Stars", - "year": 2017, - "afterEpisode": 39, - "note": "Canon original side-story film written by Tsutomu Sato, set after LN vol 11 (the Visitor Arc). Released June 2017, between S1 and S2 in broadcast order." - } - ] -} diff --git a/src/data/mappings/iruma-kun.json b/src/data/mappings/iruma-kun.json deleted file mode 100644 index c83db78..0000000 --- a/src/data/mappings/iruma-kun.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "anilistAnimeId": 107693, - "anilistMangaId": 99324, - "title": "Welcome to Demon School! Iruma-kun", - "sourceNotes": "Cumulative episodes across S1 (23) + S2 (21, eps 24-44) + S3 (21, eps 45-65) = 65 total. Use the S1 anime id (107693); S2 and S3 are sequels with cumulative numbering. Paired with Osamu Nishi's manga (AniList id 99324), ongoing in Weekly Shonen Champion since 2017; AniList lists no chapter count, so the latest figure (~448 as of mid-2026) comes from scanlation trackers. S1 adapts ch 1-43, S2 ch 44-95, S3 ch 95-146; from ep 8 onward the anime reorders/splits some chapters, so episode/chapter boundaries are approximate. Resume reading at ch 147. Arc names and cutoffs follow the fandom Story Arcs list and are fan-made/approximate. Season 4 began airing in April 2026 adapting from ch 147 onward, but no settled episode-to-chapter breakdown exists yet, so post-S3 material is listed as a chapters-only tail. No theatrical films.", - "mappings": [ - { - "episodes": [1, 10], - "chapters": [1, 17], - "arc": "Welcome (Iruma enrolls at Babyls Demon School; Asmodeus & Clara)" - }, - { - "episodes": [11, 23], - "chapters": [18, 43], - "arc": "Battler Party (rank exams; the Misfit/Abnormal Class is formed)" - }, - { - "episodes": [24, 35], - "chapters": [44, 68], - "arc": "Royal One (Ameri/Student Council; Misfit Class claims the Demon King's classroom)" - }, - { - "episodes": [36, 44], - "chapters": [69, 95], - "arc": "Walter Park (amusement-park attack; Iruma becomes a hero)" - }, - { - "episodes": [45, 49], - "chapters": [95, 101], - "arc": "Tutor Training (the Misfit Class takes on personal instructors)" - }, - { - "episodes": [50, 65], - "chapters": [102, 146], - "arc": "Harvest Festival (multi-day gathering competition for the Young King title)" - }, - { - "chapters": [147, 448], - "arc": "Post-Harvest onward (unadapted; Season 4 airing from 2026)" - } - ] -} diff --git a/src/data/mappings/is-this-a-zombie.json b/src/data/mappings/is-this-a-zombie.json deleted file mode 100644 index 21ecd09..0000000 --- a/src/data/mappings/is-this-a-zombie.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 8841, - "anilistMangaId": 53067, - "title": "Is this a Zombie?", - "sourceNotes": "Light-novel sourced (AniList NOVEL entry 53067; series complete at 19 volumes, which AniList lists as 118 chapters). Chapter values here are light-novel VOLUME numbers, not AniList chapter counts, since community episode-to-source guides track volumes. Cumulative episodes across S1 (12) + S2 \"of the Dead\" (10) = 22. The adaptation is non-linear and heavily comedic: S1 draws from Novels 1-3, the 2-episode OVA adapts Novel 6, and S2 \"of the Dead\" adapts most of Novel 7 with substantial anime-original content; Novels 4-6 are largely skipped on TV. Per-arc volume boundaries are therefore approximate.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 2], - "arc": "Ayumu the Masou-Shoujo (Novels 1-2)" - }, - { - "episodes": [7, 12], - "chapters": [3, 3], - "arc": "Kyoko, King of Night (Novel 3)" - }, - { - "episodes": [13, 22], - "chapters": [7, 7], - "arc": "of the Dead (Novel 7)" - }, - { - "chapters": [8, 19], - "arc": "Remaining novels (unadapted)" - } - ] -} diff --git a/src/data/mappings/isekai-cheat-magician.json b/src/data/mappings/isekai-cheat-magician.json deleted file mode 100644 index cc56a5a..0000000 --- a/src/data/mappings/isekai-cheat-magician.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 101547, - "anilistMangaId": 99763, - "title": "Isekai Cheat Magician", - "sourceNotes": "Single-cour 12-episode TV anime (Encourage Films, 2019), plus a 2021 OVA (anime-original, not adapted from the manga). Sourced from Karin Suzuragi's manga adaptation (AniList 99763) of Taro Hitsuji's ongoing light novel; the manga is ongoing at roughly 20 published tankobon volumes (AniList lists no chapter count; current chapter is approximately the high 80s/low 90s as of 2026, though chapter numbering is inconsistent across aggregators). The anime covers Taichi and Rin's arrival in Altia, their training and adventures in Azpire, and the Eristein civil war, corresponding to manga chapters 1-57 per community continue-reading guides (viewers are pointed to resume the manga at vol. 13, ch. 58). Chapter ranges are approximate given the numbering inconsistencies noted above.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 57], - "arc": "Arrival in Altia through the Eristein Rebellion" - }, - { - "chapters": [58, 90], - "arc": "Later manga chapters (unadapted, approximate)" - } - ] -} diff --git a/src/data/mappings/jojo-stardust-crusaders.json b/src/data/mappings/jojo-stardust-crusaders.json deleted file mode 100644 index 66565d1..0000000 --- a/src/data/mappings/jojo-stardust-crusaders.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 20474, - "anilistMangaId": 30872, - "title": "JoJo's Bizarre Adventure: Stardust Crusaders", - "sourceNotes": "Cumulative episodes across Stardust Crusaders S1 (24 eps, going to Egypt) + Battle in Egypt (24 eps, cumulative 25-48) = 48 total. Manga is Part 3 of the JoJo franchise, complete at 152 chapters / 16 volumes. Parts 1-2 (2012 anime, Phantom Blood + Battle Tendency), Part 4 (Diamond is Unbreakable), Part 5 (Golden Wind), and Part 6 (Stone Ocean) are separate franchises with their own AniList IDs and are not covered here.", - "mappings": [ - { - "episodes": [1, 9], - "chapters": [1, 27], - "arc": "Departure / Asia Bound" - }, - { - "episodes": [10, 24], - "chapters": [28, 93], - "arc": "Middle East Journey" - }, - { - "episodes": [25, 48], - "chapters": [94, 152], - "arc": "Egypt / DIO's Mansion" - } - ] -} diff --git a/src/data/mappings/jormungand.json b/src/data/mappings/jormungand.json deleted file mode 100644 index 89c746c..0000000 --- a/src/data/mappings/jormungand.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "anilistAnimeId": 12413, - "anilistMangaId": 34611, - "title": "Jormungand", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 'Perfect Order' (12) = 24; the S2 clip-show recap (Episode 12.5) is not counted. Manga complete at 70 chapters (11 volumes); S1 adapts volumes 1-6 (ch. 1-36) and S2 adapts volumes 7-11 (ch. 37-70), matching per-volume episode counts reported by Wikipedia. Arc names and boundaries taken from the fandom wiki's chapter and episode lists. One manga chapter (49, 'Serpent Looking Up to the Heavens') is adapted out of numeric sequence as a flashback cold-open in Episode 13; the ranges below follow overall chapter order rather than air order for that handoff.", - "mappings": [ - { - "episodes": [1, 1], - "chapters": [1, 2], - "arc": "Fire Hare / Gun Metal, Calico Road" - }, - { "episodes": [2, 2], "chapters": [3, 5], "arc": "Pulsar" }, - { "episodes": [3, 4], "chapters": [6, 10], "arc": "Musica Ex Machina" }, - { "episodes": [5, 5], "chapters": [11, 14], "arc": "Vein / Sea Route" }, - { - "episodes": [6, 7], - "chapters": [15, 20], - "arc": "African Golden Butterflies / Air Route" - }, - { "episodes": [8, 8], "chapters": [21, 24], "arc": "Mondo Grosso" }, - { "episodes": [9, 10], "chapters": [25, 29], "arc": "Dragon Shooter" }, - { - "episodes": [11, 12], - "chapters": [30, 36], - "arc": "Hill of Destruction / Pendulum" - }, - { - "episodes": [13, 15], - "chapters": [37, 42], - "arc": "Dance with Undershaft" - }, - { - "episodes": [16, 16], - "chapters": [43, 44], - "arc": "Kasper in Asia / Kasper and Jonah" - }, - { "episodes": [17, 18], "chapters": [45, 48], "arc": "Castle of Lies" }, - { - "episodes": [19, 19], - "chapters": [49, 53], - "arc": "Serpent Looking Up to the Heavens / Pazuzu" - }, - { "episodes": [20, 22], "chapters": [54, 65], "arc": "New World" }, - { - "episodes": [23, 24], - "chapters": [66, 70], - "arc": "War Monger / Century of Shame" - } - ] -} diff --git a/src/data/mappings/jujutsu-kaisen.json b/src/data/mappings/jujutsu-kaisen.json deleted file mode 100644 index 8b9991c..0000000 --- a/src/data/mappings/jujutsu-kaisen.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "anilistAnimeId": 113415, - "anilistMangaId": 101517, - "title": "Jujutsu Kaisen", - "sourceNotes": "Cumulative episodes across S1 (24) + S2 (23) + S3 Part 1 (12). Manga complete at 272 chapters / 30 vols (status FINISHED per AniList). Arc boundaries from well-known manga arcs.", - "mappings": [ - { - "episodes": [1, 5], - "chapters": [1, 9], - "arc": "Cursed Womb: The Beginning" - }, - { - "episodes": [6, 13], - "chapters": [10, 31], - "arc": "Vs. Mahito / Cursed Womb: Death Painting" - }, - { - "episodes": [14, 21], - "chapters": [32, 53], - "arc": "Kyoto Goodwill Event" - }, - { - "episodes": [22, 24], - "chapters": [54, 64], - "arc": "Death Painting / Origin of Obedience" - }, - { - "episodes": [25, 29], - "chapters": [65, 79], - "arc": "Hidden Inventory / Premature Death" - }, - { "episodes": [30, 47], "chapters": [80, 136], "arc": "Shibuya Incident" }, - { - "episodes": [48, 59], - "chapters": [137, 180], - "arc": "Culling Game (Part 1)" - }, - { "chapters": [181, 221], "arc": "Culling Game (Part 2)" }, - { "chapters": [222, 272], "arc": "Shinjuku Showdown / Finale" } - ], - "movies": [ - { - "anilistId": 131573, - "title": "JUJUTSU KAISEN 0", - "year": 2021, - "note": "Prequel film adapting the Jujutsu Kaisen 0 volume." - }, - { - "anilistId": 204066, - "title": "JUJUTSU KAISEN: Execution -Shibuya Incident x The Culling Game Begins-", - "year": 2025, - "afterEpisode": 47, - "note": "Shibuya Incident recap plus early premiere of the first two Culling Game episodes." - } - ] -} diff --git a/src/data/mappings/k-on.json b/src/data/mappings/k-on.json deleted file mode 100644 index 96fe928..0000000 --- a/src/data/mappings/k-on.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "anilistAnimeId": 5680, - "anilistMangaId": 43001, - "title": "K-On!", - "sourceNotes": "Cumulative episodes across S1 'K-ON!' (13) + S2 'K-ON!!' (26, eps 14-39) = 39 total. Paired with kakifly's original K-On! 4-koma manga (id 43001), complete at 57 chapters / 4 volumes. The TV anime adapts the four volumes roughly chronologically by school year: S1 covers vols 1-2 (first & second year — Light Music Club is formed, Azusa joins) and S2 covers vols 3-4 (the girls' third/final year, culminating in graduation). 4-koma source — chapter ranges are approximate (each volume is ~14 chapters and the slice-of-life vignettes do not map 1:1 to episodes). The post-graduation sequels 'K-On! College' (id 81855, 14 ch) and 'K-On! High School' (id 81857, 14 ch) are separate 4-koma volumes, shown here as a follow-up tail for further reading. K-On! The Movie is a canon side-story (the London graduation trip).", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 28], - "arc": "First & Second Year (Light Music Club formed, Azusa joins) — vols 1-2" - }, - { - "episodes": [14, 39], - "chapters": [29, 57], - "arc": "Third Year (graduation) — vols 3-4" - }, - { - "chapters": [58, 85], - "arc": "K-On! College & High School (post-graduation sequel 4-koma; separate volumes, approximate continuation)" - } - ], - "movies": [ - { - "anilistId": 9617, - "title": "K-On! The Movie", - "year": 2011, - "afterEpisode": 39, - "note": "canon side-story film (graduation London trip)" - } - ] -} diff --git a/src/data/mappings/k.json b/src/data/mappings/k.json deleted file mode 100644 index 4258995..0000000 --- a/src/data/mappings/k.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 14467, - "anilistMangaId": 85261, - "title": "K", - "sourceNotes": "Single-cour anime, 13 episodes. Anime-original story; \"K: THE FIRST\" is a manga reconstruction of the same TV series storyline, complete at 16 chapters. No official episode-to-chapter guide was found, so the split follows the anime's well-documented two-part structure (murder-mystery setup, then the Colorless/Silver King revelation) with chapter boundaries estimated proportionally — treat as approximate.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 7], - "arc": "Homra and Scepter 4 / The Shiro Murder Case" - }, - { - "episodes": [7, 13], - "chapters": [8, 16], - "arc": "Colorless King / Silver King Revelation" - } - ], - "movies": [ - { - "anilistId": 16904, - "title": "K: Missing Kings", - "year": 2014, - "afterEpisode": 13, - "note": "Canon direct sequel film bridging Season 1 to Season 2 (K: Return of Kings)." - } - ] -} diff --git a/src/data/mappings/kabaneri-of-the-iron-fortress.json b/src/data/mappings/kabaneri-of-the-iron-fortress.json deleted file mode 100644 index 15ab80c..0000000 --- a/src/data/mappings/kabaneri-of-the-iron-fortress.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 21196, - "anilistMangaId": 104517, - "title": "Kabaneri of the Iron Fortress", - "sourceNotes": "12-episode original anime (Wit Studio, 2016) paired with a concurrent 28-chapter (4-volume, complete) tie-in manga by Shiro Yoshida that follows the same story; a published chapter-to-episode guide was not found, so chapter ranges are proportioned across the anime's four major story beats (Aragane Station outbreak, the Black Fog at Yashiro Station, Biba Amatori's introduction, and the Kongokaku finale).", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 9], - "arc": "Aragane Station Outbreak / Birth of the Kabaneri" - }, - { - "episodes": [5, 6], - "chapters": [10, 14], - "arc": "The Black Fog at Yashiro Station" - }, - { - "episodes": [7, 8], - "chapters": [15, 19], - "arc": "Biba Amatori and the Hunters" - }, - { - "episodes": [9, 12], - "chapters": [20, 28], - "arc": "Biba's Betrayal / Kongokaku Showdown" - } - ], - "movies": [ - { - "anilistId": 97918, - "title": "Kabaneri of the Iron Fortress: The Battle of Unato", - "year": 2019, - "afterEpisode": 12, - "note": "Canon sequel film set six months after the TV series with entirely new story content, not adapted from the tie-in manga." - } - ] -} diff --git a/src/data/mappings/kaguya-sama.json b/src/data/mappings/kaguya-sama.json deleted file mode 100644 index bb546e0..0000000 --- a/src/data/mappings/kaguya-sama.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "anilistAnimeId": 101921, - "anilistMangaId": 86635, - "title": "Kaguya-sama: Love Is War", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (12) + S3 Ultra Romantic (13). Episodes are mostly self-contained chapter adaptations; arc boundaries follow major story shifts in the manga. Chapter ranges approximate.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 45], - "arc": "Battle of Wits / Introduction" - }, - { - "episodes": [13, 24], - "chapters": [46, 90], - "arc": "New Student Council / Election" - }, - { - "episodes": [25, 31], - "chapters": [91, 113], - "arc": "Run-up to the Culture Festival" - }, - { - "episodes": [32, 37], - "chapters": [114, 135], - "arc": "Culture Festival / Confession" - }, - { - "chapters": [136, 152], - "arc": "First Kiss That Never Ends (post-confession, adapted as OVA)" - }, - { - "chapters": [153, 200], - "arc": "Twin Star Arc / Student Council Reformation" - }, - { "chapters": [201, 240], "arc": "Christmas Arc / Ishigami Backstory" }, - { "chapters": [241, 281], "arc": "Final Arc / Graduation" } - ] -} diff --git a/src/data/mappings/kaiji-ultimate-survivor.json b/src/data/mappings/kaiji-ultimate-survivor.json deleted file mode 100644 index bdc311a..0000000 --- a/src/data/mappings/kaiji-ultimate-survivor.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "anilistAnimeId": 3002, - "anilistMangaId": 33572, - "title": "Kaiji - Ultimate Survivor", - "sourceNotes": "Single 26-episode season adapting the complete first manga series, Gambling Apocalypse: Kaiji (Tobaku Mokushiroku Kaiji) — 158 chapters, complete. Arc boundaries follow the manga's well-known gambling arcs, cross-checked against Denpa's English omnibus subtitles (Survival of the Fittest/Machiavellianism = Espoir, Human Derby, Multistoried Funambulism = Brave Men's Road, Invincible Emperor/Counterattacking Slave = E-Card). The E-Card/Tissue Box Raffle split (ch. 144/145) is approximate since no precise chapter-level source was found; refine via PR if a definitive source turns up. The sequel anime/manga (Hakairoku-hen) draws on a wholly separate manga and is not covered by this mapping.", - "mappings": [ - { - "episodes": [1, 9], - "chapters": [1, 54], - "arc": "Espoir Arc (Restricted Rock-Paper-Scissors)" - }, - { - "episodes": [10, 14], - "chapters": [55, 93], - "arc": "Castle of Despair: Human Derby & Brave Men's Road" - }, - { "episodes": [15, 21], "chapters": [94, 144], "arc": "E-Card" }, - { - "episodes": [22, 26], - "chapters": [145, 158], - "arc": "Tissue Box Raffle (Finale)" - } - ] -} diff --git a/src/data/mappings/kaiju-no-8.json b/src/data/mappings/kaiju-no-8.json deleted file mode 100644 index a00045d..0000000 --- a/src/data/mappings/kaiju-no-8.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "anilistAnimeId": 153288, - "anilistMangaId": 120760, - "title": "Kaiju No. 8", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (11). Manga complete at 129 chapters; anime adapted through Kaiju Weapon Arc (ch 55). No filler. Arc boundaries from Kaiju No. 8 Wiki.", - "mappings": [ - { - "episodes": [1, 5], - "chapters": [1, 11], - "arc": "The Man Who Became a Kaiju" - }, - { - "episodes": [6, 8], - "chapters": [12, 23], - "arc": "Sagamihara Neutralization Operation at Daybreak" - }, - { - "episodes": [9, 10], - "chapters": [24, 32], - "arc": "Raid on Tachikawa Base" - }, - { - "episodes": [11, 12], - "chapters": [33, 39], - "arc": "Kaiju No. 8 Captured" - }, - { "episodes": [13, 23], "chapters": [40, 55], "arc": "Kaiju Weapon" }, - { "chapters": [56, 68], "arc": "The Compatible User" }, - { "chapters": [69, 75], "arc": "Cataclysms" }, - { "chapters": [76, 95], "arc": "The Second Wave" }, - { "chapters": [96, 129], "arc": "The Last Wave (Final)" } - ], - "movies": [ - { - "anilistId": 179998, - "title": "Kaiju No. 8: Mission Recon", - "year": 2025, - "afterEpisode": 12, - "note": "S1 recap plus the new 'Hoshina's Day Off' episode." - } - ] -} diff --git a/src/data/mappings/kakegurui.json b/src/data/mappings/kakegurui.json deleted file mode 100644 index 8e4dff6..0000000 --- a/src/data/mappings/kakegurui.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 98314, - "anilistMangaId": 85793, - "title": "Kakegurui", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 'Kakegurui xx' (12, eps 13-24) = 24 total. Paired with the Homura Kawamoto / Toru Naomura manga 'Kakegurui - Compulsive Gambler -' (ongoing; ~121 chapters / 20+ volumes as of 2026). The anime skips some chapters: S1 covers roughly vols 1-5 (ch 1-27) and S2 the Student Council Election arc through vol 10 (ch 28-56), after which readers resume around ch 55-57. Per-arc chapter boundaries approximate.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 27], - "arc": "S1: Student Council Gambles (Yumeko vs the council members)" - }, - { - "episodes": [13, 24], - "chapters": [28, 56], - "arc": "S2 'Kakegurui xx': Student Council Election Arc" - }, - { - "chapters": [57, 121], - "arc": "Election aftermath onward (unadapted in TV anime; manga ongoing)" - } - ] -} diff --git a/src/data/mappings/kakushigoto.json b/src/data/mappings/kakushigoto.json deleted file mode 100644 index f38ddd1..0000000 --- a/src/data/mappings/kakushigoto.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "anilistAnimeId": 113311, - "anilistMangaId": 97603, - "title": "Kakushigoto", - "sourceNotes": "Single 12-episode TV season (2020) adapting Koji Kumeta's manga \"Kakushigoto: My Dad's Secret Ambition.\" Manga complete at 232 short chapters across 12 tankobon volumes (2015-2020, AniList manga id 97603). This is an episodic gag comedy with NO named story arcs and no published per-episode chapter guide; the anime does not follow strict publication order but interweaves the past (Hime age 10) with a present-day frame (Hime age 18 opening the storehouse), broadly progressing through the manga and reaching its conclusion in the finale. Mappings use the actual ANN episode titles as labels, aligned one-episode-per-volume across the manga's 12 volumes; chapter ranges are APPROXIMATE (even split of 232 chapters into 12 volume-sized blocks). The 2021 \"Kakushigoto Theatrical Edition\" is a recap re-edit of the TV footage (AniList SUMMARY) and is excluded.", - "mappings": [ - { - "episodes": [1, 1], - "chapters": [1, 20], - "arc": "Secrets" - }, - { - "episodes": [2, 2], - "chapters": [21, 40], - "arc": "Beach Sandals and B4" - }, - { - "episodes": [3, 3], - "chapters": [41, 59], - "arc": "Makeshift Circus" - }, - { - "episodes": [4, 4], - "chapters": [60, 78], - "arc": "Normale Namae" - }, - { - "episodes": [5, 5], - "chapters": [79, 97], - "arc": "And Yet Everyone Gets Their Turn in the End" - }, - { - "episodes": [6, 6], - "chapters": [98, 116], - "arc": "School Rucksack" - }, - { - "episodes": [7, 7], - "chapters": [117, 136], - "arc": "Inuhoshiki: Dog Wanted" - }, - { - "episodes": [8, 8], - "chapters": [137, 155], - "arc": "Our Rough Draft" - }, - { - "episodes": [9, 9], - "chapters": [156, 174], - "arc": "Your Lie in December" - }, - { - "episodes": [10, 10], - "chapters": [175, 193], - "arc": "I\"S (Izu)" - }, - { - "episodes": [11, 11], - "chapters": [194, 213], - "arc": "Saishukai: The Last Chapter Doesn't Bother Her" - }, - { - "episodes": [12, 12], - "chapters": [214, 232], - "arc": "Hidden Truths" - } - ] -} diff --git a/src/data/mappings/kamikatsu.json b/src/data/mappings/kamikatsu.json deleted file mode 100644 index 9c6a86d..0000000 --- a/src/data/mappings/kamikatsu.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "anilistAnimeId": 148048, - "anilistMangaId": 130965, - "title": "KamiKatsu: Working for God in a Godless World", - "sourceNotes": "Single-cour, 12 episodes (Apr-Jul 2023), 0 filler. AniList reports null chapter/volume counts for both the anime and manga entries; manga is ongoing at ch. 69 across 13 volumes (~5.3 ch/volume) as of its official Hero's Web (Comiplex) serialization in July 2026. The anime adapts through ch. 38 (~vol. 7), covering Yukito founding the goddess Mitama's faith and her rival-god confrontations with Atar/Loki (eps 1-5), Dakini (eps 6-8), and Gaia (eps 9-12); per-episode chapter boundaries within each confrontation are approximate estimates from episode synopses, not a confirmed chapter-sync guide.", - "mappings": [ - { - "episodes": [1, 5], - "chapters": [1, 16], - "arc": "Founding the Faith / Atar & Loki" - }, - { "episodes": [6, 8], "chapters": [17, 27], "arc": "Dakini Arc" }, - { "episodes": [9, 12], "chapters": [28, 38], "arc": "Gaia Arc" }, - { "chapters": [39, 69], "arc": "Unadapted ongoing manga (post-anime)" } - ] -} diff --git a/src/data/mappings/kamisama-kiss.json b/src/data/mappings/kamisama-kiss.json deleted file mode 100644 index 2823a25..0000000 --- a/src/data/mappings/kamisama-kiss.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "anilistAnimeId": 14713, - "anilistMangaId": 38157, - "title": "Kamisama Kiss", - "sourceNotes": "Paired with Julietta Suzuki's complete manga 'Kamisama Hajimemashita' (149 numbered story chapters in 25 volumes; AniList counts 154 because it lists the side/extra chapters and the time-skip epilogue separately). Episodes are cumulative across the two TV seasons: S1 (anilistAnimeId 14713, 13 eps, 2012) covers eps 1-13, and the sequel S2 'Kamisama Hajimemashita◎' (id 20801, 12 eps, 2015) continues as eps 14-25. S1 adapts roughly ch 1-30; S2 adapts ch 31-63, so a viewer resumes reading at ch 64. Per-episode chapter boundaries are approximate and grouped at the arc level. The wedding falls at ch 149 and ch 154 is the epilogue. The 4-part 'Kako-hen' (Past Arc) OVA adapts Tomoe's backstory from volumes 14-17 (within the unadapted tail) and a 1-part wedding OVA covers the finale; these OADs are excluded as they are not theatrical films.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 7], - "arc": "Becoming a Land God & Tomoe's Contract" - }, - { - "episodes": [3, 5], - "chapters": [8, 14], - "arc": "Kurama the Tengu Pop Idol" - }, - { - "episodes": [6, 9], - "chapters": [15, 22], - "arc": "Himemiko's Matchmaking & Mizuki the Snake Familiar" - }, - { - "episodes": [10, 13], - "chapters": [23, 30], - "arc": "Kurama-yama Festival & Tsuchigumo (Season 1 finale)" - }, - { - "episodes": [14, 16], - "chapters": [31, 40], - "arc": "Divine Assembly at Izumo" - }, - { - "episodes": [17, 22], - "chapters": [41, 55], - "arc": "Netherworld Journey & Kirihito / Akura-Ou" - }, - { - "episodes": [23, 25], - "chapters": [56, 63], - "arc": "Mount Kurama & Memory Regression (Season 2 finale)" - }, - { - "chapters": [64, 154], - "arc": "Black Miko, Tomoe's Past & Wedding (unadapted; story ends ch 149, ch 154 epilogue)" - } - ] -} diff --git a/src/data/mappings/katanagatari.json b/src/data/mappings/katanagatari.json deleted file mode 100644 index 25ced70..0000000 --- a/src/data/mappings/katanagatari.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "anilistAnimeId": 6594, - "anilistMangaId": 48161, - "title": "Katanagatari", - "sourceNotes": "Source is NisiOisin's 12-volume light novel (one volume released per month across 2007); the AniList entry used as anilistMangaId (id 48161, format NOVEL) is that light novel, so the 'chapters' axis here is LIGHT NOVEL VOLUME numbers 1-12, not manga chapters. The 2010 TV anime (id 6594) is a single 12-episode season of double-length episodes, and each episode adapts exactly one LN volume = one of the twelve Deviant Blades. This is a clean 1:1 mapping (episode N -> volume N), and the anime adapts the entire 12-volume LN, so there is no unadapted tail.", - "mappings": [ - { - "episodes": [1, 1], - "chapters": [1, 1], - "arc": "Zettou \"Kanna\" (Absolute Sword)" - }, - { - "episodes": [2, 2], - "chapters": [2, 2], - "arc": "Zantou \"Namakura\" (Slash Sword)" - }, - { - "episodes": [3, 3], - "chapters": [3, 3], - "arc": "Sentou \"Tsurugi\" (Thousand Sword)" - }, - { - "episodes": [4, 4], - "chapters": [4, 4], - "arc": "Hakutou \"Hari\" (Thin Sword)" - }, - { - "episodes": [5, 5], - "chapters": [5, 5], - "arc": "Zokutou \"Yoroi\" (Thief Sword)" - }, - { - "episodes": [6, 6], - "chapters": [6, 6], - "arc": "Soutou \"Tsui\" (Twin Sword)" - }, - { - "episodes": [7, 7], - "chapters": [7, 7], - "arc": "Akutou \"Bita\" (Evil Sword)" - }, - { - "episodes": [8, 8], - "chapters": [8, 8], - "arc": "Bitou \"Kanzashi\" (Tiny Sword)" - }, - { - "episodes": [9, 9], - "chapters": [9, 9], - "arc": "Outou \"Nokogiri\" (King Sword)" - }, - { - "episodes": [10, 10], - "chapters": [10, 10], - "arc": "Seitou \"Hakari\" (Honest Sword)" - }, - { - "episodes": [11, 11], - "chapters": [11, 11], - "arc": "Dokutou \"Mekki\" (Poison Sword)" - }, - { - "episodes": [12, 12], - "chapters": [12, 12], - "arc": "Entou \"Juu\" (Flame Sword)" - } - ] -} diff --git a/src/data/mappings/katekyo-hitman-reborn.json b/src/data/mappings/katekyo-hitman-reborn.json deleted file mode 100644 index 7ccc1d3..0000000 --- a/src/data/mappings/katekyo-hitman-reborn.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 1604, - "anilistMangaId": 30047, - "title": "REBORN!", - "sourceNotes": "Single continuous 203-episode anime (2006-2010); episode numbers are not split by season. The anime ended at episode 203, adapting up to roughly manga chapter 282 (end of the Future / TYL arc); the Inheritance Ceremony (Shimon) and Curse of the Rainbow arcs were never animated and are listed here as chapters-only. Three anime-original filler arcs (Arcobaleno Trials eps 141-153, Inheritance Succession eps 178-189, plus assorted Daily-life interludes) adapt no main chapters and are omitted from the ranges. Manga complete: most chapter lists count 409 numbered chapters (Target 001-409); AniList reports 411 (likely counting post-series omake) — final mapping extends to 409. Early Daily Life / Kokuyo / Varia episode-to-chapter boundaries are approximate (heavy filler) — refine via PR.", - "mappings": [ - { "episodes": [1, 33], "chapters": [1, 61], "arc": "Daily Life Arc" }, - { - "episodes": [34, 65], - "chapters": [62, 82], - "arc": "Kokuyo Arc (Mukuro)" - }, - { - "episodes": [66, 73], - "chapters": [83, 139], - "arc": "Varia Arc / Battle for the Rings" - }, - { - "episodes": [74, 203], - "chapters": [140, 282], - "arc": "Future Arc / Future (TYL) Arc" - }, - { - "chapters": [283, 330], - "arc": "Inheritance Ceremony Arc / Shimon Arc" - }, - { - "chapters": [331, 409], - "arc": "Curse of the Rainbow / Representative Battle of the Rainbow Arc" - } - ] -} diff --git a/src/data/mappings/kawai-complex.json b/src/data/mappings/kawai-complex.json deleted file mode 100644 index 95184cc..0000000 --- a/src/data/mappings/kawai-complex.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "anilistAnimeId": 20529, - "anilistMangaId": 56769, - "title": "The Kawai Complex Guide to Manors and Hostel Behavior", - "sourceNotes": "Single-cour 12-episode TV anime (2014) adapting manga volumes 1-3 (chapters 1-28). Manga complete at 94 chapters across 11 volumes; the anime covers roughly the first third, leaving the remainder unadapted. A side-story OVA and 4-koma spinoff exist but are excluded here.", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 28], "arc": "TV Series" }, - { "chapters": [29, 94], "arc": "Unadapted (manga continuation)" } - ] -} diff --git a/src/data/mappings/kaze-no-stigma.json b/src/data/mappings/kaze-no-stigma.json deleted file mode 100644 index 9932c93..0000000 --- a/src/data/mappings/kaze-no-stigma.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "anilistAnimeId": 1691, - "anilistMangaId": 40312, - "title": "Kaze no Stigma", - "sourceNotes": "24-episode anime adapts all 6 main light novel volumes (39 chapters + epilogues total; author Takahiro Yamato died in 2009, leaving the 6 side-story 'Ignition' compilations as a separate, unadapted spin-off). Episodic structure runs ~4 episodes per volume, so arc boundaries are approximated at one volume per arc using the official volume subtitles; precise chapter-level guides were not available.", - "mappings": [ - { "episodes": [1, 4], "chapters": [1, 7], "arc": "Kaze no Stigma" }, - { "episodes": [5, 8], "chapters": [8, 14], "arc": "The Price of a Soul" }, - { - "episodes": [9, 12], - "chapters": [15, 21], - "arc": "The Confession Under the Moon" - }, - { - "episodes": [13, 16], - "chapters": [22, 26], - "arc": "The Lazuline Afterimage" - }, - { - "episodes": [17, 20], - "chapters": [27, 33], - "arc": "The Scarlet Contract" - }, - { "episodes": [21, 24], "chapters": [34, 39], "arc": "The Hurricane Pike" } - ] -} diff --git a/src/data/mappings/keep-your-hands-off-eizouken.json b/src/data/mappings/keep-your-hands-off-eizouken.json deleted file mode 100644 index b862347..0000000 --- a/src/data/mappings/keep-your-hands-off-eizouken.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 109298, - "anilistMangaId": 109319, - "title": "Keep Your Hands Off Eizouken!", - "sourceNotes": "Single-cour 12-episode TV anime (Science SARU, 2020); cumulative episodes equal broadcast episodes since there is only one season. Source manga by Sumito Ōwara is ongoing (10 tankōbon volumes, ~74 chapters as of 2026). The anime adapts volumes 1-3 (chapters 1-23) at roughly 2 chapters per episode; arc boundaries follow the three in-story film productions and are corroborated by matching chapter/episode titles (Ch 1 \"The Greatest World!\" = Ep 1; Ch 8 \"Discovering an Iron Giant!\" = Ep 5; Ch 15 \"The Great Shibahama Festival\" = Ep 8; Ch 22 \"The Beginning of the War\" / Ch 23 = Ep 12 \"Shibahama UFO Wars!\"). Volume-to-chapter ranges per the Eizouken fandom wiki. The 2020 live-action film/TV drama is a separate live-action continuity and is excluded.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 6], - "arc": "Founding & Debut Short" - }, - { - "episodes": [4, 8], - "chapters": [7, 15], - "arc": "Robot Research Club Anime" - }, - { - "episodes": [9, 12], - "chapters": [16, 23], - "arc": "UFO Wars" - }, - { - "chapters": [24, 74], - "arc": "Post-Anime Productions (unadapted)" - } - ] -} diff --git a/src/data/mappings/keijo.json b/src/data/mappings/keijo.json deleted file mode 100644 index 4ca1652..0000000 --- a/src/data/mappings/keijo.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 21639, - "anilistMangaId": 85929, - "title": "Keijo!!!!!!!!", - "sourceNotes": "Single 12-episode season (2016), no sequel. Source is Daichi Sorayomi's manga \"Keijo!!!!!!!! Hip Whip Girl\" (Weekly Shonen Sunday, complete at 177 chapters / 18 volumes). The anime skips the first ~34 chapters: episode 1 condenses chapters 22-34 into an opening flashback and begins its main narrative on page 4 of chapter 35. From there it adapts roughly 4-5 chapters per episode (with some skipped chapters and page-level splits) up through chapter 90 in the finale, ending mid-East-West War as the Debut War Arc opens. Chapter ranges follow the Keijo Fandom per-episode \"chapters\" fields. Because the anime was cut short, everything from ~chapter 91 to the manga's end (ch 177) is unadapted; a viewer resumes reading around chapter 88-91.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [22, 44], - "arc": "Second Exam & Sweet Room Arc" - }, - { - "episodes": [4, 5], - "chapters": [45, 55], - "arc": "Class Exchange Arc" - }, - { - "episodes": [6, 7], - "chapters": [56, 61], - "arc": "Training Camp (Kyoto) Arc" - }, - { - "episodes": [8, 12], - "chapters": [62, 90], - "arc": "The East-West War Arc" - }, - { - "chapters": [91, 177], - "arc": "The Debut War Arc & Finale (unadapted)" - } - ] -} diff --git a/src/data/mappings/kemono-jihen.json b/src/data/mappings/kemono-jihen.json deleted file mode 100644 index 25083b9..0000000 --- a/src/data/mappings/kemono-jihen.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "anilistAnimeId": 114085, - "anilistMangaId": 98466, - "title": "Kemono Jihen", - "sourceNotes": "Single 12-episode TV season (2021, Ajia-do). Episodes are single-season, so cumulative episode numbers equal broadcast numbers. The anime adapts manga chapters 1-21 at a fairly fast pace (not panel-by-panel); episode 9 also wraps the brief 2-chapter Intermission Arc (ch 15-16), which is bundled into the Shiki Arc entry here. Source manga by Shou Aimoto, serialized in Jump Square, is ongoing: 24 tankobon volumes through ch. 105 as of December 2025. Chapter boundaries per the Kemono Jihen Fandom wiki's Story Arcs page. Everything from the Shikoku Arc (ch 22) onward is unadapted, so those entries are chapters-only; the final entry extends to the latest published chapter (105).", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 10], - "arc": "Introduction Arc" - }, - { - "episodes": [7, 9], - "chapters": [11, 16], - "arc": "Shiki Arc" - }, - { - "episodes": [10, 12], - "chapters": [17, 21], - "arc": "Snow Village Arc" - }, - { - "chapters": [22, 27], - "arc": "Shikoku Arc" - }, - { - "chapters": [28, 34], - "arc": "Shimane-Amagafuchi Arc" - }, - { - "chapters": [35, 43], - "arc": "Ogreham Factory Arc" - }, - { - "chapters": [44, 58], - "arc": "Gourd Training Arc" - }, - { - "chapters": [59, 79], - "arc": "Kyoto Arc" - }, - { - "chapters": [80, 105], - "arc": "Time Skip Arc" - } - ] -} diff --git a/src/data/mappings/kids-on-the-slope.json b/src/data/mappings/kids-on-the-slope.json deleted file mode 100644 index 942d266..0000000 --- a/src/data/mappings/kids-on-the-slope.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 12531, - "anilistMangaId": 58393, - "title": "Kids on the Slope", - "sourceNotes": "Single season, 12 episodes. Manga complete at 53 chapters. The anime is a compressed but essentially complete adaptation, reaching the same 'eight years later' epilogue as the manga rather than stopping mid-story; it drops many subplots and chapter-level detail to fit the runtime, so the split below is approximate — refine via PR.", - "mappings": [ - { - "episodes": [1, 11], - "chapters": [1, 40], - "arc": "Sasebo High School Days" - }, - { - "episodes": [12, 12], - "chapters": [41, 53], - "arc": "Graduation & Eight Years Later" - } - ] -} diff --git a/src/data/mappings/kill-la-kill.json b/src/data/mappings/kill-la-kill.json deleted file mode 100644 index f7837bd..0000000 --- a/src/data/mappings/kill-la-kill.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 18679, - "anilistMangaId": 88609, - "title": "Kill la Kill", - "sourceNotes": "24-episode anime with a 17-chapter manga tie-in by Ryo Akizuki that was cancelled before finishing the story. Chapters 1-7 follow the anime closely through Ep. 4 (roughly two chapters per episode); Ep. 6 is skipped outright and Eps. 8-11 are heavily abridged (no Elite Four backstories, shortened fights). The manga ends partway through Ep. 12's events (Mako talking Ryuko down) and never reaches the anime's Naturals Election finale or any of the later arcs.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 7], - "arc": "Honnouji Academy Uniform Hierarchy" - }, - { - "episodes": [5, 12], - "chapters": [8, 17], - "arc": "Naturals Election / Elite Four (manga ends unfinished)" - } - ] -} diff --git a/src/data/mappings/killing-slimes-300-years.json b/src/data/mappings/killing-slimes-300-years.json deleted file mode 100644 index 0c324eb..0000000 --- a/src/data/mappings/killing-slimes-300-years.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 112608, - "anilistMangaId": 101069, - "title": "I've Been Killing Slimes for 300 Years and Maxed Out My Level", - "sourceNotes": "Source is Kisetsu Morita's light novel (29+ vols); paired here with Yusuke Shiba's ongoing manga adaptation (~17 vols / ~ch. 88 as of mid-2026; AniList lists no chapter count). The 2021 TV anime is a single 12-episode season. This is an episodic slice-of-life isekai, and the anime reorders events relative to the manga — so episodes are grouped into blocks aligned to manga volumes rather than mapped 1:1. Solid anchors: manga vol 1 = ch 1-6, vol 2 = ch 7-12, vol 3 = ch 13-19, and the harvest-festival café that closes vol 3 (ch 19) is also the anime finale (ep 12). S1 therefore covers roughly manga ch 1-19 (vols 1-3); chapter boundaries within that span are approximate. A viewer resumes reading at ch 20. Manga ongoing, so the unadapted tail (ch 88) is approximate.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 6], - "arc": "Maxed-Out Witch — Laika & the Slime Daughters (Falfa & Shalsha)" - }, - { - "episodes": [3, 7], - "chapters": [7, 12], - "arc": "The Family Grows — Halkara, Beelzebub & the Demon Realm; the Dragons (Flatorte); Rosalie" - }, - { - "episodes": [8, 12], - "chapters": [13, 19], - "arc": "Highland Slice-of-Life — Eno, Kuku the Minstrel & the Café Festival" - }, - { - "chapters": [20, 88], - "arc": "Beyond the Highlands (ongoing, unadapted by the 2021 season)" - } - ] -} diff --git a/src/data/mappings/kimi-ni-todoke.json b/src/data/mappings/kimi-ni-todoke.json deleted file mode 100644 index 013feae..0000000 --- a/src/data/mappings/kimi-ni-todoke.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 6045, - "anilistMangaId": 33378, - "title": "Kimi ni Todoke: From Me to You", - "sourceNotes": "Cumulative episodes across S1 (25) + S2 (12, eps 26-37) + S3 (Netflix ONA, 5 eps, eps 38-42) = 42 total. (AniList lists S2 at 13 eps incl. a recap; the broadcast/streaming season is 12.) Paired with Karuho Shiina's complete manga: 123 numbered story chapters across 30 volumes; AniList counts 127 incl. ~4 bonus/omake chapters, so the tail extends to 127. Season-end boundaries (ch 27 / 46 / 75) corroborated across episode-to-chapter guides; the internal S1 split is approximate.", - "mappings": [ - { - "episodes": [1, 7], - "chapters": [1, 7], - "arc": "Becoming Friends (Sawako, Ayane & Chizuru)" - }, - { - "episodes": [8, 25], - "chapters": [8, 27], - "arc": "Kurumi Rivalry → New Year (S1)" - }, - { - "episodes": [26, 37], - "chapters": [28, 46], - "arc": "Valentine's & Confession (S2)" - }, - { - "episodes": [38, 42], - "chapters": [47, 75], - "arc": "New Couple / School Trip / First Kiss (S3)" - }, - { - "chapters": [76, 127], - "arc": "Third Year & Graduation (unadapted tail; ch 124-127 are bonus chapters)" - } - ] -} diff --git a/src/data/mappings/kingdom.json b/src/data/mappings/kingdom.json deleted file mode 100644 index c68474c..0000000 --- a/src/data/mappings/kingdom.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "anilistAnimeId": 12031, - "anilistMangaId": 46765, - "title": "Kingdom", - "sourceNotes": "Cumulative episodes across S1 (38) + S2 (39) + S3 (26) + S4 (26) + S5 (13) + S6 (13). Arc-level approximation; chapter ranges follow major manga arcs and are coarse.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 35], - "arc": "Assassination of King Sou / Coup d'état" - }, - { - "episodes": [13, 26], - "chapters": [36, 70], - "arc": "Battle of Dakan / Mouki Arc" - }, - { - "episodes": [27, 38], - "chapters": [71, 104], - "arc": "Bayou Plains / Mountain Tribe" - }, - { "episodes": [39, 58], "chapters": [105, 169], "arc": "Battle of Sai" }, - { - "episodes": [59, 77], - "chapters": [170, 230], - "arc": "Coalition Invasion" - }, - { - "episodes": [78, 103], - "chapters": [231, 295], - "arc": "Bandits of Shukoku / Aide Selection" - }, - { - "episodes": [104, 129], - "chapters": [296, 406], - "arc": "Western Zhao Invasion / Battle of Gyou" - }, - { - "episodes": [130, 142], - "chapters": [407, 490], - "arc": "Battle of Gyou Conclusion" - }, - { - "episodes": [143, 155], - "chapters": [491, 542], - "arc": "Battle of Shukai Plains (Part 1)" - }, - { - "chapters": [543, 700], - "arc": "Battle of Shukai Plains (cont.) / Eastern Zhao" - }, - { "chapters": [701, 830], "arc": "Qin's Continued Conquest" } - ] -} diff --git a/src/data/mappings/kiss-him-not-me.json b/src/data/mappings/kiss-him-not-me.json deleted file mode 100644 index ef2ce75..0000000 --- a/src/data/mappings/kiss-him-not-me.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "anilistAnimeId": 21686, - "anilistMangaId": 84779, - "title": "Kiss Him, Not Me", - "sourceNotes": "Single 12-episode TV series (Brain's Base, 2016) sourced from Junko's manga (complete at 60 chapters / 14 volumes, Bessatsu Friend 2013-2018). Episodes 1-5 follow the manga chronologically and end at chapter 12 (\"I Realized\"); from episode 6 onward the anime heavily reorders and cherry-picks chapters (e.g. ep6 draws on ch22-23, ep8 on ch28, ep9 jumps back to the ch25 beach material, ep11 to the ch16 survival game), so episode ranges for arcs after ch12 are approximate and non-monotonic. Arc groupings below follow the manga's chapter titles. The anime adapts roughly the first half of the manga (through ~ch28); chapters 29-60 (the post-transformation continuation) are unadapted.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 4], - "arc": "The Reverse Harem Forms" - }, - { - "episodes": [3, 4], - "chapters": [5, 8], - "arc": "Cosplay Festival & Christmas in the Holy Land" - }, - { - "episodes": [5, 5], - "chapters": [9, 12], - "arc": "Back to My Original Self" - }, - { - "episodes": [9, 11], - "chapters": [13, 16], - "arc": "Nishina and the Survival Game" - }, - { - "episodes": [10, 10], - "chapters": [17, 20], - "arc": "Brother Invasion" - }, - { - "episodes": [6, 12], - "chapters": [21, 24], - "arc": "Confessions & the Fujoshi Dispute" - }, - { - "episodes": [7, 9], - "chapters": [25, 28], - "arc": "Comiket Trip & Summer Beach" - }, - { - "chapters": [29, 60], - "arc": "Post-Transformation Continuation (unadapted)" - } - ] -} diff --git a/src/data/mappings/kiss-x-sis.json b/src/data/mappings/kiss-x-sis.json deleted file mode 100644 index 11c6d18..0000000 --- a/src/data/mappings/kiss-x-sis.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 7593, - "anilistMangaId": 33048, - "title": "kiss×sis (TV)", - "sourceNotes": "Single 12-episode TV season (Feel, 2010); anilistAnimeId 7593 is the only TV series (the earlier 2008 \"kiss×sis\" is a separate 12-part OVA side-adaptation, not mapped here). Sourced from Bow Ditama's completed ecchi harem-comedy manga (AniList 33048), which finished in 2021 at 154 chapters numbered 0-153 across 25 tankobon. This is episodic gag/fanservice comedy about Keita Suminoe and his twin stepsisters Ako and Riko with no continuous story arcs; the TV anime samples scattered early chapters non-sequentially rather than following a linear arc, so the per-episode chapter boundaries below are coarse approximations, not exact matches. A reader finishing the anime continues roughly from mid-series onward to the finale at ch. 153. No theatrical films exist (only the OVA line).", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 25], - "arc": "Keita & the Twins (episodic ecchi gags; approximate)" - }, - { - "episodes": [7, 12], - "chapters": [26, 50], - "arc": "Exams & Summer Antics (episodic; approximate)" - }, - { - "chapters": [51, 153], - "arc": "Remaining manga chapters (unadapted)" - } - ] -} diff --git a/src/data/mappings/kiznaiver.json b/src/data/mappings/kiznaiver.json deleted file mode 100644 index f365485..0000000 --- a/src/data/mappings/kiznaiver.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 21421, - "anilistMangaId": 87447, - "title": "Kiznaiver", - "sourceNotes": "12-episode original anime (Studio Trigger, written by Mari Okada, 2016) paired with a concurrent 9-chapter (2-volume, complete) tie-in manga by Roji Karegishi that retells the same story; a published chapter-to-episode guide was not found, so chapter ranges are proportioned across the anime's two halves.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 5], - "arc": "The Kizna Program Begins" - }, - { "episodes": [7, 12], "chapters": [6, 9], "arc": "Bonds and Resolution" } - ] -} diff --git a/src/data/mappings/knights-of-sidonia.json b/src/data/mappings/knights-of-sidonia.json deleted file mode 100644 index 2239f2c..0000000 --- a/src/data/mappings/knights-of-sidonia.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "anilistAnimeId": 19775, - "anilistMangaId": 43723, - "title": "Knights of Sidonia", - "sourceNotes": "Manga complete at 78 chapters / 15 volumes (Tsutomu Nihei, 2009-2015). Two anime seasons (Polygon Pictures): S1 'Knights of Sidonia' (12 eps, 2014) and S2 'Battle for Planet Nine' / Daikyuu Wakusei Seneki (12 eps, 2015). Episodes are CUMULATIVE: S2 episodes 1-12 are listed here as 13-24. Together the two seasons adapt roughly chapters 1-41 of the manga; a manga reader continues at chapter 42 after the anime. The 2021 film 'Ai Tsumugu Hoshi' (Love Woven in the Stars) then adapts the remaining final arc (~ch 42-78) in highly abridged and partly altered form. Volume-to-chapter map (Wikipedia): V1 1-5, V2 6-10, V3 11-15, V4 16-20, V5 21-25, V6 26-30, V7 31-35, V8 36-39, V9 40-44, V10 45-49 ... V15 71-78. Episode-to-chapter ranges within each season are approximate. The earlier 2015 'Sidonia no Kishi Movie' (id 21154) is a S1 recap compilation and is excluded.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 10], - "arc": "Recruitment & First Sorties (Nagate becomes a Garde pilot)" - }, - { - "episodes": [5, 8], - "chapters": [11, 22], - "arc": "Hoshijiro & the Immortal Crew (Shizuka's loss; Nagate's secret)" - }, - { - "episodes": [9, 12], - "chapters": [23, 30], - "arc": "Benisuzume / Large Gauna Cluster Ship (S1 climax)" - }, - { - "episodes": [13, 16], - "chapters": [31, 35], - "arc": "Tsumugi (the human-Gauna hybrid is created)" - }, - { - "episodes": [17, 20], - "chapters": [36, 39], - "arc": "Gravitational Beam Emitter (the experimental weapon backfires)" - }, - { - "episodes": [21, 24], - "chapters": [40, 41], - "arc": "Battle for Planet Nine / Lem (S2 climax)" - }, - { - "chapters": [42, 78], - "arc": "Final Arc — Kanata no Kabi & the Gauna War's conclusion (manga only; abridged by the 2021 film)" - } - ], - "movies": [ - { - "anilistId": 99730, - "title": "Knights of Sidonia: Love Woven in the Stars (Ai Tsumugu Hoshi)", - "year": 2021, - "chapters": [42, 78], - "afterEpisode": 24, - "note": "Canonical sequel film concluding the series; abridges and alters the manga's final arc (chapters ~42-78)." - } - ] -} diff --git a/src/data/mappings/kokoro-connect.json b/src/data/mappings/kokoro-connect.json deleted file mode 100644 index e107a1a..0000000 --- a/src/data/mappings/kokoro-connect.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 11887, - "anilistMangaId": 54380, - "title": "Kokoro Connect", - "sourceNotes": "The 2012 TV anime (AniList id 11887) is 13 episodes; the 4 'Michi Random' specials that aired December 30, 2012 (eps 14-17 here) are a separate OVA entry (AniList id 16001). The source is Sadanatsu Anda's light novel. The actual manga adaptation (AniList id 54489) is only 32 chapters / 5 volumes and never got past the early arcs, so this mapping uses LIGHT-NOVEL VOLUME numbers as the 'chapters' unit, via the LN's AniList id 54380 (11 volumes, matching the original Japanese tankobon count). Japanese LN volume structure: vol 1 Hito Random, vol 2 Kizu Random, vol 3 Kako Random, vol 4 Michi Random, vol 5 Clip Time (anthology), vol 6 Nise Random, vol 7 Yume Random, vol 8 Step Time (side material), vols 9-10 Asu Random (the finale), vol 11 Precious Time (side-story collection). (J-Novel Club's English omnibus releases renumber these arcs into 6 volumes.) The anime adapts vols 1-4 cleanly; vols 5-11 are unadapted. No theatrical films.", - "mappings": [ - { - "episodes": [1, 5], - "chapters": [1, 1], - "arc": "Hito Random - Body Swap (LN vol 1)" - }, - { - "episodes": [6, 10], - "chapters": [2, 2], - "arc": "Kizu Random - Desire Liberation (LN vol 2)" - }, - { - "episodes": [11, 13], - "chapters": [3, 3], - "arc": "Kako Random - Time Regression (LN vol 3)" - }, - { - "episodes": [14, 17], - "chapters": [4, 4], - "arc": "Michi Random - Emotion Transmission (LN vol 4, the 4 OVA specials = AniList id 16001)" - }, - { - "chapters": [5, 11], - "arc": "Unadapted: Clip Time / Nise Random / Yume Random / Step Time / Asu Random / Precious Time (LN vols 5-11)" - } - ] -} diff --git a/src/data/mappings/komi-cant-communicate.json b/src/data/mappings/komi-cant-communicate.json deleted file mode 100644 index ac01a5f..0000000 --- a/src/data/mappings/komi-cant-communicate.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "anilistAnimeId": 133965, - "anilistMangaId": 97852, - "title": "Komi Can't Communicate", - "sourceNotes": "Cumulative episodes across S1 (12, 2021) + S2 (12, 2022) = 24. Faithful, no-filler adaptation of manga chapters 1–129. Manga complete: the main Weekly Shōnen Sunday serialization ended at ch. 499, plus a bonus ch. 500 in the final Volume 37 (March 2025), so the canonical run is chapters 1–500 across 37 volumes. (AniList lists 537, which appears to over-count; 500 is the verified final chapter.) S2 finale (ep 24) ends at ch. 129; the unadapted tail (ch. 130–500) is included chapters-only. Slice-of-life with no formal arcs — groupings use seasonal/event sections and are approximate; S1 in particular reorders short skits.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 15], - "arc": "First Day / Making Friends" - }, - { - "episodes": [3, 4], - "chapters": [16, 30], - "arc": "Stage Fright / Physical Exam" - }, - { "episodes": [5, 6], "chapters": [31, 44], "arc": "Yamai / Early Summer" }, - { - "episodes": [7, 8], - "chapters": [45, 57], - "arc": "Pool / Summer Festival" - }, - { - "episodes": [9, 11], - "chapters": [58, 68], - "arc": "New Semester / Sports Day / Culture Festival Prep" - }, - { - "episodes": [12, 12], - "chapters": [69, 73], - "arc": "Culture Festival (S1 finale)" - }, - { "episodes": [13, 15], "chapters": [74, 91], "arc": "Winter / Cat Café" }, - { - "episodes": [16, 18], - "chapters": [92, 106], - "arc": "Christmas / New Year" - }, - { "episodes": [19, 21], "chapters": [107, 119], "arc": "Kyoto Field Trip" }, - { - "episodes": [22, 24], - "chapters": [120, 129], - "arc": "Valentine's / White Day (S2 finale)" - }, - { - "chapters": [130, 500], - "arc": "Unadapted Tail (second year through graduation)" - } - ] -} diff --git a/src/data/mappings/kono-oto-tomare.json b/src/data/mappings/kono-oto-tomare.json deleted file mode 100644 index 59ed3e3..0000000 --- a/src/data/mappings/kono-oto-tomare.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 103302, - "anilistMangaId": 75143, - "title": "Kono Oto Tomare!: Sounds of Life", - "sourceNotes": "Cumulative episodes across S1 (13) + S2 (13) = 26 episodes, adapting manga chapters 1-54 at roughly 2 chapters per episode with no filler. S1 (ep 1-13) covers ch 1-26, ending on \"Kuon\" at the Kantou regional festival; S2 (ep 14-26) covers ch 27-54, ending on the Tokise koto club's performance of \"Tenkyuu\" at the Kanagawa prefectural qualifiers (ch 52). Manga is ongoing in Shueisha's Jump SQ (current ch. ~152 as of May 2026, 33+ volumes); everything from ch 55 onward is unadapted. No theatrical films exist.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 13], - "arc": "Club Formation Arc" - }, - { - "episodes": [7, 13], - "chapters": [14, 26], - "arc": "Kantou Regional Festival Arc" - }, - { - "episodes": [14, 26], - "chapters": [27, 54], - "arc": "Kanagawa Preliminaries Arc" - }, - { - "chapters": [55, 152], - "arc": "Nationals Arc (unadapted)" - } - ] -} diff --git a/src/data/mappings/konosuba-explosion.json b/src/data/mappings/konosuba-explosion.json deleted file mode 100644 index 9883112..0000000 --- a/src/data/mappings/konosuba-explosion.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 150075, - "anilistMangaId": 100147, - "title": "KONOSUBA -An Explosion on This Wonderful World!", - "sourceNotes": "Standalone Megumin-focused spin-off: a single 12-episode 2023 anime by studio Drive that adapts the complete 3-volume \"An Explosion on This Wonderful World!\" light novel trilogy by Natsume Akatsuki. Mapped to the light novel source (AniList NOVEL entry, 20 chapters, trilogy complete); ranges are by volume since the LN uses per-volume prologue/chapter/epilogue numbering, so chapter numbers are approximate. Vol 1 = eps 1-5 (ends on \"Prelude to Explosion Madness\"), Vol 2 = eps 6-9 (ep 9 covers Vol 2's final chapter, the Destroyer), Vol 3 = eps 10-12. Distinct from the main Konosuba TV series (mapped separately as konosuba); the Legend of Crimson movie belongs to that main series, not this spin-off.", - "mappings": [ - { - "episodes": [1, 5], - "chapters": [1, 7], - "arc": "Light Novel Volume 1 (Crimson Demon Village / Magic Academy)" - }, - { - "episodes": [6, 9], - "chapters": [8, 14], - "arc": "Light Novel Volume 2 (City of Water / The Destroyer)" - }, - { - "episodes": [10, 12], - "chapters": [15, 20], - "arc": "Light Novel Volume 3 (Town for Beginners / Explosion)" - } - ] -} diff --git a/src/data/mappings/konosuba.json b/src/data/mappings/konosuba.json deleted file mode 100644 index a93a25f..0000000 --- a/src/data/mappings/konosuba.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "anilistAnimeId": 21202, - "anilistMangaId": 86238, - "title": "Konosuba: God's Blessing on This Wonderful World!", - "sourceNotes": "Cumulative episodes across S1 (10) + S2 (10, eps 11-20) + S3 (11, eps 21-31) = 31 total. Paired with the Watari Masahito manga adaptation (127 chapters, finished). Both adapt the same Natsume Akatsuki light novel; the Crimson Legends, Megumin spinoff, and Legend of Crimson movie are separate AniList entries.", - "mappings": [ - { - "episodes": [1, 10], - "chapters": [1, 27], - "arc": "Becoming an Adventurer / Dullahan (S1)" - }, - { - "episodes": [11, 20], - "chapters": [28, 60], - "arc": "Crimson Demons / Vanir / Lich Restoration (S2)" - }, - { - "episodes": [21, 31], - "chapters": [61, 100], - "arc": "Royal Capital (S3)" - }, - { "chapters": [101, 127], "arc": "Final Arcs (unadapted in TV anime)" } - ], - "movies": [ - { - "anilistId": 102976, - "title": "KONOSUBA - God's Blessing on This Wonderful World! Legend of Crimson", - "year": 2019, - "afterEpisode": 20, - "note": "Canon film between S2 and S3 (Crimson Demon Village)." - } - ] -} diff --git a/src/data/mappings/kotoura-san.json b/src/data/mappings/kotoura-san.json deleted file mode 100644 index 6d3dce9..0000000 --- a/src/data/mappings/kotoura-san.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "anilistAnimeId": 15379, - "anilistMangaId": 73443, - "title": "The Troubled Life of Miss Kotoura", - "sourceNotes": "Single season, 12 episodes. Manga complete at 39 chapters (7 volumes, 2010-2015) — a 4-koma gag/comedy series. The anime restructures the material into its own continuous, more dramatic narrative (e.g. the confession/reconciliation beat lands in the finale, versus as early as Ch. 3 in the manga), so episode-to-chapter correspondence is not sequential. 4-koma source — chapter ranges are approximate.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 39], - "arc": "Full Series (Anime-Original Narrative Order)" - } - ] -} diff --git a/src/data/mappings/kubo-wont-let-me-be-invisible.json b/src/data/mappings/kubo-wont-let-me-be-invisible.json deleted file mode 100644 index 55a7078..0000000 --- a/src/data/mappings/kubo-wont-let-me-be-invisible.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "anilistAnimeId": 148969, - "anilistMangaId": 112981, - "title": "Kubo Won't Let Me Be Invisible", - "sourceNotes": "Single 12-episode season (2023). Manga complete at 158 chapters per AniList (12 volumes, Weekly Young Jump). The anime adapts through roughly chapter 47, reordering some material for pacing. Slice-of-life romantic comedy with no distinct named arcs, so mapping uses one broad anime-adapted range plus the unadapted post-anime tail.", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 47], "arc": "Anime-Adapted Story" }, - { "chapters": [48, 158], "arc": "Unadapted Manga (Post-Anime)" } - ] -} diff --git a/src/data/mappings/kurokos-basketball.json b/src/data/mappings/kurokos-basketball.json deleted file mode 100644 index 226b211..0000000 --- a/src/data/mappings/kurokos-basketball.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "anilistAnimeId": 11771, - "anilistMangaId": 41652, - "title": "Kuroko's Basketball", - "sourceNotes": "Cumulative episodes across S1 (25) + S2 (25) + S3 (25) = 75 episodes, which adapt the entire main manga. Season endpoints (well-corroborated): S1 ~ch. 73, S2 ~ch. 169, S3 to the final chapter. Manga complete at 276 chapters per AniList (275 numbered chapters + a bonus per Wikipedia/Fandom). Arc names are fan conventions; the Introduction/Interhigh and Interhigh/Winter Cup cut-points are interpolated approximations (Winter Cup confidently begins at ch. 71).", - "mappings": [ - { "episodes": [1, 5], "chapters": [1, 16], "arc": "Introduction" }, - { - "episodes": [6, 25], - "chapters": [17, 73], - "arc": "Interhigh Tournament" - }, - { "episodes": [26, 75], "chapters": [74, 276], "arc": "Winter Cup" } - ], - "movies": [ - { - "anilistId": 21377, - "title": "Kuroko's Basketball: Last Game", - "year": 2017, - "afterEpisode": 75, - "note": "Adapts the separate 'Extra Game' sequel manga (Vorpal Swords vs Jabberwock), set after the Winter Cup; not part of the main 276-chapter series." - } - ] -} diff --git a/src/data/mappings/laid-back-camp.json b/src/data/mappings/laid-back-camp.json deleted file mode 100644 index 1745248..0000000 --- a/src/data/mappings/laid-back-camp.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "anilistAnimeId": 98444, - "anilistMangaId": 98351, - "title": "Laid-Back Camp", - "sourceNotes": "Cumulative episodes across three TV seasons: Season 1 (2018, 12 eps) + Season 2 (2021, 13 eps, eps 13-25) + Season 3 (2024, 12 eps, eps 26-37) = 37 total. Paired with Afro's slice-of-life camping manga 'Yuru Camp△' / 'Laid-Back Camp', ongoing (latest ~ch 107, March 2026; 18 tankobon vols, with Vol 18 covering ch 99-104). Volume-to-chapter anchors: V1=1-6, V2=7-13, V3=14-18, V4=19-23, V5=24-28, V6=29-34, V7=35-40, V8=41-46, V9=47-51, V10=52-57, V11=58-63, V12=64-69, V13=70-75, V14=76-81. Season anchors: S1 finishes Vol 4 (ep 10 bridges Vol 3->4, Christmas Camp finale in eps 10-12); the Izu Peninsula grand trip spans Vols 6-9 in S2; S3 features the 'Death Road' chapter (ch 59, Vol 11) and ends around ch 77, so a viewer resumes reading at ch 78. This is a very episodic show segmented by camping trips, so chapter boundaries are APPROXIMATE (especially the S2 setup/Izu split, which is an estimate) — refine via PR. The Room Camp (Heya Camp) shorts and per-season OVAs are separate side entries and are omitted.", - "mappings": [ - { - "episodes": [1, 9], - "chapters": [1, 18], - "arc": "Solo Camping & Outdoor Activities Club Formation (Lake Motosu, Lake Shibire, Fumotoppara)" - }, - { - "episodes": [10, 12], - "chapters": [19, 23], - "arc": "Christmas Camp at Lake Yamanaka (Season 1 finale)" - }, - { - "episodes": [13, 15], - "chapters": [24, 28], - "arc": "New Year Solo Camping & Izu Trip Planning (approx. split)" - }, - { - "episodes": [16, 25], - "chapters": [29, 51], - "arc": "Izu Peninsula Grand Camping Trip (Season 2)" - }, - { - "episodes": [26, 37], - "chapters": [52, 77], - "arc": "Outdoor Activities Club Continues, incl. 'Death Road' (Season 3)" - }, - { - "chapters": [78, 107], - "arc": "Ongoing camping trips (unadapted; current ch 107)" - } - ], - "movies": [ - { - "anilistId": 104460, - "title": "Laid-Back Camp Movie", - "year": 2022, - "afterEpisode": 25, - "note": "Canon sequel film (anime-original adult-timeline story): a grown-up Nadeshiko, Rin, Chiaki, Aoi and Ena reunite to build a campsite in Yamanashi. Not in the manga, so no chapter mapping; slots after Season 2 (eps 1-25)." - } - ] -} diff --git a/src/data/mappings/land-of-the-lustrous.json b/src/data/mappings/land-of-the-lustrous.json deleted file mode 100644 index 10a496f..0000000 --- a/src/data/mappings/land-of-the-lustrous.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "anilistAnimeId": 98707, - "anilistMangaId": 74489, - "title": "Land of the Lustrous", - "sourceNotes": "Single-cour anime (12 eps) by Orange adapts roughly chapters 1-36 of the manga (covering vol 1-6, through the winter/Antarcticite arc and the start of Phos's transformation; the anime skips ch 33-35 and adapts only parts of ch 32 and 36). The manga is complete at 108 chapters / 13 volumes (serialization ended April 2024, final volume Nov 2024), so the large post-anime tail (the Moon, the schism, and the final war through 'War's End' and the epilogue) is unadapted. Post-anime arc chapter boundaries are approximate, anchored to documented milestones (Phos taken to the Moon ~ch 63, gem defections ~ch 70, final assault ~ch 93, 'War's End' ch 95).", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 36], - "arc": "Phosphophyllite / Winter (Antarcticite) arc" - }, - { - "chapters": [37, 62], - "arc": "Aftermath & investigation (unadapted)" - }, - { - "chapters": [63, 92], - "arc": "The Moon & the schism (unadapted)" - }, - { - "chapters": [93, 108], - "arc": "Final war & ending (unadapted)" - } - ] -} diff --git a/src/data/mappings/life-lessons-with-uramichi-oniisan.json b/src/data/mappings/life-lessons-with-uramichi-oniisan.json deleted file mode 100644 index 8121405..0000000 --- a/src/data/mappings/life-lessons-with-uramichi-oniisan.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 112802, - "anilistMangaId": 100704, - "title": "Life Lessons with Uramichi Oniisan", - "sourceNotes": "Anime is 13 TV episodes (2020-2021), adapting Volumes 1-4 of the manga (through roughly chapter 36) with some anime-exclusive scenes woven in. Manga ongoing (current ch. ~76). Episodic workplace comedy with no distinct named story arcs.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 36], - "arc": "Season 1 (TV) — Volumes 1-4" - }, - { "chapters": [37, 76], "arc": "Manga-only chapters (post-anime)" } - ] -} diff --git a/src/data/mappings/log-horizon.json b/src/data/mappings/log-horizon.json deleted file mode 100644 index 8522d72..0000000 --- a/src/data/mappings/log-horizon.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "anilistAnimeId": 17265, - "anilistMangaId": 75893, - "title": "Log Horizon", - "sourceNotes": "S1 anime (25 eps, 2013-2014) paired with the Kazuhiro Hara manga adaptation (10 chapters, finished). Both adapt the Mamare Touno light novel; the manga covered only the early arc. S2 (eps 26-50) and Destruction of the Round Table (eps 51-62) go beyond the manga's coverage and have no manga reference.", - "mappings": [ - { - "episodes": [1, 25], - "chapters": [1, 10], - "arc": "Apocalypse / Crescent Moon Alliance (S1)" - } - ] -} diff --git a/src/data/mappings/lord-marksman-and-vanadis.json b/src/data/mappings/lord-marksman-and-vanadis.json deleted file mode 100644 index 97ead38..0000000 --- a/src/data/mappings/lord-marksman-and-vanadis.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "anilistAnimeId": 20809, - "anilistMangaId": 73391, - "title": "Lord Marksman and Vanadis", - "sourceNotes": "Single-cour, 13-episode anime adapting the first five light novel volumes in full. Manga (Nobuhiko Yanai, Comic Flapper) is complete at 51 chapters covering the same span as the anime, so the whole manga is adapted with no unadapted tail. Arc names come from the fandom wiki's 'Arc One' breakdown (Archer and Vanadis / Two Vanadis / Roland); exact chapter boundaries are approximated from the wiki's episode synopses since no chapter-precise guide was found, so treat them as approximate.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 12], - "arc": "Archer and Vanadis Arc" - }, - { "episodes": [4, 5], "chapters": [13, 20], "arc": "Two Vanadis Arc" }, - { "episodes": [6, 13], "chapters": [21, 51], "arc": "Roland Arc" } - ] -} diff --git a/src/data/mappings/love-after-world-domination.json b/src/data/mappings/love-after-world-domination.json deleted file mode 100644 index 976c9ac..0000000 --- a/src/data/mappings/love-after-world-domination.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 132010, - "anilistMangaId": 111390, - "title": "Love After World Domination", - "sourceNotes": "Single-cour 12-episode TV anime (Project No.9, 2022). Manga complete at 37 chapters across 6 volumes, though the series was cancelled and ended without a full narrative conclusion. Fan continue-reading guides indicate the anime adapts all but the last chapter of Volume 4, i.e. chapters 1-24; the remaining chapters were never adapted. No distinct named story arcs, so broad season/volume-based entries are used.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 24], - "arc": "Season 1 (Volumes 1-4)" - }, - { - "chapters": [25, 37], - "arc": "Unadapted (Volumes 4-6, manga ended unresolved)" - } - ] -} diff --git a/src/data/mappings/love-and-lies.json b/src/data/mappings/love-and-lies.json deleted file mode 100644 index 0059eb6..0000000 --- a/src/data/mappings/love-and-lies.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "anilistAnimeId": 98320, - "anilistMangaId": 85566, - "title": "LOVE and LIES", - "sourceNotes": "Single 12-episode season (2017), the only TV anime. Source is the manga Koi to Uso, serialized in the Manga Box app in short installments; community guides use a fine chapter numbering (~287 chapters) in which the anime ends at chapter 118, while AniList lists 301 chapters (including bonus/extra installments). Manga complete. Per-episode chapter boundaries are approximate (proportional across the ~118 adapted chapters, aligned to episode narrative beats). A 2-episode OVA exists but is home-video (excluded). Unadapted tail extended to AniList's final count of 301.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 30], - "arc": "Confession & Assignment" - }, - { - "episodes": [4, 6], - "chapters": [31, 60], - "arc": "Family Camp & Ministry Seminar" - }, - { - "episodes": [7, 9], - "chapters": [61, 90], - "arc": "School Festival" - }, - { - "episodes": [10, 12], - "chapters": [91, 118], - "arc": "Wedding Trip & Ririna's Strategy" - }, - { - "chapters": [119, 220], - "arc": "Deepening Love Triangle" - }, - { - "chapters": [221, 301], - "arc": "Choosing an Ending" - } - ] -} diff --git a/src/data/mappings/love-tyrant.json b/src/data/mappings/love-tyrant.json deleted file mode 100644 index df43378..0000000 --- a/src/data/mappings/love-tyrant.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 21517, - "anilistMangaId": 71949, - "title": "Love Tyrant", - "sourceNotes": "Single 12-episode TV season (2017). Manga (Renai Boukun) complete at 61 chapters (14 volumes, 2013-2018) — only ~11 volumes (ch 1-44) were published by the time the anime finished airing. The anime adapts the manga's opening arc faithfully through ch 32 across its 12 episodes, condensing/omitting some minor manga chapters and side characters along the way; chapters 33-61 (the manga's back half, including characters and plotlines never introduced in the anime) remain unadapted.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 32], - "arc": "Cupid's Contract / Harem Formation Arc" - }, - { - "chapters": [33, 61], - "arc": "Later chapters (unadapted; anime does not continue)" - } - ] -} diff --git a/src/data/mappings/lovely-complex.json b/src/data/mappings/lovely-complex.json deleted file mode 100644 index 6ea9218..0000000 --- a/src/data/mappings/lovely-complex.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "anilistAnimeId": 2034, - "anilistMangaId": 30031, - "title": "Lovely Complex", - "sourceNotes": "Single-cour adaptation: 24 episodes covering roughly the first half of the 72-chapter manga (17 volumes, completed 2007, including the Love Com Final one-shot). Source is Aya Nakahara's Lovely★Complex / Love★Com (AniList manga id 30031). The anime tracks the manga closely and roughly one chapter per episode through the first two-thirds, then condenses; episode 24 ends around chapter 47, leaving the later dating/graduation half unadapted. This romcom has no official arc names, so arc labels are descriptive of narrative beats and chapter boundaries are approximate — refine via PR.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 8], - "arc": "Comedy Duo / Failed Matchmaking" - }, - { - "episodes": [5, 10], - "chapters": [9, 18], - "arc": "Risa Falls / Umibozu Concert" - }, - { - "episodes": [11, 17], - "chapters": [19, 32], - "arc": "Confession & Haruka Rivalry" - }, - { - "episodes": [18, 24], - "chapters": [33, 47], - "arc": "Becoming a Couple" - }, - { - "chapters": [48, 58], - "arc": "Kohori & Relationship Trials" - }, - { - "chapters": [59, 72], - "arc": "Graduation & Love Com Final" - } - ] -} diff --git a/src/data/mappings/lucky-star.json b/src/data/mappings/lucky-star.json deleted file mode 100644 index cf6055b..0000000 --- a/src/data/mappings/lucky-star.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 1887, - "anilistMangaId": 30587, - "title": "Lucky☆Star", - "sourceNotes": "Single 24-episode TV season (2007, Kyoto Animation). Paired with Kagami Yoshimizu's original Lucky☆Star 4-koma manga (id 30587), a slice-of-life gag comic serialized in Comptiq since December 2003. The manga ran to 10 tankōbon volumes (2005-2013), went on hiatus in 2014, and was revived in Kadokawa's Mitaina! magazine in November 2022 — it is ONGOING and the post-revival chapters are not yet compiled, so AniList lists no chapter count. As a 4-koma gag series there are no story arcs, just episodic vignettes; the anime loosely adapts and reorders strips from across the early volumes and pads with anime-original segments, so episode-to-chapter boundaries are coarse. 4-koma source — chapter ranges are approximate. The Lucky☆Star OVA (id 4472) is an OVA, not a theatrical film, so no movies are listed.", - "mappings": [ - { - "episodes": [1, 24], - "chapters": [1, 56], - "arc": "Everyday school-life vignettes (Konata, the Hiiragi twins, Miyuki) — loosely adapted & reordered from early vols ~1-4 with anime-original segments" - }, - { - "chapters": [57, 140], - "arc": "Later vignettes (vols ~5-10) + ongoing Mitaina! revival — manga only, unadapted" - } - ] -} diff --git a/src/data/mappings/lycoris-recoil.json b/src/data/mappings/lycoris-recoil.json deleted file mode 100644 index 7552812..0000000 --- a/src/data/mappings/lycoris-recoil.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "anilistAnimeId": 143270, - "anilistMangaId": 151808, - "title": "Lycoris Recoil", - "sourceNotes": "13-episode anime (2022). Original anime; manga tie-in by Yasunori Bizen is ongoing (current ch. 40 across 8 volumes as of Jan 2026), retelling the anime at roughly 3 chapters per episode. The TV story wraps around ch. 39, with ch. 40+ moving into new original material beyond the anime's ending. Arc split follows the series' well-documented structural turn at episode 6/7 from episodic slice-of-life to the Majima/DA conspiracy plot.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 18], - "arc": "Direct Attack Missions / Cafe LycoReco (Episodic)" - }, - { - "episodes": [7, 13], - "chapters": [19, 39], - "arc": "Alan Institute Conspiracy / Chisato's Past" - }, - { "chapters": [40, 40], "arc": "Original Continuation (Post-Anime)" } - ] -} diff --git a/src/data/mappings/made-in-abyss.json b/src/data/mappings/made-in-abyss.json deleted file mode 100644 index 200340d..0000000 --- a/src/data/mappings/made-in-abyss.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "anilistAnimeId": 97986, - "anilistMangaId": 86551, - "title": "Made in Abyss", - "sourceNotes": "Cumulative episodes across S1 (13) + Dawn of the Deep Soul movie (1, counted as ep 14) + S2 Golden City of the Scorching Sun (12) = 26. Manga ongoing (14 tankōbon vols as of Aug 2025, ~65 chapters estimated). Arc names are fan-conventional; chapter caps for the tail are approximate — refine via PR.", - "mappings": [ - { - "episodes": [1, 8], - "chapters": [1, 15], - "arc": "Town of the Great Pit / Seeker Camp" - }, - { - "episodes": [9, 13], - "chapters": [16, 26], - "arc": "Ozen of the Immovable / Inibyo Forest" - }, - { - "episodes": [14, 14], - "chapters": [27, 39], - "arc": "Idofront / Bondrewd (Movie)" - }, - { - "episodes": [15, 26], - "chapters": [40, 60], - "arc": "Capital of the Unreturned / Village of Iruburu" - }, - { "chapters": [61, 65], "arc": "Ganja Squad / Faputa (Ongoing)" } - ], - "movies": [ - { - "anilistId": 100643, - "title": "Made in Abyss: Dawn of the Deep Soul", - "year": 2020, - "chapters": [27, 39], - "afterEpisode": 13, - "note": "Canon Idofront / Bondrewd arc; counted as ep 14 in this mapping's cumulative numbering." - } - ] -} diff --git a/src/data/mappings/madoka-magica.json b/src/data/mappings/madoka-magica.json deleted file mode 100644 index c4d31f0..0000000 --- a/src/data/mappings/madoka-magica.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "anilistAnimeId": 9756, - "anilistMangaId": 54457, - "title": "Puella Magi Madoka Magica", - "sourceNotes": "12-episode 2011 anime (SHAFT) is the original work. Paired with the Hanokage manga (12 chapters / 3 vols, 2011) which is a near-1:1 manga retelling of the anime. Multiple spinoff manga (Oriko Magica, Kazumi Magica, etc.) and the Rebellion movie are separate AniList entries.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 4], - "arc": "Wish & Witches' Introduction" - }, - { "episodes": [5, 8], "chapters": [5, 8], "arc": "Sayaka's Fall" }, - { - "episodes": [9, 12], - "chapters": [9, 12], - "arc": "Walpurgisnacht / Madoka's Wish" - } - ], - "movies": [ - { - "anilistId": 11981, - "title": "Puella Magi Madoka Magica the Movie -Rebellion-", - "year": 2013, - "afterEpisode": 12, - "note": "Canon sequel film." - } - ] -} diff --git a/src/data/mappings/magi-adventure-of-sinbad.json b/src/data/mappings/magi-adventure-of-sinbad.json deleted file mode 100644 index 29b898d..0000000 --- a/src/data/mappings/magi-adventure-of-sinbad.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "anilistAnimeId": 21394, - "anilistMangaId": 78025, - "title": "Magi: Adventure of Sinbad", - "sourceNotes": "Prequel spin-off to Magi (distinct source manga \"Magi: The Adventures of Sinbad\", AniList 78025). Single 13-episode TV season (Lay-duce, 2016), so episodes are non-cumulative. The anime is a compressed adaptation ending at chapter 55 (end of the Artemyra Arc) — community guides advise resuming the manga at ch. 55. Arc chapter boundaries per the Magi wiki / magimanga arc guide; per-episode assignments to those five arcs are approximate due to pacing. Manga complete at 182 chapters (19 volumes, ended 2018). Arcs from ch. 56 (Slave Arc) onward are unadapted. A separate 5-episode OVA (AniList 20609) covers the early Baal/Valefor material and is not mapped here.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 12], - "arc": "Baal" - }, - { - "episodes": [4, 6], - "chapters": [13, 29], - "arc": "Imuchakk" - }, - { - "episodes": [7, 8], - "chapters": [30, 38], - "arc": "Reim Empire" - }, - { - "episodes": [9, 10], - "chapters": [39, 45], - "arc": "Sasan" - }, - { - "episodes": [11, 13], - "chapters": [46, 55], - "arc": "Artemyra" - }, - { - "chapters": [56, 81], - "arc": "Slave" - }, - { - "chapters": [82, 111], - "arc": "Heliohapt" - }, - { - "chapters": [112, 119], - "arc": "Dark Continent" - }, - { - "chapters": [120, 129], - "arc": "Parthevia" - }, - { - "chapters": [130, 149], - "arc": "Forming of Sindria" - }, - { - "chapters": [150, 177], - "arc": "Sindrian War" - }, - { - "chapters": [178, 182], - "arc": "Epilogue" - } - ] -} diff --git a/src/data/mappings/magi.json b/src/data/mappings/magi.json deleted file mode 100644 index 0fef934..0000000 --- a/src/data/mappings/magi.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "anilistAnimeId": 14513, - "anilistMangaId": 44790, - "title": "Magi: The Labyrinth of Magic", - "sourceNotes": "Cumulative episodes across S1 (25) + The Kingdom of Magic / S2 (25, cumulative eps 26-50) = 50 total. Manga complete at 369 chapters; anime covers up to ch 198. Chapters 199-369 (Second Balbadd, Alma Torran, Kou Empire, Final Arc) are unadapted. Sinbad no Bouken is a separate prequel franchise.", - "mappings": [ - { "episodes": [1, 3], "chapters": [1, 16], "arc": "Dungeon" }, - { "episodes": [4, 6], "chapters": [17, 31], "arc": "Kouga / Morgiana" }, - { "episodes": [7, 13], "chapters": [32, 76], "arc": "Balbadd" }, - { - "episodes": [14, 25], - "chapters": [77, 129], - "arc": "Sindria / Zagan (S1 Finale)" - }, - { - "episodes": [26, 50], - "chapters": [130, 198], - "arc": "Magnostadt (Kingdom of Magic)" - }, - { - "chapters": [199, 369], - "arc": "Second Balbadd / Alma Torran / Kou Empire / Final Arc (unadapted)" - } - ] -} diff --git a/src/data/mappings/magical-girl-site.json b/src/data/mappings/magical-girl-site.json deleted file mode 100644 index 0e7c3ae..0000000 --- a/src/data/mappings/magical-girl-site.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 100010, - "anilistMangaId": 85666, - "title": "MAGICAL GIRL SITE", - "sourceNotes": "Single-cour 12-episode TV anime (production doA, 2018). Manga complete at 141 chapters / 16 volumes per AniList (some fan sources cite 139 for the same complete run; the discrepancy is bonus/renumbered installments). The anime follows the manga fairly closely through roughly chapter 46 (Nijimin's funeral), then diverges into an anime-original ending for its final episode(s) rather than adapting further chapters. Chapters 47-141 continue the manga-only story past that divergence point.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 46], - "arc": "Magical Girl Site (TV adaptation, diverges before the finale)" - }, - { "chapters": [47, 141], "arc": "Unadapted continuation" } - ] -} diff --git a/src/data/mappings/magical-sempai.json b/src/data/mappings/magical-sempai.json deleted file mode 100644 index d1e82ad..0000000 --- a/src/data/mappings/magical-sempai.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 105074, - "anilistMangaId": 87056, - "title": "Magical Sempai", - "sourceNotes": "12-episode single-cour anime (Liden Films, 2019); each ~12-minute episode strings together 3-5 short skits drawn non-sequentially from the manga (the finale alone pulls from ch. 78, 24, 10, and 15). Manga complete at 134 chapters (8 volumes, Weekly Young Magazine, 2016-2021). The anime's material is drawn from up through roughly ch. 78; chs. 79-134 (the manga's final two volumes) are unadapted. Chapter ranges are approximate given the non-linear episode-to-chapter drawing.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 78], - "arc": "Magic Club Antics (Season 1 material)" - }, - { "chapters": [79, 134], "arc": "Post-anime (unadapted)" } - ] -} diff --git a/src/data/mappings/maid-sama.json b/src/data/mappings/maid-sama.json deleted file mode 100644 index 8dc4ae4..0000000 --- a/src/data/mappings/maid-sama.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "anilistAnimeId": 7054, - "anilistMangaId": 32921, - "title": "Maid Sama!", - "sourceNotes": "Single 26-episode TV anime (J.C.Staff, 2010). Manga by Hiro Fujiwara is complete: AniList lists 99 chapters across 18 volumes, but the main run is 85 numbered story chapters (ending with ch. 85, where Misaki and Usui marry); AniList's higher total counts side-story/extra chapters. Final chapter count uses AniList's 99 per convention. The anime adapts only the early manga, roughly the first 8 tankobon volumes (about chapters 1-36), stopping around the Hinata Shintani / Seika student-council-election material. The series is largely episodic slice-of-life romance, and the anime reorders events and pads its second cour (eps 14-26) with anime-original content (the Soutarou Kano hypnotism arc, Maid Latte beach/footman events), so episode-to-chapter boundaries are approximate volume-aligned groupings. The large unadapted tail (ch. 37-99) covers the Igarashi/Walker and England (Britain) arcs and the finale. No theatrical films exist (the only Maid-sama film is a 2018 live-action movie, excluded), so the movies key is omitted.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 9], - "arc": "Introduction: Maid-Sama! & Aoi Hyoudou (Vols 1-2)" - }, - { - "episodes": [5, 9], - "chapters": [10, 19], - "arc": "Igarashi Tora / Miyabigaoka & Cultural Festival (Vols 3-4)" - }, - { - "episodes": [10, 11], - "chapters": [20, 24], - "arc": "Sakura's Band & Usui's Past (Vol 5)" - }, - { - "episodes": [12, 13], - "chapters": [25, 28], - "arc": "Sports Festival (Vol 6; first-cour finale)" - }, - { - "episodes": [14, 20], - "chapters": [29, 32], - "arc": "Kano Hypnotism, Beach & Footman Events (Vol 7; anime expands with filler)" - }, - { - "episodes": [21, 26], - "chapters": [33, 36], - "arc": "Hinata Shintani & Student-Council Election (Vol 8; anime ends here)" - }, - { - "chapters": [37, 99], - "arc": "Unadapted Tail: Igarashi/Walker & England (Britain) arcs through the finale (unadapted)" - } - ] -} diff --git a/src/data/mappings/makeine-too-many-losing-heroines.json b/src/data/mappings/makeine-too-many-losing-heroines.json deleted file mode 100644 index 19b588c..0000000 --- a/src/data/mappings/makeine-too-many-losing-heroines.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "anilistAnimeId": 171457, - "anilistMangaId": 135276, - "title": "Makeine: Too Many Losing Heroines!", - "sourceNotes": "LN-based (Gagaga Bunko, by Takibi Amamori), so ranges are by light-novel VOLUME — the \"chapters\" numbers here denote LN volume numbers, which is what community episode-to-source guides use (a tie-in @comic manga exists but is the minor adaptation). Cumulative episodes cover S1 only (12 eps); S1 adapts LN volumes 1-3, one volume per heroine arc. Episode 12 is an anime-original finale written by the author and does not correspond to an LN volume. LN ongoing at 8 volumes (as of May 2025); volumes 4-8 are unadapted (S2 is expected to begin from volume 4). Per-volume arc names follow the fandom wiki's Losing Heroine arc labels.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 1], - "arc": "Anna Yanami's Losing Heroine Arc" - }, - { - "episodes": [5, 7], - "chapters": [2, 2], - "arc": "Lemon Yakishio's Losing Heroine Arc" - }, - { - "episodes": [8, 11], - "chapters": [3, 3], - "arc": "Chika Komari's Losing Heroine Arc" - }, - { - "chapters": [4, 4], - "arc": "Koto Tsukinoki / BL Fanfiction Arc" - }, - { - "chapters": [5, 5], - "arc": "Kaju's Valentine's Arc" - }, - { - "chapters": [6, 6], - "arc": "Aquarium Date / Graduation Arc" - }, - { - "chapters": [7, 7], - "arc": "Riko Shiratama Arc (Second Year Begins)" - }, - { - "chapters": [8, 8], - "arc": "Student Council Election Arc" - } - ] -} diff --git a/src/data/mappings/maoyu.json b/src/data/mappings/maoyu.json deleted file mode 100644 index b58d237..0000000 --- a/src/data/mappings/maoyu.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 14833, - "anilistMangaId": 58125, - "title": "Maoyu: Archenemy & Hero", - "sourceNotes": "Single 12-episode 2013 anime by Arms (plus a 9.5 recap special, not counted in the sequence); no later seasons, so anilistAnimeId is 14833. Light-novel sourced: mapped to the AniList novel entry (id 58125), which is complete at 5 main volumes + 3 side-story volumes and lists 63 chapters. The novel numbers its content as \"scrolls\" (Vol. 1 = 11 scrolls, Vol. 2 = 10 scrolls). The anime is a diligent adaptation covering Vol. 1 in full and Vol. 2 through roughly scroll 5 — community episode-to-source guides advise resuming reading at \"Novel 2, Chapter 5.\" Chapter ranges are by volume/scroll and episode boundaries are approximate; the final entry extends to the source's 63-chapter total. No theatrical films or OVAs exist.", - "mappings": [ - { - "episodes": [1, 9], - "chapters": [1, 11], - "arc": "The Alliance and the Southern Reforms (Vol. 1)" - }, - { - "episodes": [10, 12], - "chapters": [12, 16], - "arc": "Conspiracy of the Kurultai — anime portion (Vol. 2)" - }, - { - "chapters": [17, 63], - "arc": "The War's End (Vols. 2-5, unadapted)" - } - ] -} diff --git a/src/data/mappings/marriagetoxin.json b/src/data/mappings/marriagetoxin.json deleted file mode 100644 index 73613a8..0000000 --- a/src/data/mappings/marriagetoxin.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 199547, - "anilistMangaId": 147329, - "title": "MARRIAGETOXIN", - "sourceNotes": "Single 13-episode season. Manga ongoing (current ch. 171); AniList does not track chapter counts for this series so figures are sourced from tracking sites. Arc names and chapter boundaries from the series' fandom wiki, cross-checked against per-episode adaptation notes (e.g. Episode 4 = ch. 10-12, Episode 7 = ch. 20-23, Episode 13 = ch. 45-48). The finale straddles the Beast User and Teruaki arcs.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 9], - "arc": "Intro Arc / Water User Arc" - }, - { - "episodes": [4, 6], - "chapters": [10, 19], - "arc": "Sound User Arc" - }, - { - "episodes": [7, 7], - "chapters": [20, 23], - "arc": "Bug User's Wedding Arc" - }, - { - "episodes": [8, 13], - "chapters": [24, 48], - "arc": "Beast User Arc" - }, - { - "chapters": [49, 171], - "arc": "Teruaki Arc onward (unadapted)" - } - ] -} diff --git a/src/data/mappings/masamune-kun-revenge.json b/src/data/mappings/masamune-kun-revenge.json deleted file mode 100644 index 996fe07..0000000 --- a/src/data/mappings/masamune-kun-revenge.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 21857, - "anilistMangaId": 76716, - "title": "Masamune-kun's Revenge", - "sourceNotes": "Cumulative episodes across S1 (12, 2017) + S2 'R' (12, eps 13-24, 2023) = 24 total. Manga by Hazuki Takeoka & Tiv is complete: the serialized main story runs 49 numbered chapters (plus a ch. 9.5) across 10 volumes, ending June 2018. AniList's entry reports 54 chapters because it folds in the Volume 0 bonus chapters and one-shot specials; the figures here track the 49-chapter main story, which both anime seasons fully adapt. The OVA and the separate 'After School' / 'engagement' sequels are excluded.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 29], - "arc": "The Revenge Plan (Aki & Yoshino / Tsunade Island / culture-festival play, vols 1-6)" - }, - { - "episodes": [13, 24], - "chapters": [30, 49], - "arc": "Resolution (the Yoshino twist through the finale, vols 7-10)" - } - ] -} diff --git a/src/data/mappings/mashle.json b/src/data/mappings/mashle.json deleted file mode 100644 index 44a1300..0000000 --- a/src/data/mappings/mashle.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 151801, - "anilistMangaId": 114960, - "title": "Mashle: Magic and Muscles", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 Divine Visionary Candidate Exam (12). Manga complete at 162 chapters; anime adapted through ch ~74. Arc boundaries from Mashle Wiki.", - "mappings": [ - { "episodes": [1, 7], "chapters": [1, 15], "arc": "Easton Enrollment" }, - { "episodes": [8, 12], "chapters": [16, 39], "arc": "Magia Lupus" }, - { "episodes": [13, 14], "chapters": [40, 43], "arc": "Execution" }, - { - "episodes": [15, 24], - "chapters": [44, 74], - "arc": "Divine Visionary Selection Exam" - }, - { "chapters": [75, 102], "arc": "Tri-Magic-Athalon Final Exam" }, - { "chapters": [103, 162], "arc": "Eclipse (Final Arc)" } - ] -} diff --git a/src/data/mappings/mayo-chiki.json b/src/data/mappings/mayo-chiki.json deleted file mode 100644 index 996e2ca..0000000 --- a/src/data/mappings/mayo-chiki.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 10110, - "anilistMangaId": 51860, - "title": "Mayo Chiki!", - "sourceNotes": "Single-cour 13-episode TV anime (2011) adapting Hajime Asano's light novel; paired here with the NEET-illustrated manga adaptation (complete at 39 chapters across 7 volumes). Anime covers through roughly manga chapter 18 (readers are pointed to Vol. 4 Ch. 19 to continue after the anime); episode 13 is a largely anime-original epilogue. Continuous rom-com without formally named story arcs.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 18], - "arc": "TV Anime Adaptation (Subaru's Secret → Butler Reinstatement)" - }, - { - "chapters": [19, 39], - "arc": "Unadapted manga chapters (never adapted in the TV anime)" - } - ] -} diff --git a/src/data/mappings/mieruko-chan.json b/src/data/mappings/mieruko-chan.json deleted file mode 100644 index 531d10f..0000000 --- a/src/data/mappings/mieruko-chan.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 131083, - "anilistMangaId": 105097, - "title": "Mieruko-chan", - "sourceNotes": "Single-cour 2021 TV anime (12 eps) adapting Tomoki Izumi's ongoing horror-comedy manga (Kadokawa). The anime covers manga volumes 1-3, roughly chapters 1-23; the author has said readers should resume at chapter 24. Manga is RELEASING (~ch. 71 / 14 volumes as of mid-2026 per web sources). The series is loosely structured with episodic spirit encounters, so episode-to-chapter groupings follow the volume boundaries and are approximate. No theatrical films.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 7], - "arc": "Awakening (Volume 1: Miko starts seeing spirits, befriends Hana Yurikawa)" - }, - { - "episodes": [5, 8], - "chapters": [8, 16], - "arc": "Mountain God & New Encounters (Volume 2: shrine deity, fortune teller, Yulia)" - }, - { - "episodes": [9, 12], - "chapters": [17, 23], - "arc": "Zen & the Cats (Volume 3: Zen Touno and the cat-killer resolution)" - }, - { - "chapters": [24, 71], - "arc": "Continued Sightings (ongoing, unadapted)" - } - ] -} diff --git a/src/data/mappings/misfit-of-demon-king-academy.json b/src/data/mappings/misfit-of-demon-king-academy.json deleted file mode 100644 index 80c9bad..0000000 --- a/src/data/mappings/misfit-of-demon-king-academy.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 112301, - "anilistMangaId": 106601, - "title": "The Misfit of Demon King Academy", - "sourceNotes": "Cumulative episodes across S1 (13, eps 1-13) + S2 'II' Cour 1 (12, eps 14-25) + S2 'II' Cour 2 (12, eps 26-37) = 37 total. Source is the Shu light novel; the anime adapts roughly LN volumes 1-6 (S1 = vols 1-3, S2 Cour 1 = vol 4, S2 Cour 2 = vols 5-6). The Kayaharuka manga adaptation was CANCELLED at 16 chapters / 4 volumes when the artist died (July 2021); it reaches only ~anime episode 7 (LN vol 2, ending mid-duel in the Magic Sword Tournament). Episodes 8-37 (Hero Academy / Spirit-Human Exchange, Great Spirit, and Selection Judgment arcs; LN vols 3-6) have no manga coverage and must be continued in the light novel. Mapped entries cover only the manga's actual extent. No films.", - "mappings": [ - { - "episodes": [1, 5], - "chapters": [1, 11], - "arc": "Demon King Academy / Resurrection (LN vol 1)" - }, - { - "episodes": [6, 7], - "chapters": [12, 16], - "arc": "Magic Sword Tournament (LN vol 2; manga ends mid-arc)" - } - ] -} diff --git a/src/data/mappings/mmo-junkie.json b/src/data/mappings/mmo-junkie.json deleted file mode 100644 index fa0d738..0000000 --- a/src/data/mappings/mmo-junkie.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 99726, - "anilistMangaId": 94095, - "title": "Recovery of an MMO Junkie", - "sourceNotes": "Anime (10 TV eps, 2017) + a Blu-ray-bundled OVA, counted here as ep 11. Paired with Rin Kokuyou's Comico webcomic 'Net-juu no Susume': 87 serialized chapters (2 print volumes) before a July 2015 hiatus that became a 2018 cancellation due to the author's health; a single special finale was later posted free on pixiv in 2023 (informally ch 88-89), so the complete story runs to ~89. Because the manga stalled, the TV anime supplies a partly anime-original conclusion in ep 10, so chapter boundaries are loose and approximate. This slice-of-life romcom is episodic; groupings are coarse. No theatrical films.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 24], - "arc": "NEET Life & Fruits de Mer (Moriko quits work, becomes Hayashi, befriends Lily)" - }, - { - "episodes": [4, 7], - "chapters": [25, 50], - "arc": "Secret Triangle (Moriko & Sakurai meet IRL while Hayashi & Lily bond online)" - }, - { - "episodes": [8, 10], - "chapters": [51, 72], - "arc": "Nanter SG Reveal & Drawing Closer (Sakurai's confession; anime-original ending)" - }, - { - "episodes": [11, 11], - "chapters": [73, 80], - "arc": "OVA: Blu-ray Bonus Extra" - }, - { - "chapters": [81, 89], - "arc": "Hiatus Tail & 2023 Pixiv Finale (unadapted)" - } - ] -} diff --git a/src/data/mappings/mob-psycho-100.json b/src/data/mappings/mob-psycho-100.json deleted file mode 100644 index 8dbe52e..0000000 --- a/src/data/mappings/mob-psycho-100.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "anilistAnimeId": 21507, - "anilistMangaId": 85189, - "title": "Mob Psycho 100", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (13) + S3 (12). Manga is 101 chapters; arcs are episode-grouped, chapter ranges approximate.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 18], - "arc": "Telepathy Club & Body Improvement" - }, - { "episodes": [7, 12], "chapters": [19, 38], "arc": "Claw 7th Division" }, - { "episodes": [13, 19], "chapters": [39, 60], "arc": "Mogami / Awakening" }, - { "episodes": [20, 25], "chapters": [61, 80], "arc": "Claw Arc Concluded" }, - { - "episodes": [26, 31], - "chapters": [81, 92], - "arc": "Divine Tree & Psycho Helmet" - }, - { - "episodes": [32, 37], - "chapters": [93, 101], - "arc": "Confession & ???% Mob" - } - ] -} diff --git a/src/data/mappings/monster-musume.json b/src/data/mappings/monster-musume.json deleted file mode 100644 index 4815567..0000000 --- a/src/data/mappings/monster-musume.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 21093, - "anilistMangaId": 66213, - "title": "Monster Musume: Everyday Life with Monster Girls", - "sourceNotes": "Single-cour 2015 TV anime (12 episodes) paired with Okayado's ongoing manga 'Monster Musume no Iru Nichijou' (~ch. 95 / 21 vols as of early 2026, ch. 95 released Feb 2026 per the Daily Life With A Monster Girl Wiki). The anime adapts roughly the first 25 chapters but reorders several of them and skips ch. 17 (the swimsuit chapter, adapted instead as an OVA), so episode-to-chapter boundaries are approximate. Chapter ranges below are grouped by which monster girls each block of episodes introduces. A viewer who finishes the anime resumes the manga around ch. 26.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 6], - "arc": "Miia, Papi & Centorea (Lamia, Harpy, Centaur introduced)" - }, - { - "episodes": [4, 6], - "chapters": [7, 14], - "arc": "Suu & Meroune (Slime, Mermaid introduced; shedding & egg-laying)" - }, - { - "episodes": [7, 9], - "chapters": [15, 19], - "arc": "Rachnera & the MON Squad (Arachne introduced; stalker letters)" - }, - { - "episodes": [10, 12], - "chapters": [20, 25], - "arc": "Ms. Smith, Lala & Cultural Exchange Finale (Dullahan introduced)" - }, - { - "chapters": [26, 95], - "arc": "Homestay Saga Continues (ongoing, unadapted)" - } - ] -} diff --git a/src/data/mappings/monster.json b/src/data/mappings/monster.json deleted file mode 100644 index 59e3010..0000000 --- a/src/data/mappings/monster.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "anilistAnimeId": 19, - "anilistMangaId": 30001, - "title": "Monster", - "sourceNotes": "Linear ~2.2 ch/ep adaptation. Arc boundaries follow major narrative beats; chapter ranges approximate. Refine via PR.", - "mappings": [ - { - "episodes": [1, 7], - "chapters": [1, 16], - "arc": "Düsseldorf & the Awakening" - }, - { "episodes": [8, 23], "chapters": [17, 50], "arc": "Search for Johan" }, - { - "episodes": [24, 39], - "chapters": [51, 85], - "arc": "511 Kinderheim & the Red Rose Mansion" - }, - { "episodes": [40, 54], "chapters": [86, 119], "arc": "Munich & Prague" }, - { "episodes": [55, 74], "chapters": [120, 162], "arc": "Ruhenheim" } - ] -} diff --git a/src/data/mappings/more-than-a-married-couple.json b/src/data/mappings/more-than-a-married-couple.json deleted file mode 100644 index 5432722..0000000 --- a/src/data/mappings/more-than-a-married-couple.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "anilistAnimeId": 141949, - "anilistMangaId": 105011, - "title": "More than a Married Couple, but Not Lovers", - "sourceNotes": "Single-cour 2022 TV anime (12 eps) by Studio Mother, adapting Yuki Kanamaru's seinen manga (Young Ace, 2018-). The school's 'marriage practical' pairs Jirou Yakuin with Akari Watanabe though each pines for someone else. The anime covers roughly chapters 1-29 (a reader resumes at ch 30). Per-episode boundaries are approximate, anchored to known marks: ep 5 ~ch 10, ep 7 ~ch 16, ep 11 ~ch 26, ep 12 finale ~ch 29. Manga is on indefinite hiatus (since April 2025) preparing its final part; latest is ch 79 / 13 volumes, used as the unadapted-tail endpoint. No theatrical films exist.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 5], - "arc": "The Marriage Practical Begins" - }, - { - "episodes": [3, 5], - "chapters": [6, 10], - "arc": "Adjusting to Married Life" - }, - { - "episodes": [6, 7], - "chapters": [11, 16], - "arc": "Summer Festival & Fireworks" - }, - { - "episodes": [8, 9], - "chapters": [17, 21], - "arc": "Childhood Friends & Old Feelings" - }, - { - "episodes": [10, 11], - "chapters": [22, 26], - "arc": "Tangled Hearts" - }, - { - "episodes": [12, 12], - "chapters": [27, 29], - "arc": "The Practical's Conclusion (season finale)" - }, - { - "chapters": [30, 79], - "arc": "Beyond the Anime (ongoing, unadapted)" - } - ] -} diff --git a/src/data/mappings/moriarty-the-patriot.json b/src/data/mappings/moriarty-the-patriot.json deleted file mode 100644 index 61d6347..0000000 --- a/src/data/mappings/moriarty-the-patriot.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "anilistAnimeId": 114124, - "anilistMangaId": 98544, - "title": "Moriarty the Patriot", - "sourceNotes": "Cumulative episodes across S1 (11) + 'Part 2' (13, eps 12-24) = 24 total. Paired with the manga by Ryosuke Takeuchi (story) and Hikaru Miyoshi (art), serialized in Jump Square; Part 1 ran 76 chapters across 19 volumes (concluded Dec 2022). The anime ends at chapter 56 (end of 'The Final Problem' arc), so a viewer resumes reading at chapter 57. The adaptation reorders several early one-shot cases and omits chapters: ch 4 (Albert's backstory), ch 10-14 (the 'Hunting of the Baskervilles' and 'Golden Army' arcs), and ch 31. Arc-to-episode boundaries are therefore approximate. The 2-episode OVA, the light novels, and the 'The Remains' spin-off are separate entries, and manga Part 2 (began Dec 2024) is ongoing and unadapted; there are no theatrical films.", - "mappings": [ - { - "episodes": [1, 5], - "chapters": [1, 3], - "arc": "The Earl's Crime / The Scarlet Eyes (origins & early cases)" - }, - { - "episodes": [6, 7], - "chapters": [5, 6], - "arc": "The 'Noahtic'" - }, - { - "episodes": [8, 9], - "chapters": [7, 9], - "arc": "A Study in 'S'" - }, - { - "episodes": [10, 11], - "chapters": [15, 16], - "arc": "The Two Detectives (anime skips ch 10-14)" - }, - { - "episodes": [12, 14], - "chapters": [17, 23], - "arc": "A Scandal in the British Empire" - }, - { - "episodes": [15, 16], - "chapters": [24, 28], - "arc": "The Phantom of Whitechapel" - }, - { - "episodes": [17, 17], - "chapters": [29, 30], - "arc": "The Riot in New Scotland Yard" - }, - { - "episodes": [18, 18], - "chapters": [32, 34], - "arc": "The Merchant of London" - }, - { - "episodes": [19, 20], - "chapters": [35, 39], - "arc": "The White Knight of London" - }, - { - "episodes": [21, 21], - "chapters": [40, 43], - "arc": "The Sign of Mary" - }, - { - "episodes": [22, 22], - "chapters": [44, 47], - "arc": "The Two Criminals" - }, - { - "episodes": [23, 24], - "chapters": [48, 56], - "arc": "The Final Problem" - }, - { - "chapters": [57, 76], - "arc": "The Adventure of Empty Hearts & The Valley of Fellows (rest of Part 1, unadapted)" - } - ] -} diff --git a/src/data/mappings/mushishi.json b/src/data/mappings/mushishi.json deleted file mode 100644 index 9a33cde..0000000 --- a/src/data/mappings/mushishi.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "anilistAnimeId": 457, - "anilistMangaId": 30418, - "title": "Mushishi", - "sourceNotes": "Cumulative episodes across S1 (26) + Zoku Shou S1 (10) + Zoku Shou S2 (10). Episodic/anthology adaptation, ~1 chapter per episode; arc names group stories by manga volume.", - "mappings": [ - { - "episodes": [1, 10], - "chapters": [1, 10], - "arc": "Wanderings of Ginko (Vol. 1-2)" - }, - { - "episodes": [11, 20], - "chapters": [11, 20], - "arc": "Mountains & Mushi (Vol. 3-4)" - }, - { - "episodes": [21, 26], - "chapters": [21, 26], - "arc": "Twilight Tales (Vol. 5-6)" - }, - { - "episodes": [27, 36], - "chapters": [27, 38], - "arc": "The Next Passage (Vol. 7-8)" - }, - { - "episodes": [37, 46], - "chapters": [39, 50], - "arc": "Final Stories (Vol. 9-10)" - } - ], - "movies": [ - { - "anilistId": 21008, - "title": "Mushishi: Bell Droplets", - "year": 2015, - "afterEpisode": 46, - "note": "Theatrical special adapting Suzu no Shizuku, the manga's final story." - } - ] -} diff --git a/src/data/mappings/mushoku-tensei.json b/src/data/mappings/mushoku-tensei.json deleted file mode 100644 index ff22d62..0000000 --- a/src/data/mappings/mushoku-tensei.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "anilistAnimeId": 108465, - "anilistMangaId": 85470, - "title": "Mushoku Tensei: Jobless Reincarnation", - "sourceNotes": "Cumulative episodes across S1 Part 1 (11) + S1 Part 2 (12, eps 12-23) + S2 (25, eps 24-48). Manga complete at 334 chapters (Yuka Fujikawa adaptation). Both the anime and the manga follow the light novel; pacing differs. Per-arc chapter boundaries approximate.", - "mappings": [ - { - "episodes": [1, 11], - "chapters": [1, 60], - "arc": "Infant Period (Rudeus's New Life)" - }, - { - "episodes": [12, 23], - "chapters": [61, 130], - "arc": "Juvenile Period (Demon Continent / Eris)" - }, - { - "episodes": [24, 36], - "chapters": [131, 200], - "arc": "Adolescent Period (Magic University Beginning)" - }, - { - "episodes": [37, 48], - "chapters": [201, 260], - "arc": "Adolescent Period (Magic University Continuing)" - }, - { "chapters": [261, 334], "arc": "Final Arc (unadapted)" } - ] -} diff --git a/src/data/mappings/my-deer-friend-nokotan.json b/src/data/mappings/my-deer-friend-nokotan.json deleted file mode 100644 index 96bfd90..0000000 --- a/src/data/mappings/my-deer-friend-nokotan.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 175977, - "anilistMangaId": 125555, - "title": "My Deer Friend Nokotan", - "sourceNotes": "Single-cour ONA, 12 episodes (no prequel/sequel seasons, so episodes are non-cumulative). Source is Oshioshio's gag manga \"Shikanoko Nokonoko Koshitantan\" (AniList 125555), ongoing since 2019 — 8 tankobon volumes / roughly chapter 49 published as of late 2025 (AniList lists no chapter count). This is an episodic comedy with NO named story arcs; each episode bundles ~3 unrelated gag chapters and the adaptation reorders chapters freely without skipping any, so clean per-episode chapter boundaries do not exist. The anime covers chapters 1-31 (through Vol. 5) across episodes 1-11, with episode 12 containing largely anime-original content. Chapter ranges here are coarse/approximate given the 4-koma-style, non-linear gag source. The remaining published chapters (32 onward) are unadapted.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 31], - "arc": "Nokotan and the Hijiridani Deer Club" - }, - { - "chapters": [32, 49], - "arc": "Unadapted Chapters" - } - ] -} diff --git a/src/data/mappings/my-dress-up-darling.json b/src/data/mappings/my-dress-up-darling.json deleted file mode 100644 index 06962ad..0000000 --- a/src/data/mappings/my-dress-up-darling.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "anilistAnimeId": 132405, - "anilistMangaId": 101583, - "title": "My Dress-Up Darling", - "sourceNotes": "Cumulative episodes across S1 (12, 2022) + S2 (12, 2025) = 24. Manga complete at 119 chapters (main story ended at ch. 115; extras 116–119 collected in the final Volume 15, July 2025). The TV anime is a faithful, near-1:1 adaptation; S2 reorders/interleaves a few chapters so some ranges overlap slightly. S2 finale (ep 24) adapts through ch. 85–86; the unadapted tail (ch. 86–119) is included chapters-only. Slice-of-life cosplay romance — section groupings are by cosplay shoot and are approximate.", - "mappings": [ - { "episodes": [1, 1], "chapters": [1, 1], "arc": "Meeting Marin" }, - { - "episodes": [2, 3], - "chapters": [2, 7], - "arc": "Costume Request / First Measurements" - }, - { - "episodes": [4, 6], - "chapters": [8, 17], - "arc": "Shizuku-tan Arc (First Cosplay)" - }, - { "episodes": [7, 8], "chapters": [18, 23], "arc": "Home Photoshoot" }, - { - "episodes": [9, 9], - "chapters": [24, 28], - "arc": "Meeting Sajuna (Juju)" - }, - { - "episodes": [10, 12], - "chapters": [29, 39], - "arc": "Black Lobelia / Summer Festival Shoot (S1 finale)" - }, - { - "episodes": [13, 15], - "chapters": [40, 50], - "arc": "Aftermath / Planning the Next Cosplay" - }, - { - "episodes": [16, 18], - "chapters": [51, 63], - "arc": "Halloween / Veronica Arc" - }, - { - "episodes": [19, 21], - "chapters": [64, 74], - "arc": "Beach Trip / Location Shoot" - }, - { - "episodes": [22, 24], - "chapters": [75, 85], - "arc": "Stargazer Cosplay / Confession Build-up (S2 finale)" - }, - { "chapters": [86, 119], "arc": "Unadapted Tail (incl. epilogue & extras)" } - ] -} diff --git a/src/data/mappings/my-first-girlfriend-is-a-gal.json b/src/data/mappings/my-first-girlfriend-is-a-gal.json deleted file mode 100644 index b305edd..0000000 --- a/src/data/mappings/my-first-girlfriend-is-a-gal.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 97863, - "anilistMangaId": 87315, - "title": "My First Girlfriend is a Gal", - "sourceNotes": "S1 anime (10 eps, 2017, NAZ; AniList id 97863) adapts roughly the first 37 chapters of Meguru Ueno's manga; a viewer resumes reading around ch 38. The anime reorders some gags, so the per-episode chapter boundaries below are approximate. Paired with the manga (AniList id 87315, which lists no chapter/volume count and is still marked RELEASING): it is a long-running romcom that had reached ch 200 across 21 tankobon volumes by late 2025/early 2026, and the latest chapters ('Our First Climax' ch 199, 'My First Time With You' ch 200) read like the finale, so the unadapted tail is extended to 200 (this endpoint is the latest known chapter, not a confirmed series end). The 'Hajimete no Bunkasai' OVA (cultural-festival side story, ~ch 70-73) and the live-action film are excluded.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 11], - "arc": "Junichi & Yukana Start Dating (Meeting the Gal Girlfriend)" - }, - { - "episodes": [4, 7], - "chapters": [12, 26], - "arc": "The Love Rivals Arrive (Yui, Ranko, Nene & Part-Time Jobs)" - }, - { - "episodes": [8, 10], - "chapters": [27, 37], - "arc": "Summer Trip, First Fight & Confession" - }, - { - "chapters": [38, 200], - "arc": "After the Confession (ongoing, unadapted by this anime)" - } - ] -} diff --git a/src/data/mappings/my-girlfriend-is-shobitch.json b/src/data/mappings/my-girlfriend-is-shobitch.json deleted file mode 100644 index 87a68f3..0000000 --- a/src/data/mappings/my-girlfriend-is-shobitch.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "anilistAnimeId": 98951, - "anilistMangaId": 87186, - "title": "My Girlfriend is Shobitch", - "sourceNotes": "10-episode anime adapts the start of the 4-koma romance manga (complete at 87 chapters + a special). The anime jumps around the manga's loosely-connected gag chapters rather than following a strict order, with a noticeably faithful stretch through the first ~55 chapters; readers continuing after the anime pick up around volume 5, chapter 56. Chapter ranges are approximate given the anthology-style source.", - "mappings": [ - { "episodes": [1, 10], "chapters": [1, 55], "arc": "Anime Adaptation" }, - { "chapters": [56, 87], "arc": "Manga-only Continuation" } - ] -} diff --git a/src/data/mappings/my-happy-marriage.json b/src/data/mappings/my-happy-marriage.json deleted file mode 100644 index 6b34f4b..0000000 --- a/src/data/mappings/my-happy-marriage.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 147103, - "anilistMangaId": 125444, - "title": "My Happy Marriage", - "sourceNotes": "Source is Akumi Agitogi's light novel (AniList id 125444, type MANGA / format NOVEL, ongoing — 10 volumes as of early 2026). The numeric ranges below are LIGHT NOVEL VOLUME numbers, not manga chapters: the Rito Kohsaka manga adaptation (AniList id 106531) exists but lags far behind the anime (~6 tankobon covering only early content), so episode->manga-chapter mapping is impossible for the later seasons and a light-novel-volume mapping is cleaner. Cumulative episodes across the two TV seasons: S1 (12 eps, 2023, id 147103) + S2 (13 eps, 2025, id 169441, a sequel) = eps 1-25. S1 adapts LN vols 1-2 (read on from vol 3 after S1); S2 adapts LN vols 3-6 (read on from vol 7 after S2), at a faster pace. The standalone OVA 'My Happy Marriage: The Shape of My Happiness' (id 167486), sometimes labelled 'Episode 13', sits between the seasons and is NOT counted in the cumulative TV numbering. Volume boundaries are approximate.", - "mappings": [ - { - "episodes": [1, 7], - "chapters": [1, 1], - "arc": "Arranged Marriage & Saimori Family Conflict (LN vol 1)" - }, - { - "episodes": [8, 12], - "chapters": [2, 2], - "arc": "Usuba Family / Dream-Sight Awakening & the Grotesquerie (S1, LN vol 2)" - }, - { - "episodes": [13, 19], - "chapters": [3, 4], - "arc": "Gifted Communion Cult Rises — Naoshi Usui (S2, LN vols 3-4)" - }, - { - "episodes": [20, 25], - "chapters": [5, 6], - "arc": "Grotesquerie Bearer / Usui's Defeat & Official Engagement (S2, LN vols 5-6)" - }, - { - "chapters": [7, 10], - "arc": "Post-engagement, unadapted (LN vols 7-10)" - } - ] -} diff --git a/src/data/mappings/my-hero-academia.json b/src/data/mappings/my-hero-academia.json deleted file mode 100644 index 65ecf15..0000000 --- a/src/data/mappings/my-hero-academia.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "anilistAnimeId": 21459, - "anilistMangaId": 85486, - "title": "My Hero Academia", - "sourceNotes": "Cumulative episodes across S1 (13) + S2 (25) + S3 (25) + S4 (25) + S5 (25) + S6 (25) + S7 (21) + Final Season (11+). Manga complete at 432 chapters. Arc boundaries from well-known manga arcs.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 21], - "arc": "Entrance Exam / Quirk Apprehension / USJ" - }, - { - "episodes": [14, 25], - "chapters": [22, 44], - "arc": "U.A. Sports Festival" - }, - { - "episodes": [26, 38], - "chapters": [45, 70], - "arc": "Vs. Hero Killer / Final Exams" - }, - { - "episodes": [39, 51], - "chapters": [71, 97], - "arc": "Forest Training Camp / Hideout Raid" - }, - { - "episodes": [52, 63], - "chapters": [98, 121], - "arc": "Provisional Hero License Exam" - }, - { - "episodes": [64, 88], - "chapters": [122, 162], - "arc": "Shie Hassaikai / Overhaul" - }, - { - "episodes": [89, 113], - "chapters": [163, 216], - "arc": "Joint Training / Endeavor Agency / My Villain Academia" - }, - { - "episodes": [114, 138], - "chapters": [217, 306], - "arc": "Paranormal Liberation War" - }, - { - "episodes": [139, 159], - "chapters": [307, 362], - "arc": "Tartarus Escapees / Star and Stripe" - }, - { - "episodes": [160, 170], - "chapters": [363, 423], - "arc": "Final Act / Last War" - }, - { "chapters": [424, 432], "arc": "Epilogue" } - ], - "movies": [ - { - "anilistId": 100723, - "title": "My Hero Academia: Two Heroes", - "year": 2018, - "note": "Side-story film (set after S3's Final Exams arc)." - }, - { - "anilistId": 108553, - "title": "My Hero Academia: Heroes Rising", - "year": 2019, - "note": "Side-story film (set after S4)." - }, - { - "anilistId": 126659, - "title": "My Hero Academia: World Heroes' Mission", - "year": 2021, - "note": "Side-story film (set during S5's Endeavor Agency arc)." - }, - { - "anilistId": 168013, - "title": "My Hero Academia: You're Next", - "year": 2024, - "note": "Side-story film (set after S7)." - } - ] -} diff --git a/src/data/mappings/my-isekai-life.json b/src/data/mappings/my-isekai-life.json deleted file mode 100644 index 3fbcc4b..0000000 --- a/src/data/mappings/my-isekai-life.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "anilistAnimeId": 129192, - "anilistMangaId": 106144, - "title": "My Isekai Life: I Gained a Second Character Class and Became the Strongest Sage in the World!", - "sourceNotes": "Single-cour, 12 episodes (Jul-Sep 2022). Source is Shinkoshoto's web/light novel (SB Creative, 19 LN volumes as of March 2026); AniList reports null chapter/volume counts for both the LN and its 'Manga UP!' manga tie-in, so the manga (used here as the chaptered 'chapters' axis) is tracked externally at ch. 93 across 32 volumes as of mid-2026 and is ongoing (Manga UP! splits most numbered chapters into .1/.2 parts). The anime heavily abridges and reorders the early story; per community anime-to-manga sync guides it corresponds to manga ch. 1-19 (through eps 1-9), after which eps 10-12 are mostly anime-original and adapt no further chapters.", - "mappings": [ - { - "episodes": [1, 9], - "chapters": [1, 19], - "arc": "Isekai Arrival / Adventurer's Guild / Sage Awakening" - }, - { - "episodes": [10, 12], - "chapters": [19, 19], - "arc": "Anime-original epilogue (no manga source)" - }, - { "chapters": [20, 93], "arc": "Unadapted ongoing manga" } - ] -} diff --git a/src/data/mappings/my-little-monster.json b/src/data/mappings/my-little-monster.json deleted file mode 100644 index 742b693..0000000 --- a/src/data/mappings/my-little-monster.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "anilistAnimeId": 14227, - "anilistMangaId": 43702, - "title": "My Little Monster", - "sourceNotes": "13-episode 2012 anime. Episodes 1-12 adapt manga chapters 1-16 (volumes 1-4) closely, with episode titles matching chapter titles; episode 13 ('Spring Is Near') is anime-original filler with no manga equivalent. The Robico manga is complete: 48 main numbered chapters (vols 1-12, ending 'Graduation Ceremony') plus 4 bonus/epilogue chapters in volume 13 (ch 49-52, 'Never Ending'). AniList's 69 count is all-inclusive (also counting split/half chapters, omake and fan-book extras); the chapter ranges here use the numbered-chapter axis. The 2013 'Tonari no Gokudou-kun' is an OVA (not theatrical) and the 2018 live-action film is a separate continuity, so there are no film entries.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 4], - "arc": "Haru & Shizuku Begin (Vol 1)" - }, - { - "episodes": [4, 6], - "chapters": [5, 8], - "arc": "The Friend Group Forms - Natsume & Sasayan (Vol 2)" - }, - { - "episodes": [7, 12], - "chapters": [9, 16], - "arc": "Love Triangle, Shoyo Festival & Christmas (Vols 3-4)" - }, - { - "chapters": [17, 48], - "arc": "Post-anime main story: dating, final-year arcs & Graduation (unadapted)" - }, - { - "chapters": [49, 52], - "arc": "Volume 13 bonus/epilogue chapters (unadapted)" - } - ] -} diff --git a/src/data/mappings/my-love-story-with-yamada-kun.json b/src/data/mappings/my-love-story-with-yamada-kun.json deleted file mode 100644 index 8f17787..0000000 --- a/src/data/mappings/my-love-story-with-yamada-kun.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 154965, - "anilistMangaId": 109501, - "title": "My Love Story with Yamada-kun at Lv999", - "sourceNotes": "The 2023 TV anime (Madhouse, 13 eps, single season) adapts roughly chapters 1-41 of Mashiro's manga; episode 13 lands around chapter 40-41, so a viewer resumes reading near chapter 42. This is a loosely-arced online-gaming romcom, so episode-to-chapter boundaries are approximate and evenly apportioned (~3 chapters/ep). Paired with the manga (serialized in Ganma! since 2019), which is ongoing on an irregular schedule; the latest chapter is ~110 (MangaDex tracks through ch 108), so the unadapted tail runs to ch 110 and will grow. No theatrical films exist.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 9], - "arc": "Online Game & Breakup (Akane meets YAMADA in FOS; first offline meetup)" - }, - { - "episodes": [4, 7], - "chapters": [10, 21], - "arc": "Real-Life Meetings (Collab Cafe & Higashinari School Festival)" - }, - { - "episodes": [8, 10], - "chapters": [22, 31], - "arc": "Growing Feelings & Guild Crisis" - }, - { - "episodes": [11, 13], - "chapters": [32, 41], - "arc": "Confession (\"I Like You\")" - }, - { - "chapters": [42, 110], - "arc": "Dating Life Continues (ongoing, unadapted)" - } - ] -} diff --git a/src/data/mappings/my-love-story.json b/src/data/mappings/my-love-story.json deleted file mode 100644 index d858a90..0000000 --- a/src/data/mappings/my-love-story.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "anilistAnimeId": 20946, - "anilistMangaId": 66933, - "title": "My Love Story!!", - "sourceNotes": "Single 2-cour TV anime (24 eps, 2015, Madhouse) adapting Kazune Kawahara & Aruko's complete manga (AniList id 66933: 56 chapters / 14 volumes). The anime is a faithful but condensed adaptation of roughly the first nine volumes, ending at about chapter 34 (the Kouki Ichinose pâtissier rival arc), so a viewer resumes reading around ch 35. Some side stories are cut/rearranged, so chapter boundaries are approximate. The 2015 live-action film is excluded.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 6], - "arc": "Takeo & Yamato (train rescue, misunderstanding, confession)" - }, - { - "episodes": [4, 7], - "chapters": [7, 12], - "arc": "A New Couple (fire rescue, Yamato's friends, early dating)" - }, - { - "episodes": [8, 12], - "chapters": [13, 19], - "arc": "Summer with Suna (mountain & ocean trip, Ai introduced)" - }, - { - "episodes": [13, 14], - "chapters": [20, 22], - "arc": "Summer Festival (Ai's unrequited feelings resolve)" - }, - { - "episodes": [15, 18], - "chapters": [23, 27], - "arc": "Autumn & Winter (Christmas, New Year's first kiss)" - }, - { - "episodes": [19, 22], - "chapters": [28, 32], - "arc": "Takeo's Mom, Valentine's & the Love Letter" - }, - { - "episodes": [23, 24], - "chapters": [33, 34], - "arc": "Kouki Ichinose (pâtissier rival arc)" - }, - { - "chapters": [35, 56], - "arc": "Post-anime story (unadapted)" - } - ] -} diff --git a/src/data/mappings/my-mental-choices.json b/src/data/mappings/my-mental-choices.json deleted file mode 100644 index 681f992..0000000 --- a/src/data/mappings/my-mental-choices.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "anilistAnimeId": 19221, - "anilistMangaId": 84593, - "title": "My Mental Choices Are Completely Interfering With My School Romantic Comedy", - "sourceNotes": "Single-cour, 10 episodes total. Original source is a 12-volume light novel (AniList id 84431, chapters untracked); this mapping instead uses the closely-following manga adaptation by Sayaka Itsuki (5 volumes, complete at 23 chapters), which is the entry AniList tracks by chapter count. Episodic girl-of-the-week comedy format with no distinct named story arcs, so a single broad mapping is used; chapter boundaries are approximate.", - "mappings": [ - { - "episodes": [1, 10], - "chapters": [1, 23], - "arc": "Series (episodic comedy, no distinct arcs)" - } - ] -} diff --git a/src/data/mappings/my-senpai-is-annoying.json b/src/data/mappings/my-senpai-is-annoying.json deleted file mode 100644 index fa638ae..0000000 --- a/src/data/mappings/my-senpai-is-annoying.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 120646, - "anilistMangaId": 103111, - "title": "My Senpai is Annoying", - "sourceNotes": "Single 12-episode TV season (2021, Doga Kobo, dir. Ryota Itoh); it is the first and only season, so episode numbers are non-cumulative. Source is Shiro Manta's 4-koma slice-of-life comedy Senpai ga Uzai Kouhai no Hanashi (id 103111). AniList lists the manga as complete at 294 chapters, but that count includes bonus/split chapters — the published main run ended on 2024-07-26 at chapter 236 across 13 volumes; the tail entry is extended to AniList's 294 per convention. 4-koma gag source, so chapter ranges are approximate: the anime samples short vignettes out of order and skips a number of skits rather than mapping 1:1, and there are no story arcs. Community guides say the anime ends around chapter 76, so the 12 episodes are treated as two coarse episodic groups plus an unadapted manga tail; a reader continues from roughly chapter 77 to the finale. No theatrical films exist, so no movies are listed.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 38], - "arc": "Episodes 1-6 (Futaba and Takeda's office everyday-life vignettes; 4-koma, approximate)" - }, - { - "episodes": [7, 12], - "chapters": [39, 76], - "arc": "Episodes 7-12 (continued cast antics through the anime finale; 4-koma, approximate)" - }, - { - "chapters": [77, 294], - "arc": "Later vignettes to the finale (unadapted; 4-koma, approximate)" - } - ] -} diff --git a/src/data/mappings/my-status-as-an-assassin.json b/src/data/mappings/my-status-as-an-assassin.json deleted file mode 100644 index 22dcfcb..0000000 --- a/src/data/mappings/my-status-as-an-assassin.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "anilistAnimeId": 186794, - "anilistMangaId": 103655, - "title": "My Status as an Assassin Obviously Exceeds the Hero's", - "sourceNotes": "12-episode single-cour anime (TMS Entertainment/Sunrise, Oct-Dec 2025) adapts the Matsuri Akai light novel directly; the Hiroyuki Aigamo manga (Comic Gardo, since July 2018) is a parallel adaptation of the same novel rather than the anime's source, and lags well behind the anime's pace. Manga ongoing, current ch. 37 as of July 2026; AniList lists chapters as null. By the time the manga catches up to ch. 37 the story has only reached roughly the midpoint of episode 7, so episodes 8-12 have no manga equivalent yet and aren't mapped. Chapter boundaries are approximate; no distinct named arcs are documented for this series.", - "mappings": [ - { - "episodes": [1, 7], - "chapters": [1, 37], - "arc": "Retice Kingdom Summoning & Early Assassin Missions" - } - ] -} diff --git a/src/data/mappings/my-stepmoms-daughter-is-my-ex.json b/src/data/mappings/my-stepmoms-daughter-is-my-ex.json deleted file mode 100644 index 85135ae..0000000 --- a/src/data/mappings/my-stepmoms-daughter-is-my-ex.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "anilistAnimeId": 136934, - "anilistMangaId": 109422, - "title": "My Stepmom's Daughter Is My Ex", - "sourceNotes": "Source is Kyosuke Kamishiro's light novel (AniList id 109422, type MANGA / format NOVEL), which began on Kakuyomu in 2017 and in print under Kadokawa Sneaker Bunko in Dec 2018; 13 main volumes published as of late 2025. AniList lists no chapter/volume count for either source entry, and the official manga adaptation (id 110342) is paced far behind the anime, so this maps by LIGHT NOVEL VOLUME instead. IMPORTANT: the `chapters` tuples below hold LN VOLUME numbers, NOT chapter numbers. The 2022 single-cour TV anime (id 136934, 12 eps, Project No.9) adapts the LN non-linearly: it covers vols 1-2, SKIPS the Vol 3 arc (reported as vol-3 chapters 4-9), then adapts vol 4 and concludes around vol 5 (Mizuto and Yume's first kiss during the countryside summer-festival trip). The skipped Vol 3 is shown as a chapters-only entry with no episodes. Per-volume episode groupings are approximate estimates for this low-arc romcom. Vols 6-13 are unadapted. No theatrical films.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 1], - "arc": "The Ex-Couple Become Step-Siblings (LN vol 1)" - }, - { - "episodes": [5, 8], - "chapters": [2, 2], - "arc": "Higashira Isana & Summer Break (LN vol 2)" - }, - { - "chapters": [3, 3], - "arc": "LN vol 3 (skipped by the anime)" - }, - { - "episodes": [9, 12], - "chapters": [4, 5], - "arc": "The Countryside Trip & First Kiss (LN vols 4-5)" - }, - { - "chapters": [6, 13], - "arc": "Post-anime volumes (LN vols 6-13, unadapted)" - } - ] -} diff --git a/src/data/mappings/mysterious-girlfriend-x.json b/src/data/mappings/mysterious-girlfriend-x.json deleted file mode 100644 index 84a3908..0000000 --- a/src/data/mappings/mysterious-girlfriend-x.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 12467, - "anilistMangaId": 31926, - "title": "Mysterious Girlfriend X", - "sourceNotes": "Single season: 12 TV episodes (Hoods Entertainment, 2012) plus a 13th-episode OVA bundled with Volume 9 of the manga, matching AniList's 13-episode total. Manga complete at 101 chapters per AniList (frequently cited elsewhere as 92 chapters across 12 volumes; the discrepancy likely reflects raw serialized vs. tankobon-collected chapter counts). The anime adapts roughly the first third of the story, commonly cited as ending around chapter 36 of the 92-chapter count (~chapter 40 scaled to AniList's total) with the OVA functioning as a bundled side story rather than the immediate next chapter, so chapter ranges are approximate.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 40], - "arc": "TV Series + OVA (Tsubaki & Urabe)" - }, - { "chapters": [41, 101], "arc": "Unadapted continuation (manga-only)" } - ] -} diff --git a/src/data/mappings/nagatoro.json b/src/data/mappings/nagatoro.json deleted file mode 100644 index 1826142..0000000 --- a/src/data/mappings/nagatoro.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 120697, - "anilistMangaId": 100664, - "title": "Don't Toy with Me, Miss Nagatoro", - "sourceNotes": "Cumulative episodes across S1 (12, 2021) + S2 '2nd Attack' (12, 2023) = 24. S1 covers the first six volumes (~ch. 1-46); S2 continues through five chapters of vol. 12, ending around ch. 91 (read on from ch. 92). The manga is complete at 154 numbered chapters / 20 volumes (ended July 2024); AniList id 100664 lists 188 'chapters' because it counts the many '.5' bonus chapters, so this mapping uses the official numbering. Slice-of-life groupings are approximate and aligned to volume boundaries.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 23], - "arc": "Teasing Senpai (vols 1-3)" - }, - { - "episodes": [7, 12], - "chapters": [24, 46], - "arc": "Art Club & Cultural Festival (vols 4-6, S1 finale)" - }, - { - "episodes": [13, 18], - "chapters": [47, 70], - "arc": "Sports Festival & Gamo's Gang (vols 7-9)" - }, - { - "episodes": [19, 24], - "chapters": [71, 91], - "arc": "Sleepover & Deepening Bond (vols 10-12, S2 finale)" - }, - { - "chapters": [92, 154], - "arc": "Unadapted (dating & finale)" - } - ] -} diff --git a/src/data/mappings/nana.json b/src/data/mappings/nana.json deleted file mode 100644 index a0eeb7b..0000000 --- a/src/data/mappings/nana.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "anilistAnimeId": 877, - "anilistMangaId": 30028, - "title": "NANA", - "sourceNotes": "47-episode anime covers manga vols 1–12 (ch 1–53). Arc-level approximation.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 11], - "arc": "Tokyo & Apartment 707" - }, - { "episodes": [13, 25], "chapters": [12, 27], "arc": "Blast vs Trapnest" }, - { - "episodes": [26, 36], - "chapters": [28, 40], - "arc": "Pregnancy & Marriage" - }, - { - "episodes": [37, 47], - "chapters": [41, 53], - "arc": "Trapnest Tour & Hachi's Choice" - }, - { "chapters": [54, 84], "arc": "Post-anime (manga hiatus since 2009)" } - ] -} diff --git a/src/data/mappings/nanbaka.json b/src/data/mappings/nanbaka.json deleted file mode 100644 index 58877bb..0000000 --- a/src/data/mappings/nanbaka.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 21051, - "anilistMangaId": 86693, - "title": "NANBAKA", - "sourceNotes": "Cumulative episodes across S1 (13) + 'NANBAKA - Part Two' ONA (12) = 25. Manga complete at 423 chapters (short, densely paced comico webcomic chapters, collected into 8 volumes). Arc boundaries follow the fandom wiki's 'Part One'-'Part Five' story groupings; S1 covers all of Part One (New Year's Cooperation Tournament and its aftermath). S2 covers only the first portion of Part Two, ending mid-arc around ch. 94 per community consensus on where to resume reading — the remainder of Part Two plus Parts Three-Five are unadapted.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 37], - "arc": "Part One — New Year's Cooperation Tournament" - }, - { - "episodes": [14, 25], - "chapters": [38, 94], - "arc": "Part Two — Receiving Rewards / Building 5 (partial)" - }, - { - "chapters": [95, 423], - "arc": "Unadapted (rest of Part Two through Part Five)" - } - ] -} diff --git a/src/data/mappings/naruto.json b/src/data/mappings/naruto.json deleted file mode 100644 index fe9e054..0000000 --- a/src/data/mappings/naruto.json +++ /dev/null @@ -1,133 +0,0 @@ -{ - "anilistAnimeId": 20, - "anilistMangaId": 30011, - "title": "Naruto", - "sourceNotes": "Cumulative episodes across Naruto (220) + Naruto: Shippuden (500). Manga complete at 700 chapters. Both anime contain substantial filler; episode ranges span all (canon + filler) episodes between arc boundaries, so filler episodes resolve to the surrounding canon arc's chapter range. Arc boundaries from Narutopedia.", - "mappings": [ - { "episodes": [1, 19], "chapters": [1, 33], "arc": "Land of Waves" }, - { - "episodes": [20, 80], - "chapters": [34, 138], - "arc": "Chunin Exams / Konoha Crush" - }, - { - "episodes": [81, 100], - "chapters": [139, 171], - "arc": "Search for Tsunade" - }, - { - "episodes": [101, 220], - "chapters": [172, 244], - "arc": "Sasuke Recovery / Part 1 Filler Tail" - }, - { - "episodes": [221, 252], - "chapters": [245, 281], - "arc": "Kazekage Rescue" - }, - { - "episodes": [253, 308], - "chapters": [282, 342], - "arc": "Sasuke and Sai / Hidan and Kakuzu" - }, - { - "episodes": [309, 371], - "chapters": [343, 412], - "arc": "Itachi Pursuit / Three-Tails / Tale of Jiraiya" - }, - { "episodes": [372, 395], "chapters": [413, 453], "arc": "Pain's Assault" }, - { - "episodes": [396, 434], - "chapters": [454, 483], - "arc": "Five Kage Summit" - }, - { - "episodes": [435, 476], - "chapters": [484, 515], - "arc": "Fourth Shinobi World War: Countdown" - }, - { - "episodes": [477, 541], - "chapters": [516, 559], - "arc": "Fourth Shinobi World War: Confrontation" - }, - { - "episodes": [542, 595], - "chapters": [560, 639], - "arc": "Fourth Shinobi World War: Climax" - }, - { - "episodes": [596, 647], - "chapters": [640, 677], - "arc": "Birth of the Ten-Tails' Jinchuriki" - }, - { - "episodes": [648, 720], - "chapters": [678, 700], - "arc": "Kaguya Otsutsuki Strikes / Epilogue" - } - ], - "movies": [ - { - "anilistId": 442, - "title": "Naruto the Movie: Ninja Clash in the Land of Snow", - "year": 2004, - "note": "Side story (anime-original)." - }, - { - "anilistId": 936, - "title": "Naruto the Movie: Legend of the Stone of Gelel", - "year": 2005, - "note": "Side story (anime-original)." - }, - { - "anilistId": 2144, - "title": "Naruto the Movie: Guardians of the Crescent Moon Kingdom", - "year": 2006, - "note": "Side story (anime-original)." - }, - { - "anilistId": 2472, - "title": "Naruto Shippuden the Movie", - "year": 2007, - "note": "Side story (anime-original)." - }, - { - "anilistId": 4437, - "title": "Naruto Shippuden the Movie: Bonds", - "year": 2008, - "note": "Side story (anime-original)." - }, - { - "anilistId": 6325, - "title": "Naruto Shippuden the Movie: The Will of Fire", - "year": 2009, - "note": "Side story (anime-original)." - }, - { - "anilistId": 8246, - "title": "Naruto Shippuden the Movie: The Lost Tower", - "year": 2010, - "note": "Side story (anime-original)." - }, - { - "anilistId": 10589, - "title": "Naruto Shippuden the Movie: Blood Prison", - "year": 2011, - "note": "Side story (anime-original)." - }, - { - "anilistId": 13667, - "title": "Road to Ninja: Naruto the Movie", - "year": 2012, - "note": "Side story (anime-original)." - }, - { - "anilistId": 16870, - "title": "The Last: Naruto the Movie", - "year": 2014, - "afterEpisode": 713, - "note": "Canon film set between manga ch 699 and 700." - } - ] -} diff --git a/src/data/mappings/natsume-yuujinchou.json b/src/data/mappings/natsume-yuujinchou.json deleted file mode 100644 index 8463f9b..0000000 --- a/src/data/mappings/natsume-yuujinchou.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "anilistAnimeId": 4081, - "anilistMangaId": 31859, - "title": "Natsume's Book of Friends", - "sourceNotes": "Source is the ongoing Natsume Yuujinchou manga by Yuki Midorikawa (AniList 31859; ~33 volumes / ~135 chapters as of 2026, still RELEASING — AniList lists no chapter count). The anime is a highly episodic, largely one-story-per-episode adaptation that pulls chapters OUT OF ORDER and interleaves LaLa specials (numbered as .5 chapters), so chapter boundaries are approximate spans, NOT contiguous 1:1 ranges — later seasons revisit earlier chapters and overlap. Because the show has no named story arcs, mappings are given per TV season using each season's title as the arc label. Cumulative episodes across S1 (13) + S2/Zoku (13) + S3/San (13) + S4/Shi (13) + S5/Go (11) + S6/Roku (11) + S7/Shichi (12) = 86 episodes. Per-season chapter spans derived from fan chapter↔episode masterlists (aislinceivun, treecakes); S7 (2024) adapted roughly manga volumes 20-27. Final chapters-only entry covers the unadapted ongoing tail.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 10], - "arc": "Season 1 (Natsume Yuujinchou)" - }, - { - "episodes": [14, 26], - "chapters": [4, 22], - "arc": "Season 2 (Zoku Natsume Yuujinchou)" - }, - { - "episodes": [27, 39], - "chapters": [23, 48], - "arc": "Season 3 (Natsume Yuujinchou San)" - }, - { - "episodes": [40, 52], - "chapters": [34, 51], - "arc": "Season 4 (Natsume Yuujinchou Shi)" - }, - { - "episodes": [53, 63], - "chapters": [52, 67], - "arc": "Season 5 (Natsume Yuujinchou Go)" - }, - { - "episodes": [64, 74], - "chapters": [60, 79], - "arc": "Season 6 (Natsume Yuujinchou Roku)" - }, - { - "episodes": [75, 86], - "chapters": [80, 112], - "arc": "Season 7 (Natsume Yuujinchou Shichi)" - }, - { - "chapters": [113, 135], - "arc": "Ongoing (unadapted)" - } - ], - "movies": [ - { - "anilistId": 100268, - "title": "Natsume's Book of Friends: The Waking of the Ephemeral", - "year": 2018, - "afterEpisode": 74, - "note": "Canon theatrical feature (Utsusemi ni Musubu) with an original in-continuity story following Natsume and Nyanko-sensei; new animation, released after the TV run." - }, - { - "anilistId": 124132, - "title": "Natsume Yuujinchou: Ishi Okoshi to Ayashiki Raihousha", - "year": 2021, - "afterEpisode": 74, - "note": "Canon theatrical release of new-animation Natsume stories (The Waking of Stone and the Suspicious Visitor) in the same continuity." - } - ] -} diff --git a/src/data/mappings/neon-genesis-evangelion.json b/src/data/mappings/neon-genesis-evangelion.json deleted file mode 100644 index b347611..0000000 --- a/src/data/mappings/neon-genesis-evangelion.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "anilistAnimeId": 30, - "anilistMangaId": 30698, - "title": "Neon Genesis Evangelion", - "sourceNotes": "26-episode 1995 anime paired with Yoshiyuki Sadamoto's manga (97 chapters / 14 vols, 1994-2013). Both ran concurrently from the same original concept; the manga diverges substantially in later volumes, retelling much of the End of Evangelion material in its own way. Episode-to-chapter pacing is approximate.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 14], - "arc": "Sachiel → Ramiel (Angel Encounters Begin)" - }, - { - "episodes": [7, 13], - "chapters": [15, 32], - "arc": "Asuka Arrives / Israfel / Bardiel" - }, - { - "episodes": [14, 19], - "chapters": [33, 56], - "arc": "Zeruel / NERV's Secrets" - }, - { "episodes": [20, 24], "chapters": [57, 78], "arc": "Armisael / Tabris" }, - { - "episodes": [25, 26], - "chapters": [79, 97], - "arc": "Instrumentality (anime: 25-26; manga: extended through Vol 14)" - } - ], - "movies": [ - { - "anilistId": 32, - "title": "Neon Genesis Evangelion: The End of Evangelion", - "year": 1997, - "afterEpisode": 24, - "note": "Theatrical finale reimagining eps 25-26." - } - ] -} diff --git a/src/data/mappings/netoge.json b/src/data/mappings/netoge.json deleted file mode 100644 index f644c45..0000000 --- a/src/data/mappings/netoge.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 21290, - "anilistMangaId": 86009, - "title": "And you thought there is never a girl online?", - "sourceNotes": "Single-cour 2016 TV anime (Project No.9), 12 episodes. The source is Shibai Kineko's light novel (AniList id 86009, type MANGA / format NOVEL, 23 volumes, FINISHED). A separate manga adaptation exists (AniList id 85886, 46 chapters across 8 volumes) but it is its own truncated retelling, so mapping by LIGHT NOVEL VOLUME is cleaner and is what is used here: the numbers in the `chapters` fields are LN VOLUME numbers, not chapter numbers. The anime adapts roughly LN vols 1-3 (the Alley Cats guild, the offline meeting revealing the guildmates are classmates, forming the Net Game Club to help Ako separate game from reality). Volume-to-episode boundaries are approximate, split evenly four episodes per volume; the show is an episodic romcom so groupings are coarse. LN vols 4-23 are unadapted.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 1], - "arc": "Offline Meeting & the Net Game Club (LN vol 1, approx)" - }, - { - "episodes": [5, 8], - "chapters": [2, 2], - "arc": "Ako's Reality vs. Game & School Life (LN vol 2, approx)" - }, - { - "episodes": [9, 12], - "chapters": [3, 3], - "arc": "Training Camp & the Legendary Age Event (LN vol 3, approx)" - }, - { - "chapters": [4, 23], - "arc": "Continued Net Game Club arcs (LN vols 4-23, unadapted)" - } - ] -} diff --git a/src/data/mappings/new-game.json b/src/data/mappings/new-game.json deleted file mode 100644 index 4883c83..0000000 --- a/src/data/mappings/new-game.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 21455, - "anilistMangaId": 85697, - "title": "NEW GAME!", - "sourceNotes": "Cumulative episodes across S1 'NEW GAME!' (12) + S2 'NEW GAME!!' (eps 13-24, 12) = 24 total, paired with Shotaro Tokuno's original 4-koma manga (id 85697), complete at 13 volumes / 181 chapters (AniList count; serialized in Manga Time Kirara Carat, ended 2021). 4-koma source, so chapter ranges are approximate and assigned by volume (~14 ch/volume). S1 adapts roughly volumes 1-3 (Aoba Suzukaze joins Eagle Jump and works on the game 'Fairies Story 3' through release). S2 adapts volumes 4, 6 and 7 (new-project/new-hire era with Tsubame and Momiji) and deliberately SKIPS volume 5, a prequel side-story collection; the anime therefore ends around the close of volume 7 (community guides say resume at 'chapter 65' in the tankobon-arc numbering). Volumes 8-13 (mapped here as chapters 99-181) are unadapted. A single BD-bundled OVA (id 97637, a company trip) exists but is not theatrical.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 42], - "arc": "Fairies Story 3 (Aoba's first year at Eagle Jump) — vols 1-3" - }, - { - "episodes": [13, 24], - "chapters": [43, 98], - "arc": "New project & new hires (Tsubame, Momiji) — vols 4, 6-7 (vol 5 prequel side stories skipped)" - }, - { - "chapters": [99, 181], - "arc": "Post-anime continuation — vols 8-13 (unadapted)" - } - ] -} diff --git a/src/data/mappings/nichijou.json b/src/data/mappings/nichijou.json deleted file mode 100644 index 00e71b2..0000000 --- a/src/data/mappings/nichijou.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 10165, - "anilistMangaId": 33082, - "title": "Nichijou - My Ordinary Life", - "sourceNotes": "Single 26-episode TV season (2011, Kyoto Animation). Nichijou is a slice-of-life gag manga by Keiichi Arawi with no continuous story arcs — just episodic vignettes — so the adaptation is treated as one entry plus an unadapted tail. The manga's first run ended in 2015 (vol 10, ~ch 192) but was revived in 2021 and is ONGOING (12 volumes / roughly ch 231 as of vol 12, Oct 2024); chapter counting is fuzzy because installments are short numbered segments with half-numbered entries. The anime adapts material from roughly vols 1-7 (ch 1-124), reordered and interleaved with KyoAni-original segments. The related 'Episode 0' is an OVA (no theatrical film exists), so no movies are listed.", - "mappings": [ - { - "episodes": [1, 26], - "chapters": [1, 124], - "arc": "Everyday vignettes (manga vols 1-7 + anime-original segments)" - }, - { - "chapters": [125, 231], - "arc": "Later vignettes (vols 8-12) — manga only, ongoing" - } - ] -} diff --git a/src/data/mappings/nisekoi.json b/src/data/mappings/nisekoi.json deleted file mode 100644 index 059a844..0000000 --- a/src/data/mappings/nisekoi.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "anilistAnimeId": 18897, - "anilistMangaId": 61499, - "title": "Nisekoi: False Love", - "sourceNotes": "Cumulative episodes across S1 \"Nisekoi\" (20, 2014) + S2 \"Nisekoi:\" (12, 2015) = 32. Manga complete at 240 chapters on AniList (229 numbered chapters ending with ch. 229 \"Promise\", plus 11 .5 omake chapters). The anime adapts loosely and reorders chapters within each season, so ranges are approximate arc groupings. S1 ends around ch. 50 (cultural-festival Romeo & Juliet play); the whole anime ends at ch. 106 (\"Investigation\"). The large unadapted tail (ch. 107–240) is included chapters-only. No canonical anime film exists (the only Nisekoi movie is the 2018 live-action film, which is excluded).", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 7], - "arc": "Pendant & Promise / Fake Relationship" - }, - { "episodes": [4, 5], "chapters": [8, 13], "arc": "Onodera Focus" }, - { "episodes": [6, 8], "chapters": [14, 20], "arc": "Tsugumi Introduction" }, - { - "episodes": [9, 13], - "chapters": [21, 32], - "arc": "Hot Springs / Festival Beats" - }, - { - "episodes": [14, 17], - "chapters": [33, 44], - "arc": "Marika Introduction" - }, - { - "episodes": [18, 20], - "chapters": [45, 50], - "arc": "Cultural Festival / Romeo & Juliet (S1 finale)" - }, - { - "episodes": [21, 22], - "chapters": [51, 57], - "arc": "Please Notice / Fate Showdown" - }, - { - "episodes": [23, 26], - "chapters": [58, 75], - "arc": "Mother Arc / Summer" - }, - { - "episodes": [27, 29], - "chapters": [76, 90], - "arc": "Haru & Paula / Little Sister" - }, - { - "episodes": [30, 32], - "chapters": [91, 106], - "arc": "Toward the Finale / Investigation (S2 finale)" - }, - { - "chapters": [107, 240], - "arc": "Unadapted Tail (key mystery resolution & ending)" - } - ] -} diff --git a/src/data/mappings/no-game-no-life.json b/src/data/mappings/no-game-no-life.json deleted file mode 100644 index a0ebc47..0000000 --- a/src/data/mappings/no-game-no-life.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "anilistAnimeId": 19815, - "anilistMangaId": 78397, - "title": "No Game, No Life", - "sourceNotes": "12-episode 2014 anime adapts light novel volumes 1-3. Paired with the Mashiro Hiiragi manga (11 chapters, cancelled). Anime ended with no S2. No Game No Life Zero movie is a prequel (LN vol 6) and a separate AniList entry.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 4], - "arc": "Arrival in Disboard / Chess Match" - }, - { - "episodes": [5, 8], - "chapters": [5, 8], - "arc": "Eastern Federation / Jibril" - }, - { - "episodes": [9, 12], - "chapters": [9, 11], - "arc": "Old Deus / Game vs Kurami" - } - ], - "movies": [ - { - "anilistId": 21875, - "title": "No Game, No Life: Zero", - "year": 2017, - "note": "Prequel film (LN vol 6)." - } - ] -} diff --git a/src/data/mappings/no-longer-allowed-in-another-world.json b/src/data/mappings/no-longer-allowed-in-another-world.json deleted file mode 100644 index 2a6e0f9..0000000 --- a/src/data/mappings/no-longer-allowed-in-another-world.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "anilistAnimeId": 152137, - "anilistMangaId": 112253, - "title": "No Longer Allowed in Another World", - "sourceNotes": "Single 12-episode season (Atelier Pontdarc, 2024) adapts manga chapters 1-29 (through volume 5). Manga ongoing (current ch. 62 translated / vol. 15 raw as of mid-2026); episodic dark-comedy structure with no widely established named story arcs, so mapping uses broad coverage entries.", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 29], "arc": "TV Anime Adaptation" }, - { "chapters": [30, 62], "arc": "Unadapted Chapters" } - ] -} diff --git a/src/data/mappings/noblesse.json b/src/data/mappings/noblesse.json deleted file mode 100644 index b708e7b..0000000 --- a/src/data/mappings/noblesse.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "anilistAnimeId": 116005, - "anilistMangaId": 59983, - "title": "Noblesse", - "sourceNotes": "13-episode TV series picks up after the separate Noblesse: Awakening ONA and begins at webtoon 'Season 2' (chapter 93); episode 8 opens the visit to Lukedonia. Series runs through the end of the Lukedonia arc (chapter 200); readers are pointed to resume the manhwa at chapter 201. Manga complete at 544 chapters. Episode/chapter split at the arc boundary is approximate.", - "mappings": [ - { "episodes": [1, 7], "chapters": [93, 154], "arc": "DA-5 Arc" }, - { "episodes": [8, 13], "chapters": [155, 200], "arc": "Lukedonia Arc" }, - { "chapters": [201, 544], "arc": "Manga-Only Continuation" } - ] -} diff --git a/src/data/mappings/non-non-biyori.json b/src/data/mappings/non-non-biyori.json deleted file mode 100644 index 1962a3c..0000000 --- a/src/data/mappings/non-non-biyori.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "anilistAnimeId": 17549, - "anilistMangaId": 47552, - "title": "Non Non Biyori", - "sourceNotes": "Cumulative episodes across S1 Non Non Biyori (12) + S2 Repeat (12) + S3 Nonstop (12) = 36 TV episodes. Source manga by Atto ran in Comic Alive 2009-2021, complete at 16 volumes / 126 chapters on AniList (~120 numbered chapters plus extras). This is an episodic iyashikei slice-of-life series with NO named story arcs and a heavily NON-LINEAR adaptation: Silver Link reordered chapters freely and Repeat re-adapts several early-manga vignettes skipped by season 1, so exact episode-to-chapter boundaries are not published. Chapter ranges below are APPROXIMATE, presented progressively by season (~1-3 chapters per episode) purely to indicate reading progress; the practical takeaway is that the three seasons together cover roughly the first ~13-14 volumes, leaving the final volumes unadapted. Seasons are used as the arc labels since the work has no canonical arcs.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 30], - "arc": "Season 1 (Non Non Biyori)" - }, - { - "episodes": [13, 24], - "chapters": [31, 64], - "arc": "Season 2 (Repeat)" - }, - { - "episodes": [25, 36], - "chapters": [65, 108], - "arc": "Season 3 (Nonstop)" - }, - { - "chapters": [109, 126], - "arc": "Unadapted (final volumes)" - } - ], - "movies": [ - { - "anilistId": 98779, - "title": "Non Non Biyori Vacation", - "year": 2018, - "afterEpisode": 24, - "note": "Canon theatrical feature in the main continuity, released between Repeat (S2) and Nonstop (S3). Expands the girls' summer trip to Okinawa (building on the S1 'We're Going to Okinawa' OVA) with all-new animation. Largely anime-expanded original content, so chapter alignment is approximate." - } - ] -} diff --git a/src/data/mappings/noragami.json b/src/data/mappings/noragami.json deleted file mode 100644 index 5fc945c..0000000 --- a/src/data/mappings/noragami.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "anilistAnimeId": 20447, - "anilistMangaId": 54692, - "title": "Noragami", - "sourceNotes": "Cumulative episodes across Noragami S1 (12) + Noragami Aragoto S2 (13). Manga complete at 109 chapters; anime only adapted through ch ~38, so most arcs are unadapted. Arc boundaries from Noragami Wiki (arc names are unofficial except Final Arc).", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 11], "arc": "Yukine Arc" }, - { "episodes": [13, 18], "chapters": [12, 24], "arc": "Bishamonten Arc" }, - { "episodes": [19, 25], "chapters": [25, 38], "arc": "Ebisu Arc" }, - { "chapters": [39, 54], "arc": "Yomi Arc" }, - { "chapters": [55, 72], "arc": "Heaven Arc" }, - { "chapters": [73, 91], "arc": "Stray Arc" }, - { "chapters": [92, 99], "arc": "Crisis Arc" }, - { "chapters": [100, 109], "arc": "Final Arc" } - ] -} diff --git a/src/data/mappings/nozaki-kun.json b/src/data/mappings/nozaki-kun.json deleted file mode 100644 index bd276cd..0000000 --- a/src/data/mappings/nozaki-kun.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 20668, - "anilistMangaId": 59211, - "title": "Monthly Girls' Nozaki-kun", - "sourceNotes": "12-episode 2014 TV anime (Doga Kobo). The source is an ongoing 4-koma (yonkoma) gag manga by Izumi Tsubaki; AniList lists no chapter count, and the anime adapts strips NON-SEQUENTIALLY, so every chapter boundary below is APPROXIMATE (the 4-koma runs ~10 chapters per volume, and 5 volumes existed when the anime aired in 2014). The TV series draws from roughly chapters 1-38 (vols 1-4), sampling material out of order; the 6 home-video specials reach ~ch 48. The manga continues well past the anime (~17 volumes / ~160 chapters as of 2025); that later material is unadapted.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 10], - "arc": "Sakura & Nozaki / Mikoshiba introduced (approx.)" - }, - { - "episodes": [3, 5], - "chapters": [11, 20], - "arc": "Kashima & Hori introduced (approx.)" - }, - { - "episodes": [6, 9], - "chapters": [21, 32], - "arc": "Seo & Wakamatsu (approx.)" - }, - { - "episodes": [10, 12], - "chapters": [33, 38], - "arc": "Ensemble / culture-festival finale (approx.)" - }, - { - "chapters": [39, 160], - "arc": "Ongoing serialization, unadapted (~vols 5-17)" - } - ] -} diff --git a/src/data/mappings/nura-rise-of-the-yokai-clan.json b/src/data/mappings/nura-rise-of-the-yokai-clan.json deleted file mode 100644 index df80c38..0000000 --- a/src/data/mappings/nura-rise-of-the-yokai-clan.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 7592, - "anilistMangaId": 35664, - "title": "Nura: Rise of the Yokai Clan", - "sourceNotes": "Cumulative episodes: S1 id 7592 = eps 1-24 (2010), S2 'Sennen Makyou / Demon Capital' id 10049 = eps 25-48 (2011). Main manga complete at 210 chapters / 25 volumes (2008-2012); final chapter is 210 'He Who Equips True Fear'. (AniList lists 218 because it also counts the separate 2023 4-chapter 'Kage/Shadow' sequel and bonus chapters; the canonical main-series count is 210.) Season 1 adapts ch 1-47 (through the Shikoku arc, with an expanded anime finale). Season 2 Demon Capital adapts ch 48-134, ending partway through volume 16 (mid-Kyoto/Hagoromo-Gitsune arc); manga readers continue at ch 135. Chapters 135-210 (New Year's, Urban Legend, Edo, Hyaku Monogatari, and Gokadoin/final arcs) are entirely unadapted. Arc boundaries per Nurarihyon no Mago fandom wiki Story Arcs.", - "mappings": [ - { - "episodes": [1, 9], - "chapters": [1, 17], - "arc": "Exposition / Gyuki Arc" - }, - { - "episodes": [10, 24], - "chapters": [18, 47], - "arc": "Ungaikyo / Shikoku Arc (Season 1 finale)" - }, - { - "episodes": [25, 32], - "chapters": [48, 77], - "arc": "Jami / Keikain / Past / Tono Arc (Demon Capital)" - }, - { - "episodes": [33, 48], - "chapters": [78, 134], - "arc": "Kyoto Arc: Hagoromo-Gitsune (Demon Capital finale, ends mid-arc)" - }, - { - "chapters": [135, 210], - "arc": "Urban Legend / Edo / Hyaku Monogatari / Gokadoin final arcs (unadapted)" - } - ] -} diff --git a/src/data/mappings/nyaruko.json b/src/data/mappings/nyaruko.json deleted file mode 100644 index 3121404..0000000 --- a/src/data/mappings/nyaruko.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "anilistAnimeId": 11785, - "anilistMangaId": 53485, - "title": "Nyaruko: Crawling with Love!", - "sourceNotes": "Cumulative episodes across S1 (12) + Season W (12) = 24. Source is Manta Aisora's light novel, complete at 12 volumes / 65 chapters per AniList. S1 loosely adapts volumes 1-4 (~chapters 1-22); Season W draws mainly from volumes 5-7 (~chapters 23-40) but sprinkles in material out of order, and its finale adapts a short story from volume 11. The adaptation is a gag/comedy series that reorders and omits content freely, so chapter ranges are approximate. Chapters 41-65 (most of volumes 8-10 and 12) are unadapted. A separate flash-animated OVA series (Haiyoru! Nyaruani, 2009-2010) predates this TV adaptation and is a different production; a 1-episode OVA (\"F\", 2015) also exists but is not included in this mapping's episode numbering.", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 22], "arc": "Season 1" }, - { "episodes": [13, 24], "chapters": [23, 40], "arc": "Season W" }, - { "chapters": [41, 65], "arc": "Unadapted (Volumes 8-10, 12)" } - ] -} diff --git a/src/data/mappings/o-maidens-in-your-savage-season.json b/src/data/mappings/o-maidens-in-your-savage-season.json deleted file mode 100644 index a8679ef..0000000 --- a/src/data/mappings/o-maidens-in-your-savage-season.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "anilistAnimeId": 105932, - "anilistMangaId": 101719, - "title": "O Maidens in Your Savage Season", - "sourceNotes": "Single-cour TV anime (12 episodes, 2019, Lay-duce) adapting Mari Okada & Nao Emoto's ensemble literature-club drama. The manga is complete at 32 numbered chapters across 8 volumes (V1: ch1-4, V2: 5-8, V3: 9-12, V4: 13-16, V5: 17-20, V6: 21-23, V7: 24-27, V8: 28-32); AniList reports 33 chapters because it counts a bonus/final extra, so the last entry extends to 33. The manga and anime concluded the same season (July-Sept 2019) and the anime faithfully adapts the full story, condensing roughly 2.7 chapters per episode with a slightly restructured but complete ending — a reader who finishes the anime has effectively finished the manga. This show has no canonical arc names; the segment titles below are descriptive narrative phases and the episode-to-chapter boundaries are approximate.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 8], - "arc": "The Literature Club & Awakening Desire" - }, - { - "episodes": [4, 6], - "chapters": [9, 16], - "arc": "Kazusa & Izumi / Niina's Past" - }, - { - "episodes": [7, 9], - "chapters": [17, 24], - "arc": "Momoko, Sonezaki & Tangled Feelings" - }, - { - "episodes": [10, 12], - "chapters": [25, 33], - "arc": "Summer Camp & Resolution (Finale)" - } - ] -} diff --git a/src/data/mappings/oddtaxi.json b/src/data/mappings/oddtaxi.json deleted file mode 100644 index bde8890..0000000 --- a/src/data/mappings/oddtaxi.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "anilistAnimeId": 128547, - "anilistMangaId": 128564, - "title": "ODDTAXI", - "sourceNotes": "Original anime (13 episodes, written by Kazuya Konomoto); the manga adaptation by Konomoto and artist Takeichi Abaraya began serialization before the anime aired and ran roughly a year past it, closely tracking the same story chapter-for-chapter. Manga complete at 37 chapters (5 volumes); the fandom wiki's chapter list marks which chapter each episode's material starts at, used directly below. The final 2 chapters (36-37) are manga-only bonus/epilogue content with no TV counterpart.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 9], - "arc": "Odokawa's fares & the missing girl" - }, - { - "episodes": [4, 6], - "chapters": [10, 16], - "arc": "The investigation widens" - }, - { "episodes": [7, 9], "chapters": [17, 24], "arc": "Threads converge" }, - { - "episodes": [10, 13], - "chapters": [25, 35], - "arc": "Endgame & Odokawa's secret" - }, - { "chapters": [36, 37], "arc": "Bonus epilogue (manga-only)" } - ], - "movies": [ - { - "anilistId": 143080, - "title": "ODDTAXI In The Woods", - "year": 2022, - "afterEpisode": 13, - "note": "Documentary-style 'reconstruction' of the TV series' events with new epilogue content set after the finale." - } - ] -} diff --git a/src/data/mappings/one-piece.json b/src/data/mappings/one-piece.json deleted file mode 100644 index a762bdb..0000000 --- a/src/data/mappings/one-piece.json +++ /dev/null @@ -1,113 +0,0 @@ -{ - "anilistAnimeId": 21, - "anilistMangaId": 30013, - "title": "One Piece", - "sourceNotes": "Initial seed — arc-level approximation. Refine per-episode mappings via PR.", - "mappings": [ - { "episodes": [1, 3], "chapters": [1, 7], "arc": "Romance Dawn" }, - { "episodes": [4, 8], "chapters": [8, 21], "arc": "Orange Town" }, - { "episodes": [9, 18], "chapters": [22, 41], "arc": "Syrup Village" }, - { "episodes": [19, 30], "chapters": [42, 68], "arc": "Baratie" }, - { "episodes": [31, 47], "chapters": [69, 95], "arc": "Arlong Park" }, - { "episodes": [48, 53], "chapters": [96, 105], "arc": "Loguetown" }, - { - "episodes": [62, 77], - "chapters": [106, 132], - "arc": "Whisky Peak / Little Garden" - }, - { "episodes": [92, 130], "chapters": [155, 217], "arc": "Alabasta" }, - { "chapters": [1118, 1180], "arc": "Elbaf" } - ], - "movies": [ - { - "anilistId": 459, - "title": "ONE PIECE: The Movie", - "year": 2000, - "note": "Side story (anime-original)." - }, - { - "anilistId": 460, - "title": "One Piece: Clockwork Island Adventure", - "year": 2001, - "note": "Side story (anime-original)." - }, - { - "anilistId": 461, - "title": "One Piece: Chopper's Kingdom on the Island of Strange Animals", - "year": 2002, - "note": "Side story (anime-original)." - }, - { - "anilistId": 462, - "title": "One Piece The Movie: The Dead End Adventure", - "year": 2003, - "note": "Side story (anime-original)." - }, - { - "anilistId": 463, - "title": "One Piece: The Curse of the Sacred Sword", - "year": 2004, - "note": "Side story (anime-original)." - }, - { - "anilistId": 464, - "title": "One Piece: Baron Omatsuri and the Secret Island", - "year": 2005, - "note": "Side story (anime-original)." - }, - { - "anilistId": 465, - "title": "One Piece: Mega Mecha Soldier of Karakuri Castle", - "year": 2006, - "note": "Side story (anime-original)." - }, - { - "anilistId": 2107, - "title": "One Piece: The Desert Princess and the Pirates, Adventures in Alabasta", - "year": 2007, - "note": "Condensed theatrical retelling of the Alabasta arc." - }, - { - "anilistId": 3848, - "title": "One Piece: Episode of Chopper +: The Miracle Winter Cherry Blossom", - "year": 2008, - "note": "Alternate theatrical retelling of the Drum Island arc." - }, - { - "anilistId": 4155, - "title": "One Piece Film: Strong World", - "year": 2009, - "note": "Side story written by Oda; ties into manga ch 0." - }, - { - "anilistId": 9999, - "title": "One Piece 3D: Mugiwara Chase", - "year": 2011, - "note": "3D theatrical film (Movie 11)." - }, - { - "anilistId": 12859, - "title": "One Piece Film: Z", - "year": 2012, - "note": "Side story (anime-original)." - }, - { - "anilistId": 21335, - "title": "One Piece Film: Gold", - "year": 2016, - "note": "Side story (anime-original)." - }, - { - "anilistId": 105143, - "title": "One Piece: Stampede", - "year": 2019, - "note": "Side story (anime-original)." - }, - { - "anilistId": 141902, - "title": "One Piece Film: Red", - "year": 2022, - "note": "Side story (anime-original)." - } - ] -} diff --git a/src/data/mappings/one-punch-man.json b/src/data/mappings/one-punch-man.json deleted file mode 100644 index fdca88c..0000000 --- a/src/data/mappings/one-punch-man.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "anilistAnimeId": 21087, - "anilistMangaId": 74347, - "title": "One-Punch Man", - "sourceNotes": "Anime S1 (12 ep, 2015) covers manga ch 1–37 — through Asteroid arc finale. S2 (12 ep, 2019) covers ch 38–84 — Garou intro through Monster Association elevator. S3 Part 1 (12 ep, 2025) covers ch ~85–116 — Monster Association raid continuation. Verify before relying on per-episode precision. S3 Part 2 (announced for 2027) not yet mapped.", - "mappings": [ - { - "season": 1, - "episodes": [1, 1], - "chapters": [1, 4], - "arc": "S1 · Saitama Intro" - }, - { - "season": 1, - "episodes": [2, 2], - "chapters": [5, 7], - "arc": "S1 · Subterraneans" - }, - { - "season": 1, - "episodes": [3, 3], - "chapters": [8, 9], - "arc": "S1 · House of Evolution Begins" - }, - { - "season": 1, - "episodes": [4, 5], - "chapters": [10, 14], - "arc": "S1 · House of Evolution" - }, - { - "season": 1, - "episodes": [6, 9], - "chapters": [15, 21], - "arc": "S1 · Paradise Group / Sea Monster" - }, - { - "season": 1, - "episodes": [10, 12], - "chapters": [22, 37], - "arc": "S1 · Alien Conquerors (Boros)" - }, - { - "season": 2, - "episodes": [13, 14], - "chapters": [38, 41], - "arc": "S2 · Garou Intro" - }, - { - "season": 2, - "episodes": [15, 17], - "chapters": [42, 53], - "arc": "S2 · Hero Hunt" - }, - { - "season": 2, - "episodes": [18, 20], - "chapters": [54, 67], - "arc": "S2 · Martial Arts Tournament" - }, - { - "season": 2, - "episodes": [21, 24], - "chapters": [68, 84], - "arc": "S2 · Monster Association Raid" - }, - { - "season": 3, - "episodes": [25, 36], - "chapters": [85, 116], - "arc": "S3 · Monster Association (cont.)" - }, - { "chapters": [117, 170], "arc": "Monster Association Aftermath" }, - { "chapters": [171, 226], "arc": "Psychic Sisters / Neo Heroes" } - ] -} diff --git a/src/data/mappings/orange.json b/src/data/mappings/orange.json deleted file mode 100644 index b8fccd1..0000000 --- a/src/data/mappings/orange.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 21647, - "anilistMangaId": 65573, - "title": "Orange", - "sourceNotes": "13-episode 2016 TV anime; every episode is titled 'LETTER 01'-'LETTER 13', mirroring the manga's 'Letter' chapters. The anime adapts the COMPLETE main story: Letters 1-22 across volumes 1-5 (Ichigo Takano). AniList id 65573 lists 39 chapters spanning all 7 volumes; the material past Letter 22 (chapters 23-39, vols 6-7) is post-series side-story content NOT covered by the TV series — vol 6 'orange -future-' (Suwa's POV, ~ch 23-26, which the film adapts) and vol 7 'to you, dear one' POV shorts (~ch 27-33 + bonuses). Volume/Letter boundaries are high-confidence; exact episode cut-points within the main story are approximate (the relay race is ep 10, ch 19 falls in ep 12).", - "mappings": [ - { - "episodes": [1, 5], - "chapters": [1, 8], - "arc": "Receiving the letters / meeting Kakeru (vols 1-2)" - }, - { - "episodes": [6, 10], - "chapters": [9, 16], - "arc": "Growing closer / the athletic festival relay (vols 3-4)" - }, - { - "episodes": [11, 13], - "chapters": [17, 22], - "arc": "Saving Kakeru / the future timeline & ending (vol 5)" - }, - { - "chapters": [23, 39], - "arc": "Side stories: 'orange -future-' (Suwa's POV, vol 6) & 'to you, dear one' POV shorts (vol 7) — unadapted by the TV series" - } - ], - "movies": [ - { - "anilistId": 97669, - "title": "Orange: Future", - "year": 2016, - "chapters": [23, 26], - "afterEpisode": 13, - "note": "Sequel film: retells the story from Hiroto Suwa's POV and adds new Ichigo Takano content set after the series (vol 6 'orange -future-'). Recap layer plus genuinely new post-series footage." - } - ] -} diff --git a/src/data/mappings/orb.json b/src/data/mappings/orb.json deleted file mode 100644 index 8b3f8a1..0000000 --- a/src/data/mappings/orb.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "anilistAnimeId": 151514, - "anilistMangaId": 124139, - "title": "Orb: On the Movements of the Earth", - "sourceNotes": "Fully adapted: 25 eps cover all 62 chapters across the P-Kingdom generational arcs. Arc boundaries follow the three generational protagonists.", - "mappings": [ - { "episodes": [1, 7], "chapters": [1, 17], "arc": "Rafal's Generation" }, - { - "episodes": [8, 16], - "chapters": [18, 38], - "arc": "Oczy & Badeni / Jolenta" - }, - { - "episodes": [17, 25], - "chapters": [39, 62], - "arc": "Albert Brown / Final Generation" - } - ] -} diff --git a/src/data/mappings/oregairu.json b/src/data/mappings/oregairu.json deleted file mode 100644 index c1b6a0c..0000000 --- a/src/data/mappings/oregairu.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 14813, - "anilistMangaId": 92954, - "title": "My Teen Romantic Comedy SNAFU", - "sourceNotes": "Cumulative episodes across S1 (13) + S2 'TOO' (13, eps 14-26) + S3 'Climax' (12, eps 27-38) = 38 total. Paired with the Naomichi Io manga adaptation 'My Youth Romantic Comedy Is Wrong, as I Expected @comic' (id 92954, 118 ch / 22 vols, completed Feb 2023) — a faithful, complete adaptation of Wataru Watari's 14-volume light novel. Anime season coverage by LN volume: S1 = vol 1-6, S2 = vol 7-9, S3 = vol 10-14. Manga chapter boundaries are aligned to that LN coverage and are approximate; endpoints are firm (ep 38 = ch 118, the manga's final chapter).", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 48], - "arc": "Service Club formation through the culture festival (LN vol 1-6)" - }, - { - "episodes": [14, 26], - "chapters": [49, 80], - "arc": "The 'genuine thing' through the Christmas event & student council (LN vol 7-9)" - }, - { - "episodes": [27, 38], - "chapters": [81, 118], - "arc": "Prom arc & the conclusion (LN vol 10-14)" - } - ] -} diff --git a/src/data/mappings/oreimo.json b/src/data/mappings/oreimo.json deleted file mode 100644 index 916fae0..0000000 --- a/src/data/mappings/oreimo.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "anilistAnimeId": 8769, - "anilistMangaId": 43667, - "title": "Oreimo", - "sourceNotes": "Cumulative broadcast episodes across S1 (12, eps 1-12) + S2 'Oreimo 2' (13, eps 13-25) = 25 total. Broadcast counts only: the original S1 also shipped 4 web-only 'True Route' episodes (AniList ONA id 10020) and S2 added a 3-episode ONA 'True End'; both alternate-route extras are excluded. Paired with Tsukasa Fushimi's light novel (AniList id 43667, type MANGA / format NOVEL, 56 chapters across 12 volumes) rather than the standalone manga adaptation (id 45317), which covers only the first 4 LN volumes (26 ch); the anime adapts the complete 12-volume LN, so mapping by LN volume is cleaner and fully covers the series. Chapter ranges are proportional estimates converting LN volume boundaries onto AniList's 56-chapter count, and the per-arc episode splits within each season are approximate. No unadapted tail (the LN is fully adapted) and no films.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 5], - "arc": "Kirino's Hidden Hobby / Life Counseling (S1, LN vol 1)" - }, - { - "episodes": [5, 8], - "chapters": [6, 9], - "arc": "Comiket & the Eroge Conflict (S1, LN vol 2)" - }, - { - "episodes": [9, 12], - "chapters": [10, 19], - "arc": "America Arc / Kuroneko's Confession (S1, LN vols 3-4)" - }, - { - "episodes": [13, 16], - "chapters": [20, 28], - "arc": "New School Year / Ayase & Kanako (S2, LN vols 5-6)" - }, - { - "episodes": [17, 20], - "chapters": [29, 42], - "arc": "Kirino's Game Dev & Saori's Past (S2, LN vols 7-9)" - }, - { - "episodes": [21, 25], - "chapters": [43, 56], - "arc": "Kyousuke & Kirino Finale (S2, LN vols 10-12)" - } - ] -} diff --git a/src/data/mappings/oreshura.json b/src/data/mappings/oreshura.json deleted file mode 100644 index 731e1d3..0000000 --- a/src/data/mappings/oreshura.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 14749, - "anilistMangaId": 56613, - "title": "Oreshura", - "sourceNotes": "Single 13-episode A-1 Pictures TV series (2013); no prequel/sequel seasons, so episodes are non-cumulative 1-13. Source is Yuuji Yuuji's GA Bunko light novel (AniList id 56613, NOVEL format, FINISHED at 18 main volumes + 1 after-story; AniList lists 248 total chapters, but chapter numbering resets each volume, e.g. Vol. 2 runs #0-#7). Because per-volume chapters reset and don't form a clean cumulative sequence, the chapters[] ranges here are LIGHT-NOVEL VOLUME numbers, which is the basis community guides use for this show. The anime adapts Volumes 1-4; Volumes 5-18 are unadapted. Arc/volume boundaries inferred from episode titles matched against the published volume tables of contents (e.g. Vol. 2's \"The Truth About the Love Letter\" = ep 5; Vol. 4's \"Summer Training Meeting\" / disciplinary-committee chapters = eps 10-13).", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 1], - "arc": "Masuzu's Fake Girlfriend (Vol. 1)" - }, - { - "episodes": [3, 5], - "chapters": [2, 2], - "arc": "Chiwa's Love Letter (Vol. 2)" - }, - { - "episodes": [6, 8], - "chapters": [3, 3], - "arc": "Himeka Akishino / Gray World (Vol. 3)" - }, - { - "episodes": [9, 13], - "chapters": [4, 4], - "arc": "Ai Fuyuumi & Summer Training Camp (Vol. 4)" - }, - { - "chapters": [5, 18], - "arc": "Unadapted (Vols. 5-18)" - } - ] -} diff --git a/src/data/mappings/oresuki.json b/src/data/mappings/oresuki.json deleted file mode 100644 index 9e73956..0000000 --- a/src/data/mappings/oresuki.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 104464, - "anilistMangaId": 98648, - "title": "ORESUKI: Are you the only one who loves me?", - "sourceNotes": "Source is Rakuda's light novel (17 volumes, completed Jan 2022) — a harem rom-com 'deconstruction' where protagonist Joro keeps getting set up only to discover the girls love someone else. The Yu Ijima manga adaptation (AniList id 98648, 43 ch / 6 vols, Shounen Jump+ 2017-2020) diverges from the novel and reaches its own early conclusion, so its chapters do not line up with the anime; this mapping therefore uses LIGHT-NOVEL VOLUME NUMBERS as the 'chapters' axis instead. The 2019 TV anime (12 eps) adapts LN vols 1-4 (the finale already dips into vol 5), and the 'Oretachi no Game Set' OVA — counted here as ep 13 — adapts vol 5. Per-volume episode boundaries are approximate (the anime reorders some material). LN vols 6-17 are unadapted. No theatrical films.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 1], - "arc": "Confession arc — Cosmos & Himawari both confess to Joro yet pine for Sun-chan, then plain library girl Pansy reveals she loves Joro (harem-deconstruction setup; LN vol 1)" - }, - { - "episodes": [4, 6], - "chapters": [2, 2], - "arc": "Joro branded the school villain and his recovery; Tsubaki's debut and the Hundred Flower Festival dance (LN vol 2)" - }, - { - "episodes": [7, 9], - "chapters": [3, 3], - "arc": "Cheerful Skewers part-time work arc and Tsubaki's transfer; resolving Sun-chan's feelings (LN vol 3)" - }, - { - "episodes": [10, 12], - "chapters": [4, 4], - "arc": "Library Crisis and the Hose rival love-quadrangle — the scheme to save the school library (TV finale; LN vol 4)" - }, - { - "episodes": [13, 13], - "chapters": [5, 5], - "arc": "'Oretachi no Game Set' OVA — the festival showdown that closes out the anime (LN vol 5)" - }, - { - "chapters": [6, 17], - "arc": "Post-anime volumes through the series finale (LN vols 6-17, unadapted)" - } - ] -} diff --git a/src/data/mappings/osamake.json b/src/data/mappings/osamake.json deleted file mode 100644 index ddbb626..0000000 --- a/src/data/mappings/osamake.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "anilistAnimeId": 124675, - "anilistMangaId": 114015, - "title": "Osamake: Romcom Where The Childhood Friend Won't Lose", - "sourceNotes": "Single 12-episode season (Doga Kobo, 2021), adapted from the light novel (13 volumes, complete 2025); the anime covers light novel volumes 1-4 at roughly 3 episodes per volume. The separate main manga (complete, 51 chapters / 8 volumes, ~2 manga volumes per light-novel volume) covers that same story span rather than continuing past it, so its full run is mapped across the season. Per-episode LN volume checkpoints are documented (ep. 1 opens vol. 1, ep. 9 closes vol. 3, ep. 12 closes vol. 4); manga chapter boundaries within each LN volume are proportional approximations.", - "mappings": [ - { "episodes": [1, 3], "chapters": [1, 13], "arc": "Light Novel Volume 1" }, - { "episodes": [4, 6], "chapters": [14, 26], "arc": "Light Novel Volume 2" }, - { "episodes": [7, 9], "chapters": [27, 38], "arc": "Light Novel Volume 3" }, - { - "episodes": [10, 12], - "chapters": [39, 51], - "arc": "Light Novel Volume 4" - } - ] -} diff --git a/src/data/mappings/oshi-no-ko.json b/src/data/mappings/oshi-no-ko.json deleted file mode 100644 index 48f349f..0000000 --- a/src/data/mappings/oshi-no-ko.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 150672, - "anilistMangaId": 117195, - "title": "[Oshi no Ko]", - "sourceNotes": "Cumulative episodes across S1 (11) + S2 (13). Manga complete at 171 chapters; unadapted arcs included at the tail.", - "mappings": [ - { - "episodes": [1, 1], - "chapters": [1, 9], - "arc": "Mother and Children (90-min Premiere)" - }, - { "episodes": [2, 4], "chapters": [10, 21], "arc": "Showbiz" }, - { - "episodes": [5, 7], - "chapters": [22, 33], - "arc": "First Concert / Dating Reality Show" - }, - { - "episodes": [8, 11], - "chapters": [34, 53], - "arc": "Private (Stage Play)" - }, - { - "episodes": [12, 24], - "chapters": [54, 102], - "arc": "2.5D Stage Play / Movie Arc" - }, - { "chapters": [103, 132], "arc": "Scandal / Tokyo Blade Movie" }, - { "chapters": [133, 154], "arc": "15-Year Lie" }, - { "chapters": [155, 171], "arc": "Final Arc" } - ] -} diff --git a/src/data/mappings/ossan-newbie-adventurer.json b/src/data/mappings/ossan-newbie-adventurer.json deleted file mode 100644 index b6b8734..0000000 --- a/src/data/mappings/ossan-newbie-adventurer.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 163292, - "anilistMangaId": 114048, - "title": "The Ossan Newbie Adventurer, Trained to Death by the Most Powerful Party, Became Invincible", - "sourceNotes": "Single season, 12 episodes. Adapted from Kiraku Kishima's light novel; the manga (Ken Ogino, id 114048) is used as the chapter source. Manga ongoing (13 volumes as of May 2026, approx. ch. 75 as of mid-2026). The anime adapts through roughly manga Vol. 6 Ch. 35 (Rookie Examiner / Fist King Tournament arcs), with remaining chapters unadapted continuation.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 35], - "arc": "Rookie Examiner / Fist King Tournament Arc" - }, - { - "chapters": [36, 75], - "arc": "Unadapted continuation (ongoing)" - } - ] -} diff --git a/src/data/mappings/our-dating-story.json b/src/data/mappings/our-dating-story.json deleted file mode 100644 index 4861405..0000000 --- a/src/data/mappings/our-dating-story.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "anilistAnimeId": 154459, - "anilistMangaId": 144718, - "title": "Our Dating Story: The Experienced You and The Inexperienced Me", - "sourceNotes": "Single-cour, 12 episodes. Original source is a light novel (finished at 10 volumes); this mapping uses the same-story manga adaptation (ongoing, current ch. ~50) for concrete chapter numbers since AniList does not track the novel's chapter count. The anime's 12 episodes adapt roughly manga chapters 1-30 (viewers are pointed to continue from ch. 31 after the finale, though the manga diverges from the anime's ending). No distinct named story arcs — a straightforward romance chronology.", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 30], "arc": "Anime-Adapted Story" }, - { "chapters": [31, 50], "arc": "Unadapted Manga Continuation" } - ] -} diff --git a/src/data/mappings/our-last-crusade.json b/src/data/mappings/our-last-crusade.json deleted file mode 100644 index ccfc890..0000000 --- a/src/data/mappings/our-last-crusade.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "anilistAnimeId": 112667, - "anilistMangaId": 100670, - "title": "Our Last Crusade or the Rise of a New World", - "sourceNotes": "LN-based mapping (AniList source id 100670, the Fujimi Fantasia Bunko novel by Kei Sazane); the discontinued Okama manga (43 ch.) is a minor side-adaptation and is not used. Ranges are by LN VOLUME, not chapter — the \"chapters\" fields hold volume numbers. Cumulative episodes across S1 (12) + S2 (12) = 24. Season 1 adapts volumes 1-4; Season 2 adapts volumes 5-8. Arc names are the anime's cour-segment titles (Wikipedia episode list), aligned one segment per volume as an approximation — the third novel in particular was heavily condensed. Light novel is ongoing (16 volumes published, plus 3 Secret File short-story collections); volumes 9-16 are unadapted.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 1], - "arc": "Encounter (Vol. 1)" - }, - { - "episodes": [4, 5], - "chapters": [2, 2], - "arc": "Intersection (Vol. 2)" - }, - { - "episodes": [6, 9], - "chapters": [3, 3], - "arc": "Paradise (Vol. 3)" - }, - { - "episodes": [10, 12], - "chapters": [4, 4], - "arc": "Beginning (Vol. 4)" - }, - { - "episodes": [13, 15], - "chapters": [5, 5], - "arc": "Witch (Vol. 5)" - }, - { - "episodes": [16, 18], - "chapters": [6, 6], - "arc": "Line of Descent (Vol. 6)" - }, - { - "episodes": [19, 22], - "chapters": [7, 7], - "arc": "Last Crusade (Vol. 7)" - }, - { - "episodes": [23, 24], - "chapters": [8, 8], - "arc": "Morning Star (Vol. 8)" - }, - { - "chapters": [9, 16], - "arc": "Unadapted (Vols. 9-16)" - } - ] -} diff --git a/src/data/mappings/ouran-high-school-host-club.json b/src/data/mappings/ouran-high-school-host-club.json deleted file mode 100644 index 46ff205..0000000 --- a/src/data/mappings/ouran-high-school-host-club.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "anilistAnimeId": 853, - "anilistMangaId": 30030, - "title": "Ouran High School Host Club", - "sourceNotes": "Single 26-episode anime (2006). Episodic adaptation, roughly one manga chapter per episode, that reorders several stories and adapts only about chapters 1–36 (Volumes 1–8); episodes 25–26 are a studio-original Éclair Tonnerre / Ouran Fair finale with no manga equivalent. The manga's chapters are untitled, so episodes are matched by adapted events — intermediate boundaries are approximate. Manga complete: 83 numbered story chapters across 18 volumes; AniList reports 97 counting per-volume bonus/omake and specials. The unadapted tail (ch. 37–97 — the France trip, family drama, and Tamaki–Haruhi romance) is included chapters-only.", - "mappings": [ - { "episodes": [1, 2], "chapters": [1, 2], "arc": "Host Club Introduction" }, - { - "episodes": [3, 4], - "chapters": [3, 4], - "arc": "Physical Exam / Renge (Lady Manager)" - }, - { - "episodes": [5, 6], - "chapters": [5, 6], - "arc": "The Twins' Fight / Shiro" - }, - { - "episodes": [7, 8], - "chapters": [7, 9], - "arc": "Water Park / Beach Trip" - }, - { "episodes": [9, 9], "chapters": [10, 10], "arc": "Lobelia / Zuka Club" }, - { - "episodes": [10, 11], - "chapters": [12, 13], - "arc": "Haruhi's Family / Ranka" - }, - { - "episodes": [12, 14], - "chapters": [14, 16], - "arc": "Honey's Cavity / Newspaper Club" - }, - { - "episodes": [15, 17], - "chapters": [17, 21], - "arc": "Karuizawa / Misuzu Pension" - }, - { - "episodes": [18, 20], - "chapters": [29, 31], - "arc": "Yasuchika / Zuka Club Returns" - }, - { "episodes": [21, 21], "chapters": [11, 32], "arc": "Halloween" }, - { - "episodes": [22, 24], - "chapters": [33, 36], - "arc": "Kasanoda / Kyoya-Tamaki Origin" - }, - { - "episodes": [25, 26], - "chapters": [36, 36], - "arc": "Ouran Fair Finale (anime-original)" - }, - { - "chapters": [37, 97], - "arc": "Unadapted Tail (France trip, family drama, romance)" - } - ] -} diff --git a/src/data/mappings/outbreak-company.json b/src/data/mappings/outbreak-company.json deleted file mode 100644 index 94e18f6..0000000 --- a/src/data/mappings/outbreak-company.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 19369, - "anilistMangaId": 84983, - "title": "Outbreak Company", - "sourceNotes": "Single-cour, 12-episode anime (2013) has a semi-original storyline that compresses and rearranges events from light novel volumes 1-4 and 7 (of an eventual 18, ~75 chapters total per AniList). Because Ichiro Sakaki's separate manga adaptation by Kiri Kajiya only ran 4 volumes/25 chapters (2012-2014) and doesn't track the anime's rearranged order, this mapping uses light-novel chapter numbers as the 'chapters' unit instead (same approach as realist-hero.json). Chapter boundaries for the compressed/rearranged span are approximate. Light novel finished at 18 volumes (Aug 2017); unadapted volumes included at the tail. No movies.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 30], - "arc": "TV Anime (LN Vols 1-4 & 7, compressed/rearranged)" - }, - { "chapters": [31, 75], "arc": "Unadapted Light Novel (Vols 5-6, 8-18)" } - ] -} diff --git a/src/data/mappings/overlord.json b/src/data/mappings/overlord.json deleted file mode 100644 index 6470364..0000000 --- a/src/data/mappings/overlord.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 20832, - "anilistMangaId": 85934, - "title": "Overlord", - "sourceNotes": "Cumulative episodes across S1 (13) + S2 (13, eps 14-26) + S3 (13, eps 27-39) + S4 (13, eps 40-52) = 52 total. Paired with the Satoshi Ōshio manga adaptation (83 ch). Both anime and manga adapt the same Kugane Maruyama light novel. Per-arc chapter boundaries approximate.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 20], - "arc": "The Undead King (S1: Carne Village / E-Rantel)" - }, - { - "episodes": [14, 26], - "chapters": [21, 38], - "arc": "The Dark Warrior (S2: Lizardmen / Re-Estize)" - }, - { - "episodes": [27, 39], - "chapters": [39, 60], - "arc": "The Bloody Valkyrie (S3: Carne Defense / Jaldabaoth)" - }, - { - "episodes": [40, 52], - "chapters": [61, 83], - "arc": "The Ruler of Conspiracy (S4: Holy Kingdom / Re-Estize Invasion)" - } - ], - "movies": [ - { - "anilistId": 133845, - "title": "Overlord: The Sacred Kingdom", - "year": 2024, - "afterEpisode": 52, - "note": "Canon film adapting the Holy Kingdom arc (LN vols 12-13)." - } - ] -} diff --git a/src/data/mappings/parallel-world-pharmacy.json b/src/data/mappings/parallel-world-pharmacy.json deleted file mode 100644 index 321f33e..0000000 --- a/src/data/mappings/parallel-world-pharmacy.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 136707, - "anilistMangaId": 99024, - "title": "Parallel World Pharmacy", - "sourceNotes": "Single-season, 12-episode TV anime (Diomedéa, 2022) adapts manga ch. 1-39, ending with the resolution of the Black Death outbreak. Manga (art: Sei Takano) ongoing, current ch. 68; the source light novel (10 vols, Liz Takayama) completed in Jan. 2024, but the manga trails the novel's pacing considerably.", - "mappings": [ - { - "episodes": [1, 9], - "chapters": [1, 23], - "arc": "Royal Physician & Parallel World Pharmacy Founding" - }, - { - "episodes": [10, 12], - "chapters": [24, 39], - "arc": "Black Death Outbreak" - }, - { - "chapters": [40, 68], - "arc": "Unadapted (manga continues past the anime)" - } - ] -} diff --git a/src/data/mappings/parasyte.json b/src/data/mappings/parasyte.json deleted file mode 100644 index 19fd38b..0000000 --- a/src/data/mappings/parasyte.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "anilistAnimeId": 20623, - "anilistMangaId": 30401, - "title": "Parasyte -the maxim-", - "sourceNotes": "24-episode 2014 anime (Madhouse) faithfully adapts the full Parasyte manga (8 vols / 64 chapters, 1988-1995) with modernized setting tweaks. Manga complete.", - "mappings": [ - { - "episodes": [1, 7], - "chapters": [1, 15], - "arc": "Migi & Shinichi (Awakening)" - }, - { - "episodes": [8, 13], - "chapters": [16, 30], - "arc": "School Parasites / Mr. A" - }, - { - "episodes": [14, 19], - "chapters": [31, 46], - "arc": "Reiko Tamura / Gotou Introduction" - }, - { - "episodes": [20, 24], - "chapters": [47, 64], - "arc": "Hunt for Gotou / Finale" - } - ] -} diff --git a/src/data/mappings/penguindrum.json b/src/data/mappings/penguindrum.json deleted file mode 100644 index bafece1..0000000 --- a/src/data/mappings/penguindrum.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 10721, - "anilistMangaId": 88512, - "title": "Penguindrum", - "sourceNotes": "Original anime (Brain's Base, dir. Kunihiko Ikuhara, 2011, 24 episodes); the manga by Isuzu Shibata began serialization nearly two years later (2013-2017) as a close tie-in retelling of the same story, complete at 34 chapters / 5 volumes. Volume 1 is confirmed to adapt episodes 1-6; beyond that, no published source breaks down the remaining volume-to-episode pacing precisely, so the back half is split evenly across the two broad halves of the story (the 'Survival Strategy' opening and the 'Fate/Penguindrum' back half). Boundaries beyond episode 6 are APPROXIMATE.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 17], - "arc": "Survival Strategy / Child Broiler" - }, - { - "episodes": [13, 24], - "chapters": [18, 34], - "arc": "Fate / The Penguindrum" - } - ] -} diff --git a/src/data/mappings/pet-girl-of-sakurasou.json b/src/data/mappings/pet-girl-of-sakurasou.json deleted file mode 100644 index d48fbf2..0000000 --- a/src/data/mappings/pet-girl-of-sakurasou.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 13759, - "anilistMangaId": 58107, - "title": "The Pet Girl of Sakurasou", - "sourceNotes": "TV anime (24 eps, 2012-2013, J.C.Staff) adapts Hajime Kamoshida's light novel (13 vols). Paired with the Hoki Kusano manga adaptation (id 58107, 49 ch / 8 vols, ended 2015), which is an incomplete adaptation covering only roughly LN vols 1-4 -- about the anime's first cour (eps ~1-13). Anime eps 14-24 (LN vols 5-7: end-of-year exams, the student anime project, and the graduation finale) have no manga counterpart, so the mapping ends with the anime's first cour. Chapter boundaries are approximate.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 12], - "arc": "Mashiro Moves Into Sakura Hall (LN vol 1)" - }, - { - "episodes": [5, 9], - "chapters": [13, 30], - "arc": "Game Project & Chasing Dreams (LN vols 2-3)" - }, - { - "episodes": [10, 13], - "chapters": [31, 49], - "arc": "Sakura Hall Festival & Christmas (LN vols 3-4, first-cour climax)" - } - ] -} diff --git a/src/data/mappings/phantom-world.json b/src/data/mappings/phantom-world.json deleted file mode 100644 index cc28ad3..0000000 --- a/src/data/mappings/phantom-world.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 21306, - "anilistMangaId": 86401, - "title": "Myriad Colors Phantom World", - "sourceNotes": "TV anime (13 eps, 2016, Kyoto Animation) adapts Soichiro Hatano's light novel 'Musaigen no Phantom World'. AniList has no manga-adaptation entry, so this maps to the light novel (id 86401), treating its 3 published volumes as 'chapters' 1-3. The show is largely episodic (a phantom-of-the-week format) with a loose overarching thread around Enigma and the phantom Ruru that pays off late, so volume boundaries are approximate and KyoAni reordered/added original material. Side entries 'Limitless Phantom World' (7 shorts) and the OVA 'The Polka Dot Miracle' are excluded. There are no theatrical films.", - "mappings": [ - { - "episodes": [1, 5], - "chapters": [1, 1], - "arc": "Phantom Sealing Begins (team forms: Haruhiko, Mai, Reina)" - }, - { - "episodes": [6, 9], - "chapters": [2, 2], - "arc": "Episodic Phantom Cases (Kurumi, Koito & Ruru join)" - }, - { - "episodes": [10, 13], - "chapters": [3, 3], - "arc": "Enigma Arc (overarching memory/Ruru climax)" - } - ] -} diff --git a/src/data/mappings/ping-pong-the-animation.json b/src/data/mappings/ping-pong-the-animation.json deleted file mode 100644 index e99faab..0000000 --- a/src/data/mappings/ping-pong-the-animation.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "anilistAnimeId": 20607, - "anilistMangaId": 35744, - "title": "Ping Pong the Animation", - "sourceNotes": "Single-cour 11-episode Masaaki Yuasa adaptation of Taiyo Matsumoto's Ping Pong manga (complete at 55 chapters across 5 volumes, exactly 11 chapters per volume). The anime is a faithful, near-complete adaptation of the entire manga, so ranges track the source's 5 volumes at roughly one volume per two episodes; chapter boundaries are approximate since the show reorders some beats within its continuous single-story narrative (no named shounen-style arcs — divisions follow the two Inter-High tournaments). No animated theatrical films exist (the 2002 live-action film is excluded).", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 11], - "arc": "Introduction / Kong Wenge Arrives" - }, - { - "episodes": [3, 4], - "chapters": [12, 22], - "arc": "First Inter-High Preliminaries" - }, - { - "episodes": [5, 6], - "chapters": [23, 33], - "arc": "Aftermath / Peco's Fall, Smile's Rise" - }, - { - "episodes": [7, 8], - "chapters": [34, 44], - "arc": "Peco's Return / Training" - }, - { - "episodes": [9, 11], - "chapters": [45, 55], - "arc": "Second Inter-High Tournament / Final" - } - ] -} diff --git a/src/data/mappings/plastic-memories.json b/src/data/mappings/plastic-memories.json deleted file mode 100644 index 38c6f4b..0000000 --- a/src/data/mappings/plastic-memories.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "anilistAnimeId": 20872, - "anilistMangaId": 122492, - "title": "Plastic Memories", - "sourceNotes": "Original 13-episode anime; the closest tie-in print source is the 'Heartfelt Thanks' light novel, a novelization following the same protagonist (Tsukasa Mizugaki) and story, complete at 5 chapters. Dense novelization — chapter ranges are approximate (~2-3 episodes per chapter). The 'Say to Good-bye' spin-off manga is a prequel told from a different character's (Michiru's) perspective and is not used here since it does not map onto the anime's episode-by-episode plot.", - "mappings": [ - { "episodes": [1, 13], "chapters": [1, 5], "arc": "Terminal Service No. 1" } - ] -} diff --git a/src/data/mappings/platinum-end.json b/src/data/mappings/platinum-end.json deleted file mode 100644 index 506dc2e..0000000 --- a/src/data/mappings/platinum-end.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 127401, - "anilistMangaId": 86526, - "title": "Platinum End", - "sourceNotes": "Single-cour 24-episode TV anime (no season split) that adapts the complete manga by Tsugumi Ohba and Takeshi Obata. Manga is complete at 58 chapters across 14 volumes; the anime covers all of it (roughly 2 chapters/episode in the first half, then ~3.4 chapters/episode as the second half is compressed). Cumulative episodes are simply 1-24 since there is only one season. Chapter boundaries follow the tankobon volumes: the Metropoliman arc concludes with Kanade Uryu's defeat at the end of volume 8 (ch 27, ~episode 15), Professor Gaku Yoneda (the final antagonist) formally debuts in volume 10 (ch 32). Arc-to-episode boundaries in the compressed second half are approximate.", - "mappings": [ - { - "episodes": [1, 15], - "chapters": [1, 27], - "arc": "Metropoliman Arc" - }, - { - "episodes": [16, 17], - "chapters": [28, 31], - "arc": "New God Candidates Arc" - }, - { - "episodes": [18, 24], - "chapters": [32, 58], - "arc": "Professor Yoneda Arc" - } - ] -} diff --git a/src/data/mappings/plunderer.json b/src/data/mappings/plunderer.json deleted file mode 100644 index 929129e..0000000 --- a/src/data/mappings/plunderer.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 101168, - "anilistMangaId": 85939, - "title": "Plunderer", - "sourceNotes": "Single 2-cour TV anime (24 eps, 2020, GEEKTOYS) adapting Suu Minazuki's manga, which finished in 2022 at 83 chapters / 21 volumes (AniList). The manga runs in four arcs: the present-day introduction (ch 1-11), the 'Return to the Past' Abandonment War flashback (ch 12-28), the Special Service Arc (ch 29-53), and the Last War Arc (ch 54-83). The anime covers chapters 1 through roughly 36-37: eps 1-11 adapt the heavily padded present-day intro (~1 ch/ep, biggest divergence from ep 6), eps 12-18 compress the academy/war flashback, and eps 19-24 return to the present for the start of the Special Service Arc. Ep 22 adapts ch 33-34; the finale (ep 24) lands around ch 37 with some anime-original wrap-up, so a reader resumes near ch 38. Chapter boundaries are approximate. No theatrical films.", - "mappings": [ - { - "episodes": [1, 11], - "chapters": [1, 11], - "arc": "Hina's Search / The Count System (Licht the Baron, the Aces, Abyss Demon)" - }, - { - "episodes": [12, 18], - "chapters": [12, 28], - "arc": "Return to the Past: Military Academy & the Abandonment War (Birth of Alcia)" - }, - { - "episodes": [19, 24], - "chapters": [29, 37], - "arc": "Special Service / King of Abyss (return to the present)" - }, - { - "chapters": [38, 83], - "arc": "Special Service conclusion & the Last War Arc (unadapted)" - } - ] -} diff --git a/src/data/mappings/pluto.json b/src/data/mappings/pluto.json deleted file mode 100644 index 275173b..0000000 --- a/src/data/mappings/pluto.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "anilistAnimeId": 99088, - "anilistMangaId": 30745, - "title": "PLUTO", - "sourceNotes": "Single-season ONA (8 episodes, ~60 min each) released on Netflix in 2023, adapting Naoki Urasawa's completed manga Pluto: Urasawa x Tezuka (65 chapters/\"Acts\" collected in 8 tankobon volumes, AniList id 30745). The adaptation is essentially one episode per manga volume, covering the entire manga. Per-volume act boundaries: V1 = Acts 1-7, V2 = 8-15, V3 = 16-23, V4 = 24-31, V5 = 32-39, V6 = 40-47, V7 = 48-55, V8 = 56-65. Pluto is a single continuous mystery rather than a multi-arc series, so mappings are labeled by source volume. Manga complete at 65 chapters.", - "mappings": [ - { - "episodes": [1, 1], - "chapters": [1, 7], - "arc": "Volume 1" - }, - { - "episodes": [2, 2], - "chapters": [8, 15], - "arc": "Volume 2" - }, - { - "episodes": [3, 3], - "chapters": [16, 23], - "arc": "Volume 3" - }, - { - "episodes": [4, 4], - "chapters": [24, 31], - "arc": "Volume 4" - }, - { - "episodes": [5, 5], - "chapters": [32, 39], - "arc": "Volume 5" - }, - { - "episodes": [6, 6], - "chapters": [40, 47], - "arc": "Volume 6" - }, - { - "episodes": [7, 7], - "chapters": [48, 55], - "arc": "Volume 7" - }, - { - "episodes": [8, 8], - "chapters": [56, 65], - "arc": "Volume 8" - } - ] -} diff --git a/src/data/mappings/prison-school.json b/src/data/mappings/prison-school.json deleted file mode 100644 index ec3985a..0000000 --- a/src/data/mappings/prison-school.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 20807, - "anilistMangaId": 55297, - "title": "Prison School", - "sourceNotes": "S1 anime (12 eps, 2015) adapts manga chapters 1-82 (partway into the DTO arc; resume reading at ch 83). Paired with Akira Hiramoto's complete manga: the story ends at ch 277 with a ch 277.5 epilogue (28 vols); AniList counts 279 because it lists the '.5' interstitial half-chapters separately, so the final arc extends to 279. The 'Mad Wax' OVA (re-covers ch 82-89) and the live-action drama are excluded. Saga-level boundaries follow the fandom Story Arcs list; the ASSA/DTO sub-split is approximate.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 82], - "arc": "Underground Student Council Saga (Peeping → ASSA → DTO; anime portion)" - }, - { - "chapters": [83, 165], - "arc": "DTO Finale → Aboveground Student Council Saga" - }, - { "chapters": [166, 241], "arc": "Sports Festival Saga" }, - { - "chapters": [242, 279], - "arc": "Tanabata Saga (Yakiniku Party & Epilogue)" - } - ] -} diff --git a/src/data/mappings/problem-children.json b/src/data/mappings/problem-children.json deleted file mode 100644 index 795fbd9..0000000 --- a/src/data/mappings/problem-children.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 15315, - "anilistMangaId": 75855, - "title": "Problem Children Are Coming From Another World, Aren't They?", - "sourceNotes": "Single-cour anime, 10 episodes (Diomedea, 2013); no sequel seasons, so cumulative episodes = raw episodes. The source is Tarou Tatsunoko's light novel (AniList id 75855, format NOVEL, complete at 12 volumes / listed as 125 chapters). There is no manga used for episode-to-source guides, so this mapping uses LIGHT-NOVEL VOLUME numbers as the 'chapters' unit. The anime adapts LN volumes 1-2: eps 1-5 cover Volume 1 and eps 6-10 cover Volume 2 (confirmed by Wikipedia/fandom). Volumes 3-12 (including the Ouroboros Alliance, Three-Headed Dragon and later arcs) are unadapted; the story continues in the sequel LN series Last Embryo. Per-volume arc boundaries are approximate. A single OVA (\"The Hot Spring Fun Trip\", 2013) exists but is a non-theatrical bonus episode, so no films are listed.", - "mappings": [ - { - "episodes": [1, 5], - "chapters": [1, 1], - "arc": "Yes! Black Rabbit Called You! — arrival in Little Garden, No Names community, Fores Garo Gift Game & Thousand Eyes, rescuing Leticia from Perseus (LN vol 1)" - }, - { - "episodes": [6, 10], - "chapters": [2, 2], - "arc": "Oh dear, a Declaration of War by a Demon Lord? — Salamandra's Fire Dragon Birth Festival, the Pied Piper of Hamelin and the Demon Lord Pest (LN vol 2)" - }, - { - "chapters": [3, 12], - "arc": "Dragon Summoning through the later arcs (Ouroboros Alliance, Three-Headed Dragon, etc.) — LN vols 3-12, unadapted (continued in Last Embryo)" - } - ] -} diff --git a/src/data/mappings/promised-neverland.json b/src/data/mappings/promised-neverland.json deleted file mode 100644 index 6fc8775..0000000 --- a/src/data/mappings/promised-neverland.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "anilistAnimeId": 101759, - "anilistMangaId": 87423, - "title": "The Promised Neverland", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (11) = 23. Manga complete at 181 chapters. S2 famously compresses ch 38-181 into 11 episodes, omitting the Goldy Pond Battle and Queen/Nobles arcs — unadapted-tail-style entries kept for the omitted material so manga-side navigation still resolves.", - "mappings": [ - { - "episodes": [1, 5], - "chapters": [1, 9], - "arc": "Introduction (Grace Field House)" - }, - { - "episodes": [6, 12], - "chapters": [10, 37], - "arc": "Jailbreak (Grace Field Escape)" - }, - { - "episodes": [13, 18], - "chapters": [38, 63], - "arc": "Goldy Pond Hunt (Anime-Compressed)" - }, - { - "episodes": [19, 23], - "chapters": [64, 181], - "arc": "Cuvitidala / Seven Walls / Final (Anime-Compressed)" - } - ] -} diff --git a/src/data/mappings/pseudo-harem.json b/src/data/mappings/pseudo-harem.json deleted file mode 100644 index 804b565..0000000 --- a/src/data/mappings/pseudo-harem.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "anilistAnimeId": 163623, - "anilistMangaId": 105577, - "title": "Pseudo Harem", - "sourceNotes": "Single 12-episode season (Nomad, 2024) adapts the complete manga, a former Twitter webcomic parallel-serialized in Monthly Shonen Sunday (Jan 2019-Mar 2021) and collected into 6 volumes. Manga complete at 157 chapters; the anime covers the full story through its epilogue, so a single broad mapping entry is used (no distinct named arcs).", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 157], "arc": "Complete Adaptation" } - ] -} diff --git a/src/data/mappings/psycho-pass.json b/src/data/mappings/psycho-pass.json deleted file mode 100644 index 23eecac..0000000 --- a/src/data/mappings/psycho-pass.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "anilistAnimeId": 13601, - "anilistMangaId": 74933, - "title": "PSYCHO-PASS", - "sourceNotes": "S1 anime (22 eps, 2012, Production I.G.) is the original work. Paired with the Hikaru Miyoshi manga retelling 'Kanshikan Tsunemori Akane' (27 chapters / 6 vols, 2012-2014) which covers similar material. PSYCHO-PASS 2 (id 20513) and PSYCHO-PASS 3 (id 108307) are separate sequel anime not covered here.", - "mappings": [ - { - "episodes": [1, 11], - "chapters": [1, 14], - "arc": "Cour 1: Sibyl System & Makishima Introduction" - }, - { - "episodes": [12, 22], - "chapters": [15, 27], - "arc": "Cour 2: Pursuit of Makishima / Finale" - } - ], - "movies": [ - { - "anilistId": 20514, - "title": "PSYCHO-PASS: The Movie", - "year": 2015, - "note": "Canon sequel film, set after S2." - }, - { - "anilistId": 102649, - "title": "PSYCHO-PASS: Sinners of the System Case.1 - Crime and Punishment", - "year": 2019, - "note": "Canon side-story film." - }, - { - "anilistId": 104382, - "title": "PSYCHO-PASS: Sinners of the System Case.2 - First Guardian", - "year": 2019, - "note": "Canon side-story film." - }, - { - "anilistId": 104990, - "title": "PSYCHO-PASS: Sinners of the System Case.3 - On the Other Side of Love and Hate", - "year": 2019, - "note": "Canon side-story film." - }, - { - "anilistId": 153687, - "title": "PSYCHO-PASS: Providence", - "year": 2023, - "note": "Canon film bridging Sinners of the System and S3." - } - ] -} diff --git a/src/data/mappings/quintessential-quintuplets.json b/src/data/mappings/quintessential-quintuplets.json deleted file mode 100644 index 9107657..0000000 --- a/src/data/mappings/quintessential-quintuplets.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 103572, - "anilistMangaId": 100230, - "title": "The Quintessential Quintuplets", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (12, eps 13-24) = 24 total. The 2022 Movie wraps up the story; it's a separate AniList entry. Manga complete at 122 chapters.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 30], - "arc": "Camp / Reunion (S1 first half)" - }, - { - "episodes": [7, 12], - "chapters": [31, 56], - "arc": "Final Exam (S1 second half)" - }, - { - "episodes": [13, 24], - "chapters": [57, 100], - "arc": "School Festival / Reveals (S2)" - }, - { - "chapters": [101, 122], - "arc": "Wedding / Finale (covered by 2022 movie)" - } - ], - "movies": [ - { - "anilistId": 131520, - "title": "The Quintessential Quintuplets Movie", - "year": 2022, - "chapters": [101, 122], - "afterEpisode": 24, - "note": "Concludes the story (Wedding / Finale arcs)." - } - ] -} diff --git a/src/data/mappings/ragna-crimson.json b/src/data/mappings/ragna-crimson.json deleted file mode 100644 index 7cdbf4c..0000000 --- a/src/data/mappings/ragna-crimson.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 146493, - "anilistMangaId": 99065, - "title": "Ragna Crimson", - "sourceNotes": "Single 24-episode TV anime (two consecutive cours, Oct 2023-Mar 2024); episodes are non-cumulative since there is only one season. The anime adapts manga chapters 1-56. Arc names and chapter/episode boundaries are the fan/community divisions from the Ragna Crimson Fandom wiki (the wiki notes these are unofficial). Boundary chapters and episodes overlap at arc edges (e.g. ch. 7 and ep. 4 straddle the first two arcs) because the adaptation splits chapters across arcs. Manga is ongoing (current ch. ~94 as of June 2026); chapters 57 onward are unadapted.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 7], - "arc": "Birth of the Reaper" - }, - { - "episodes": [4, 8], - "chapters": [7, 16], - "arc": "Royal Capital" - }, - { - "episodes": [8, 17], - "chapters": [17, 40], - "arc": "Argentum Corps" - }, - { - "episodes": [18, 24], - "chapters": [41, 56], - "arc": "Winged Bloodline" - }, - { - "chapters": [57, 94], - "arc": "Post-Winged Bloodline (unadapted)" - } - ] -} diff --git a/src/data/mappings/rainbow.json b/src/data/mappings/rainbow.json deleted file mode 100644 index 95f7cc4..0000000 --- a/src/data/mappings/rainbow.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 6114, - "anilistMangaId": 37482, - "title": "Rainbow", - "sourceNotes": "26 episodes, single season. Manga complete at 235 chapters across 22 volumes. The manga's story is split into four chronological parts (1955-56, 1957-58, 1960-64, and 1953-55/1964-68); per Japanese fan sources the anime finale ends partway through Crime 118 (vol. 12), the close of Part 2 (1957-58), leaving Parts 3-4 unadapted. Chapter boundary is approximate (mid-chapter cutoff rounded to the chapter start).", - "mappings": [ - { - "episodes": [1, 26], - "chapters": [1, 118], - "arc": "Shonan Reform School (Parts 1-2: 1955-58)" - }, - { - "chapters": [119, 235], - "arc": "Life After Release (Parts 3-4: 1953-55 & 1960-68, unadapted)" - } - ] -} diff --git a/src/data/mappings/ranking-of-kings.json b/src/data/mappings/ranking-of-kings.json deleted file mode 100644 index d40412f..0000000 --- a/src/data/mappings/ranking-of-kings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 113717, - "anilistMangaId": 114388, - "title": "Ranking of Kings", - "sourceNotes": "TV Season 1 (id 113717, 23 eps) adapts the entirety of the manga's Part 1 (the Bosse Kingdom storyline), which is chapters 1-155 / volumes 1-12; Part 2 begins at chapter 156 and the manga remains ongoing (RELEASING; ~chapter 276 as of Dec 2025). The Ousama Ranking manga uses short, web-style chapters, so the per-arc chapter splits within Part 1 are approximate (~6-7 chapters per episode). The sequel TV 'Treasure Chest of Courage' (id 153452, 10 eps) adapts bonus / side-story gaiden chapters and is not mapped to the main-series numbering here, so it is omitted. The announced Ousama Ranking film (id 166457) is NOT_YET_RELEASED and is excluded.", - "mappings": [ - { - "episodes": [1, 9], - "chapters": [1, 55], - "arc": "King Bosse's death & Bojji's journey" - }, - { - "episodes": [10, 15], - "chapters": [56, 100], - "arc": "Underworld training (Despa) & Miranjo's plot" - }, - { - "episodes": [16, 23], - "chapters": [101, 155], - "arc": "Battle for the Bosse Kingdom (Part 1 finale)" - }, - { - "chapters": [156, 276], - "arc": "Part 2 (unadapted in main TV, manga ongoing)" - } - ] -} diff --git a/src/data/mappings/re-creators.json b/src/data/mappings/re-creators.json deleted file mode 100644 index 8a99922..0000000 --- a/src/data/mappings/re-creators.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 97980, - "anilistMangaId": 99260, - "title": "Re:CREATORS", - "sourceNotes": "Single season, 22 episodes. Original TROYCA anime (concept by Rei Hiroe, directed by Ei Aoki); the manga by Daiki Kase is a close tie-in adaptation that ran in parallel with the broadcast, complete at 29 chapters across 6 volumes. The story has no distinct named arcs, but splits naturally at the mid-series turn from gathering the Creations to the confrontation with Altair; chapters are split proportionally to match.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 17], - "arc": "Gathering of the Creations" - }, - { - "episodes": [14, 22], - "chapters": [18, 29], - "arc": "Confrontation with Altair" - } - ] -} diff --git a/src/data/mappings/re-zero.json b/src/data/mappings/re-zero.json deleted file mode 100644 index 4057700..0000000 --- a/src/data/mappings/re-zero.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "anilistAnimeId": 21355, - "anilistMangaId": 87259, - "title": "Re:ZERO -Starting Life in Another World-", - "sourceNotes": "S1 anime (25 eps, 2016). The Re:Zero manga is split across multiple AniList IDs, one per light-novel 'Chapter'/arc. This mapping uses Chapter 3: Truth of Zero (id 87259, 55 ch) which covers S1 eps 7-25 (Roswaal Mansion → Witch's Cult / White Whale / Petelgeuse). Earlier eps adapt Chapter 1 (id 85736, 11 ch) and Chapter 2 (id 85814, 31 ch); S2+ adapt Chapter 4 (Sanctuary) and beyond, each a separate AniList manga.", - "mappings": [ - { - "episodes": [7, 25], - "chapters": [1, 55], - "arc": "Chapter 3: Truth of Zero (Roswaal Mansion → Witch's Cult)" - } - ] -} diff --git a/src/data/mappings/real-girl.json b/src/data/mappings/real-girl.json deleted file mode 100644 index b3b5acd..0000000 --- a/src/data/mappings/real-girl.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "anilistAnimeId": 100526, - "anilistMangaId": 80767, - "title": "Real Girl", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (12). Manga complete; AniList lists 51 chapters across 13 volumes (some sources cite 47 numbered chapters across 12 volumes, likely due to how bonus/special chapters are split — AniList's count is used here). A faithful, 0%-filler adaptation covering the full story; S1 ends around the manga's halfway point, S2 covers the remainder through the ending.", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 23], "arc": "Season 1" }, - { "episodes": [13, 24], "chapters": [24, 51], "arc": "Season 2" } - ] -} diff --git a/src/data/mappings/realist-hero.json b/src/data/mappings/realist-hero.json deleted file mode 100644 index aa25087..0000000 --- a/src/data/mappings/realist-hero.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 117612, - "anilistMangaId": 98171, - "title": "How a Realist Hero Rebuilt the Kingdom", - "sourceNotes": "Source is Dojyomaru's light novel (Genjitsu Shugi Yuusha no Oukoku Saikenki, 20 volumes, completed Dec 2024). The 2021-22 TV anime (J.C.Staff) aired as 2 cours: Part 1 (eps 1-13, AniList id 117612) and Part 2 (eps 14-26, AniList id 139648). This mapping uses the first id with CUMULATIVE episode numbering 1-26. The linked manga adaptation (AniList id 98171, art by Satoshi Ueda, serialized in Comic Gardo since 2017) lags FAR behind the anime - only ~15 tankobon / ~ch 76 as of mid-2026, not yet reaching the anime's endpoint, and AniList lists no chapter count - so this mapping uses LIGHT-NOVEL VOLUME numbers as the 'chapters' unit instead (same approach as cheat-skill.json and netoge.json). The anime adapts LN vols 1 through roughly the first half of vol 5; a viewer resumes reading at LN vol 5. Per-volume episode boundaries are approximate. No theatrical films.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 1], - "arc": "Kingdom Reform - Elfrieden (Souma is crowned, gathers talented retainers, and pushes fiscal & food reforms) (LN vol 1)" - }, - { - "episodes": [7, 13], - "chapters": [2, 2], - "arc": "The Three Dukedoms Civil War (the dukes' rebellion, the Amidonian invasion, and the capture of Van) (LN vol 2)" - }, - { - "episodes": [14, 18], - "chapters": [3, 3], - "arc": "Occupation of Van & Amidonia (governing the conquered city, the food festival broadcast, Roroa) (LN vol 3)" - }, - { - "episodes": [19, 23], - "chapters": [4, 4], - "arc": "The Mankind Declaration & the Gran Chaos Empire (Jeanne's negotiation, returning Van, the engagement) (LN vol 4)" - }, - { - "episodes": [24, 26], - "chapters": [5, 5], - "arc": "Into the Next Reign (LN vol 5, first half - the anime stops partway through this volume)" - }, - { - "chapters": [5, 20], - "arc": "Beyond the anime - the rest of LN vol 5 onward (vols 5-20, unadapted; resume reading at vol 5)" - } - ] -} diff --git a/src/data/mappings/record-of-grancrest-war.json b/src/data/mappings/record-of-grancrest-war.json deleted file mode 100644 index 13d6064..0000000 --- a/src/data/mappings/record-of-grancrest-war.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 97768, - "anilistMangaId": 88547, - "title": "Record of Grancrest War", - "sourceNotes": "24 episodes, attempting to cover the entire 10-volume, 46-chapter light novel series (complete) in one cour. The separate manga adaptation by Makoto Yotsuba only covers the first two light novel volumes, so the light novel itself (AniList type MANGA, format NOVEL) is used here as the source of truth. Chapter cut points are estimated proportionally from the light novel's volume synopses (e.g. vol. 5 covers the Altirk Treaty/liberation of Theo's hometown, vol. 10 covers Theo's coronation and the final battle with Pandora) and should be treated as approximate.", - "mappings": [ - { - "episodes": [1, 9], - "chapters": [1, 19], - "arc": "Siluca and Theo's Rise Against the Coalition" - }, - { - "episodes": [10, 19], - "chapters": [20, 36], - "arc": "The Altirk Treaty and the Fall of Milza" - }, - { - "episodes": [20, 24], - "chapters": [37, 46], - "arc": "The Final War and the Empire of Leon" - } - ] -} diff --git a/src/data/mappings/record-of-ragnarok.json b/src/data/mappings/record-of-ragnarok.json deleted file mode 100644 index bb73f53..0000000 --- a/src/data/mappings/record-of-ragnarok.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "anilistAnimeId": 127399, - "anilistMangaId": 107098, - "title": "Record of Ragnarok", - "sourceNotes": "Cumulative episodes across the Netflix ONA: S1 (12 ep, 2021) + S2 (15 ep, 2023; Part 1 = ep 13–22, Part 2 = ep 23–27) + S3 (15 ep, 2025) = 42 total. Uses the S1 anime id (127399); S2/S3 are sequels with their own AniList ids. Paired with the ongoing manga by Shinya Umemura, Takumi Fukui & Ajichika — 27 volumes / latest chapter ~121 (June 2026). Each Ragnarok ROUND is treated as an arc. Firm anchors from anime-vs-manga reading guides: resume reading at ch 20 after S1, ch 55 after S2, and ch 86 after S3 — so S1 = ch 1–19, S2 = ch 20–54, S3 = ch 55–85. Round-level anchors: Shiva vs Raiden ≈ ch 31–41 and Buddha begins ch 42 (Round Six). Internal per-round chapter splits within each season are approximate; the S1/S2/S3 endpoints are exact. The unadapted tail (ch 86–121) covers Round 10 (Okita vs Susano'o) onward, still ongoing.", - "mappings": [ - { - "season": 1, - "episodes": [1, 4], - "chapters": [1, 7], - "arc": "S1 · Round 1: Lü Bu vs Thor (incl. prologue)" - }, - { - "season": 1, - "episodes": [5, 8], - "chapters": [8, 14], - "arc": "S1 · Round 2: Adam vs Zeus" - }, - { - "season": 1, - "episodes": [9, 12], - "chapters": [15, 19], - "arc": "S1 · Round 3: Kojiro Sasaki vs Poseidon" - }, - { - "season": 2, - "episodes": [13, 17], - "chapters": [20, 30], - "arc": "S2 · Round 4: Jack the Ripper vs Heracles" - }, - { - "season": 2, - "episodes": [18, 22], - "chapters": [31, 41], - "arc": "S2 · Round 5: Raiden Tameemon vs Shiva" - }, - { - "season": 2, - "episodes": [23, 27], - "chapters": [42, 54], - "arc": "S2 · Round 6: Buddha vs Zerofuku/Hajun" - }, - { - "season": 3, - "episodes": [28, 33], - "chapters": [55, 65], - "arc": "S3 · Round 7: Qin Shi Huang vs Hades" - }, - { - "season": 3, - "episodes": [34, 38], - "chapters": [66, 76], - "arc": "S3 · Round 8: Nikola Tesla vs Beelzebub" - }, - { - "season": 3, - "episodes": [39, 42], - "chapters": [77, 85], - "arc": "S3 · Round 9: Leonidas vs Apollo" - }, - { - "chapters": [86, 121], - "arc": "Round 10+ (Okita vs Susano'o onward, ongoing, unadapted)" - } - ] -} diff --git a/src/data/mappings/redo-of-healer.json b/src/data/mappings/redo-of-healer.json deleted file mode 100644 index 6f9cee3..0000000 --- a/src/data/mappings/redo-of-healer.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 113425, - "anilistMangaId": 100476, - "title": "Redo of Healer", - "sourceNotes": "Source is the light novel (10 volumes); paired here with the ongoing manga adaptation (AniList id 100476, which reports null chapters). The 2021 TV anime (12 eps; the broadcast 'Redo' and 'Complete Recovery' uncensored versions share the same 12 episodes) adapts roughly LN volumes 1-3 = manga chapters 1-30, so a viewer resumes reading around ch 31. Manga is ongoing: 18 volumes / latest chapter ~78 as of mid-2026 (web-sourced; AniList chapter count is null). Per-episode chapter boundaries are approximate, segmented by arc.", - "mappings": [ - { - "episodes": [1, 1], - "chapters": [1, 5], - "arc": "Revenge Restart: Keyaru Rewinds Time & Recaptures Flare" - }, - { - "episodes": [2, 3], - "chapters": [6, 11], - "arc": "Princess Flare's Downfall (Freia) & Buying Setsuna" - }, - { - "episodes": [4, 9], - "chapters": [12, 23], - "arc": "Setsuna's Revenge & Kureha the Blade Saint; Demon Lord Eve" - }, - { - "episodes": [10, 12], - "chapters": [24, 30], - "arc": "The Kingdom & Princess Norn; A New Journey" - }, - { - "chapters": [31, 78], - "arc": "Post-anime arcs (unadapted): Eve's reclamation, Buranikka & hunting Norn" - } - ] -} diff --git a/src/data/mappings/reincarnated-as-a-sword.json b/src/data/mappings/reincarnated-as-a-sword.json deleted file mode 100644 index c75e8d3..0000000 --- a/src/data/mappings/reincarnated-as-a-sword.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 139587, - "anilistMangaId": 98014, - "title": "Reincarnated as a Sword", - "sourceNotes": "12-episode ONA (C2C, 2022); use the S1 anime id 139587. The printed source is Yuu Tanaka's light novel (AniList id 97466), but that has no continuous chapter numbering, so this maps to the Tomowo Maruyama manga adaptation (AniList id 98014), which uses the running chapter numbers community episode-to-source guides reference. Manga ongoing (chapter 97 as of June 2026; AniList lists no count). The anime adapts manga chapters 1-27 (LN vol 1 through vol 2 ch 3); guides say to resume the manga at Vol 6, Ch 28 (the Undead Dungeon arc) after the anime. Season 2 announced for Oct 2026. Episode boundaries within each arc are approximate; the unadapted tail is a single chapters-only entry since later per-arc manga chapter boundaries are not firmly documented.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 7], - "arc": "Introduction (Fran and Teacher / Alessa)" - }, - { - "episodes": [4, 7], - "chapters": [8, 15], - "arc": "Goblin Dungeon Arc" - }, - { - "episodes": [8, 12], - "chapters": [16, 27], - "arc": "Spider Dungeon Arc" - }, - { - "chapters": [28, 97], - "arc": "Undead Dungeon Arc onward (unadapted)" - } - ] -} diff --git a/src/data/mappings/reincarnation-of-the-strongest-exorcist.json b/src/data/mappings/reincarnation-of-the-strongest-exorcist.json deleted file mode 100644 index 65c780f..0000000 --- a/src/data/mappings/reincarnation-of-the-strongest-exorcist.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "anilistAnimeId": 144553, - "anilistMangaId": 123544, - "title": "The Reincarnation of the Strongest Exorcist in Another World", - "sourceNotes": "Single 13-episode season. Manga ongoing (current ch. 52); the anime fast-paces through the light novel's early volumes, concluding at manga chapter 30, with skipped worldbuilding/character depth noted by fans. Unadapted continuation included at the tail.", - "mappings": [ - { "episodes": [1, 13], "chapters": [1, 30], "arc": "Anime Adaptation" }, - { "chapters": [31, 52], "arc": "Manga-Only Continuation" } - ] -} diff --git a/src/data/mappings/relife.json b/src/data/mappings/relife.json deleted file mode 100644 index 68b174b..0000000 --- a/src/data/mappings/relife.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 21049, - "anilistMangaId": 85849, - "title": "ReLIFE", - "sourceNotes": "Cumulative episodes across the 2016 ONA series (13) + the 2018 OVA finale 'Kanketsu-hen / Final Arc' (4, eps 14-17) = 17 total, one continuous story. Manga complete: 222 numbered chapters ('Reports') by Yayoiso; AniList's 238 count includes the volume 15 epilogue and bonus chapters. The TV/ONA series ends at roughly chapter 108 (the school-festival 'Confession'); the four-episode OVA compresses the entire remainder (ch 109 to the ending). The internal eps 7/8 chapter split is approximate. No theatrical anime film exists (the 2017 live-action film is a separate continuity).", - "mappings": [ - { - "episodes": [1, 7], - "chapters": [1, 70], - "arc": "First Semester & Midterm Exams (the experiment begins)" - }, - { - "episodes": [8, 13], - "chapters": [71, 108], - "arc": "Volleyball Tournament, Summer & School Festival" - }, - { - "episodes": [14, 17], - "chapters": [109, 238], - "arc": "Final Arc (OVA): Second Semester, Hishiro Resolution, Graduation & Finale" - } - ] -} diff --git a/src/data/mappings/remake-our-life.json b/src/data/mappings/remake-our-life.json deleted file mode 100644 index c6d864c..0000000 --- a/src/data/mappings/remake-our-life.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "anilistAnimeId": 114065, - "anilistMangaId": 105819, - "title": "Remake Our Life!", - "sourceNotes": "Single-cour 12-episode anime by feel (2021), plus an unnumbered recap (ep 6.5) that is not counted in the episode numbering. The source is Nachi Kio's light novel (AniList 105819, NOVEL format), which is complete at 12 main volumes (March 2017 - March 2023). The LN exposes no continuous chapter numbering, so ranges use LIGHT-NOVEL VOLUME numbers as the unit and are approximate (~3 episodes per volume). Multiple guides agree the anime adapts LN volumes 1-4, ending on the Volume 4 \"changed future\" twist; readers are advised to continue from Volume 5. Volumes 5-12 (final arc begins at vol 11) are unadapted.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 1], - "arc": "Volume 1: Ten Years Back / Becoming a Creator" - }, - { - "episodes": [4, 6], - "chapters": [2, 2], - "arc": "Volume 2: Finding Something Worth Getting Serious About" - }, - { - "episodes": [7, 9], - "chapters": [3, 3], - "arc": "Volume 3" - }, - { - "episodes": [10, 12], - "chapters": [4, 4], - "arc": "Volume 4: The Changed Future" - }, - { - "chapters": [5, 10], - "arc": "Volumes 5-10 (unadapted)" - }, - { - "chapters": [11, 12], - "arc": "Volumes 11-12: Final Arc (unadapted)" - } - ] -} diff --git a/src/data/mappings/rent-a-girlfriend.json b/src/data/mappings/rent-a-girlfriend.json deleted file mode 100644 index dff79a1..0000000 --- a/src/data/mappings/rent-a-girlfriend.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "anilistAnimeId": 113813, - "anilistMangaId": 99943, - "title": "Rent-a-Girlfriend", - "sourceNotes": "Cumulative episodes across S1 (12, 2020, eps 1-12) + S2 (12, 2022, eps 13-24) + S3 (12, 2023, eps 25-36) = 36 total. Manga by Reiji Miyajima is ONGOING in Weekly Shonen Magazine (current ch. 429; 46 tankobon volumes as of June 2026; AniList lists its chapter count as null). S1 adapts roughly vol 1-6 (ch 1-50), S2 vol 7-12 (ch ~51-104), S3 vol 13-19 (ch ~105-167); intra-season chapter boundaries are approximate (split proportionally by episode). The unadapted tail (ch 168-429) is included chapters-only; note that S4 (2025) and S5 (2026) later adapt part of this tail but are out of scope for this S1-S3 mapping. No theatrical films.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 25], - "arc": "Rental Girlfriend / Grandmother Hospitalized (S1)" - }, - { - "episodes": [7, 12], - "chapters": [26, 50], - "arc": "Class Beach Trip / Next-Door Neighbor (S1)" - }, - { - "episodes": [13, 18], - "chapters": [51, 77], - "arc": "Ruka & Sumi / The Boyfriend Lie (S2)" - }, - { - "episodes": [19, 24], - "chapters": [78, 104], - "arc": "Stage Play / Chizuru's Acting Dream (S2)" - }, - { - "episodes": [25, 30], - "chapters": [105, 136], - "arc": "Indie Movie Production / Crowdfunding (S3)" - }, - { - "episodes": [31, 36], - "chapters": [137, 167], - "arc": "Film Screening / Grandmother's Passing (S3)" - }, - { - "chapters": [168, 429], - "arc": "Unadapted Tail (water park & Hawaii trips onward; later adapted by S4/S5)" - } - ] -} diff --git a/src/data/mappings/restaurant-to-another-world.json b/src/data/mappings/restaurant-to-another-world.json deleted file mode 100644 index edc6cc9..0000000 --- a/src/data/mappings/restaurant-to-another-world.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 97617, - "anilistMangaId": 98911, - "title": "Restaurant to Another World", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (12). Manga complete at 29 chapters (4 volumes, Young Gangan, 2016-2019). The manga is an alternative adaptation of the same light novel source the anime draws from, rather than the anime's direct source, so episode order and chapter order diverge somewhat even though both cover the same 'dish of the week' stories. Episodic anthology adaptation, roughly 1 chapter per episode; chapter ranges are approximate.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 12], - "arc": "Season 1 (Nekoya Restaurant)" - }, - { "episodes": [13, 24], "chapters": [13, 29], "arc": "Season 2" } - ] -} diff --git a/src/data/mappings/rokka-braves-of-the-six-flowers.json b/src/data/mappings/rokka-braves-of-the-six-flowers.json deleted file mode 100644 index b17e375..0000000 --- a/src/data/mappings/rokka-braves-of-the-six-flowers.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 20955, - "anilistMangaId": 86037, - "title": "Rokka -Braves of the Six Flowers-", - "sourceNotes": "Source is Ishio Yamagata's light novel (AniList id 86037, format NOVEL; AniList lists no chapter count), so this mapping uses LIGHT-NOVEL VOLUME numbers as the \"chapters\" unit. The linked manga (id 86038, 16 chapters / 4 tankobon, finished 2015) is a minor side-adaptation of volume 1 only, not the primary source. The single 12-episode TV series (id 20955, 2015) adapts the ENTIRETY of LN volume 1 as one continuous locked-room mystery — the six chosen Braves discover a seventh among them and Adlet must expose the impostor (vol 1 = Prologue, chapters 1-5, Epilogue). The LN ran 6 volumes (final volume released July 2015) and has been on indefinite hiatus since; volumes 2-6 (the march through the Howling Vilelands — the second fake, Tgurneu, Chamo's parasite, the Dead Host, and the Black Barrenbloom) are entirely unadapted. No theatrical films (a 3-episode \"Picture Drama\" short exists but is not a feature).", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 1], - "arc": "The Search for the Seventh / The Fake Brave - the six Braves of the Six Flowers gather, find a seventh impostor among them, and Adlet is accused; he must uncover the true fake (LN vol 1, the entire anime)" - }, - { - "chapters": [2, 6], - "arc": "March through the Howling Vilelands - the second fake, Tgurneu and the fiend commanders, Chamo's parasite, the Dead Host, and the Black Barrenbloom (LN vols 2-6, unadapted; series on hiatus)" - } - ] -} diff --git a/src/data/mappings/romantic-killer.json b/src/data/mappings/romantic-killer.json deleted file mode 100644 index 243b49a..0000000 --- a/src/data/mappings/romantic-killer.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "anilistAnimeId": 153930, - "anilistMangaId": 113531, - "title": "Romantic Killer", - "sourceNotes": "Single-cour Netflix ONA (12 episodes, all released 2022-10-27), so episode numbers are non-cumulative. Adapts Wataru Momose's manga essentially in full: the anime runs from Vol. 1 Ch. 1 through the finale near Ch. 39-40. Manga complete at 40 chapters across 4 volumes (Vol.1 ch.1-9, Vol.2 ch.10-20, Vol.3 ch.21-30, Vol.4 ch.31-40). Romantic Killer is an episodic romantic comedy with no official arc names, so ranges are segmented by volume and by the love-interest/story block each covers, and chapter boundaries are approximate (~3 chapters per episode).", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 9], - "arc": "Riri's Curse & Tsukasa Kazuki" - }, - { - "episodes": [4, 6], - "chapters": [10, 20], - "arc": "Junta Hayami, the Childhood Friend" - }, - { - "episodes": [7, 9], - "chapters": [21, 30], - "arc": "Hijiri Koganei" - }, - { - "episodes": [10, 12], - "chapters": [31, 40], - "arc": "Saki Shion & the Finale" - } - ] -} diff --git a/src/data/mappings/rosario-vampire.json b/src/data/mappings/rosario-vampire.json deleted file mode 100644 index 287baf7..0000000 --- a/src/data/mappings/rosario-vampire.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 2993, - "anilistMangaId": 30894, - "title": "Rosario + Vampire", - "sourceNotes": "Source is the first Rosario+Vampire manga (\"Season I\", AniList 30894), complete at 40 chapters / 10 volumes; the story then continues in a separate sequel manga, Rosario+Vampire: Season II (AniList 33403, 67 more chapters, completed 2014), which the anime never reaches. The Gonzo TV adaptation is only 26 episodes across two 13-episode cours (S1: Rosario+Vampire, 2008; S2: Capu2, 2008). S1 loosely adapts roughly chapters 1-20 of the manga but freely REORDERS the arcs and inserts original filler, so chapter ranges here reflect the arc each episode block draws from, not strict linear progression (e.g. Mizore ch19-20 airs before the Witch's Knoll and Kuyo arcs). Episode 8 (\"Mathematics\") is largely anime-original. Capu2 (cumulative episodes 14-26) is almost entirely anime-original / non-canon and adapts essentially no manga chapters, so it is not mapped; the manga's ghoul crisis and the whole of Season II remain unadapted. No theatrical films exist.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 8], - "arc": "Enrollment: Moka, Kurumu, Swim Club, Newspaper Club & Yukari" - }, - { - "episodes": [7, 8], - "chapters": [19, 20], - "arc": "Mizore the Snow Woman" - }, - { - "episodes": [9, 11], - "chapters": [13, 18], - "arc": "Summer & Witch's Knoll (Ruby)" - }, - { - "episodes": [12, 13], - "chapters": [9, 12], - "arc": "Public Safety Commission (Kuyo)" - }, - { - "chapters": [21, 40], - "arc": "Ghoul Crisis & Anti-Thesis onward (unadapted; continues in Season II manga)" - } - ] -} diff --git a/src/data/mappings/rurouni-kenshin.json b/src/data/mappings/rurouni-kenshin.json deleted file mode 100644 index 8117030..0000000 --- a/src/data/mappings/rurouni-kenshin.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "anilistAnimeId": 45, - "anilistMangaId": 30022, - "title": "Rurouni Kenshin", - "sourceNotes": "Original 1996-1998 anime (94 episodes). Eps 1-62 follow the manga; eps 63-94 are anime-original filler arcs (Christian Arc, Feng Shui, etc.) and are omitted. The Jinchū arc was never adapted into the main TV series and is included here without an episode range (partially covered by the `Reflection` OVA). Manga complete at 259 chapters.", - "mappings": [ - { "episodes": [1, 27], "chapters": [1, 47], "arc": "Tokyo Arc" }, - { "episodes": [28, 62], "chapters": [48, 151], "arc": "Kyoto Arc" }, - { "chapters": [152, 259], "arc": "Jinchū Arc (unadapted in 1996 TV anime)" } - ], - "movies": [ - { - "anilistId": 46, - "title": "Samurai X: The Motion Picture", - "year": 1997, - "note": "Side-story film (Ishin Shishi e no Requiem) in the 1996 anime continuity." - } - ] -} diff --git a/src/data/mappings/sabikui-bisco.json b/src/data/mappings/sabikui-bisco.json deleted file mode 100644 index 9f1f013..0000000 --- a/src/data/mappings/sabikui-bisco.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "anilistAnimeId": 130591, - "anilistMangaId": 111620, - "title": "Sabikui Bisco", - "sourceNotes": "Season 1, 12 episodes. Source is a 10-volume light novel series (AniList does not track its chapter count), so this mapping uses the 'Rust-Eater Bisco' manga adaptation instead — complete at 22 chapters across 4 volumes, covering the same content as the anime (both adapt only Light Novel Volume 1). A separately-numbered sequel manga ('Rust-Eater Bisco 2', drawn by a new artist) covers the Sabikui Bisco 2nd Season anime and is out of scope for this file.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 22], - "arc": "Imihama (Novel Volume 1)" - } - ] -} diff --git a/src/data/mappings/saekano.json b/src/data/mappings/saekano.json deleted file mode 100644 index c2f3cd0..0000000 --- a/src/data/mappings/saekano.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 20657, - "anilistMangaId": 79567, - "title": "Saekano: How to Raise a Boring Girlfriend", - "sourceNotes": "Source is Fumiaki Maruto's light novel 'Saenai Heroine no Sodatekata' (13 main volumes, completed Nov 2017). This mapping uses LIGHT-NOVEL VOLUME NUMBERS as the 'chapters' axis because it is cleaner and covers the whole story: the manga adaptation by Takeshi Moriki (AniList 81309) runs only ~42 chapters / 7 vols and stops around the TV anime's end, never reaching the finale. anilistMangaId 79567 is the canonical LN entry. anilistAnimeId 20657 is the 2015 TV anime; AniList lists 13 eps (incl. episode 0), but the broadcast had 12 numbered eps. Season 2 '♭ (Flat)' (2017, 11 eps) is a sequel, so episodes are numbered cumulatively here (S1 = 1-12, S2 = 13-23). The 2019 film 'Saekano the Movie: Finale' adapts the remaining volumes and concludes the story. Volume boundaries are APPROXIMATE — the anime condenses and reorders material around the doujin-game ('cherry blessing') production milestones.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 3], - "arc": "Forming blessing software (Season 1) — Tomoya recruits artist Eriri, scenario writer Utaha, and his 'boring' muse Megumi to build the doujin game 'cherry blessing' (LN vols 1-3)" - }, - { - "episodes": [13, 23], - "chapters": [4, 6], - "arc": "Making 'cherry blessing' (Season 2 ♭) — development crunch, team friction, and the game's Winter Comiket release (LN vols 4-6)" - }, - { - "chapters": [7, 13], - "arc": "The Finale — Eriri & Utaha leave for a rival circle, blessing software's second game, and the Megumi/Tomoya resolution; adapted by the Finale film (LN vols 7-13)" - } - ], - "movies": [ - { - "anilistId": 100675, - "title": "Saekano the Movie: Finale", - "year": 2019, - "chapters": [7, 13], - "afterEpisode": 23, - "note": "Canon finale film adapting the final LN volumes; concludes the story after the cumulative TV run (eps 1-23)." - } - ] -} diff --git a/src/data/mappings/saiki-k.json b/src/data/mappings/saiki-k.json deleted file mode 100644 index e7ac9e5..0000000 --- a/src/data/mappings/saiki-k.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 21804, - "anilistMangaId": 67755, - "title": "The Disastrous Life of Saiki K.", - "sourceNotes": "Cumulative episodes across S1 (24) + S2 (24, eps 25-48) + the Netflix ONA 'Reawakened' (6, eps 49-54) = 54 total. AniList lists Season 1 (id 21804) as 120 short-form segments; this mapping uses the standard 24-episode half-hour edit. Shuichi Aso's gag manga is complete at 281 chapters (plus 2 epilogue chapters) / 26 vols (AniList counts 290, including extras). Because the series is an episodic gag comedy, each ~22-min episode adapts several short chapters and the seasons do not follow strict chapter order — 'Reawakened' in particular backfills previously skipped chapters and animates the finale plus the two epilogue chapters. Chapter boundaries are therefore coarse approximations.", - "mappings": [ - { - "episodes": [1, 24], - "chapters": [1, 130], - "arc": "Season 1 — Saiki's daily psychic disasters (assorted early chapters)" - }, - { - "episodes": [25, 48], - "chapters": [131, 245], - "arc": "Season 2 — continued misadventures" - }, - { - "episodes": [49, 54], - "chapters": [246, 281], - "arc": "Reawakened — backfilled chapters, the finale & epilogues" - } - ] -} diff --git a/src/data/mappings/sailor-moon.json b/src/data/mappings/sailor-moon.json deleted file mode 100644 index aa03d30..0000000 --- a/src/data/mappings/sailor-moon.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "anilistAnimeId": 530, - "anilistMangaId": 30092, - "title": "Sailor Moon", - "sourceNotes": "Cumulative episodes across the five 90s TV series: Sailor Moon S1 (46) + Sailor Moon R (43) + Sailor Moon S (38) + Sailor Moon SuperS (39) + Sailor Moon Sailor Stars (34) = 200 episodes. Source manga is complete at 60 acts (AniList lists 61 chapters, counting a side-story extra), using the shinsouban/renewal 60-act numbering. The 90s anime is a loose adaptation with substantial filler, so the mapping is arc-level: each TV series corresponds to one manga arc rather than a tight 1:1 chapter cadence. Notable filler includes Sailor Moon R's opening Makaiju/Doom Tree episodes (anime-original) before the Black Moon story begins.", - "mappings": [ - { - "episodes": [1, 46], - "chapters": [1, 14], - "arc": "Dark Kingdom" - }, - { - "episodes": [47, 89], - "chapters": [15, 27], - "arc": "Black Moon" - }, - { - "episodes": [90, 127], - "chapters": [28, 38], - "arc": "Infinity (Death Busters)" - }, - { - "episodes": [128, 166], - "chapters": [39, 49], - "arc": "Dream (Dead Moon)" - }, - { - "episodes": [167, 200], - "chapters": [50, 61], - "arc": "Stars (Shadow Galactica)" - } - ], - "movies": [ - { - "anilistId": 531, - "title": "Sailor Moon R: The Movie", - "year": 1993, - "afterEpisode": 89, - "note": "Canon side-story feature in the classic continuity; original tale of Fiore and the Xenian flower, set after the Black Moon arc." - }, - { - "anilistId": 997, - "title": "Sailor Moon S the Movie: Hearts in Ice", - "year": 1994, - "afterEpisode": 127, - "note": "Canon side-story feature loosely based on Naoko Takeuchi's 'The Lover of Princess Kaguya' short; slots within the Sailor Moon S / Infinity period." - }, - { - "anilistId": 1240, - "title": "Sailor Moon SuperS the Movie: Black Dream Hole", - "year": 1995, - "afterEpisode": 166, - "note": "Canon original side-story feature in the classic continuity, set during the SuperS / Dream period." - } - ] -} diff --git a/src/data/mappings/saint-seiya.json b/src/data/mappings/saint-seiya.json deleted file mode 100644 index e99fdde..0000000 --- a/src/data/mappings/saint-seiya.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "anilistAnimeId": 1254, - "anilistMangaId": 31045, - "title": "Saint Seiya: Knights of the Zodiac", - "sourceNotes": "Original 1986-1989 Toei TV anime (114 eps). Chapter numbers use AniList's 249-act scale (manga complete at 249 chapters / 28 volumes); arc boundaries are anchored to tankobon volumes (vols 1-13 = Sanctuary, 14-18 = Poseidon, 19-28 = Hades) and the exact 249-scale cut points are derived/approximate. The TV anime is heavy-filler; the internal Sanctuary sub-divisions (Galaxian Wars / Silver Saints / Twelve Gold Houses) vary by source, but the firm hard boundaries are Sanctuary ep 1-73, the ANIME-ORIGINAL Asgard arc ep 74-99 (no manga source), and Poseidon ep 100-114. The TV series adapted only manga vols 1-18 and stopped before the Hades arc (vols 19-28), which is left unadapted (later animated as separate OVAs). Excludes the Knights of the Zodiac CG reboot, Omega, Lost Canvas, and Saintia Sho.", - "mappings": [ - { - "episodes": [1, 40], - "chapters": [1, 18], - "arc": "Galaxian Wars / Black Saints" - }, - { - "episodes": [41, 60], - "chapters": [19, 53], - "arc": "Silver Saints" - }, - { - "episodes": [61, 73], - "chapters": [54, 116], - "arc": "Sanctuary / Twelve Gold Houses (Zodiac)" - }, - { - "episodes": [100, 114], - "chapters": [117, 160], - "arc": "Poseidon" - }, - { - "chapters": [161, 249], - "arc": "Hades - Sanctuary / Inferno / Elysion (unadapted by TV)" - } - ], - "movies": [ - { - "anilistId": 1256, - "title": "Saint Seiya: Evil Goddess Eris", - "year": 1987, - "note": "Anime-original non-canon side story; adapts no manga chapters." - }, - { - "anilistId": 1255, - "title": "Saint Seiya: Legend of Crimson Youth", - "year": 1988, - "note": "Anime-original non-canon side story; adapts no manga chapters." - }, - { - "anilistId": 1258, - "title": "Saint Seiya: The Heated Battle of the Gods", - "year": 1988, - "note": "Anime-original non-canon side story; inspired the TV anime's Asgard arc. Adapts no manga chapters." - }, - { - "anilistId": 1260, - "title": "Saint Seiya: Warriors of the Final Holy Battle", - "year": 1989, - "note": "Anime-original non-canon side story; adapts no manga chapters." - } - ] -} diff --git a/src/data/mappings/saints-magic-power-is-omnipotent.json b/src/data/mappings/saints-magic-power-is-omnipotent.json deleted file mode 100644 index 9efcc9d..0000000 --- a/src/data/mappings/saints-magic-power-is-omnipotent.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 123802, - "anilistMangaId": 101503, - "title": "The Saint's Magic Power is Omnipotent", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (12) = 24. Adapted from Yuka Tachibana's light novel; the manga comic (Fujiazuki, id 101503) is used here as the chapter source since it tracks episode content more granularly than the light novel's volume structure. Manga ongoing (11 volumes, approx. ch. 47 as of Feb 2026). S1 covers manga Vol. 1-6 (ch. 1-27), ending with the Klausner Domain arc. S2 continues into Vol. 7 onward; the manga's release pace lags the anime (which is novel-based), so the S2 chapter boundary is approximate and the tail may not yet fully cover S2's ending content.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 27], - "arc": "Season 1: Saint Summoning to the Klausner Domain" - }, - { - "episodes": [13, 24], - "chapters": [28, 47], - "arc": "Season 2 (manga ongoing, chapter boundary approximate)" - } - ] -} diff --git a/src/data/mappings/sakamoto-days.json b/src/data/mappings/sakamoto-days.json deleted file mode 100644 index d66eb74..0000000 --- a/src/data/mappings/sakamoto-days.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 177709, - "anilistMangaId": 125828, - "title": "Sakamoto Days", - "sourceNotes": "Cumulative episodes across Sakamoto Days S1 Cour 1 (11) + Cour 2 / Part 2 (11). Manga ongoing (current ch. ~260 as of May 2026). Anime adapted through ch ~75 (start of JCC Infiltration). Arc boundaries from Sakamoto Days Wiki / Deltia's arc guide.", - "mappings": [ - { - "episodes": [1, 11], - "chapters": [1, 37], - "arc": "Introduction / Amusement Park / Lab" - }, - { - "episodes": [12, 22], - "chapters": [38, 75], - "arc": "Death Row Prisoners / JCC Transfer Exams" - }, - { "chapters": [76, 104], "arc": "JCC Infiltration" }, - { "chapters": [105, 120], "arc": "Taro Sakamoto's Past" }, - { "chapters": [121, 130], "arc": "Bangkok" }, - { "chapters": [131, 168], "arc": "Assassin Exhibition of the Century" }, - { "chapters": [169, 260], "arc": "JAA Jail / New JAA (Current)" } - ] -} diff --git a/src/data/mappings/samurai-champloo.json b/src/data/mappings/samurai-champloo.json deleted file mode 100644 index a489a45..0000000 --- a/src/data/mappings/samurai-champloo.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "anilistAnimeId": 205, - "anilistMangaId": 30512, - "title": "Samurai Champloo", - "sourceNotes": "Anime-original 2004 series (26 eps, Manglobe). Paired with the Masaru Gotsubo manga (10 chapters / 2 vols, 2004) which adapts select scenes. No tight chapter-to-episode correspondence; the anime is the canonical telling.", - "mappings": [ - { - "episodes": [1, 26], - "chapters": [1, 10], - "arc": "Loose adaptation (no per-arc alignment)" - } - ] -} diff --git a/src/data/mappings/sankarea.json b/src/data/mappings/sankarea.json deleted file mode 100644 index 1f171b1..0000000 --- a/src/data/mappings/sankarea.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "anilistAnimeId": 11499, - "anilistMangaId": 48597, - "title": "Sankarea: Undying Love", - "sourceNotes": "Single 12-episode TV season (2012) adapting manga chapters 1-21 (roughly volumes 1-4); the anime's final episode adds an anime-original cliffhanger not in the manga. Manga complete at 59 chapters across 11 volumes. Adaptation runs ~1.75 chapters/episode, so chapter boundaries are approximate and follow narrative beats. Two OVAs adapt side chapters out of sequence (a prequel from ch. 2 and a comedic side-story around ch. 29) and are excluded from the sequential mapping. Unadapted tail (ch. 22-59) grouped into broad chapter-only entries.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 4], - "arc": "Reviving Babu" - }, - { - "episodes": [3, 5], - "chapters": [5, 9], - "arc": "Rea Becomes a Zombie" - }, - { - "episodes": [6, 8], - "chapters": [10, 14], - "arc": "A New Life Together" - }, - { - "episodes": [9, 12], - "chapters": [15, 21], - "arc": "Confronting the Sanka Family" - }, - { - "chapters": [22, 34], - "arc": "Searching for a Cure" - }, - { - "chapters": [35, 47], - "arc": "Zombie Outbreak" - }, - { - "chapters": [48, 59], - "arc": "Final Arc" - } - ] -} diff --git a/src/data/mappings/sasaki-and-miyano.json b/src/data/mappings/sasaki-and-miyano.json deleted file mode 100644 index 0e74310..0000000 --- a/src/data/mappings/sasaki-and-miyano.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 126288, - "anilistMangaId": 98370, - "title": "Sasaki and Miyano", - "sourceNotes": "Single-cour TV anime (12 episodes, 2022) covering manga volumes 1-6 (roughly chapters 1-33). Manga ongoing (current ch. ~54 as of 2026, having resumed serialization in 2025 after a hiatus); the Graduation film adapts the vol. 7-8 content that follows the TV series and was never animated for TV (see movies[]). Low-arc slice-of-life romance without distinct named story arcs.", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 33], "arc": "Season 1" }, - { - "chapters": [34, 54], - "arc": "Unadapted on TV (Graduation film covers ch. 34-39; manga continues beyond)" - } - ], - "movies": [ - { - "anilistId": 146743, - "title": "Sasaki and Miyano: Graduation", - "year": 2023, - "chapters": [34, 39], - "afterEpisode": 12, - "note": "Canon continuation covering volume 7 and part of volume 8 (the graduation arc); never adapted on TV." - } - ] -} diff --git a/src/data/mappings/say-i-love-you.json b/src/data/mappings/say-i-love-you.json deleted file mode 100644 index 044265c..0000000 --- a/src/data/mappings/say-i-love-you.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 14289, - "anilistMangaId": 41767, - "title": "Say I Love You", - "sourceNotes": "Single-cours TV anime (13 eps, 2012) adapting roughly the first 7 volumes (ch 1-28), so a viewer resumes reading at ch 29. Paired with Kanae Hazuki's complete manga, serialized in Dessert 2008-2017: AniList counts 73 chapters across 18 volumes. The adaptation is near chapter-per-episode early on but rushes from ep 9 once Kai is introduced, so arc boundaries are approximate. The 'Mei to Marshmallow' shorts and the 'Dareka ga' OAD are separate side entries, and the 2016 live-action film is excluded.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 4], - "arc": "Mei & Yamato (First Kiss, Dating Begins)" - }, - { - "episodes": [3, 5], - "chapters": [5, 12], - "arc": "Aiko & the Past (incl. Kakeru, Yamato's sister Nagi)" - }, - { - "episodes": [6, 8], - "chapters": [13, 20], - "arc": "Megumi & Modeling (Rumors → Reconciliation)" - }, - { - "episodes": [9, 13], - "chapters": [21, 28], - "arc": "Kai Rivalry & Megumi's Resolution (Finale)" - }, - { - "chapters": [29, 73], - "arc": "Third Year & Beyond (unadapted tail)" - } - ] -} diff --git a/src/data/mappings/sayonara-zetsubou-sensei.json b/src/data/mappings/sayonara-zetsubou-sensei.json deleted file mode 100644 index ab46f84..0000000 --- a/src/data/mappings/sayonara-zetsubou-sensei.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 2605, - "anilistMangaId": 30661, - "title": "Sayonara, Zetsubou-Sensei", - "sourceNotes": "Cumulative episodes across S1 (12) + Zoku/S2 (13) + Goku OVA (3) + Zan/S3 (13) + Zan Bangaichi OVA (2) + a 2012 Blu-ray bonus episode (1) = 44. Manga by Koji Kumeta complete at 301 serialized chapters (ch. 268 was never collected in tankobon). Satirical gag/anthology manga — Shaft's adaptation (dir. Akiyuki Shinbo) heavily shuffles and skips chapters rather than adapting in reading order, with most episodes splicing together two to four unrelated chapter-length gags pulled from across the run, so per-season chapter ranges are not cleanly separable; the single adapted range below is a coarse approximation of the chapter span touched across the whole TV+OVA run, not a strict sequence. The manga's true, never-animated finale begins at chapter 290.", - "mappings": [ - { - "episodes": [1, 44], - "chapters": [1, 289], - "arc": "TV Series + OVAs (non-linear anthology adaptation)" - }, - { "chapters": [290, 301], "arc": "Finale (never adapted)" } - ] -} diff --git a/src/data/mappings/school-babysitters.json b/src/data/mappings/school-babysitters.json deleted file mode 100644 index 59be819..0000000 --- a/src/data/mappings/school-babysitters.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 98503, - "anilistMangaId": 46922, - "title": "School Babysitters", - "sourceNotes": "Single 12-episode TV season (2018); a 27-minute OVA (AniList 102969) was later bundled with the seventh BD/DVD and is not counted in the cumulative episode numbering. The manga (Gakuen Babysitters by Hari Tokeino, AniList 46922) is an episodic slice-of-life work with no named story arcs, and the anime adapts it NON-LINEARLY: per the community episode-to-chapter guide, episodes pull scattered chapters out of order (e.g. ep1=ch1, ep2=ch2+6, ep3=ch17+5, ep6=ch28+14, ep7=ch21+20), all drawn from roughly the first five volumes (chapters 1-28). Because selection is non-contiguous, the mapping uses one coarse range for the adapted material rather than fabricating per-episode contiguous boundaries; ranges are approximate. Manga ongoing (27 volumes as of Nov 2025, latest around chapter 151); the tail entry is chapters-only, unadapted.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 28], - "arc": "Morinomiya Academy Daycare (Anime)" - }, - { - "chapters": [29, 151], - "arc": "Continuing Manga (Post-Anime)" - } - ] -} diff --git a/src/data/mappings/school-live.json b/src/data/mappings/school-live.json deleted file mode 100644 index 24a0a29..0000000 --- a/src/data/mappings/school-live.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "anilistAnimeId": 20754, - "anilistMangaId": 85235, - "title": "SCHOOL-LIVE!", - "sourceNotes": "Single 12-episode TV season (2015, Lerche) adapting Norimitsu Kaihou & Sadoru Chiba's School-Live! manga (AniList id 85235), which is complete at 78 chapters across 12 volumes. The anime covers only the school-set portion — the manga's volumes 1-5 (chapters 1-31), ending precisely at Volume 5's final chapter \"Graduation\" (ch 31) as the School Living Club leaves Megurigaoka High for the university on Megumi's map. IMPORTANT CAVEAT: the anime heavily REORDERS the manga's non-linear, flashback-driven chapters into a more chronological mystery-reveal structure (e.g., ch 19 \"Scar\" surfaces late as ep 11, and Miki/Kurumi backstories are redistributed), so per-episode chapter boundaries are approximate — the two anime entries below reflect overall volume coverage, not a 1:1 chapter order. Volume boundaries: v1 ch1-6, v2 7-12, v3 13-18, v4 19-25, v5 26-31, v6 32-37, v7 38-43, v8 44-49, v9 50-55, v10 56-63, v11 64-70, v12 71-78. Everything from ch 32 onward (the journey to and survival at the Randall Corporation university, then the final arc) is unadapted. The only feature film is a 2019 live-action adaptation (alternate continuity, non-animation) and is excluded; no theatrical anime films exist, so no movies are listed.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 18], - "arc": "School Living Club — daily life and the truth (Miki joins; Megu-nee revealed as delusion) — vols 1-3, anime reorders these chapters" - }, - { - "episodes": [7, 12], - "chapters": [19, 31], - "arc": "The hidden shelter, the infection crisis, and Graduation — vols 4-5, anime reorders these chapters" - }, - { - "chapters": [32, 49], - "arc": "Randall Corporation university — setting off and the campus survivors (manga only) — vols 6-8" - }, - { - "chapters": [50, 78], - "arc": "Final arc — the outbreak's origin, the cure, and the club's last days (manga only) — vols 9-12" - } - ] -} diff --git a/src/data/mappings/science-fell-in-love.json b/src/data/mappings/science-fell-in-love.json deleted file mode 100644 index f228f40..0000000 --- a/src/data/mappings/science-fell-in-love.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "anilistAnimeId": 107067, - "anilistMangaId": 87377, - "title": "Science Fell in Love, So I Tried to Prove It", - "sourceNotes": "Cumulative episodes across S1 (12) + the sequel S2 \"r=1-sinθ\" (12) = 24 episodes, adapting manga chapters 1-61 (anime ends at ch. 61; continue reading at ch. 62). Manga ongoing (latest ch. 106, vol. 21 as of 2026). Episodic romcom source — each episode adapts 2-3 self-contained \"proof\" chapters and the anime reorders a few (the S1 finale kiss is pulled from a later chapter), so chapter ranges are approximate and grouped by episode-title beats / volume clusters rather than strict 1:1 boundaries. S2 resumes around Vol. 6 / ch. 32.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 10], - "arc": "Analyzing Love / Experiments" - }, - { - "episodes": [4, 6], - "chapters": [11, 19], - "arc": "First Date & First Kiss" - }, - { - "episodes": [7, 9], - "chapters": [20, 26], - "arc": "Drinking Party & Okinawa Training Camp" - }, - { - "episodes": [10, 12], - "chapters": [27, 31], - "arc": "Presentations & Proof of Love (S1 Finale)" - }, - { - "episodes": [13, 15], - "chapters": [32, 40], - "arc": "Comparing Couples & New Theories" - }, - { - "episodes": [16, 18], - "chapters": [41, 48], - "arc": "Live Concert & Analyzing the Proof" - }, - { - "episodes": [19, 21], - "chapters": [49, 55], - "arc": "Group Date & Campus Festival Prep" - }, - { - "episodes": [22, 24], - "chapters": [56, 61], - "arc": "Campus Festival & Marriage (S2 Finale)" - }, - { - "chapters": [62, 106], - "arc": "Post-Anime Chapters (Unadapted)" - } - ] -} diff --git a/src/data/mappings/scums-wish.json b/src/data/mappings/scums-wish.json deleted file mode 100644 index a76bbe7..0000000 --- a/src/data/mappings/scums-wish.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 21701, - "anilistMangaId": 74929, - "title": "Scum's Wish", - "sourceNotes": "The 2017 TV anime (12 eps) is a near-complete adaptation of Mengo Yokoyari's manga (53 chapters across 8 volumes, complete). It covers essentially the whole story; ep 12's ending lands very close to the manga's, so a viewer only needs the final few chapters (51-53) to finish. Episode-to-chapter boundaries are approximate. Yokoyari's 'Kuzu no Honkai Décor' (a separate 7-chapter side-story anthology) is excluded.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 18], - "arc": "Fake Lovers: Hanabi & Mugi's Arrangement (the love web; Ecchan & Moca introduced)" - }, - { - "episodes": [5, 9], - "chapters": [19, 38], - "arc": "Akane Minagawa Arc (Mugi & Akane; Hanabi's jealousy & confrontation; Narumi)" - }, - { - "episodes": [10, 12], - "chapters": [39, 50], - "arc": "Letting Go: Ending the Arrangement (resolutions; anime portion)" - }, - { - "chapters": [51, 53], - "arc": "Manga Finale (post-anime resolution)" - } - ] -} diff --git a/src/data/mappings/second-prettiest-girl-in-my-class.json b/src/data/mappings/second-prettiest-girl-in-my-class.json deleted file mode 100644 index ab39cd2..0000000 --- a/src/data/mappings/second-prettiest-girl-in-my-class.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "anilistAnimeId": 169580, - "anilistMangaId": 145940, - "title": "I Made Friends with the Second Prettiest Girl in My Class", - "sourceNotes": "The anime is an ADAPTATION of the light novel (id 145940) on AniList, not of the ongoing manga (id 148082), which is a separate, parallel ALTERNATIVE adaptation of the same novel. Because the LN doesn't expose chapter numbers on AniList, the chapters[] ranges here are LN VOLUME numbers (same convention as campfire-cooking-in-another-world.json). Single 12-episode season adapting light novel volumes 1-3, with volume 3 compressed/rushed into the final two episodes. Light novel complete at 11 volumes (10 main volumes + 1 side-story volume, per its April 2026 ending announcement); volumes 4-11 are unadapted.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 1], - "arc": "Volume 1 — Meeting Umi Asanagi" - }, - { - "episodes": [5, 8], - "chapters": [2, 2], - "arc": "Volume 2 — Into School Territory" - }, - { - "episodes": [9, 12], - "chapters": [3, 3], - "arc": "Volume 3 — Compressed Coverage" - }, - { "chapters": [4, 11], "arc": "Unadapted (Vol. 4 onward)" } - ] -} diff --git a/src/data/mappings/secrets-of-the-silent-witch.json b/src/data/mappings/secrets-of-the-silent-witch.json deleted file mode 100644 index a36ba22..0000000 --- a/src/data/mappings/secrets-of-the-silent-witch.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 179966, - "anilistMangaId": 136834, - "title": "Secrets of the Silent Witch", - "sourceNotes": "Single-cour 13-episode TV anime (2025) adapting light novel volumes 1-3. Manga ongoing (current ch. 32); per fan tracking, manga chapters 1-26 cover light novel volumes 1-2 and chapter 27 begins volume 3, matching the anime's coverage, though the manga has not yet caught up to the anime's volume-3 endpoint. Chapter boundaries for the volume 1/volume 2 split (~ch. 13) are estimated proportionally since no official per-chapter breakdown was found; treat as approximate.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 13], - "arc": "Serendia Academy Enrollment (Vol. 1)" - }, - { - "episodes": [5, 8], - "chapters": [14, 26], - "arc": "Chess Tournament & Assassination Plot (Vol. 2)" - }, - { - "episodes": [9, 13], - "chapters": [27, 32], - "arc": "Bernie Jones & the Barrier Mage (Vol. 3, ongoing)" - } - ] -} diff --git a/src/data/mappings/seirei-gensouki.json b/src/data/mappings/seirei-gensouki.json deleted file mode 100644 index 0446a77..0000000 --- a/src/data/mappings/seirei-gensouki.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "anilistAnimeId": 126546, - "anilistMangaId": 99587, - "title": "Seirei Gensouki: Spirit Chronicles", - "sourceNotes": "Cumulative episodes across S1 (12, 2021) + S2 (12, eps 13-24, 2024) = 24 total. The source is Yuri Kitayama's light novel (ongoing, 28 main volumes as of early 2026). The linked manga (AniList id 99587, art by Futago Minaduki, ~13 tankobon / ~60 chapters) only reaches roughly LN vol 7 and AniList lists no chapter count, so — like other LN adaptations here whose manga lags far behind — this mapping uses LIGHT-NOVEL VOLUME numbers as the 'chapters' unit. The anime also reorders source material (it pulls the Celia wedding-rescue / Miharu reunion forward and skips most of vol 4), so per-volume boundaries are approximate and sources disagree on exact volume numbering. S1 covers roughly LN vols 1-5; S2 roughly vols 6-7. No theatrical films.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 1], - "arc": "Rio & Haruto: reincarnation, rescuing Princess Flora, entering the Royal Academy (LN vol 1)" - }, - { - "episodes": [4, 6], - "chapters": [2, 2], - "arc": "Latifa & the Forest of Spirits; leaving the academy to seek his homeland (LN vol 2)" - }, - { - "episodes": [7, 9], - "chapters": [3, 3], - "arc": "Journey east to Yagumo: his grandmother, his parents' past, avenging his mother (LN vol 3)" - }, - { - "episodes": [10, 12], - "chapters": [4, 5], - "arc": "Return to Beltrum: Aishia awakens, stopping Celia's forced marriage, reuniting with Miharu (LN vols 4-5)" - }, - { - "episodes": [13, 18], - "chapters": [6, 6], - "arc": "S2: Galarc Kingdom life — rebuilding, heroes & champions, threats to home (LN vol 6)" - }, - { - "episodes": [19, 24], - "chapters": [7, 7], - "arc": "S2: the Battle to Defend Amande and its aftermath (LN vol 7)" - }, - { - "chapters": [8, 28], - "arc": "LN vols 8-28 (ongoing), unadapted" - } - ] -} diff --git a/src/data/mappings/seitokai-yakuindomo.json b/src/data/mappings/seitokai-yakuindomo.json deleted file mode 100644 index 6631a96..0000000 --- a/src/data/mappings/seitokai-yakuindomo.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "anilistAnimeId": 8675, - "anilistMangaId": 44110, - "title": "Seitokai Yakuindomo", - "sourceNotes": "Source is the completed Seitokai Yakuindomo 4-koma gag manga by Tozen Ujiie (AniList 44110): 655 chapters / 22 volumes, ran 2007-2021 (Manga complete). This is an episodic 4-koma with NO story arcs — the anime pulls short gag strips out of chronological order across both seasons, so exact per-episode chapter boundaries do not exist and the ranges below are APPROXIMATE season blocks. Cumulative episodes across S1 (13) + S2 \"Seitokai Yakuindomo*\" (13) = 26. Community/fandom consensus is that by the end of the two TV seasons (plus the bundled OVAs) roughly the first ~280 chapters' worth of material had been adapted, and readers picking up where the anime leaves off should start around chapter 280; everything from ~281 to 655 is unadapted by the TV run. The two theatrical films (2017, 2021) are new-animation canon continuations and are listed in movies[]. Chapter split within the anime block is an even estimate, not a strip-accurate boundary.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 140], - "arc": "Season 1" - }, - { - "episodes": [14, 26], - "chapters": [141, 280], - "arc": "Season 2 (Seitokai Yakuindomo*)" - }, - { - "chapters": [281, 655], - "arc": "Post-anime (unadapted)" - } - ], - "movies": [ - { - "anilistId": 98240, - "title": "Seitokai Yakuindomo the Movie", - "year": 2017, - "afterEpisode": 26, - "note": "Canon theatrical feature with new animation continuing the TV series' gag skits; adapts additional manga strips beyond the second season." - }, - { - "anilistId": 113692, - "title": "Seitokai Yakuindomo the Movie 2", - "year": 2021, - "afterEpisode": 26, - "note": "Second canon theatrical feature (delayed from 2020 to Jan 2021), new-animation continuation released around the manga's conclusion." - } - ] -} diff --git a/src/data/mappings/sekirei.json b/src/data/mappings/sekirei.json deleted file mode 100644 index fe905d3..0000000 --- a/src/data/mappings/sekirei.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "anilistAnimeId": 4063, - "anilistMangaId": 30873, - "title": "Sekirei", - "sourceNotes": "Cumulative episodes across S1 (12) + Pure Engagement S2 (13). Manga complete at 187 chapters (18 volumes). S2's back half and finale are largely anime-original and diverge from the manga (notably skipping canon material in ch. 70-73), so the S2 chapter range is an approximation; the manga continues well beyond both seasons.", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 55], "arc": "Season 1" }, - { - "episodes": [13, 25], - "chapters": [56, 74], - "arc": "Pure Engagement (Season 2)" - }, - { "chapters": [75, 187], "arc": "Post-Anime Story (Unadapted)" } - ] -} diff --git a/src/data/mappings/senko-san.json b/src/data/mappings/senko-san.json deleted file mode 100644 index 23132d9..0000000 --- a/src/data/mappings/senko-san.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 105914, - "anilistMangaId": 100584, - "title": "The Helpful Fox Senko-san", - "sourceNotes": "Single 12-episode TV season (2019, Doga Kobo). Source is Rimukoro's Sewayaki Kitsune no Senko-san manga (id 100584), an episodic slice-of-life serialized on Comic Newtype; it is complete at 12 tankobon volumes / 93 main chapters (volume boundaries per MangaDex: v1 ch1-7, v2 ch8-15, v3 ch16-23, v4 ch24-31, ... v12 ch84-91, plus uncategorized ch92-93; .5 side chapters ignored). Cumulative episodes are trivial here (one season, 12 episodes). Episodic source — chapter ranges are approximate: the short comfort-comedy chapters do not map 1:1 to episodes, and the anime reorders and samples material from roughly volumes 1-4 (the only volumes out when it aired, ch1-31) rather than following a continuous arc. There are no story arcs, so the adaptation is treated as coarse episodic groupings plus an unadapted manga tail. No theatrical films or OVAs exist, so no movies are listed.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 15], - "arc": "Episodes 1-6 (Senko moves in and pampers Nakano; everyday comfort vignettes) — roughly vols 1-2, approximate" - }, - { - "episodes": [7, 12], - "chapters": [16, 31], - "arc": "Episodes 7-12 (Shiro, the beach trip, and more household antics) — roughly vols 3-4, approximate" - }, - { - "chapters": [32, 93], - "arc": "Later chapters to the finale (vols 5-12; unadapted, approximate)" - } - ] -} diff --git a/src/data/mappings/sentenced-to-be-a-hero.json b/src/data/mappings/sentenced-to-be-a-hero.json deleted file mode 100644 index 674050d..0000000 --- a/src/data/mappings/sentenced-to-be-a-hero.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 167152, - "anilistMangaId": 142687, - "title": "Sentenced to Be a Hero", - "sourceNotes": "Source is Rocket Shokai's light novel \"Sentenced to Be a Hero: The Prison Records of Penal Hero Unit 9004\" (AniList id 142687, format NOVEL); AniList lists no chapter count for the novel, and the separate manga adaptation (id 164543) lags far behind (it had only reached ch. 14, ~episode 5, at the anime's end), so this mapping uses LIGHT-NOVEL VOLUME numbers as the \"chapters\" unit. Studio Kai's 12-episode Season 1 (Jan-Mar 2026) adapts LN volumes 1-2; readers are advised to continue at volume 3. The LN is ongoing at 8 volumes (as of Jan 2026). The episode 1-6 / 7-12 split between vols 1 and 2 is approximate (vol 1's Mureed Fortress defense reached ~episode 5-6 per manga-chapter cross-check). Season 2 was announced March 2026. No theatrical films.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 1], - "arc": "Defense of Mureed Fortress — Xylo's pact with Teoritta, the Holy Sword, defeat of demon lord Iblis (LN vol 1)" - }, - { - "episodes": [7, 12], - "chapters": [2, 2], - "arc": "Port City of Ioff / Loff Port Cheg — assassins targeting Teoritta, new Penal Hero recruits, Rhyno revealed as a Demon Lord (LN vol 2)" - }, - { - "chapters": [3, 8], - "arc": "Reclaiming captured territories & military/temple conspiracy arcs (LN vols 3-8), unadapted" - } - ] -} diff --git a/src/data/mappings/seraph-of-the-end.json b/src/data/mappings/seraph-of-the-end.json deleted file mode 100644 index f2f20c2..0000000 --- a/src/data/mappings/seraph-of-the-end.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 20829, - "anilistMangaId": 73661, - "title": "Seraph of the End: Vampire Reign", - "sourceNotes": "Cumulative episodes across S1 'Vampire Reign' (12) + S2 'Battle in Nagoya' (12, eps 13-24) = 24 total. Paired with the Takaya Kagami / Yamato Yamamoto manga (AniList id 73661, ongoing, ~37 volumes / latest collected ch. ~155 as of 2026, serialized in Jump SQ). The two anime seasons cover through the end of the Nagoya arc (~ch 41 / vol 11); everything from vol 12 onward is unadapted. The S1/S2 chapter cutoff is approximate due to anime reordering.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 15], - "arc": "Vampire Reign (S1: Prologue / Second Shibuya High / Shinjuku, vols 1-5)" - }, - { - "episodes": [13, 24], - "chapters": [16, 41], - "arc": "Battle in Nagoya (S2: Post-Shinjuku → Nagoya arc, vols 5-11)" - }, - { - "chapters": [42, 155], - "arc": "Post-Nagoya → Osaka → Shibuya → Akihabara → Mount Fuji & beyond (unadapted; manga ongoing)" - } - ] -} diff --git a/src/data/mappings/seven-deadly-sins.json b/src/data/mappings/seven-deadly-sins.json deleted file mode 100644 index 4f644fa..0000000 --- a/src/data/mappings/seven-deadly-sins.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "anilistAnimeId": 20789, - "anilistMangaId": 74485, - "title": "The Seven Deadly Sins", - "sourceNotes": "Cumulative episodes across S1 (24) + Signs of Holy War (4, eps 25-28) + Revival of the Commandments (24, eps 29-52) + Wrath of the Gods (24, eps 53-76) + Dragon's Judgement (24, eps 77-100) = 100 total. Manga complete at 346 main chapters (AniList lists 367 incl. extras). Arc boundaries approximate — refine via PR.", - "mappings": [ - { - "episodes": [1, 9], - "chapters": [1, 72], - "arc": "Sins of Liones (Introduction → Vaizel Fight Festival)" - }, - { - "episodes": [10, 23], - "chapters": [73, 100], - "arc": "Kingdom Infiltration / Armor Giant" - }, - { - "episodes": [24, 66], - "chapters": [101, 256], - "arc": "Ten Commandments Saga" - }, - { "episodes": [67, 90], "chapters": [257, 306], "arc": "New Holy War" }, - { - "episodes": [91, 100], - "chapters": [307, 367], - "arc": "Final Battle / Demon King" - } - ], - "movies": [ - { - "anilistId": 99540, - "title": "The Seven Deadly Sins the Movie: Prisoners of the Sky", - "year": 2018, - "note": "Side story (anime-original)." - }, - { - "anilistId": 128740, - "title": "The Seven Deadly Sins: Cursed by Light", - "year": 2021, - "afterEpisode": 100, - "note": "Canon sequel film adapting the manga's epilogue chapters." - } - ] -} diff --git a/src/data/mappings/shadows-house.json b/src/data/mappings/shadows-house.json deleted file mode 100644 index e84106c..0000000 --- a/src/data/mappings/shadows-house.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "anilistAnimeId": 125038, - "anilistMangaId": 104063, - "title": "SHADOWS HOUSE", - "sourceNotes": "Cumulative episodes across S1 (13) + S2 (12). Manga ongoing (current ch. ~240). S1's final 2-3 episodes (the anime-only \"Kidnapping\" detour) diverge from the manga, and S2 compresses/skips material while staying broadly faithful; the combined anime settles back into the manga around Chapter 79, so chapter boundaries below are approximate.", - "mappings": [ - { "episodes": [1, 13], "chapters": [1, 50], "arc": "Debut Arc" }, - { "episodes": [14, 25], "chapters": [51, 79], "arc": "Master Robe Arc" }, - { "chapters": [80, 240], "arc": "Unadapted (Manga-Only)" } - ] -} diff --git a/src/data/mappings/shakugan-no-shana.json b/src/data/mappings/shakugan-no-shana.json deleted file mode 100644 index 95040f8..0000000 --- a/src/data/mappings/shakugan-no-shana.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "anilistAnimeId": 355, - "anilistMangaId": 33074, - "title": "Shakugan no Shana", - "sourceNotes": "Cumulative episodes across Season 1 (24) + Season II (24) + Season III/Final (24) = 72. Adapts the light novel (AniList tracks it as a 123-'chapter' entry, counting each of the 22 main volumes' prologue/numbered-chapters/epilogue as discrete chapters). Chapter ranges here are a proportional conversion from the fandom wiki's volume-level arc breakdown, since per-volume chapter counts aren't uniformly published for every volume — treat exact boundaries as approximate and refine via PR. The standalone theatrical Shakugan no Shana: The Movie is an alternate-continuity retelling of Volume 1 and is excluded from movies.", - "mappings": [ - { "episodes": [1, 2], "chapters": [1, 7], "arc": "Chance Meeting" }, - { "episodes": [3, 8], "chapters": [8, 15], "arc": "Disturbance" }, - { "episodes": [9, 13], "chapters": [16, 25], "arc": "Aizen Siblings" }, - { "episodes": [14, 16], "chapters": [26, 31], "arc": "Birth" }, - { "episodes": [17, 19], "chapters": [32, 41], "arc": "Mania" }, - { "episodes": [20, 24], "chapters": [42, 52], "arc": "Bal Masqué" }, - { - "episodes": [25, 31], - "chapters": [53, 57], - "arc": "Village of Jestful Slumber" - }, - { "episodes": [32, 35], "chapters": [58, 62], "arc": "Omens of a Storm" }, - { "episodes": [36, 39], "chapters": [63, 73], "arc": "Colorful Wave" }, - { - "episodes": [40, 48], - "chapters": [74, 84], - "arc": "Scars from the Storm / Grand Order" - }, - { "episodes": [49, 52], "chapters": [85, 89], "arc": "Blackout" }, - { "episodes": [53, 55], "chapters": [90, 95], "arc": "Biding Time" }, - { - "episodes": [56, 63], - "chapters": [96, 112], - "arc": "Battle of Seireiden" - }, - { - "episodes": [64, 72], - "chapters": [113, 123], - "arc": "Final Battle of Misaki City" - } - ] -} diff --git a/src/data/mappings/shaman-king-2021.json b/src/data/mappings/shaman-king-2021.json deleted file mode 100644 index 4f892dc..0000000 --- a/src/data/mappings/shaman-king-2021.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "anilistAnimeId": 119675, - "anilistMangaId": 30050, - "title": "SHAMAN KING (2021)", - "sourceNotes": "The 2021 reboot (52 eps, single run) faithfully re-adapts the ENTIRE manga, including the canonical true ending that the 2001 anime never reached. Numbering caveat: the reboot adapts the 35-volume Complete Edition (kanzenban), whose 'Reincarnation' chapters run 1-300; the original serialized print (referenced by AniList manga id 30050) was 285 chapters / 288 per AniList. This file uses the AniList 288-chapter count as its source of truth and scales the kanzenban arc seams into that numbering, so the final entry extends to chapter 288 (the manga's ending). There is NO unadapted tail and NO theatrical film in this continuity. Pacing is fast (~5-6 ch/ep) and per-episode boundaries are approximate — refine via PR.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 25], - "arc": "Coming to Tokyo (Introduction)" - }, - { - "episodes": [5, 13], - "chapters": [26, 77], - "arc": "Shaman Fight in Tokyo (Preliminaries / Hao Introduced)" - }, - { - "episodes": [14, 20], - "chapters": [78, 103], - "arc": "American Tour / Road to Patch Village" - }, - { - "episodes": [21, 43], - "chapters": [104, 247], - "arc": "Shaman Fight Second Round (Patch Village / Gandhara)" - }, - { - "episodes": [44, 51], - "chapters": [248, 275], - "arc": "Invading the Plants (Mu Continent / Great Spirit / Final Battle)" - }, - { - "episodes": [52, 52], - "chapters": [276, 288], - "arc": "Epilogue (True Ending)" - } - ] -} diff --git a/src/data/mappings/shangri-la-frontier.json b/src/data/mappings/shangri-la-frontier.json deleted file mode 100644 index 89ca476..0000000 --- a/src/data/mappings/shangri-la-frontier.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 151970, - "anilistMangaId": 122063, - "title": "Shangri-La Frontier", - "sourceNotes": "Source is Katarina's web novel; the adaptation paired here is Ryosuke Fuji's manga 'Shangri-La Frontier: Kusoge Hunter, Kami-ge ni Idoman to su', serialized in Kodansha's Weekly Shonen Magazine since 2020 and ongoing (~ch. 270 as of late June 2026). anilistAnimeId 151970 is the first TV anime (2023-24, 25 eps across 2 cours). Season 2 (AniList 176508, another 25 eps) is a sequel, so episodes are numbered cumulatively 26-50. S1 adapts roughly ch 1-58; S2 adapts ch 59-126, so a viewer resumes reading at ch 127. Arc boundaries are approximate, derived from the AnimeFillerGuide episode-to-chapter conversion and the Shangri-La Frontier Fandom 'Story Arcs' page; arcs are named by the in-game scenario/boss (one of the Seven Colossi). S2 cour 2 runs the undersea 'Abyss City' raid concurrently with the Global Game Competition (GGC) tournament. A separate 'Mini Anime' ONA exists; there are no theatrical films.", - "mappings": [ - { - "episodes": [1, 8], - "chapters": [1, 17], - "arc": "Lycagon the Nightslayer (Vorpal Rabbit's Foot)" - }, - { - "episodes": [9, 25], - "chapters": [18, 58], - "arc": "Wezaemon the Tombguard" - }, - { - "episodes": [26, 40], - "chapters": [59, 96], - "arc": "Journeying Wolf, Be Ambitious (Shadow-Lycagon)" - }, - { - "episodes": [41, 50], - "chapters": [97, 126], - "arc": "Abyss City (Ctarnidd) & Global Game Competition" - }, - { - "chapters": [127, 270], - "arc": "Beyond the Abyssal City / Dragon Blight (ongoing, unadapted)" - } - ] -} diff --git a/src/data/mappings/shield-hero.json b/src/data/mappings/shield-hero.json deleted file mode 100644 index cb0bb6f..0000000 --- a/src/data/mappings/shield-hero.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "anilistAnimeId": 99263, - "anilistMangaId": 85442, - "title": "The Rising of the Shield Hero", - "sourceNotes": "Cumulative episodes across S1 (25) + S2 (13, eps 26-38) + S3 (12, eps 39-50) = 50 total. Paired with the Aiya Kyū manga adaptation (ongoing, ~96 chapters). Per-arc chapter boundaries approximate.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 25], - "arc": "Initial Wave / False Charges" - }, - { - "episodes": [14, 25], - "chapters": [26, 45], - "arc": "Three Heroes Cooperation / Pope" - }, - { - "episodes": [26, 38], - "chapters": [46, 70], - "arc": "Spirit Tortoise (S2)" - }, - { - "episodes": [39, 50], - "chapters": [71, 96], - "arc": "Phoenix / Calamity (S3)" - } - ] -} diff --git a/src/data/mappings/shikimoris-not-just-a-cutie.json b/src/data/mappings/shikimoris-not-just-a-cutie.json deleted file mode 100644 index c9641dc..0000000 --- a/src/data/mappings/shikimoris-not-just-a-cutie.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 127911, - "anilistMangaId": 107282, - "title": "Shikimori's Not Just a Cutie", - "sourceNotes": "Single 12-episode TV season (2022). Keigo Maki's manga (AniList id 107282) is complete at 203 chapters / 20 volumes (concluded 2024), not ongoing. The anime adapts roughly the first four volumes (~ch 1-40), so a viewer resumes around ch 41. Episodic romcom with no strong arcs — chapter ranges are approximate.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 13], - "arc": "Meeting Shikimori & the Friend Group" - }, - { - "episodes": [5, 8], - "chapters": [14, 27], - "arc": "Sports Festival & Summer Days" - }, - { - "episodes": [9, 12], - "chapters": [28, 40], - "arc": "Festivals & Growing Closer" - }, - { - "chapters": [41, 203], - "arc": "Remaining manga (unadapted)" - } - ] -} diff --git a/src/data/mappings/shimoneta.json b/src/data/mappings/shimoneta.json deleted file mode 100644 index 3ba1965..0000000 --- a/src/data/mappings/shimoneta.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "anilistAnimeId": 20910, - "anilistMangaId": 86320, - "title": "Shimoneta", - "sourceNotes": "Single 12-episode TV season (2015). The source is Hirotaka Akagi's light novel (AniList 86319, 11 vols / 64 ch, finished); the anime adapts roughly LN vols 1-4. anilistMangaId points at the finished manga adaptation 'Manmaru-hen' (AniList 86320, 23 ch / 4 vols), which covers the same early LN material. Episode-to-chapter ranges are approximate (LN-based): both the anime and manga independently adapt the novels, so boundaries are reasonable segment splits across the manga's 23 chapters rather than exact correspondences. A reader who finishes the manga continues in the light novel.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 6], - "arc": "Joining SOX (Lewd Terrorism Begins)" - }, - { - "episodes": [4, 6], - "chapters": [7, 12], - "arc": "Anna's Awakening & SOX Operations" - }, - { - "episodes": [7, 9], - "chapters": [13, 18], - "arc": "Gathered Fabric & White Source Incident" - }, - { - "episodes": [10, 12], - "chapters": [19, 23], - "arc": "Anna's Obsession & Decensorship Finale" - } - ] -} diff --git a/src/data/mappings/showa-genroku-rakugo-shinju.json b/src/data/mappings/showa-genroku-rakugo-shinju.json deleted file mode 100644 index 984b9c9..0000000 --- a/src/data/mappings/showa-genroku-rakugo-shinju.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 20972, - "anilistMangaId": 56704, - "title": "Showa Genroku Rakugo Shinju", - "sourceNotes": "Cumulative episodes across S1 (13) + S2/Sukeroku Futatabi-hen (12) = 25. Manga by Haruko Kumota complete at 10 volumes; AniList lists 32 chapters (the fandom wiki's chapter list runs 1-31, with AniList's count likely including a bonus/epilogue chapter). S1 covers volumes 1-5 (chapters 1-16), spanning the \"Yotaro's Odyssey\" present-day frame and the \"Yakumo and Sukeroku\" flashback arc; S2 covers volumes 6-10 (chapters 17-32), the \"Sukeroku Again\" arc following Yotaro in the present day. A 2-episode OVA (\"Yotaro Hourou-hen\", 2015) predates and was later re-adapted into S1's extended 48-minute premiere, so it is not counted separately in this mapping's episode numbering.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 16], - "arc": "Yakumo to Sukeroku-hen (Kikuhiko & Sukeroku's Youth)" - }, - { - "episodes": [14, 25], - "chapters": [17, 32], - "arc": "Sukeroku Futatabi-hen (Yotaro's Present Day)" - } - ] -} diff --git a/src/data/mappings/sign-of-affection.json b/src/data/mappings/sign-of-affection.json deleted file mode 100644 index 44745f2..0000000 --- a/src/data/mappings/sign-of-affection.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 166794, - "anilistMangaId": 111189, - "title": "A Sign of Affection", - "sourceNotes": "Cumulative episodes are just the 12-episode first-season TV anime (Jan-Mar 2024); no Season 2 has aired or been announced as of June 2026, so the episode count does not extend further. Paired with suu Morishita's ongoing manga (AniList lists chapters as null): 57 numbered chapters released as of volume 14 (May 13, 2026), so the unadapted tail runs to chapter 57. The anime adapts through chapter 21 (chapter 8 is skipped between episodes 5 and 6); per-episode chapter boundaries follow AnimeFillerGuide's conversion, and the internal arc splits are approximate.", - "mappings": [ - { - "episodes": [1, 5], - "chapters": [1, 7], - "arc": "A Fateful Meeting & The Answer (Yuki falls for Itsuomi)" - }, - { - "episodes": [6, 9], - "chapters": [8, 15], - "arc": "Becoming a Couple (first dates, introductions, Kyouya)" - }, - { - "episodes": [10, 12], - "chapters": [16, 21], - "arc": "Oushi's World / Promise (Itsuomi heads abroad)" - }, - { - "chapters": [22, 57], - "arc": "After the Promise (unadapted tail; manga ongoing)" - } - ] -} diff --git a/src/data/mappings/sing-yesterday-for-me.json b/src/data/mappings/sing-yesterday-for-me.json deleted file mode 100644 index 2b8b14c..0000000 --- a/src/data/mappings/sing-yesterday-for-me.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "anilistAnimeId": 109020, - "anilistMangaId": 31155, - "title": "SING \"YESTERDAY\" FOR ME", - "sourceNotes": "Single-cour 12-episode TV series (Doga Kobo, 2020); a separate 6-episode ONA short series ('Yesterday wo Utatte Extras', AniList id 117496) aired alongside it but is not counted here. Manga (Kei Toume, 1997-2015) complete at 113 chapters across 11 volumes. Reviewers note the anime covers roughly the first two-thirds of the manga before diverging into a mostly-original ending for its finale, skipping the manga's final act, so the adapted-range boundary below is an approximation rather than a confirmed chapter cut.", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 75], "arc": "Main Story" }, - { "chapters": [76, 113], "arc": "Unadapted Ending (manga-only)" } - ] -} diff --git a/src/data/mappings/skeleton-knight-in-another-world.json b/src/data/mappings/skeleton-knight-in-another-world.json deleted file mode 100644 index f3090ee..0000000 --- a/src/data/mappings/skeleton-knight-in-another-world.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 132474, - "anilistMangaId": 98900, - "title": "Skeleton Knight in Another World", - "sourceNotes": "Single-cour TV anime (S1, 12 episodes, 2022) from Studio Kai. The printed source is the light novel (AniList 87239, ongoing), but this mapping uses the ongoing manga adaptation (AniList 98900) because its chapters are numbered continuously and the community \"where to start reading\" boundary lands cleanly at manga chapter 21 (Volume 5). The anime adapts manga chapters 1-20 (manga volumes 1-4), equivalent to light novel volumes 1-3; readers continue at manga ch. 21 / LN vol. 4. Chapter ranges are volume-aligned and approximate (~1.7 chapters per episode, some minor LN arcs cut). Manga ongoing (current ch. 72, vol. 15). A 12-episode Season 2 began airing July 2026 (AniList 185542) and is not covered here.", - "mappings": [ - { - "episodes": [1, 5], - "chapters": [1, 10], - "arc": "Diento & Slave Market Arc" - }, - { - "episodes": [6, 8], - "chapters": [11, 15], - "arc": "Elf Village & Nohzan Conflict Arc" - }, - { - "episodes": [9, 12], - "chapters": [16, 20], - "arc": "Rhoden Capital & Beastfolk Arc" - }, - { - "chapters": [21, 72], - "arc": "Post-anime continuation (unadapted)" - } - ] -} diff --git a/src/data/mappings/skip-and-loafer.json b/src/data/mappings/skip-and-loafer.json deleted file mode 100644 index b50e77b..0000000 --- a/src/data/mappings/skip-and-loafer.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "anilistAnimeId": 141911, - "anilistMangaId": 109285, - "title": "Skip and Loafer", - "sourceNotes": "Season 1 only (12 episodes), a faithful, filler-free adaptation that covers manga chapters 1-23 (volumes 1-4), ending with the cultural festival. Manga chapters are labelled 'Scene N'. The per-episode split within each volume block is an even-pacing approximation; the overall span (ep 1-12 = ch 1-23) is firm. Manga is ongoing (serialized in Monthly Afternoon); latest chapter approximately 78 with 13 volumes as of mid-2026 (approximate). A Season 2 is announced but had not aired as of mid-2026.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 5], - "arc": "First day / Meeting Shima (Vol. 1)" - }, - { - "episodes": [4, 6], - "chapters": [6, 11], - "arc": "New friends & the rainy season (Vol. 2)" - }, - { - "episodes": [7, 9], - "chapters": [12, 17], - "arc": "Student council & summer break (Vol. 3)" - }, - { - "episodes": [10, 12], - "chapters": [18, 23], - "arc": "The cultural festival (Vol. 4)" - }, - { - "chapters": [24, 29], - "arc": "Second half of freshman year / first love (Vol. 5, unadapted)" - }, - { - "chapters": [30, 78], - "arc": "Manga continues past the anime (unadapted, Vol. 6 onward)" - } - ] -} diff --git a/src/data/mappings/slam-dunk.json b/src/data/mappings/slam-dunk.json deleted file mode 100644 index 392d029..0000000 --- a/src/data/mappings/slam-dunk.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "anilistAnimeId": 170, - "anilistMangaId": 30051, - "title": "Slam Dunk", - "sourceNotes": "1993-1996 anime (101 eps) covers manga ch 1-159 approximately. Manga complete at 276 chapters; the Inter-High tournament (Toyotama, Sannoh, Aiwa) is unadapted in the TV series. THE FIRST SLAM DUNK (2022 movie) covers the Sannoh match from the unadapted portion.", - "mappings": [ - { - "episodes": [1, 25], - "chapters": [1, 50], - "arc": "Shohoku Founding / Inter-High Qualifier Begins" - }, - { - "episodes": [26, 60], - "chapters": [51, 110], - "arc": "Kainan / Shoyo / Ryonan Battles" - }, - { - "episodes": [61, 101], - "chapters": [111, 159], - "arc": "Inter-High Qualifier Finals (Kainan Rematch)" - }, - { - "chapters": [160, 276], - "arc": "Inter-High Tournament: Toyotama / Sannoh / Aiwa (unadapted in TV; Sannoh covered by 2022 movie)" - } - ], - "movies": [ - { - "anilistId": 1764, - "title": "Slam Dunk: The Movie", - "year": 1994, - "note": "Side story (anime-original)." - }, - { - "anilistId": 1861, - "title": "Slam Dunk: National Domination! Sakuragi Hanamichi", - "year": 1994, - "note": "Side story (anime-original)." - }, - { - "anilistId": 2498, - "title": "Slam Dunk: Shohoku's Greatest Challenge! Burning Hanamichi Sakuragi", - "year": 1995, - "note": "Side story (anime-original)." - }, - { - "anilistId": 2499, - "title": "Slam Dunk: Howling Basketman Spirit!!", - "year": 1995, - "note": "Side story (anime-original)." - }, - { - "anilistId": 128207, - "title": "THE FIRST SLAM DUNK", - "year": 2022, - "chapters": [220, 276], - "afterEpisode": 101, - "note": "Adapts the Sannoh match from the unadapted Inter-High portion (range approximate)." - } - ] -} diff --git a/src/data/mappings/sleepy-princess-in-the-demon-castle.json b/src/data/mappings/sleepy-princess-in-the-demon-castle.json deleted file mode 100644 index 3b9ef07..0000000 --- a/src/data/mappings/sleepy-princess-in-the-demon-castle.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 111428, - "anilistMangaId": 87510, - "title": "Sleepy Princess in the Demon Castle", - "sourceNotes": "Single season, 12 episodes. Manga ongoing (current ch. 445 as of July 2026, serialized in Weekly Shonen Sunday since 2016). Gag/vignette comedy format — the anime does not adapt chapters in sequence; individual episodes cherry-pick and reorder unrelated chapters (the finale alone draws from Ch. 33 and Ch. 84). Chapter ranges are approximate: the anime's 12 episodes loosely cover material through roughly Ch. 89 (through vol. 7) before the manga moves into territory the anime never touched.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 89], - "arc": "Anime Adaptation (Non-Linear Vignette Order)" - }, - { "chapters": [90, 445], "arc": "Unadapted (Ongoing)" } - ] -} diff --git a/src/data/mappings/smartphone.json b/src/data/mappings/smartphone.json deleted file mode 100644 index 75f1a71..0000000 --- a/src/data/mappings/smartphone.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 98491, - "anilistMangaId": 87174, - "title": "In Another World With My Smartphone", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (12, eps 13-24) = 24 total. The anime adapts Patora Fuyuhara's LIGHT NOVEL, not Soto's slower parallel manga adaptation (id 99465, ~18 vols, whose chapter pacing does not line up with the anime), so this maps to the light novel (AniList id 87174, type MANGA / format NOVEL, ongoing at 31 volumes as of May 2025). AniList tracks no chapter count for the LN, so the numbers in the `chapters` field are LIGHT NOVEL VOLUMES, not chapters. Both seasons combined cover roughly LN vols 1-6: S1 ~vols 1-3, S2 ~vols 4-6, with readers advised to continue at vol 7 afterward. The TV adaptation is heavily abridged and non-linear (it reorders and skips chapters), so the per-season volume boundaries are approximate. Vols 7-31 are unadapted.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 3], - "arc": "Reincarnation, Fiancees & the Babylon Discovery (S1, LN vols 1-3)" - }, - { - "episodes": [13, 24], - "chapters": [4, 6], - "arc": "Brunhild Dukedom, Frame Gears & the Phrase (S2, LN vols 4-6)" - }, - { - "chapters": [7, 31], - "arc": "Unadapted (LN vols 7-31)" - } - ] -} diff --git a/src/data/mappings/smoking-behind-the-supermarket-with-you.json b/src/data/mappings/smoking-behind-the-supermarket-with-you.json deleted file mode 100644 index 0c2fd87..0000000 --- a/src/data/mappings/smoking-behind-the-supermarket-with-you.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 196187, - "anilistMangaId": 147149, - "title": "Smoking Behind the Supermarket with You", - "sourceNotes": "The anime is currently RELEASING (Summer 2026 season, 12 planned episodes at ~24 min each). The first 6 episodes were released early as twelve ~10-minute mini-episodes on ABEMA/Crunchyroll ahead of the standard TV broadcast, adapting manga chapters 1-20. Manga (by Jinushi) is ongoing, at roughly chapter 58 as of early 2026 per Anime-Planet. Episodes 7-12 had not yet aired at the time this mapping was drafted, so their chapter coverage is left as an unadapted tail; revisit once the season completes and per-episode chapter data becomes available.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 20], - "arc": "Season 1 (Early Mini-Episode Release)" - }, - { "chapters": [21, 58], "arc": "Unadapted (Episodes 7-12 not yet aired)" } - ] -} diff --git a/src/data/mappings/snow-white-with-the-red-hair.json b/src/data/mappings/snow-white-with-the-red-hair.json deleted file mode 100644 index 1f3fd30..0000000 --- a/src/data/mappings/snow-white-with-the-red-hair.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "anilistAnimeId": 21058, - "anilistMangaId": 34571, - "title": "Snow White with the Red Hair", - "sourceNotes": "Cumulative episodes across S1 (12 eps, AniList 21058) + S2 (12 eps, AniList 21258 — eps 13-24) = 24 total. Use the S1 id. Paired with Sorata Akizuki's shoujo manga 'Akagami no Shirayuki-hime' (AniList 34571), ongoing — 27 tankobon volumes / ~ch 142 as of May 2025 (vol 27). S1 adapts roughly ch 1-18 (vols 1-4); S2 adapts roughly ch 19-31 (vols 5-7). S2 closes on an anime-original ending, so the standard advice is for a viewer to resume the manga at ch 32. The 1-episode OVA 'Nandemonai Takaramono, Kono Page' (AniList 21313) is a side story aired between seasons and is not part of the cumulative count; there is no 3rd TV season and no theatrical film. Intra-season arc boundaries are approximate.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 2], - "arc": "Tanbarun & the Poisoned Apple (fleeing Prince Raji, meeting Zen)" - }, - { - "episodes": [3, 6], - "chapters": [3, 9], - "arc": "Royal Court Herbalist (Wistal Castle exam & apprenticeship under Ryuu)" - }, - { - "episodes": [7, 9], - "chapters": [10, 13], - "arc": "Mihaya Kidnapping & Obi" - }, - { - "episodes": [10, 12], - "chapters": [14, 18], - "arc": "Return to Tanbarun" - }, - { - "episodes": [13, 16], - "chapters": [19, 23], - "arc": "Northern City of Lyrias (research assignment)" - }, - { - "episodes": [17, 21], - "chapters": [24, 28], - "arc": "Sea Pirate Kidnapping (Claw of the Sea & Lions of the Mountain)" - }, - { - "episodes": [22, 24], - "chapters": [29, 31], - "arc": "Resolution & Official Court Herbalist (anime-original ending; resume at ch 32)" - }, - { - "chapters": [32, 142], - "arc": "Continued Story (unadapted, ongoing)" - } - ] -} diff --git a/src/data/mappings/so-i-cant-play-h.json b/src/data/mappings/so-i-cant-play-h.json deleted file mode 100644 index 983ab63..0000000 --- a/src/data/mappings/so-i-cant-play-h.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "anilistAnimeId": 12549, - "anilistMangaId": 55547, - "title": "So, I Can't Play H!", - "sourceNotes": "Anime is 12 TV episodes (2012); a 13th episode aired separately as an OVA in 2013 continuing the story and is not counted in the cumulative range. Manga (Shou Okagiri, complete at 28 chapters / 5 volumes) is a parallel adaptation of the same Pan Tachibana light novels rather than a direct novelization of the anime, but covers the same overall plot through its swimsuit-competition climax. Continuous romantic comedy with no distinct named arcs.", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 28], "arc": "Main Story" } - ] -} diff --git a/src/data/mappings/so-im-a-spider.json b/src/data/mappings/so-im-a-spider.json deleted file mode 100644 index 6d80d29..0000000 --- a/src/data/mappings/so-im-a-spider.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 103632, - "anilistMangaId": 86952, - "title": "So I'm a Spider, So What?", - "sourceNotes": "Source is Okina Baba's light novel Kumo desu ga, Nani ka?, complete at 16 main volumes (concluded January 2022; AniList LN id 86406). The `chapters` tuples here are LIGHT-NOVEL VOLUME numbers (1-16), NOT manga chapters. anilistMangaId points to the Asahiro Kakashi manga adaptation (id 86952, ongoing -- roughly ch. 78 / 15 volumes as of 2026), but that manga cannot anchor this mapping: it lags far behind the 24-episode anime and deliberately drops most of the human-side 'S' interludes, whereas the anime interweaves Kumoko's dungeon-climb timeline with the reincarnated classmates' present-day timeline (set ~15 years later). The single 2-cour 2021 TV anime (24 eps) adapts roughly LN vols 1-5; an anime-only viewer resumes at vol 6. Per-volume episode boundaries are APPROXIMATE because the anime reorders and interleaves the two timelines. No theatrical films.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 1], - "arc": "Lower Stratum survival: hatching & fleeing the Great Elroe Labyrinth (classmates' reincarnation revealed) (LN vol 1)" - }, - { - "episodes": [5, 8], - "chapters": [2, 2], - "arc": "Middle Stratum: the catfish & magma trials; Hero and Demon Lord introduced; Prince Shun's childhood (LN vol 2)" - }, - { - "episodes": [9, 12], - "chapters": [3, 3], - "arc": "Upper Stratum & the Great Fire Dragon -- cour 1 finale (LN vol 3)" - }, - { - "episodes": [13, 18], - "chapters": [4, 4], - "arc": "Reaching the surface: parallel minds & the Queen's puppet spiders; the classmates' school years (LN vol 4)" - }, - { - "episodes": [19, 24], - "chapters": [5, 5], - "arc": "Convergence: class reunion, evolution to Arachne & the Hero's death; Kumoko becomes Shiraori (anime finale) (LN vol 5)" - }, - { - "chapters": [6, 16], - "arc": "Human-Demon war, Sariella & the System's truth (LN vols 6-16, unadapted)" - } - ] -} diff --git a/src/data/mappings/solo-leveling.json b/src/data/mappings/solo-leveling.json deleted file mode 100644 index cb95e7d..0000000 --- a/src/data/mappings/solo-leveling.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "anilistAnimeId": 151807, - "anilistMangaId": 105398, - "title": "Solo Leveling", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (13, eps 13-25) = 25 total. Paired with the DUBU manhwa (201 chapters, finished). Both adapt the Chugong web novel. S3 announced. Per-arc chapter boundaries approximate.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 50], - "arc": "E-Rank Hunter / Double Dungeon → Awakening (S1)" - }, - { - "episodes": [13, 25], - "chapters": [51, 110], - "arc": "Job Change Quest / Jeju Island (S2)" - }, - { "chapters": [111, 201], "arc": "Monarchs War / Final Arc (unadapted)" } - ], - "movies": [ - { - "anilistId": 184694, - "title": "Solo Leveling: ReAwakening", - "year": 2024, - "afterEpisode": 12, - "note": "S1 recap plus early premiere of the first two S2 episodes." - } - ] -} diff --git a/src/data/mappings/somali-and-the-forest-spirit.json b/src/data/mappings/somali-and-the-forest-spirit.json deleted file mode 100644 index f50d579..0000000 --- a/src/data/mappings/somali-and-the-forest-spirit.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 108617, - "anilistMangaId": 86788, - "title": "Somali and the Forest Spirit", - "sourceNotes": "Single 12-episode season. Manga cut short at 39 chapters (6 volumes) — serialization ended in 2019, then officially concluded in December 2020 after author Yako Gureishi's worsening health forced an early wrap-up. The anime notably adapts chapters out of chronological order to suit its own pacing (e.g. episode 7 draws from chapters 6-11 while episode 6 draws from chapters 20-21), so a precise per-episode chapter correspondence isn't meaningful; this mapping instead spans the overall range of chapters the anime draws from (ch. 1-31, matching episode 12's use of ch. 31) with the unadapted final chapters (32-39) at the tail. Episode 12's ending is anime-original and not present in the manga.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 31], - "arc": "Somali & Golem's Journey (anime run; chapters adapted out of order)" - }, - { - "chapters": [32, 39], - "arc": "Final Chapters (unadapted manga-only epilogue)" - } - ] -} diff --git a/src/data/mappings/soul-eater.json b/src/data/mappings/soul-eater.json deleted file mode 100644 index 2ebdb2c..0000000 --- a/src/data/mappings/soul-eater.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 3588, - "anilistMangaId": 30908, - "title": "Soul Eater", - "sourceNotes": "Single 51-episode 2008 anime; faithfully adapts manga chapters ~1-32 through ep 35, then diverges into an anime-original ending across ep 36-51. Manga complete at 117 chapters. Anime-original eps 36-51 are intentionally unmapped; unadapted manga arcs are included at the tail.", - "mappings": [ - { - "episodes": [1, 19], - "chapters": [1, 19], - "arc": "Introduction / DWMA / Italy Mission" - }, - { - "episodes": [20, 35], - "chapters": [20, 32], - "arc": "DWMA Anniversary / Asura's Awakening (anime-canon end)" - }, - { "chapters": [33, 44], "arc": "Vs. Arachnophobia / Brew" }, - { "chapters": [45, 60], "arc": "Operation Capture Baba Yaga Castle" }, - { "chapters": [61, 71], "arc": "Tezca Tlipoca / Spartoi" }, - { "chapters": [72, 81], "arc": "Salvage Arc" }, - { "chapters": [82, 117], "arc": "Battle on the Moon / Finale" } - ] -} diff --git a/src/data/mappings/space-dandy.json b/src/data/mappings/space-dandy.json deleted file mode 100644 index a8f9f98..0000000 --- a/src/data/mappings/space-dandy.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "anilistAnimeId": 20057, - "anilistMangaId": 85537, - "title": "Space Dandy", - "sourceNotes": "Cumulative episodes across S1 (13) + S2 (13) = 26. Manga complete at 16 chapters / 2 volumes (Masafumi Harada/BONES, Young Gangan, 2013-2014), covering both TV seasons. Episodic/anthology anime with self-contained, often-reset episodes; the manga retells select episodes rather than adapting all 26 1:1 (e.g. chapter 1 diverges noticeably from anime episode 1), so the chapter split below is an approximate, roughly even distribution across the two seasons rather than a strict scene-for-scene correspondence.", - "mappings": [ - { "episodes": [1, 13], "chapters": [1, 8], "arc": "Season 1" }, - { "episodes": [14, 26], "chapters": [9, 16], "arc": "Season 2" } - ] -} diff --git a/src/data/mappings/spice-and-wolf.json b/src/data/mappings/spice-and-wolf.json deleted file mode 100644 index 53eb947..0000000 --- a/src/data/mappings/spice-and-wolf.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 2966, - "anilistMangaId": 33299, - "title": "Spice and Wolf", - "sourceNotes": "Cumulative episodes across S1 (13) + S2 (12, eps 14-25) = 25 total. Paired with the Keito Koume manga adaptation (108 chapters, finished). Both adapt the Isuna Hasekura light novel. The 2024 'Merchant Meets the Wise Wolf' reboot anime is a separate AniList entry.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 50], - "arc": "S1: First Journey (Wheat, Silver Coin)" - }, - { - "episodes": [14, 25], - "chapters": [51, 108], - "arc": "S2: Amati / Diana Ruvik" - } - ] -} diff --git a/src/data/mappings/spy-x-family.json b/src/data/mappings/spy-x-family.json deleted file mode 100644 index 9c156d9..0000000 --- a/src/data/mappings/spy-x-family.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 140960, - "anilistMangaId": 108556, - "title": "SPY x FAMILY", - "sourceNotes": "Cumulative episodes across S1 (12) + Cour 2 (13) + S2 (12) + S3 (13) = 50. Manga ongoing (Mission 127, Vol 17 as of April 2026). Arc names are fan-conventional and chapter boundaries are approximate due to vignette-style mission structure — refine via PR.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 11], - "arc": "Operation Strix / Eden Academy Entrance" - }, - { - "episodes": [13, 25], - "chapters": [12, 22], - "arc": "Stella Star / Damian's Birthday" - }, - { - "episodes": [26, 37], - "chapters": [23, 37], - "arc": "Yor's Brother (Yuri) / Mount Hugot / Tennis" - }, - { "episodes": [38, 50], "chapters": [38, 53], "arc": "Cruise Adventure" }, - { "chapters": [54, 66], "arc": "Loid's Past / Berlin Operation" }, - { "chapters": [67, 75], "arc": "Bus Hijacking" }, - { "chapters": [76, 84], "arc": "Wheeler / Mole Hunt" }, - { "chapters": [85, 127], "arc": "Family Photo / Recent Missions (Ongoing)" } - ], - "movies": [ - { - "anilistId": 158928, - "title": "SPY x FAMILY CODE: White", - "year": 2023, - "afterEpisode": 37, - "note": "Side-story film (anime-original) between S2 and S3." - } - ] -} diff --git a/src/data/mappings/ssss-gridman.json b/src/data/mappings/ssss-gridman.json deleted file mode 100644 index 9c1dba8..0000000 --- a/src/data/mappings/ssss-gridman.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "anilistAnimeId": 99424, - "anilistMangaId": 116192, - "title": "SSSS.GRIDMAN", - "sourceNotes": "Single-cour 12-episode series (Studio Trigger, 2018). Manga by Yuki Konno (Shonen Jump+, Nov 2019 - Dec 2021) is a close tie-in adaptation of the same story with no distinct named arcs; complete at 52 chapters. Original anime; manga is a close tie-in adaptation.", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 52], "arc": "Gridman Alliance" } - ] -} diff --git a/src/data/mappings/steins-gate.json b/src/data/mappings/steins-gate.json deleted file mode 100644 index a84f357..0000000 --- a/src/data/mappings/steins-gate.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 9253, - "anilistMangaId": 47517, - "title": "Steins;Gate", - "sourceNotes": "24-episode 2011 anime adapts the 2009 visual novel; both anime and the Yomi Sarachi manga retelling (23 chapters / 2 vols) share the same source story. Pacing differs noticeably between adaptations. Steins;Gate 0 (2018 anime + 2017 manga, 41 ch) is a separate parallel-timeline sequel with its own AniList entries.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 12], - "arc": "α-World Line (SERN, IBN 5100, time-leap experiments)" - }, - { - "episodes": [13, 24], - "chapters": [13, 23], - "arc": "β-World Line (Mayuri's fate, Suzuha, finale)" - } - ], - "movies": [ - { - "anilistId": 11577, - "title": "Steins;Gate the Movie: Load Region of Deja Vu", - "year": 2013, - "afterEpisode": 24, - "note": "Sequel film (anime-original)." - } - ] -} diff --git a/src/data/mappings/strike-the-blood.json b/src/data/mappings/strike-the-blood.json deleted file mode 100644 index bea4543..0000000 --- a/src/data/mappings/strike-the-blood.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "anilistAnimeId": 18277, - "anilistMangaId": 71021, - "title": "Strike the Blood", - "sourceNotes": "Source is Gakuto Mikumo's light novel (AniList id 71021, format NOVEL, 157 parts across 22 main volumes; series complete, ended 2020 with vol 22). Chapter ranges are proportional volume estimates mapped onto AniList's 157-part count (~7 parts/vol), so they are approximate. Cumulative episodes span the full sequel/OVA chain: TV Season 1 (id 18277, 24 eps) + Kingdom of the Valkyria side-story OVA (id 21098, 2 eps) + Strike the Blood II (id 21815, 8 eps) + Strike the Blood III (10 eps) + Strike the Blood IV (12 eps) + Strike the Blood Final (4 eps) = 60 episodes. The adaptation is deliberately OUT of volume order, so chapter ranges are non-monotonic: S1 adapts vols 1-6, with eps 23-24 an anime-original finale loosely based on vol 17; the Kingdom of the Valkyria OVA covers side-story vol 18; STB II adapts vols 9, 11, 12 (skipping vol 10); STB III adapts vols 13-15; STB IV adapts vols 16, 19, 20, 21; STB Final adapts vol 22. LN vols 7, 8, and 10 were never adapted. Within-OVA per-volume episode splits are evenly estimated. No theatrical films exist.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 7], - "arc": "The Right Arm of the Saint (LN vol 1)" - }, - { - "episodes": [5, 8], - "chapters": [8, 14], - "arc": "From the Warlord's Empire (LN vol 2)" - }, - { - "episodes": [9, 12], - "chapters": [15, 21], - "arc": "The Amphisbaena (LN vol 3)" - }, - { - "episodes": [13, 15], - "chapters": [22, 29], - "arc": "Labyrinth of the Blue Witch (LN vol 4)" - }, - { - "episodes": [16, 19], - "chapters": [30, 36], - "arc": "Fiesta for the Observers (LN vol 5)" - }, - { - "episodes": [20, 22], - "chapters": [37, 43], - "arc": "Return of the Alchemist (LN vol 6)" - }, - { - "episodes": [23, 24], - "chapters": [115, 121], - "arc": "Empire of the Dawn (S1 anime-original finale, loosely LN vol 17)" - }, - { - "episodes": [25, 26], - "chapters": [122, 128], - "arc": "Kingdom of the Valkyria OVA (side story, LN vol 18)" - }, - { - "episodes": [27, 29], - "chapters": [58, 64], - "arc": "Strike the Blood II - Third Progenitor arc (LN vol 9)" - }, - { - "episodes": [30, 32], - "chapters": [72, 79], - "arc": "Strike the Blood II (LN vol 11, skips vol 10)" - }, - { - "episodes": [33, 34], - "chapters": [80, 86], - "arc": "Strike the Blood II (LN vol 12)" - }, - { - "episodes": [35, 38], - "chapters": [87, 93], - "arc": "Strike the Blood III (LN vol 13)" - }, - { - "episodes": [39, 41], - "chapters": [94, 100], - "arc": "Strike the Blood III (LN vol 14)" - }, - { - "episodes": [42, 44], - "chapters": [101, 107], - "arc": "Strike the Blood III (LN vol 15)" - }, - { - "episodes": [45, 47], - "chapters": [108, 114], - "arc": "Strike the Blood IV (LN vol 16)" - }, - { - "episodes": [48, 50], - "chapters": [129, 136], - "arc": "Strike the Blood IV (LN vol 19)" - }, - { - "episodes": [51, 53], - "chapters": [137, 143], - "arc": "Strike the Blood IV (LN vol 20)" - }, - { - "episodes": [54, 56], - "chapters": [144, 150], - "arc": "Strike the Blood IV (LN vol 21)" - }, - { - "episodes": [57, 60], - "chapters": [151, 157], - "arc": "Strike the Blood Final (LN vol 22)" - } - ] -} diff --git a/src/data/mappings/summer-time-rendering.json b/src/data/mappings/summer-time-rendering.json deleted file mode 100644 index eae33ff..0000000 --- a/src/data/mappings/summer-time-rendering.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "anilistAnimeId": 129201, - "anilistMangaId": 102989, - "title": "Summer Time Rendering", - "sourceNotes": "The 25-episode 2022 TV anime (OLM) is a full 1:1 adaptation of Yasuki Tanaka's COMPLETE manga: 139 chapters across 13 volumes (Shonen Jump+, 2017-2021). Episode 25 'I'm Home' ends on the manga's final chapter, 139. Cadence is ~5-6 chapters per episode; the arc boundaries below are aligned to verified per-episode chapter anchors (ep 5 ends ch 20, ep 9 ends ch 47, ep 13 ends ch 68, ep 18 ends ch 99, ep 22 ends ch 125, ep 25 ends ch 139), so the cumulative ranges are exact. No theatrical films.", - "mappings": [ - { - "episodes": [1, 5], - "chapters": [1, 20], - "arc": "Return to Hitogashima / first loops (the funeral, the Shadow phenomenon, early deaths)" - }, - { - "episodes": [6, 9], - "chapters": [21, 47], - "arc": "The Shadow hunt (alliance with Hizuru & Ginjiro, Shadow rules uncovered, Shadow Ushio)" - }, - { - "episodes": [10, 13], - "chapters": [48, 68], - "arc": "The Hishigata Clinic (Ushio's death, the Hiruko statue / bunker, Kobayakawa raids)" - }, - { - "episodes": [14, 18], - "chapters": [69, 99], - "arc": "The Haine / Shide reveal (origin of the Shadows, Masahito unmasked as Shide)" - }, - { - "episodes": [19, 22], - "chapters": [100, 125], - "arc": "Time-loop escalation (Shadow Shinpei, Ushio's resurrection as the observer)" - }, - { - "episodes": [23, 25], - "chapters": [126, 139], - "arc": "The final confrontation (decisive battle vs. the immortal Shide; resolution)" - } - ] -} diff --git a/src/data/mappings/suppose-a-kid-from-the-last-dungeon-boonies-moved-to-a-starter-town.json b/src/data/mappings/suppose-a-kid-from-the-last-dungeon-boonies-moved-to-a-starter-town.json deleted file mode 100644 index be1e531..0000000 --- a/src/data/mappings/suppose-a-kid-from-the-last-dungeon-boonies-moved-to-a-starter-town.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 112649, - "anilistMangaId": 100311, - "title": "Suppose a Kid from the Last Dungeon Boonies moved to a starter town?", - "sourceNotes": "Single-cour 12-episode anime (Liden Films, 2021) compresses roughly five light novels into one season, skipping large stretches of story. Manga (Hajime Fusemachi, Gangan Online) complete at 52 chapters / 12 volumes (2017-2023), adapting through Novel 6 before ending. The anime's finale lines up with approximately chapter 44 of the manga; the manga continues a bit further with unadapted material before its own conclusion.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 44], - "arc": "Anime Story (Season 1)" - }, - { "chapters": [45, 52], "arc": "Manga-only continuation" } - ] -} diff --git a/src/data/mappings/sweetness-and-lightning.json b/src/data/mappings/sweetness-and-lightning.json deleted file mode 100644 index eaaf019..0000000 --- a/src/data/mappings/sweetness-and-lightning.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "anilistAnimeId": 21659, - "anilistMangaId": 86044, - "title": "Sweetness & Lightning", - "sourceNotes": "Single-cour, 12-episode anime (2016) adapts roughly the first 19 of the manga's 78 chapters (~volumes 1-3), with the anime skipping and reordering a few chapters typical of a slice-of-life adaptation. Manga complete at 78 chapters (12 volumes, finished Aug 2018). Chronological cooking/slice-of-life story with no distinct named arcs; unadapted material included at the tail for readers continuing past the anime.", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 19], "arc": "TV Anime Adaptation" }, - { "chapters": [20, 78], "arc": "Unadapted (Manga-only)" } - ] -} diff --git a/src/data/mappings/sword-art-online.json b/src/data/mappings/sword-art-online.json deleted file mode 100644 index a3fe29e..0000000 --- a/src/data/mappings/sword-art-online.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "anilistAnimeId": 11757, - "anilistMangaId": 53718, - "title": "Sword Art Online", - "sourceNotes": "S1 anime (25 eps, 2012). Eps 1-14 adapt the Aincrad arc (LN vol 1, paired here with the Nakamura Aincrad manga, 12 chapters); eps 15-25 adapt the Fairy Dance arc which has its own manga adaptation. Subsequent SAO seasons (II, Alicization, War of Underworld) adapt later light-novel arcs, each with their own AniList manga IDs and not covered here.", - "mappings": [ - { - "episodes": [1, 14], - "chapters": [1, 12], - "arc": "Aincrad (Floors 1-100)" - } - ], - "movies": [ - { - "anilistId": 21403, - "title": "Sword Art Online the Movie: Ordinal Scale", - "year": 2017, - "note": "Canon sequel film between SAO II and Alicization." - }, - { - "anilistId": 124140, - "title": "Sword Art Online the Movie -Progressive- Aria of a Starless Night", - "year": 2021, - "note": "Progressive retelling of the Aincrad arc." - }, - { - "anilistId": 140999, - "title": "Sword Art Online the Movie -Progressive- Scherzo of Deep Night", - "year": 2022, - "note": "Progressive retelling of the Aincrad arc." - } - ] -} diff --git a/src/data/mappings/takopis-original-sin.json b/src/data/mappings/takopis-original-sin.json deleted file mode 100644 index 1797013..0000000 --- a/src/data/mappings/takopis-original-sin.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "anilistAnimeId": 185407, - "anilistMangaId": 142568, - "title": "Takopi's Original Sin", - "sourceNotes": "Single-season 6-episode ONA that adapts the complete 16-chapter manga by Taizan5 (2 tankobon volumes; vol.1 = ch1-7, vol.2 = ch8-16). Manga is complete at 16 chapters. Episode 1 adapts chapters 1-2 (confirmed by reviews); episodes 2-6 are each titled after their final adapted chapter (\"Takopi's Salvation\" = ch4, \"Takopi's Confession\" = ch7, \"Azuma-kun's Salvation\" = ch10 \"Naoki's Salvation\" since the boy is Naoki Azuma, \"To You in 2022\" = ch12, \"To All of You in 2016\" = ch16). Single cour, so episode numbers are non-cumulative. The only related film is an unreleased recap/compilation (\"Arigatou, Mata Ashita\"), excluded.", - "mappings": [ - { - "episodes": [1, 1], - "chapters": [1, 2], - "arc": "To You in 2016" - }, - { - "episodes": [2, 2], - "chapters": [3, 4], - "arc": "Takopi's Salvation" - }, - { - "episodes": [3, 3], - "chapters": [5, 7], - "arc": "Takopi's Confession" - }, - { - "episodes": [4, 4], - "chapters": [8, 10], - "arc": "Azuma-kun's Salvation" - }, - { - "episodes": [5, 5], - "chapters": [11, 12], - "arc": "To You in 2022" - }, - { - "episodes": [6, 6], - "chapters": [13, 16], - "arc": "To All of You in 2016" - } - ] -} diff --git a/src/data/mappings/takt-op-destiny.json b/src/data/mappings/takt-op-destiny.json deleted file mode 100644 index 252df28..0000000 --- a/src/data/mappings/takt-op-destiny.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "anilistAnimeId": 131565, - "anilistMangaId": 151578, - "title": "takt op.Destiny", - "sourceNotes": "Single-cour anime, 12 episodes. \"takt op.Destiny: Haruka Tsuioku no Anna - Harmony of Hope\" is a companion manga covering the same story and timeline from Anna Schneider's point of view, complete at 14 chapters. No official episode-to-chapter guide was found for this POV retelling, so it is mapped as one broad range spanning the full series — treat the chapter split as approximate.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 14], - "arc": "Anna's Perspective (Full Series Retelling)" - } - ] -} diff --git a/src/data/mappings/talentless-nana.json b/src/data/mappings/talentless-nana.json deleted file mode 100644 index 6b39b24..0000000 --- a/src/data/mappings/talentless-nana.json +++ /dev/null @@ -1,114 +0,0 @@ -{ - "anilistAnimeId": 117343, - "anilistMangaId": 99536, - "title": "Talentless Nana", - "sourceNotes": "Single-cour 13-episode anime (Fall 2020) adapting the Munou na Nana manga (source id 99536) chapters 1-28, through Volume 4 (finale \"Revival\" = Ch 28). Only one anime season, so episodes are not cumulative across seasons. The manga is essentially complete: after a May 2026 announcement it concludes at Chapter 121 on July 12, 2026 (final chapter count used here). Arc names come from the Munou na Nana fandom wiki \"Story Arcs\" page, which are community/fan-made labels rather than official titles; the anime's own episode titles (\"Time Traveler\", \"Necromancer\", \"The Invisible Blade\", etc.) align with these. Confirmed anchors: Necromancer = Ch 10-14 (ep 6-7), Poison Case = Ch 15-17 (ep 8), Unknown Student = Ch 18-20 (ep 9), anime ends at Ch 28 (ep 13). Episode boundaries within the island-introduction stretch (ep 1-5, Ch 1-9) are approximate. Post-Ch-97 arc labels are derived from chapter titles and are approximate. No qualifying theatrical films.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 5], - "arc": "Assassinating Students" - }, - { - "episodes": [3, 5], - "chapters": [6, 9], - "arc": "Future Photos" - }, - { - "episodes": [6, 7], - "chapters": [10, 14], - "arc": "Necromancer" - }, - { - "episodes": [8, 8], - "chapters": [15, 17], - "arc": "Poison Case" - }, - { - "episodes": [9, 9], - "chapters": [18, 20], - "arc": "Unknown Student" - }, - { - "episodes": [10, 13], - "chapters": [21, 28], - "arc": "The Invisible Blade (Ryuuji Ishii Murder Case)" - }, - { - "chapters": [29, 30], - "arc": "Ryuuji Ishii Murder Case (Conclusion)" - }, - { - "chapters": [31, 33], - "arc": "Military Forces" - }, - { - "chapters": [34, 38], - "arc": "Moe and Nana vs Hikaru Daichi" - }, - { - "chapters": [39, 48], - "arc": "Twin Sisters" - }, - { - "chapters": [49, 52], - "arc": "The Death of Hikaru Daichi" - }, - { - "chapters": [53, 54], - "arc": "After the Fall" - }, - { - "chapters": [55, 66], - "arc": "Daisuke Souma / Takeo Saijo Car Case" - }, - { - "chapters": [67, 68], - "arc": "The Downfall of the Talented" - }, - { - "chapters": [69, 71], - "arc": "Managed Camp" - }, - { - "chapters": [72, 76], - "arc": "Time Loop" - }, - { - "chapters": [77, 78], - "arc": "Rin and Kyouya's Past" - }, - { - "chapters": [79, 80], - "arc": "Rescue Team Arrives" - }, - { - "chapters": [81, 85], - "arc": "Shadow Boy Incident" - }, - { - "chapters": [86, 91], - "arc": "Nanao and Nana Final Showdown" - }, - { - "chapters": [92, 93], - "arc": "Monster Transitioning / Escape" - }, - { - "chapters": [94, 97], - "arc": "The Talented Civil War" - }, - { - "chapters": [98, 105], - "arc": "Hostage Negotiations & Telepathy" - }, - { - "chapters": [106, 113], - "arc": "Talentless vs Talentless" - }, - { - "chapters": [114, 121], - "arc": "Mind Reading (Final Arc)" - } - ] -} diff --git a/src/data/mappings/tamako-market.json b/src/data/mappings/tamako-market.json deleted file mode 100644 index 2475b38..0000000 --- a/src/data/mappings/tamako-market.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 16417, - "anilistMangaId": 88044, - "title": "Tamako Market", - "sourceNotes": "Single season, 12 episodes (excludes the separate 6-episode Blu-ray special set). Original Kyoto Animation anime; the tie-in light novel is a close novelization of the TV series, complete at 11 chapters. The 2014 sequel film Tamako Love Story has its own separate novelization and is not covered by these chapter ranges.", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 11], "arc": "Full series" } - ], - "movies": [ - { - "anilistId": 20519, - "title": "Tamako -love story-", - "year": 2014, - "afterEpisode": 12, - "note": "Canon sequel film continuing directly after the TV series; own separate light novelization, not covered by the TV chapter ranges above." - } - ] -} diff --git a/src/data/mappings/tanaka-kun-is-always-listless.json b/src/data/mappings/tanaka-kun-is-always-listless.json deleted file mode 100644 index 970864d..0000000 --- a/src/data/mappings/tanaka-kun-is-always-listless.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "anilistAnimeId": 21495, - "anilistMangaId": 85898, - "title": "Tanaka-kun is Always Listless", - "sourceNotes": "Single 12-episode TV season (2016) adapting the manga by Nozomi Uda. Manga complete at 140 chapters (13 volumes plus a 13.5 supplement), serialized 2013-2019 on Gangan Online. This is a plotless, episodic slice-of-life comedy with NO named story arcs; the anime cherry-picks and partially adapts chapters, jumping around and skipping heavily, but overall draws from roughly chapters 1-40. Chapter ranges below are approximate, using the official episode titles as segment labels and dividing the adapted material proportionally (~3 chapters/episode) rather than as exact boundaries. The final entry is a chapters-only tail covering the large unadapted remainder of the manga.", - "mappings": [ - { - "episodes": [1, 1], - "chapters": [1, 4], - "arc": "Tanaka-kun and Ohta-kun" - }, - { - "episodes": [2, 2], - "chapters": [5, 7], - "arc": "Apprenticeship Application" - }, - { - "episodes": [3, 3], - "chapters": [8, 11], - "arc": "Girl of Contrast, Echizen-san" - }, - { - "episodes": [4, 4], - "chapters": [12, 14], - "arc": "Shiraishi-san's Secret" - }, - { - "episodes": [5, 5], - "chapters": [15, 17], - "arc": "Tanaka-kun's Day" - }, - { - "episodes": [6, 6], - "chapters": [18, 20], - "arc": "The Sick Tanaka-kun" - }, - { - "episodes": [7, 7], - "chapters": [21, 24], - "arc": "Tanaka-kun's Valentine" - }, - { - "episodes": [8, 8], - "chapters": [25, 27], - "arc": "Ohta-kun's Ordeal" - }, - { - "episodes": [9, 9], - "chapters": [28, 31], - "arc": "Welcome to Wac" - }, - { - "episodes": [10, 10], - "chapters": [32, 34], - "arc": "Tanaka-kun's Summer" - }, - { - "episodes": [11, 11], - "chapters": [35, 37], - "arc": "Tanaka-kun's Culture Festival" - }, - { - "episodes": [12, 12], - "chapters": [38, 40], - "arc": "Tanaka-kun's Happiness" - }, - { - "chapters": [41, 140], - "arc": "Unadapted manga chapters" - } - ] -} diff --git a/src/data/mappings/tanya-the-evil.json b/src/data/mappings/tanya-the-evil.json deleted file mode 100644 index b463edc..0000000 --- a/src/data/mappings/tanya-the-evil.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 21613, - "anilistMangaId": 97216, - "title": "The Saga of Tanya the Evil", - "sourceNotes": "S1 anime (12 eps, 2017) adapts roughly light novel volumes 1-2. Paired with the Chika Tojo manga (ongoing, ~70 chapters). The 2019 movie continues with the Republic Arc; S2 announced for 2026.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 20], - "arc": "Norden Campaign / Imperial Promotion" - }, - { "episodes": [7, 12], "chapters": [21, 40], "arc": "Dakia / Rhine Front" } - ], - "movies": [ - { - "anilistId": 100878, - "title": "Saga of Tanya the Evil - The Movie", - "year": 2019, - "afterEpisode": 12, - "note": "Canon sequel film continuing from S1." - } - ] -} diff --git a/src/data/mappings/teasing-master-takagi-san.json b/src/data/mappings/teasing-master-takagi-san.json deleted file mode 100644 index 6df5c43..0000000 --- a/src/data/mappings/teasing-master-takagi-san.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "anilistAnimeId": 99468, - "anilistMangaId": 85533, - "title": "Teasing Master Takagi-san", - "sourceNotes": "Cumulative episodes across S1 (12, 2018) + S2 (12, eps 13-24, 2019) + S3 (12, eps 25-36, 2022) = 36 total; all use the S1 anime id 99468 as the entry point. Paired with Soichiro Yamamoto's manga 'Karakai Jouzu no Takagi-san' (AniList id 85533, FINISHED, 20 volumes). AniList lists 190 chapters; the main serialized run is closer to ~166 numbered chapters, with the remainder being bonus/extra chapters, so the chapter count is source-dependent. This is an episodic gag romcom of short chapters (each episode adapts roughly 4-5 chapters, not strictly in order), so all chapter boundaries are coarse and approximate. The canon theatrical film follows S3.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 48], - "arc": "Season 1 (approx. vols 1-4 — first-year teasing battles)" - }, - { - "episodes": [13, 24], - "chapters": [49, 96], - "arc": "Season 2 (approx. vols 5-9 — deepening rivalry & affection)" - }, - { - "episodes": [25, 36], - "chapters": [97, 144], - "arc": "Season 3 (approx. vols 10-14 — second-year onward)" - }, - { - "chapters": [145, 190], - "arc": "Final chapters (later/unadapted manga, incl. material drawn on by the film)" - } - ], - "movies": [ - { - "anilistId": 138425, - "title": "Teasing Master Takagi-san: The Movie", - "year": 2022, - "afterEpisode": 36, - "note": "Canon film set after S3 (ep 36), adapting later manga chapters toward the series' culmination." - } - ] -} diff --git a/src/data/mappings/tensura.json b/src/data/mappings/tensura.json deleted file mode 100644 index a32d609..0000000 --- a/src/data/mappings/tensura.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "anilistAnimeId": 101280, - "anilistMangaId": 86355, - "title": "That Time I Got Reincarnated as a Slime", - "sourceNotes": "Cumulative episodes across S1 (24) + S2 Part 1 (12, eps 25-36) + S2 Part 2 (12, eps 37-48) + S3 (24, eps 49-72) = 72 total. Paired with the manga adaptation (168 chapters). Per-arc chapter boundaries approximate.", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 30], "arc": "Tempest Founded" }, - { - "episodes": [13, 24], - "chapters": [31, 60], - "arc": "Walpurgis Preparation / Demon Lord Awakening" - }, - { - "episodes": [25, 48], - "chapters": [61, 110], - "arc": "Falmuth War / Demon Lord Ascension (S2)" - }, - { - "episodes": [49, 72], - "chapters": [111, 168], - "arc": "Holy Empire War (S3)" - } - ], - "movies": [ - { - "anilistId": 139498, - "title": "That Time I Got Reincarnated as a Slime the Movie: Scarlet Bond", - "year": 2022, - "afterEpisode": 48, - "note": "Side-story film between S2 and S3." - }, - { - "anilistId": 182206, - "title": "That Time I Got Reincarnated as a Slime the Movie: Tears of the Azure Sea", - "year": 2026, - "note": "Side-story film." - } - ] -} diff --git a/src/data/mappings/terra-formars.json b/src/data/mappings/terra-formars.json deleted file mode 100644 index 18ab248..0000000 --- a/src/data/mappings/terra-formars.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "anilistAnimeId": 20629, - "anilistMangaId": 67563, - "title": "Terra Formars", - "sourceNotes": "Manga ongoing (RELEASING; Yu Sasuga / Kenichi Tachibana, 2011-). AniList reports no fixed chapter total. The fandom wiki groups the story into the BUGS2 Arc (6 ch, the early Bugs 2 mission), the Annex 1 Arc (the main Mars mission, ch 1-173 in the restarted Weekly Young Jump numbering), and the ongoing Earth Arc (post-Mars, numbered separately as 'Number 1-58+'). Chapter numbers below follow the Annex 1 (main-series) numbering. Two TV seasons (Liden Films): S1 'Terra Formars' (13 eps, 2014) and S2 'Terra Formars: Revenge' (13 eps, 2016); episodes are CUMULATIVE, so Revenge eps 1-12 are listed as 14-26. The TV anime adapts the Annex 1 / Mars arc only: S1 covers ~ch 1-49 (briefing, departure, and the opening Mars battles), Revenge covers ~ch 50-108, ending on '12-Second Revolution' (ch 108). The BUGS2 prequel was adapted separately by the 'Bugs 2-hen' OVAs (id 20630) and the 2018 'Earth Arc' OVA covers later material; both are excluded here. Episode-to-chapter ranges are approximate.", - "mappings": [ - { - "episodes": [1, 7], - "chapters": [1, 25], - "arc": "Annex 1: Departure & First Contact (Mars mission begins)" - }, - { - "episodes": [8, 13], - "chapters": [26, 49], - "arc": "Annex 1: The Mars Landing Battles (S1 finale)" - }, - { - "episodes": [14, 20], - "chapters": [50, 80], - "arc": "Revenge: Betrayal & the Second Army" - }, - { - "episodes": [21, 26], - "chapters": [81, 108], - "arc": "Revenge: 12-Second Revolution (S2 finale)" - }, - { - "chapters": [109, 173], - "arc": "Annex 1: remainder (manga only)" - }, - { - "chapters": [174, 231], - "arc": "Earth Arc (manga only, ongoing — ~58 chapters numbered separately as 'Number 1+', continuing here from the Annex 1 total)" - } - ] -} diff --git a/src/data/mappings/testament-of-sister-new-devil.json b/src/data/mappings/testament-of-sister-new-devil.json deleted file mode 100644 index 8ae6c62..0000000 --- a/src/data/mappings/testament-of-sister-new-devil.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 20678, - "anilistMangaId": 79305, - "title": "The Testament of Sister New Devil", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 'BURST' (10, eps 13-22) = 22 total. The series is sourced from Tetsuto Uesu's light novel (AniList id 79305, type NOVEL, 75 chapters across 13 volumes); the parallel manga adaptation (id 81755) is a separate, incomplete continuity (only 9 volumes / 46 chapters) that diverges from the anime, so this maps by LN volume instead. S1 adapts LN vols 1-2 and S2 BURST adapts LN vols 3-4, leaving vols 5-13 unadapted. Chapter ranges are proportional estimates converting those volume boundaries onto AniList's 75-chapter count, so they are approximate. The DEPARTURES OVA and other specials are side entries; there are no theatrical films.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 6], - "arc": "Master-Servant Pact (new step-sisters & family forms, LN vol 1)" - }, - { - "episodes": [7, 12], - "chapters": [7, 12], - "arc": "Zolgia Arc (Mio kidnapped & rescued, Zest joins, LN vol 2)" - }, - { - "episodes": [13, 18], - "chapters": [13, 17], - "arc": "Zest's Contract & the Hero Village summons Basara (LN vol 3)" - }, - { - "episodes": [19, 22], - "chapters": [18, 23], - "arc": "Takigawa/Lars Reveal & Hero-Faction Clash (LN vol 4)" - }, - { - "chapters": [24, 75], - "arc": "Demon-Lord Faction War (LN vols 5-13, unadapted)" - } - ] -} diff --git a/src/data/mappings/the-aristocrats-otherworldly-adventure.json b/src/data/mappings/the-aristocrats-otherworldly-adventure.json deleted file mode 100644 index 7313a70..0000000 --- a/src/data/mappings/the-aristocrats-otherworldly-adventure.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "anilistAnimeId": 153332, - "anilistMangaId": 103238, - "title": "The Aristocrat's Otherworldly Adventure: Serving Gods Who Go Too Far", - "sourceNotes": "Single-cour, 12 episodes. The manga (illustrated by Nini) is ongoing at 15+ volumes, current ch. ~77; AniList does not track a chapter count for the source light novel, so the manga is used as the reference here. Volume synopses confirm the 5-year training arc (vol. 5) lands at ep. 9 and Cain becoming a domain lord (vol. 6) lands at eps. 11-12, so the anime's 12 episodes cover roughly the first 6 volumes; exact chapter cut points are estimated from an average chapters-per-volume rate and should be refined via PR if a fan chapter guide surfaces.", - "mappings": [ - { - "episodes": [1, 8], - "chapters": [1, 20], - "arc": "Reincarnation, the Royal Capital, and the Academy" - }, - { - "episodes": [9, 12], - "chapters": [21, 31], - "arc": "Five Years of Training and Becoming a Domain Lord" - }, - { "chapters": [32, 77], "arc": "Unadapted manga continuation" } - ] -} diff --git a/src/data/mappings/the-day-i-became-a-god.json b/src/data/mappings/the-day-i-became-a-god.json deleted file mode 100644 index 834ced4..0000000 --- a/src/data/mappings/the-day-i-became-a-god.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 118419, - "anilistMangaId": 135190, - "title": "The Day I Became a God", - "sourceNotes": "Single-cour, 12 episodes. Original anime story from Jun Maeda/Key; the manga (complete at 16 chapters across 2 volumes) is a close tie-in adaptation rather than the source, so pacing is approximate. No distinct named story arcs exist for this drama, so it is split into two broad halves that roughly track the two collected volumes.", - "mappings": [ - { "episodes": [1, 6], "chapters": [1, 8], "arc": "Hina and the Prophecy" }, - { - "episodes": [7, 12], - "chapters": [9, 16], - "arc": "The Truth Behind the Miracle" - } - ] -} diff --git a/src/data/mappings/the-detective-is-already-dead.json b/src/data/mappings/the-detective-is-already-dead.json deleted file mode 100644 index 3eb9110..0000000 --- a/src/data/mappings/the-detective-is-already-dead.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 128712, - "anilistMangaId": 114202, - "title": "The Detective Is Already Dead", - "sourceNotes": "Source is nigozyu's light novel (AniList id 114202, format NOVEL, ongoing). Media Factory has published 13 volumes under MF Bunko J as of mid-2026 (vol 1 in Nov 2019; vol 14 announced). A separate manga adaptation exists (id 119752, 29 ch, finished) but it is a minor early-arc side adaptation that ends far short of the anime, so this maps by LIGHT NOVEL VOLUME numbers instead — the `chapters` tuples below hold LN VOLUME numbers, NOT chapter numbers (AniList lists no chapter count). The 2021 TV anime (id 128712, 12 eps, single cour) adapts LN vols 1-2, but does so NON-LINEARLY: per the community/Wikipedia breakdown, the first part of ep 1, eps 2-4, ep 10 and parts of eps 11-12 cover vol 1, while the second part of ep 1, eps 5-9 and parts of eps 11-12 cover vol 2. Because the two volumes are interwoven across the cour rather than run in sequence, the adapted span is given as a single episodes[1,12]→vols[1,2] block. A Season 2 (id 152677) is scheduled but is a separate AniList entry not included here. No theatrical films.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 2], - "arc": "Siesta, SPES & the Hijacking — the pair's three years together and Siesta's death, through the Nagisa/Hel confrontation (S1; LN vols 1-2, adapted non-linearly)" - }, - { - "chapters": [3, 13], - "arc": "Post-Siesta mysteries: Nagisa as the new detective and the wider SPES/Sinner conflict (LN vols 3-13, unadapted by this anime)" - } - ] -} diff --git a/src/data/mappings/the-dreaming-boy-is-a-realist.json b/src/data/mappings/the-dreaming-boy-is-a-realist.json deleted file mode 100644 index 998eeb3..0000000 --- a/src/data/mappings/the-dreaming-boy-is-a-realist.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "anilistAnimeId": 157397, - "anilistMangaId": 132664, - "title": "The Dreaming Boy is a Realist", - "sourceNotes": "Single-cour, 12-episode anime (2023) adapts the early volumes of Okemaru's light novel non-linearly, interleaving scenes between different characters' perspectives out of strict chronological order. The direct manga adaptation by Popuri Yoshikita (5 volumes, complete at 33 chapters, finished March 2024) covers roughly the same span of story as the anime. Because the anime jumps between threads rather than following the manga chapter-by-chapter, precise per-episode chapter boundaries are not documented anywhere; this mapping treats the manga's full run as corresponding to the anime's full run. No movies.", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 33], "arc": "TV Anime Adaptation" } - ] -} diff --git a/src/data/mappings/the-elusive-samurai.json b/src/data/mappings/the-elusive-samurai.json deleted file mode 100644 index 1e2f23c..0000000 --- a/src/data/mappings/the-elusive-samurai.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 162896, - "anilistMangaId": 128666, - "title": "The Elusive Samurai", - "sourceNotes": "Season 1 only (12 episodes + a recap special not counted in the episode range); Season 2 begins airing July 17, 2026 and is not yet covered. Manga complete at 238 chapters. Arc boundaries from the fandom wiki's Story Arcs page; Season 1 covers chapters 1-31, through the VS Kokushi arc.", - "mappings": [ - { "episodes": [1, 3], "chapters": [1, 3], "arc": "Intro Arc" }, - { "episodes": [4, 4], "chapters": [4, 6], "arc": "Gathering Allies Arc" }, - { "episodes": [5, 5], "chapters": [7, 10], "arc": "Archery Arc" }, - { "episodes": [6, 6], "chapters": [11, 15], "arc": "Rinji Seizure Arc" }, - { "episodes": [7, 9], "chapters": [16, 23], "arc": "Pincer Arc" }, - { "episodes": [10, 12], "chapters": [24, 31], "arc": "VS Kokushi Arc" }, - { - "chapters": [32, 238], - "arc": "Unadapted on TV as of Season 1 (Verbal Battle Arc onward)" - } - ] -} diff --git a/src/data/mappings/the-fruit-of-grisaia.json b/src/data/mappings/the-fruit-of-grisaia.json deleted file mode 100644 index a2dbf7d..0000000 --- a/src/data/mappings/the-fruit-of-grisaia.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "anilistAnimeId": 17729, - "anilistMangaId": 79051, - "title": "The Fruit of Grisaia", - "sourceNotes": "The 13-episode 2014 anime adapts Front Wing's visual novel Grisaia no Kajitsu, organized by heroine routes: a common-route/Yumiko intro, then the Michiru, Sachi, Makina and Amane routes as the climax. Paired here with the Grisaia no Kajitsu: Sanctuary Fellows manga (AniList 79051, 24 chapters / 4 volumes, 2013-2014, complete), which retells the same common route plus the five heroines. Because the manga compresses the individual routes differently than the anime, the per-route chapter ranges are APPROXIMATE; only the cumulative endpoint (last entry reaching ch. 24) is reliable. Scope is limited to this first installment: The Labyrinth of Grisaia (2015, 47-min TV special) and The Eden of Grisaia (2015, 10-ep TV) adapt the later VNs Meikyuu and Rakuen and have their own AniList entries; the Grisaia: Phantom Trigger films are a separate spin-off franchise and are excluded, so no movies are listed.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 6], - "arc": "Common route - Yuuji arrives at Mihama Academy & Yumiko intro" - }, - { - "episodes": [3, 4], - "chapters": [7, 10], - "arc": "Michiru Matsushima route (approximate - condensed in manga)" - }, - { - "episodes": [5, 7], - "chapters": [11, 15], - "arc": "Sachi Komine route (approximate - condensed in manga)" - }, - { - "episodes": [8, 9], - "chapters": [16, 19], - "arc": "Makina Irisu route (approximate - condensed in manga)" - }, - { - "episodes": [10, 13], - "chapters": [20, 24], - "arc": "Amane Suou route - backstory & climax" - } - ] -} diff --git a/src/data/mappings/the-girl-i-like-forgot-her-glasses.json b/src/data/mappings/the-girl-i-like-forgot-her-glasses.json deleted file mode 100644 index cb3864f..0000000 --- a/src/data/mappings/the-girl-i-like-forgot-her-glasses.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 160188, - "anilistMangaId": 105641, - "title": "The Girl I Like Forgot Her Glasses", - "sourceNotes": "Single-season, 13-episode TV anime (GoHands, 2023) adapts manga ch. 1-68 (~through vol. 7). Manga complete at 120 chapters (12 vols). Slice-of-life romance/comedy source with no formally named arcs — roughly 5 chapters per episode.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 68], - "arc": "Anime-Adapted Chapters" - }, - { - "chapters": [69, 120], - "arc": "Unadapted (manga continues past the anime)" - } - ] -} diff --git a/src/data/mappings/the-great-jahy-will-not-be-defeated.json b/src/data/mappings/the-great-jahy-will-not-be-defeated.json deleted file mode 100644 index 6b22d4d..0000000 --- a/src/data/mappings/the-great-jahy-will-not-be-defeated.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "anilistAnimeId": 132456, - "anilistMangaId": 100207, - "title": "The Great Jahy Will Not Be Defeated!", - "sourceNotes": "20-episode anime (2021, single cour split across two half-seasons under one AniList entry). Manga ongoing (current ch. ~107 as of mid-2026; 12 tankobon volumes as of Nov 2025, with a 13th and final volume slated for Q4 2026). Skit/gag-based comedy manga, so the anime adapts a high density of chapters per episode while skipping some pure joke chapters; a viewer resumes reading at chapter 68. No movies.", - "mappings": [ - { "episodes": [1, 20], "chapters": [1, 67], "arc": "TV Anime Adaptation" }, - { "chapters": [68, 107], "arc": "Unadapted (Manga-only, ongoing)" } - ] -} diff --git a/src/data/mappings/the-heroic-legend-of-arslan.json b/src/data/mappings/the-heroic-legend-of-arslan.json deleted file mode 100644 index a81d94c..0000000 --- a/src/data/mappings/the-heroic-legend-of-arslan.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 20935, - "anilistMangaId": 81233, - "title": "The Heroic Legend of Arslan", - "sourceNotes": "Cumulative episodes across S1 (25) + S2 'Dust Storm Dance' (8) = 33; anilistAnimeId is the S1 TV entry (20935) per this repo's sequel convention. Manga (Hiromu Arakawa, ongoing) is at roughly 155 chapters / 24+ volumes as of mid-2026 per Kodansha's K Manga chapter listing — AniList itself does not report a chapter count for this entry. The anime tracks the manga at first but runs out of adapted material partway through and shifts to directly adapting Yoshiki Tanaka's source novels; S1 (eps 1-25) covers through manga vol. 12 ch. 71, and S2 (eps 26-33, 'Dust Storm Dance' = Novel 6 'A Frenzy of Dust') covers through vol. 18 ch. 107, per fan chapter-guides. Chapters 108+ continue the manga-only story past where the anime ends, and the current chapter count will drift as the ongoing series updates.", - "mappings": [ - { - "episodes": [1, 25], - "chapters": [1, 71], - "arc": "Novels 1-5 (The Capital Ablaze - Shadow of a Lone Rider)" - }, - { - "episodes": [26, 33], - "chapters": [72, 107], - "arc": "Dust Storm Dance (Novel 6: A Frenzy of Dust)" - }, - { - "chapters": [108, 155], - "arc": "Unadapted continuation (manga-only, ongoing)" - } - ] -} diff --git a/src/data/mappings/the-ice-guy-and-his-cool-female-colleague.json b/src/data/mappings/the-ice-guy-and-his-cool-female-colleague.json deleted file mode 100644 index c2bc2c5..0000000 --- a/src/data/mappings/the-ice-guy-and-his-cool-female-colleague.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "anilistAnimeId": 151252, - "anilistMangaId": 109728, - "title": "The Ice Guy and His Cool Female Colleague", - "sourceNotes": "Single 12-episode season (2024). Manga ongoing (current ch. 71 as of July 2026, GanGan pixiv). The anime adapts manga chapters 1-40. Workplace slice-of-life romantic comedy with no distinct named arcs, so mapping uses one broad anime-adapted range plus the unadapted ongoing tail.", - "mappings": [ - { "episodes": [1, 12], "chapters": [1, 40], "arc": "Anime-Adapted Story" }, - { "chapters": [41, 71], "arc": "Unadapted Manga (Post-Anime, Ongoing)" } - ] -} diff --git a/src/data/mappings/the-kingdoms-of-ruin.json b/src/data/mappings/the-kingdoms-of-ruin.json deleted file mode 100644 index b41ea2e..0000000 --- a/src/data/mappings/the-kingdoms-of-ruin.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "anilistAnimeId": 160900, - "anilistMangaId": 112203, - "title": "The Kingdoms of Ruin", - "sourceNotes": "Single-cour, 12 episodes. Manga complete at 66 chapters across 15 volumes. The anime adapts the first 33 chapters (through roughly vol. 6-7); chapters 34-66 are unadapted manga-only continuation. Chapter titles from the manga's own chapter list corroborate the episode groupings below (e.g. ch. 10 'The Resurrection of the Witch' opens the Lunamilia arc, ch. 24 'Mamuta, the Ruined Country' opens the Mamuta arc).", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 9], - "arc": "Adonis's Escape and Revenge" - }, - { - "episodes": [4, 6], - "chapters": [10, 19], - "arc": "Resurrection and the Invasion of Lunamilia" - }, - { - "episodes": [7, 9], - "chapters": [20, 24], - "arc": "Journey to the Ruined Kingdom of Mamuta" - }, - { - "episodes": [10, 12], - "chapters": [25, 33], - "arc": "Shirousagi and Dorothea's Betrayal" - }, - { "chapters": [34, 66], "arc": "Unadapted manga continuation" } - ] -} diff --git a/src/data/mappings/the-magical-revolution-of-the-reincarnated-princess-and-the-genius-young-lady.json b/src/data/mappings/the-magical-revolution-of-the-reincarnated-princess-and-the-genius-young-lady.json deleted file mode 100644 index b4db8c0..0000000 --- a/src/data/mappings/the-magical-revolution-of-the-reincarnated-princess-and-the-genius-young-lady.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 153629, - "anilistMangaId": 122344, - "title": "The Magical Revolution of the Reincarnated Princess and the Genius Young Lady", - "sourceNotes": "Single-cour anime (12 eps, Jan-Mar 2023), adapted primarily from the light novel (13 volumes, complete). The manga adaptation finished serialization in March 2026 and is complete at 53 chapters (9 volumes); it follows the same early story beats as the anime rather than the full 13-volume light novel, with episode 12 corresponding to roughly manga chapter 50 and the final chapters extending slightly past the anime's ending. No theatrical films.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 50], - "arc": "Main Story (Anime Adaptation)" - }, - { "chapters": [51, 53], "arc": "Epilogue (manga-only ending, unadapted)" } - ] -} diff --git a/src/data/mappings/the-strongest-sage-with-the-weakest-crest.json b/src/data/mappings/the-strongest-sage-with-the-weakest-crest.json deleted file mode 100644 index 0721eee..0000000 --- a/src/data/mappings/the-strongest-sage-with-the-weakest-crest.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "anilistAnimeId": 129191, - "anilistMangaId": 99931, - "title": "The Strongest Sage with the Weakest Crest", - "sourceNotes": "Single-cour, 12 episodes (Jan-Mar 2022). Originally a web novel; the Manga UP! manga is used here as the 'chapters' source since AniList reports null volume/chapter counts for both the novel and the manga. Manga is ongoing, at 30 tankobon volumes as of May 2026 per Anime News Network; chapter numbering is inconsistent across scanlation aggregators (chapter-split conventions vary by source), so chapter figures use an approximate ~5 chapters/volume and should be treated as rough estimates. The anime's 12 episodes appear to cover roughly the first 5-6 volumes (GN 5 released Sept. 2021, mid-broadcast) -- approx. ch. 1-30; the remaining ~120 chapters (vol. 7+) are unadapted.", - "mappings": [ - { "episodes": [1, 4], "chapters": [1, 10], "arc": "Academy Enrollment" }, - { - "episodes": [5, 8], - "chapters": [11, 20], - "arc": "Demon Threat / City Defense" - }, - { - "episodes": [9, 12], - "chapters": [21, 30], - "arc": "Duel and the Powerful Enemy" - }, - { "chapters": [31, 150], "arc": "Unadapted ongoing manga (Vol. 7+)" } - ] -} diff --git a/src/data/mappings/the-summer-hikaru-died.json b/src/data/mappings/the-summer-hikaru-died.json deleted file mode 100644 index 2b70ae5..0000000 --- a/src/data/mappings/the-summer-hikaru-died.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 177689, - "anilistMangaId": 138603, - "title": "The Summer Hikaru Died", - "sourceNotes": "Single 12-episode TV season (2025) adapting the manga by Mokumokuren; episodes are cumulative 1-12 (no prior seasons). The anime reorders/interleaves some chapters but covers manga chapters 1-26 in full, ending just shy of the end of ch. 26. The fandom wiki names two adapted arcs: Daily Life Arc (ch. 1-16) and the Mystery Solving Arc, aka the Village arc (ch. 17-26); episode boundaries mapped via the anime-filler episode-to-chapter guide, so per-arc episode ranges are approximate given the non-linear adaptation. Manga is ongoing: 9 tankobon volumes / through chapter 46 published as of June 2026. Chapters 27+ (Hole Closing Arc) are unadapted. A 2nd season was announced in Sept 2025 (release TBA). No theatrical films exist (a stage play ran Jan 2026, excluded).", - "mappings": [ - { - "episodes": [1, 7], - "chapters": [1, 16], - "arc": "Daily Life Arc" - }, - { - "episodes": [8, 12], - "chapters": [17, 26], - "arc": "Mystery Solving Arc (Village)" - }, - { - "chapters": [27, 46], - "arc": "Hole Closing Arc" - } - ] -} diff --git a/src/data/mappings/the-water-magician.json b/src/data/mappings/the-water-magician.json deleted file mode 100644 index b69ed2c..0000000 --- a/src/data/mappings/the-water-magician.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "anilistAnimeId": 186052, - "anilistMangaId": 142688, - "title": "The Water Magician", - "sourceNotes": "Single season, 12 episodes ('Part 1: Central Provinces'). Direct source is Tadashi Kubo's light novel; the manga adaptation lags far behind (only ch. 36 by the anime's midpoint) so this maps by LIGHT NOVEL VOLUME instead of manga chapter, matching the ascendance-of-a-bookworm convention -- the `chapters` tuples below are LN volume numbers, not manga chapters. Part 1 (vols 1-7) is complete and fully adapted by the 12-episode season; Part 2 'Western Nations' (vols 8-12) is complete but unadapted on TV, and Part 3 'Eastern Nations' (vols 13-18+) is ongoing. Per-episode volume boundaries are approximate.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 1], - "arc": "Introduction Arc (Reincarnation & Training in Rondo Forest)" - }, - { - "episodes": [3, 8], - "chapters": [2, 5], - "arc": "Adventure Guild / Dungeon Crisis Arc (Lune, the Great Tidal Bore, the Gate)" - }, - { - "episodes": [9, 12], - "chapters": [6, 7], - "arc": "Whitnash Festival Arc (Confrontation with Oscar, the Inferno Magician)" - }, - { "chapters": [8, 12], "arc": "Part 2: Western Nations Arc (unadapted)" }, - { - "chapters": [13, 18], - "arc": "Part 3: Eastern Nations Arc (unadapted, ongoing)" - } - ] -} diff --git a/src/data/mappings/this-art-club-has-a-problem.json b/src/data/mappings/this-art-club-has-a-problem.json deleted file mode 100644 index 621b675..0000000 --- a/src/data/mappings/this-art-club-has-a-problem.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 21457, - "anilistMangaId": 80331, - "title": "This Art Club Has a Problem!", - "sourceNotes": "12-episode single-cour anime (Feel, 2016) is an episodic 4-koma-adjacent gag comedy; each episode strings together several short, largely self-contained vignettes drawn non-sequentially from the manga. Resume reading post-anime at ch. 35. Manga ongoing since Oct 2012 (Dengeki Maoh), current ch. ~112 (vol. 16) as of 2026; AniList lists chapters as null. Chapter ranges are approximate given the non-linear episode-to-chapter drawing and the series' lack of named story arcs.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 34], - "arc": "Art Club Antics (Season 1)" - }, - { "chapters": [35, 112], "arc": "Post-anime (ongoing, unadapted)" } - ] -} diff --git a/src/data/mappings/to-love-ru.json b/src/data/mappings/to-love-ru.json deleted file mode 100644 index 6c99510..0000000 --- a/src/data/mappings/to-love-ru.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 3455, - "anilistMangaId": 30671, - "title": "To Love-Ru", - "sourceNotes": "Cumulative episodes across 4 TV seasons: To Love-Ru S1 (26, 2008) + Motto To Love-Ru (12, 2010) + To Love-Ru Darkness (12, 2012) + To Love-Ru Darkness 2nd (12, 2015) = 62 eps. anilistMangaId is the ORIGINAL To Love-Ru manga by Saki Hasemi & Kentaro Yabuki, complete at 162 chapters / 18 volumes (~9 ch per volume). S1 is largely anime-original and pulls scattered chapters from vols 1-6; Motto adapts vols 7-11 faithfully in a 3-skit-per-episode format; the original manga's final arcs (vols 12-18, ch 100-162) were never adapted on TV (chapters-only tail, lead-in to Darkness). The two Darkness TV seasons adapt a SEPARATE sequel manga, To Love-Ru Darkness (AniList id 52519; ~77 numbered chapters / 18 volumes, AniList counts 100 incl. extras) — so their chapter ranges use the Darkness manga's OWN numbering, not the original 162-ch axis: Darkness covers Darkness ch 1-19, Darkness 2nd covers Darkness ch 20-47 (the remainder, Darkness ch 48-77, is unadapted). Episodic harem comedy, so all chapter boundaries are approximate (refine via PR). OVAs/specials are not theatrical and are omitted; no qualifying theatrical films.", - "mappings": [ - { - "episodes": [1, 26], - "chapters": [1, 54], - "arc": "To Love-Ru (Season 1, 2008) — original manga vols 1-6, mostly anime-original / scattered chapters" - }, - { - "episodes": [27, 38], - "chapters": [55, 99], - "arc": "Motto To Love-Ru (Season 2, 2010) — original manga vols 7-11, faithful 3-skit adaptation" - }, - { - "chapters": [100, 162], - "arc": "Original manga vols 12-18 — final arcs, unadapted on TV (lead-in to To Love-Ru Darkness)" - }, - { - "episodes": [39, 50], - "chapters": [1, 19], - "arc": "To Love-Ru Darkness (Season 3, 2012) — Darkness manga ch 1-19 (SEPARATE manga, AniList id 52519)" - }, - { - "episodes": [51, 62], - "chapters": [20, 47], - "arc": "To Love-Ru Darkness 2nd (Season 4, 2015) — Darkness manga ch 20-47 (SEPARATE numbering)" - } - ] -} diff --git a/src/data/mappings/to-your-eternity.json b/src/data/mappings/to-your-eternity.json deleted file mode 100644 index 8627700..0000000 --- a/src/data/mappings/to-your-eternity.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 114535, - "anilistMangaId": 97830, - "title": "To Your Eternity", - "sourceNotes": "Three TV seasons map to the now-complete manga (ended June 2025 at chapter 201 / 25 volumes; AniList's '202 chapters' counts split chapters). Cumulative episodes: S1 (id 114535, 20 eps) = eps 1-20; S2 (id 138565, 20 eps) = eps 21-40; S3 (id 162669, 22 eps) = eps 41-62. S1 adapts ch 1-54 (early Past Era through into Jananda Island). S2 adapts ch 55-116, finishing the Past Era at the close of the Renril/Nokker War. S3 adapts the Modern Era from ch 117 to roughly ch 165; the season endpoint is approximate (mid-160s). The Future Arc (ch ~166-201) is unadapted. No theatrical films ('The Roots of To Your Eternity' is a documentary special, not a movie).", - "mappings": [ - { - "episodes": [1, 20], - "chapters": [1, 54], - "arc": "Past Era: awakening & early lives (into Jananda Island)" - }, - { - "episodes": [21, 40], - "chapters": [55, 116], - "arc": "Jananda finale, Guardians & Renril / Nokker War" - }, - { - "episodes": [41, 62], - "chapters": [117, 165], - "arc": "Modern Era (New World & Mimori arcs)" - }, - { - "chapters": [166, 201], - "arc": "Future Arc & ending (unadapted)" - } - ] -} diff --git a/src/data/mappings/toaru-majutsu-no-index.json b/src/data/mappings/toaru-majutsu-no-index.json deleted file mode 100644 index 4ffdc48..0000000 --- a/src/data/mappings/toaru-majutsu-no-index.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 4654, - "anilistMangaId": 37775, - "title": "A Certain Magical Index", - "sourceNotes": "Cumulative episodes across S1 (24) + S2 (24, eps 25-48) + S3 (26, eps 49-74) = 74 total. Paired with the Chuya Kogino manga adaptation (ongoing). Both adapt the Kazuma Kamachi light novel. Per-arc chapter boundaries approximate. The Toaru Kagaku no Railgun and Accelerator spinoffs are separate franchises.", - "mappings": [ - { - "episodes": [1, 24], - "chapters": [1, 40], - "arc": "S1: Index Introduction / Angel Fall / Sisters" - }, - { - "episodes": [25, 48], - "chapters": [41, 80], - "arc": "S2: Daihaseisai / Document of Constantine" - }, - { - "episodes": [49, 74], - "chapters": [81, 132], - "arc": "S3: World War III / God's Right Seat" - } - ], - "movies": [ - { - "anilistId": 11743, - "title": "A Certain Magical Index: The Movie - The Miracle of Endymion", - "year": 2013, - "afterEpisode": 48, - "note": "Side story (anime-original)." - } - ] -} diff --git a/src/data/mappings/toilet-bound-hanako-kun.json b/src/data/mappings/toilet-bound-hanako-kun.json deleted file mode 100644 index 3104653..0000000 --- a/src/data/mappings/toilet-bound-hanako-kun.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 108463, - "anilistMangaId": 98842, - "title": "Toilet-bound Hanako-kun", - "sourceNotes": "Cumulative episodes: S1 id 108463 = eps 1-12 (2020), S2 id 170892 = eps 13-24 (2025 cour 1), S2 Part 2 id 189326 = eps 25-36 (2025 cour 2). Manga ongoing; latest released chapter (spook) 130 as of mid-2026 (extended hiatus after ch 130; ch 131 due ~July 2026). Note: S1 reordered arcs and SKIPPED the Three Clock Keepers arc (ch 23-29); S2 backfilled it first, so the S1/S2 chapter coverage overlaps around ch 23-36 rather than being a clean cut. S1 net coverage = ch 1-36; S2 (eps 13-36) = ch 23-92, ending mid-Far Shore Bound (~ch 92). Arc boundaries are fan-classified (Hanako-kun fandom wiki Story Arcs).", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 36], - "arc": "Season 1: Hanako-san / Misaki Stairs / Hell of Mirrors (Clock Keepers ch 23-29 skipped, backfilled in S2)" - }, - { - "episodes": [13, 24], - "chapters": [23, 58], - "arc": "Season 2 (cour 1): Three Clock Keepers / Summer Lights / Picture Perfect" - }, - { - "episodes": [25, 36], - "chapters": [59, 92], - "arc": "Season 2 Part 2 (cour 2): Sacrifice of the Grim Reaper / Red House / Far Shore Bound (ends mid-arc ~ch 92)" - }, - { - "chapters": [93, 130], - "arc": "Far Shore Bound conclusion / The Nightlife / Omen / Alteration (unadapted, ongoing)" - } - ] -} diff --git a/src/data/mappings/tokyo-ghoul.json b/src/data/mappings/tokyo-ghoul.json deleted file mode 100644 index bddca4f..0000000 --- a/src/data/mappings/tokyo-ghoul.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "anilistAnimeId": 20605, - "anilistMangaId": 63327, - "title": "Tokyo Ghoul", - "sourceNotes": "Cumulative episodes across S1 (12, faithfully adapting ch 1-66) + √A (S2, 12 eps, cumulative 13-24; anime-original ending diverging from the manga). Manga complete at 144 chapters (Part 1 only). The Tokyo Ghoul:re sequel manga + 2018 anime are separate AniList entries and not covered here.", - "mappings": [ - { - "episodes": [1, 7], - "chapters": [1, 30], - "arc": "Tragedy / Kaneki's Awakening" - }, - { - "episodes": [8, 9], - "chapters": [31, 46], - "arc": "Doves' Emergence (CCG)" - }, - { "episodes": [10, 13], "chapters": [47, 79], "arc": "Aogiri Tree" }, - { - "episodes": [14, 24], - "chapters": [80, 144], - "arc": "Anteiku Raid (anime diverges in √A)" - } - ] -} diff --git a/src/data/mappings/tokyo-ravens.json b/src/data/mappings/tokyo-ravens.json deleted file mode 100644 index 15e8dba..0000000 --- a/src/data/mappings/tokyo-ravens.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "anilistAnimeId": 16011, - "anilistMangaId": 54037, - "title": "Tokyo Ravens", - "sourceNotes": "Single-cour 24-episode TV anime (2013-14) adapting the first 9 volumes of Kōhei Azano's light novel; paired here with Atsushi Suzumi's manga adaptation, which follows the same story at roughly 5 chapters per volume (complete at 82 chapters across 15 volumes). Anime episode groupings mirror the light novel's volume subtitles (SHAMAN*CLAN, RAVEN'S NEST, etc.); some minor side-story content from volumes 4-5 is skipped in the TV adaptation, so that boundary is approximate. Manga volumes 10-15 (ch 47-82) cover the light novel's second story arc and were never animated.", - "mappings": [ - { "episodes": [1, 3], "chapters": [1, 5], "arc": "SHAMAN*CLAN" }, - { "episodes": [4, 6], "chapters": [6, 10], "arc": "RAVEN'S NEST" }, - { "episodes": [7, 9], "chapters": [11, 15], "arc": "cHImAirA DanCE" }, - { - "episodes": [10, 14], - "chapters": [16, 25], - "arc": "GIRL RETURN / days in nest" - }, - { - "episodes": [15, 17], - "chapters": [26, 30], - "arc": "Black Shaman ASSAULT" - }, - { "episodes": [18, 19], "chapters": [31, 35], "arc": "_DARKNESS_EMERGE_" }, - { "episodes": [20, 21], "chapters": [36, 41], "arc": "over-cry" }, - { "episodes": [22, 24], "chapters": [42, 46], "arc": "to The DarkSky" }, - { - "chapters": [47, 82], - "arc": "Second Arc (Volumes 10-15, unadapted in the TV anime)" - } - ] -} diff --git a/src/data/mappings/tokyo-revengers.json b/src/data/mappings/tokyo-revengers.json deleted file mode 100644 index 8d03484..0000000 --- a/src/data/mappings/tokyo-revengers.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "anilistAnimeId": 120120, - "anilistMangaId": 102988, - "title": "Tokyo Revengers", - "sourceNotes": "Cumulative episodes across S1 (24) + S2 Christmas Showdown / Seiya Kessen-hen (13) + S2 Pt 2 Tenjiku-hen (13) = 50. Manga complete at 279 chapters. Three Deities War / Santen Sensou-hen anime announced but unaired — unadapted tail covers Bonten + Final Arc chapters.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 12], - "arc": "Introduction (Time Leap / Toman Founding)" - }, - { "episodes": [5, 12], "chapters": [13, 33], "arc": "Moebius" }, - { - "episodes": [13, 24], - "chapters": [34, 73], - "arc": "Valhalla / Bloody Halloween" - }, - { - "episodes": [25, 37], - "chapters": [74, 121], - "arc": "Christmas Showdown / Black Dragon" - }, - { "episodes": [38, 50], "chapters": [122, 185], "arc": "Tenjiku" }, - { "chapters": [186, 206], "arc": "Bonten" }, - { "chapters": [207, 235], "arc": "Three Deities War" }, - { "chapters": [236, 279], "arc": "Kanto Manji (Final)" } - ] -} diff --git a/src/data/mappings/tomo-chan-is-a-girl.json b/src/data/mappings/tomo-chan-is-a-girl.json deleted file mode 100644 index 29a432a..0000000 --- a/src/data/mappings/tomo-chan-is-a-girl.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "anilistAnimeId": 151806, - "anilistMangaId": 86300, - "title": "Tomo-chan Is a Girl!", - "sourceNotes": "Fumita Yanagida's 4-koma webcomic/manga (961 short strips collected into 8 complete volumes per AniList). The single-cour 2023 TV anime (13 episodes) is a complete adaptation of the entire manga, so a viewer finishes the whole story. Because the source is 4-koma (gag strips rather than continuous chapters), strip-to-episode boundaries are highly approximate; ranges below are coarse groupings by descriptive segment and roughly track the 8 volumes. Tomo Aizawa, a tomboy mistaken for 'one of the guys', tries to make childhood friend Junichiro 'Jun' Kubota see her as a girl, aided and teased by schemer Misuzu Gundou and transfer student Carol Olston. There are no theatrical films. ('Kurae! Telepathy' is the opening-theme music video, not story content.)", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 148], - "arc": "Confession Attempts Begin — Tomo's love goes unnoticed (Vol. 1, approx.)" - }, - { - "episodes": [3, 5], - "chapters": [149, 370], - "arc": "Misuzu's Scheming & Carol Olston's Arrival (Vols. 2-3, approx.)" - }, - { - "episodes": [6, 8], - "chapters": [371, 592], - "arc": "Summer, the Beach & the Sports Festival (Vols. 4-5, approx.)" - }, - { - "episodes": [9, 11], - "chapters": [593, 815], - "arc": "Carol & Misuzu, and Tomo's Growing Resolve (Vols. 6-7, approx.)" - }, - { - "episodes": [12, 13], - "chapters": [816, 961], - "arc": "Resolution — Jun's Realization & the Confession (Vol. 8, approx.)" - } - ] -} diff --git a/src/data/mappings/tomodachi-game.json b/src/data/mappings/tomodachi-game.json deleted file mode 100644 index 85c12b7..0000000 --- a/src/data/mappings/tomodachi-game.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 141014, - "anilistMangaId": 85911, - "title": "Tomodachi Game", - "sourceNotes": "Manga conceived by Mikoto Yamaguchi with art by Yuki Sato; serialized in Bessatsu Shounen Magazine Dec 2013 - Aug 2024 and now complete at 26 volumes / 127 chapters (AniList lists 130, likely counting the split final chapter and extras). The 2022 anime (12 eps, single cours; AniList tags it ONA, aired on TV in Japan) adapts manga ch 1-25, so a viewer resumes reading at ch 26 (Volume 6). Per-game chapter boundaries are well sourced (Shapes / K Manga): Game 1 'Kokkuri-san' debt game = ch 1-8, Game 2 'Bad-Mouth Sugoroku' = ch 9-18, Game 3 'Friendship Hide-and-Seek' = ch 19-25. Episode-to-game boundaries are approximate. The unadapted tail (ch 26-127) covers the later games - Friend's Sin Trial / Friend Murder Game, Solitary King (Kill the King), Import-Export, the All-Bet gambling arc, and the final Friends Battle Royale.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 8], - "arc": "Game 1: Kokkuri-san (Debt Repayment Game)" - }, - { - "episodes": [3, 6], - "chapters": [9, 18], - "arc": "Game 2: Bad-Mouth Sugoroku" - }, - { - "episodes": [7, 12], - "chapters": [19, 25], - "arc": "Game 3: Friendship Hide-and-Seek" - }, - { - "chapters": [26, 127], - "arc": "Later Games (Sin Trial, Kill the King, Import-Export, Battle Royale; unadapted)" - } - ] -} diff --git a/src/data/mappings/tomozaki.json b/src/data/mappings/tomozaki.json deleted file mode 100644 index 11fa192..0000000 --- a/src/data/mappings/tomozaki.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 112443, - "anilistMangaId": 100807, - "title": "Bottom-Tier Character Tomozaki", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 '2nd STAGE' (13, eps 13-25) = 25 total. Source is Yuki Yaku's light novel ('life is a god-tier game' premise). The Yuki Aonuma manga adaptation (AniList id 100807, 30 ch / 6 vols, finished Feb 2021) only adapts the early arcs (~LN vols 1-3) and ends far short of the two-season anime, so this mapping uses LIGHT-NOVEL VOLUME NUMBERS as the 'chapters' axis instead. Anime coverage by LN volume: S1 = vols 1-3 (a viewer resumes at vol 4), S2 = vols 4-7 (resume at vol 8). The main LN entered its 'Last Stage' at vol 11; 11 main volumes plus short-story side volumes were published through early 2024, leaving vols 8-11 unadapted. Per-volume arc boundaries are approximate. No theatrical films.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 3], - "arc": "Hinami's life-as-a-game coaching; friend group & Tama-chan; student council election & sports festival (S1; LN vols 1-3)" - }, - { - "episodes": [13, 25], - "chapters": [4, 7], - "arc": "Dating goal with Kikuchi-san & the culture-festival play arc; field trip (S2 '2nd STAGE'; LN vols 4-7)" - }, - { - "chapters": [8, 11], - "arc": "Career survey through the 'Last Stage' finale (LN vols 8-11, unadapted)" - } - ] -} diff --git a/src/data/mappings/tonikawa.json b/src/data/mappings/tonikawa.json deleted file mode 100644 index 49c9cfb..0000000 --- a/src/data/mappings/tonikawa.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 116267, - "anilistMangaId": 101177, - "title": "TONIKAWA: Over The Moon For You", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (12, eps 13-24) = 24 total. Paired with Kenjiro Hata's manga 'Fly Me to the Moon' (Tonikaku Kawaii), ongoing (~ch. 351 / 36 vols as of mid-2026 per MangaDex). S1 adapts ch 1-46; S2 adapts ch 47-106, so a viewer resumes reading at ch 107. This slice-of-life romance is episodic, so groupings are coarse and boundaries approximate. The SNS OVA, Uniform special, and High School Days ONA are separate side entries; there are no theatrical films.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 46], - "arc": "Newlywed Life (Marriage & Arisugawa Bathhouse)" - }, - { - "episodes": [13, 24], - "chapters": [47, 106], - "arc": "Family & School Life (incl. School Trip)" - }, - { - "chapters": [107, 351], - "arc": "Married Life Continues (ongoing, unadapted)" - } - ] -} diff --git a/src/data/mappings/toradora.json b/src/data/mappings/toradora.json deleted file mode 100644 index 225d47d..0000000 --- a/src/data/mappings/toradora.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "anilistAnimeId": 4224, - "anilistMangaId": 34368, - "title": "Toradora!", - "sourceNotes": "Single 25-episode TV anime (2008) adapting Yuyuko Takemiya's 10-volume light novel. Paired with the Zekkyo manga adaptation (97 chapters across 11 published volumes; the manga runs slowly and reaches the story's conclusion at ch 97, with a final extras volume pending). Both anime and manga adapt the same light novel. Per-arc episode/chapter boundaries are approximate (Toradora is a continuous rom-com without formal arc names); chapter groupings follow the manga's volume structure.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 14], - "arc": "The Deal: Tiger & Dragon (intro, Kitamura & Minori, Ami arrives)" - }, - { - "episodes": [7, 10], - "chapters": [15, 34], - "arc": "Ami Kawashima / the stalker & summer pool" - }, - { - "episodes": [11, 13], - "chapters": [35, 46], - "arc": "Summer Vacation (Ami's beach villa, fireworks, test of courage)" - }, - { - "episodes": [14, 16], - "chapters": [47, 55], - "arc": "Culture Festival (pro-wrestling play, Taiga's father)" - }, - { - "episodes": [17, 19], - "chapters": [56, 64], - "arc": "Festival Pageant / Student Council (Mr. & Ms. Festival, Kitamura's crisis)" - }, - { - "episodes": [20, 21], - "chapters": [65, 81], - "arc": "Christmas Eve" - }, - { - "episodes": [22, 23], - "chapters": [82, 88], - "arc": "School Ski Trip" - }, - { - "episodes": [24, 25], - "chapters": [89, 97], - "arc": "Confessions & Finale (Valentine's, the elopement)" - } - ] -} diff --git a/src/data/mappings/toriko.json b/src/data/mappings/toriko.json deleted file mode 100644 index bfa9f10..0000000 --- a/src/data/mappings/toriko.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "anilistAnimeId": 10033, - "anilistMangaId": 37887, - "title": "Toriko", - "sourceNotes": "Single continuous 147-episode anime (2011-2014). The anime adapted the Human World portion of the manga but with substantial expansion, several anime-original interludes (e.g. the Golden Wheat / BB Corn detours and scattered filler episodes), and an anime-original ending: it stopped partway through the Cooking Festival arc (around chapter 230-253) and resolved with a non-canon battle instead of the manga's true Cooking Festival climax. Episode-to-chapter boundaries are therefore approximate; the per-arc cumulative episode ranges below are sensible groupings rather than exact frame-accurate cuts. Manga complete at 396 chapters; the entire Gourmet World Act (ch 264-396) and the back half of the Cooking Festival arc were never animated and are listed chapters-only. Refine boundaries via PR.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 18], - "arc": "Introduction (Galala Gator / Rainbow Fruit / Puffer Whale)" - }, - { - "episodes": [13, 26], - "chapters": [19, 62], - "arc": "Regal Mammoth / BB Corn Arc" - }, - { - "episodes": [27, 50], - "chapters": [63, 100], - "arc": "Century Soup Arc" - }, - { - "episodes": [51, 78], - "chapters": [101, 143], - "arc": "Ozone Herb / Gourmet World Reality / Melk Stardust / Mellow Cola Arc" - }, - { - "episodes": [79, 110], - "chapters": [144, 193], - "arc": "Training for Gourmet World (Gourami / Meteor Garlic / Bubble Fruit)" - }, - { - "episodes": [111, 125], - "chapters": [194, 209], - "arc": "Four Beast Arc" - }, - { - "episodes": [126, 147], - "chapters": [210, 230], - "arc": "Cooking Festival Arc (anime-original ending)" - }, - { - "chapters": [231, 263], - "arc": "Cooking Festival Arc (manga conclusion, unadapted)" - }, - { - "chapters": [264, 271], - "arc": "Billion Bird Arc (Gourmet World)" - }, - { - "chapters": [272, 294], - "arc": "AIR Arc" - }, - { - "chapters": [295, 323], - "arc": "PAIR Arc" - }, - { - "chapters": [324, 368], - "arc": "ANOTHER Arc" - }, - { - "chapters": [369, 396], - "arc": "GOD Arc (Final Arc)" - } - ], - "movies": [ - { - "anilistId": 17699, - "title": "Toriko the Movie: Secret Recipe of Gourmet God!", - "year": 2013, - "afterEpisode": 110, - "note": "Anime-original side-story feature set between the anime's Golden Wheat and Four Beast arcs." - } - ] -} diff --git a/src/data/mappings/tower-of-god.json b/src/data/mappings/tower-of-god.json deleted file mode 100644 index 179be10..0000000 --- a/src/data/mappings/tower-of-god.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 115230, - "anilistMangaId": 85143, - "title": "Tower of God", - "sourceNotes": "S1 anime (13 eps, 2020) adapts the entirety of webtoon Part 1 (episodes 1-78), heavily compressing the back half. Paired with SIU's webtoon 'Tower of God' (AniList id 85143, type MANGA); its 'chapters' are webtoon episodes. Numbering here uses the platform's cumulative episode index (Part 1 = 1-78); the webtoon reached its Season 3 finale at internal episode ~653 (Feb 2025, now on hiatus). Episode-to-arc boundaries within S1 are approximate. A 2024 anime Season 2 (26 eps, separate AniList id 153406) adapts early Part 2 (Workshop Battle) and is not mapped here.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 13], - "arc": "Headon's Floor → Yu Hansung's Examination (entrance tests)" - }, - { - "episodes": [5, 9], - "chapters": [14, 27], - "arc": "Crown Game / The Rest" - }, - { - "episodes": [10, 12], - "chapters": [28, 56], - "arc": "Position Test / Hide-and-Seek / The Submerged Fish" - }, - { - "episodes": [13, 13], - "chapters": [57, 78], - "arc": "Last Examination & Rachel's Betrayal (Part 1 finale)" - }, - { - "chapters": [79, 653], - "arc": "Part 2 & Part 3 (Workshop Battle → Hell Train → Season 3 finale; early Part 2 adapted by the 2024 anime S2)" - } - ] -} diff --git a/src/data/mappings/trapped-in-a-dating-sim.json b/src/data/mappings/trapped-in-a-dating-sim.json deleted file mode 100644 index b6969fe..0000000 --- a/src/data/mappings/trapped-in-a-dating-sim.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 142074, - "anilistMangaId": 104503, - "title": "Trapped in a Dating Sim: The World of Otome Games Is Tough for Mobs", - "sourceNotes": "Single 12-episode TV season (ENGI, 2022); the 2026 Season 2 is not yet released. Officially light-novel-sourced (LN complete at 13 volumes; AniList novel id 104504), but every community episode-to-source guide anchors the anime to the MANGA adaptation, so chapter ranges here use the manga's continuous numbering (AniList manga id 104503). The anime adapts LN volumes 1-2 = roughly manga chapters 1-38; guides tell readers to continue in the manga at Vol. 8, Ch. 39 (equivalently LN Vol. 3), which picks up right where the finale leaves off after Leon overcomes the Principality of Fanoss. The internal split between the academy/duel arc (LN vol 1) and the Fanoss war arc (LN vol 2) is approximate because the anime compressed vol 2's pacing. Manga was ongoing past the AniList snapshot of 72 chapters (13 tankobon by late 2024). No theatrical films exist.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 19], - "arc": "Academy Arc" - }, - { - "episodes": [7, 12], - "chapters": [20, 38], - "arc": "Principality of Fanoss Arc" - }, - { - "chapters": [39, 72], - "arc": "Alzer Republic Arc (unadapted in S1)" - } - ] -} diff --git a/src/data/mappings/trigun.json b/src/data/mappings/trigun.json deleted file mode 100644 index 9d844d1..0000000 --- a/src/data/mappings/trigun.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "anilistAnimeId": 6, - "anilistMangaId": 30703, - "title": "Trigun", - "sourceNotes": "Original 1998 anime (26 eps) loosely adapts Trigun manga (3 vols / 23 chapters) in eps 1-13, then continues with anime-original material inspired by early Trigun Maximum. The Trigun Maximum sequel manga (AniList id 30704, 14 vols / 104 ch) is not covered here. Trigun Stampede (2023) and Trigun Stargaze (2026) are separate CGI re-adaptations.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 23], - "arc": "Vash the Stampede (Trigun manga vol 1-3)" - } - ], - "movies": [ - { - "anilistId": 4106, - "title": "Trigun: Badlands Rumble", - "year": 2010, - "note": "Side story in the 1998 anime continuity." - } - ] -} diff --git a/src/data/mappings/trinity-seven.json b/src/data/mappings/trinity-seven.json deleted file mode 100644 index 2448127..0000000 --- a/src/data/mappings/trinity-seven.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "anilistAnimeId": 20631, - "anilistMangaId": 54822, - "title": "Trinity Seven", - "sourceNotes": "TV anime (12 eps, 2014, Seven Arcs Pictures) adapts Kenji Saito & Akinari Nao's manga 'Trinity Seven: The Seven Magicians', serialized in Monthly Dragon Age since 2010 and still ongoing (34 volumes / ~chapter 173 as of April 2026 per Wikipedia's chapter list, NOT complete). Volume 1 opens with a prologue chapter 0; ranges below start at chapter 1 for clarity. The anime covers roughly volumes 1-8, whose final chapter is 35 ('Judecca & World System'); arc-to-episode boundaries are approximate (~3 chapters per episode). A reader resumes at chapter 36. The two canon theatrical films continue after episode 12 and loosely adapt later manga arcs; their exact chapter ranges are not officially documented, so the values given are approximate. The single-episode OVA and the various spin-off manga are excluded.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 9], - "arc": "Selection Arc (Royal Biblia Academy)" - }, - { - "episodes": [4, 6], - "chapters": [10, 18], - "arc": "Superbia & Iscariot Arcs" - }, - { - "episodes": [7, 9], - "chapters": [19, 27], - "arc": "Liber Arcanum Arc" - }, - { - "episodes": [10, 12], - "chapters": [28, 35], - "arc": "Sword Arc (Hijiri & World System)" - }, - { - "chapters": [36, 173], - "arc": "Eternal Library, Heavens Library & beyond (post-anime; films adapt early portions, rest unadapted, ongoing)" - } - ], - "movies": [ - { - "anilistId": 21874, - "title": "Trinity Seven: Eternity Library and Alchemic Girl", - "year": 2017, - "chapters": [36, 43], - "afterEpisode": 12, - "note": "Canon film following the TV series. Awakening of the Eternal Library and the grimoire-girl Lilim, leading into the alchemist arc (approx. vols 9-10); chapter range approximate." - }, - { - "anilistId": 103631, - "title": "Trinity Seven: Heavens Library & Crimson Lord", - "year": 2019, - "chapters": [44, 54], - "afterEpisode": 12, - "note": "Sequel to the first film. Arata and the Trinity Seven face the Crimson Demon Lord, Lilith's father (approx. vols 11-12); chapter range approximate." - } - ] -} diff --git a/src/data/mappings/tsukimichi.json b/src/data/mappings/tsukimichi.json deleted file mode 100644 index 479ce98..0000000 --- a/src/data/mappings/tsukimichi.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "anilistAnimeId": 125206, - "anilistMangaId": 87225, - "title": "Tsukimichi: Moonlit Fantasy", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 (25, eps 13-37) = 37 total. anilistAnimeId is the 2021 first-season TV anime (id 125206); S2 (id 139518) is a sequel whose 25 episodes continue the cumulative count. Paired with Kotora Kino's ongoing manga adaptation 'Tsuki ga Michibiku Isekai Douchuu' (AniList id 87225, RELEASING), latest ch. 117 across 16 volumes (mid-2026). Anchors: after S1 a reader resumes the manga at vol. 9 / ch. 60, and manga ch. 104 lines up with roughly cumulative ep. 23 (S2 ep. 11). The anime is a fast, compressed adaptation that has OUTPACED the manga: manga ch. 117 only reaches about cumulative ep. 26, so the back half of S2 (roughly eps. 27-37) has no corresponding manga yet (no unadapted manga tail exists). Arc boundaries are interpolated from those anchors and are approximate.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 15], - "arc": "Goddess's Wasteland & Founding of Asora (demi-human haven, Tomoe & Mio)" - }, - { - "episodes": [4, 9], - "chapters": [16, 45], - "arc": "Tsige & the Kuzunoha Company (adventurer's guild, Rembrandt curse)" - }, - { - "episodes": [10, 12], - "chapters": [46, 59], - "arc": "Rotsgard Academy (Raidou the lecturer; S1 finale)" - }, - { - "episodes": [13, 23], - "chapters": [60, 104], - "arc": "Rotsgard Academy Festival & the Heroes (S2; Hibiki and Tomoki appear)" - }, - { - "episodes": [24, 37], - "chapters": [105, 117], - "arc": "Fort Stella & the Demon War (S2; anime surpasses the manga partway through)" - } - ] -} diff --git a/src/data/mappings/tsuredure-children.json b/src/data/mappings/tsuredure-children.json deleted file mode 100644 index 7a7bdec..0000000 --- a/src/data/mappings/tsuredure-children.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 98291, - "anilistMangaId": 86481, - "title": "Tsuredure Children", - "sourceNotes": "Short-format ensemble manga — chapter ranges are approximate. Toshiya Wakabayashi's gag/short romcom is a complete 4-koma-style work (AniList lists 212 short chapters / 12 volumes; some sources tally fewer due to differing chapter splits). It has no story arcs — instead it follows many independent couples' brief vignettes that interleave throughout. The 2017 TV short (single season, 12 short episodes) adapts an assortment of these early couples (roughly ch 1-50), so a viewer resumes reading around there. The remainder is unadapted.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 50], - "arc": "Episodes 1-12 (assorted couples)" - }, - { - "chapters": [51, 212], - "arc": "Remaining couples & vignettes (unadapted)" - } - ] -} diff --git a/src/data/mappings/twin-star-exorcists.json b/src/data/mappings/twin-star-exorcists.json deleted file mode 100644 index 1b5b1f6..0000000 --- a/src/data/mappings/twin-star-exorcists.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 21499, - "anilistMangaId": 85247, - "title": "Twin Star Exorcists", - "sourceNotes": "Single 50-episode TV series (2016-2017), so episodes are not cumulative across seasons. The anime only adapts manga chapters 1-15 (roughly volumes 1-5) and does so loosely across episodes 1-20, with heavy anime-original padding interspersed (episodes 5 and 10-16 are filler); per the community canon guide episodes 1-9 cover chapters 1-10 and episodes 17-20 cover chapters 10-15. From episode 21 onward (eps 21-50) the anime abandons the manga entirely and tells a wholly original story, so it cannot be mapped to chapters. The manga is complete: AniList lists 142 chapters, while Wikipedia counts 134 numbered chapters across 35 tankobon volumes (Jump Square, 2013-2024). Everything from chapter 16 to the end is unadapted by the anime; a precise per-arc chapter breakdown of that unadapted remainder is not reliably documented, so it is given as a single chapters-only tail entry.", - "mappings": [ - { - "episodes": [1, 9], - "chapters": [1, 10], - "arc": "Meeting & the Hiinatsuki Tragedy" - }, - { - "episodes": [17, 20], - "chapters": [11, 15], - "arc": "Yuto & Basara Confrontation" - }, - { - "chapters": [16, 142], - "arc": "Unadapted manga (post-anime divergence)" - } - ] -} diff --git a/src/data/mappings/umaru-chan.json b/src/data/mappings/umaru-chan.json deleted file mode 100644 index a30300b..0000000 --- a/src/data/mappings/umaru-chan.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 20987, - "anilistMangaId": 80133, - "title": "Himouto! Umaru-chan", - "sourceNotes": "Cumulative episodes across S1 (12 eps, 2015) + S2 'R' (12 eps, 2017, eps 13-24) = 24 total. Use the S1 id; R is a sequel. Paired with Sankaku Head's complete manga: 231 chapters across 12 volumes (FINISHED per AniList). 4-koma episodic slice-of-life with no real story arcs, so groupings are coarse and chapter ranges are approximate (roughly several chapters per episode); the anime also reorders gags rather than adapting strictly in order. The OVA and the 'S'/'R'/'N'/'G' spin-offs are separate side entries; there are no theatrical films.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 90], - "arc": "Season 1 (eps 1-12) — Umaru's double life (approximate)" - }, - { - "episodes": [13, 24], - "chapters": [91, 180], - "arc": "Season 2 R (eps 13-24) — friends & family slice-of-life (approximate)" - }, - { - "chapters": [181, 231], - "arc": "Unadapted tail — final chapters through the manga's end" - } - ] -} diff --git a/src/data/mappings/uncle-from-another-world.json b/src/data/mappings/uncle-from-another-world.json deleted file mode 100644 index 25b1141..0000000 --- a/src/data/mappings/uncle-from-another-world.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "anilistAnimeId": 135806, - "anilistMangaId": 104617, - "title": "Uncle from Another World", - "sourceNotes": "Single 13-episode TV season (Atelier Pontdarc, 2022-2023); no sequel season, so cumulative episodes equal S1 episodes. Source is Hotondoshindeiru's ongoing episodic web manga (AniList id 104617), which is gag/slice-of-life with no official arc names, so groupings are labeled by episode-title storyline threads and chapter ranges are approximate. The adaptation is non-linear (each episode pulls ~2-3 chapters, sometimes out of order); it covers roughly chapters 1-33, with Ep13's epilogue teasing scattered later chapters (34, 36). Manga ongoing (~ch. 74 / 15 volumes as of 2026).", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 7], - "arc": "Homecoming & Guardian Heroes" - }, - { - "episodes": [3, 4], - "chapters": [8, 12], - "arc": "The Tsundere Elf" - }, - { - "episodes": [5, 6], - "chapters": [13, 18], - "arc": "Assassination & the Freak Show" - }, - { - "episodes": [7, 8], - "chapters": [19, 22], - "arc": "SEGA Wisdom & the Strongest Form" - }, - { - "episodes": [9, 11], - "chapters": [23, 29], - "arc": "The Ice Spirit" - }, - { - "episodes": [12, 13], - "chapters": [30, 33], - "arc": "The Singing Demon" - }, - { - "chapters": [34, 74], - "arc": "Continued Adventures (Unadapted)" - } - ] -} diff --git a/src/data/mappings/undead-unluck.json b/src/data/mappings/undead-unluck.json deleted file mode 100644 index 9cccf58..0000000 --- a/src/data/mappings/undead-unluck.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "anilistAnimeId": 154116, - "anilistMangaId": 114791, - "title": "Undead Unluck", - "sourceNotes": "Manga is COMPLETE at chapter 239 (ended 2025-01-27, 27 volumes) — AniList's '244 chapters' includes bonus/extra entries; canonical main-series count is 239. TV Season 1 = 24 episodes (eps 1-24), adapting chapters 1-53 (ending mid-Autumn Arc). A standalone 'Winter Arc' 1-hour special (aired 2025-12-25) adapts chapters 53-56; it is a bridging special, not a numbered TV episode, so it is not in the cumulative episode count here. Season 2 is announced but unreleased as of June 2026. Arc names are fan/wiki labels and within-arc episode boundaries are approximate (the anime compressed/reordered material). Everything from chapter 57 onward is unadapted.", - "mappings": [ - { "episodes": [1, 2], "chapters": [1, 3], "arc": "Intro" }, - { "episodes": [2, 4], "chapters": [4, 8], "arc": "Unchange" }, - { "episodes": [4, 9], "chapters": [9, 20], "arc": "Spoil" }, - { "episodes": [9, 13], "chapters": [21, 30], "arc": "Unrepair" }, - { "episodes": [13, 16], "chapters": [31, 36], "arc": "Unbelievable" }, - { - "episodes": [16, 24], - "chapters": [37, 53], - "arc": "Autumn (S1 ends mid-ch 53)" - }, - { "chapters": [53, 56], "arc": "Winter (adapted as 1-hour special)" }, - { "chapters": [57, 67], "arc": "Summer" }, - { "chapters": [68, 93], "arc": "Spring" }, - { "chapters": [94, 132], "arc": "Ragnarok" }, - { "chapters": [133, 144], "arc": "Union" }, - { "chapters": [145, 153], "arc": "Negator War" }, - { "chapters": [154, 160], "arc": "Unfeel" }, - { "chapters": [161, 167], "arc": "Untruth" }, - { "chapters": [168, 172], "arc": "Unmove" }, - { "chapters": [173, 183], "arc": "Sick" }, - { "chapters": [184, 190], "arc": "Unburn / Unjustice" }, - { "chapters": [191, 205], "arc": "Unstoppable / Language" }, - { - "chapters": [206, 239], - "arc": "Final arcs (Unchaste / Untouchable / Undead Unluck / finale)" - } - ] -} diff --git a/src/data/mappings/undefeated-bahamut-chronicle.json b/src/data/mappings/undefeated-bahamut-chronicle.json deleted file mode 100644 index 5775379..0000000 --- a/src/data/mappings/undefeated-bahamut-chronicle.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "anilistAnimeId": 21188, - "anilistMangaId": 85613, - "title": "Undefeated Bahamut Chronicle", - "sourceNotes": "12-episode single-cour anime (Lerche, 2016) adapting light novel volumes 1-5 (of 20 total). Episode-to-light-novel-volume boundaries are well documented (vol 1 = ep 1-2, vol 2 = ep 3-5, vol 3 = ep 6-7, vol 4 = ep 8-9, vol 5 = ep 10-12). The anilistMangaId here points at the separate manga adaptation (complete at 46 chapters across 11 volumes, itself only covering part of the light novel's story), since AniList's light-novel entry does not track a chapter count. No published chapter-level breakdown of the manga exists, so chapter ranges are proportionally estimated against the known volume boundaries and should be treated as approximate. Arc names follow the heroine-focused structure of the source material.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 4], - "arc": "Lisesharte / The Crimson War Princess" - }, - { "episodes": [3, 5], "chapters": [5, 9], "arc": "Krulcifer's Engagement" }, - { - "episodes": [6, 9], - "chapters": [10, 18], - "arc": "Celestia's Challenge / Philuffy's Ragnarok" - }, - { - "episodes": [10, 12], - "chapters": [19, 23], - "arc": "Academy Festival / The Imperial Assassin" - }, - { "chapters": [24, 46], "arc": "Unadapted Arcs" } - ] -} diff --git a/src/data/mappings/unwanted-undead-adventurer.json b/src/data/mappings/unwanted-undead-adventurer.json deleted file mode 100644 index cfbd58c..0000000 --- a/src/data/mappings/unwanted-undead-adventurer.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 147642, - "anilistMangaId": 100693, - "title": "The Unwanted Undead Adventurer", - "sourceNotes": "Single 12-episode season (ONA). Manga ongoing (current ch. 70); AniList does not track chapter counts for this series so figures are sourced from tracking sites. Anime-continuation guides agree the season covers manga chapters 1-29, with readers directed to pick the manga back up at ch. 30. No widely-documented named-arc split exists for the adapted stretch beyond the Bronze-Class Exam and Garden Labyrinth story beats named in the anime's own episode titles, so the intervening groupings below are approximate.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 6], - "arc": "Unwanted Undead (Death & Awakening)" - }, - { - "episodes": [5, 6], - "chapters": [7, 14], - "arc": "Undead Adventurer / Bronze-Class Exam" - }, - { - "episodes": [7, 10], - "chapters": [15, 24], - "arc": "Magical Contract & Dragonblood Flower" - }, - { - "episodes": [11, 12], - "chapters": [25, 29], - "arc": "The Garden Labyrinth" - }, - { - "chapters": [30, 70], - "arc": "Unadapted (manga ongoing)" - } - ] -} diff --git a/src/data/mappings/uzaki-chan.json b/src/data/mappings/uzaki-chan.json deleted file mode 100644 index 42bdcef..0000000 --- a/src/data/mappings/uzaki-chan.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 115113, - "anilistMangaId": 101724, - "title": "Uzaki-chan Wants to Hang Out!", - "sourceNotes": "Cumulative episodes across S1 (12 eps, 2020) + S2 'ω' (13 eps, 2022, eps 13-25) = 25 total. Paired with Take's manga 'Uzaki-chan wa Asobitai!', still ongoing (~ch. 137 / 14 volumes as of mid-2026, serialized on Niconico Seiga's Dra Dra Sharp since Dec 2017). This is an episodic slice-of-life romcom and the anime adapts chapters out of order with anime-original beats, so groupings are coarse and chapter boundaries are approximate. S1 ends around the start of Volume 4 (~ch 30); S2 ends around Volume 6, so a viewer resumes reading roughly ch 62 (sources vary between ch 61 and ch 69). No theatrical films exist.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 10], - "arc": "Meeting Up: First Hangouts (Café, Games, Movies)" - }, - { - "episodes": [5, 8], - "chapters": [11, 20], - "arc": "Summer: The Beach, Fireworks & the Cat Café" - }, - { - "episodes": [9, 12], - "chapters": [21, 30], - "arc": "Tottori Trip, the Holidays & the Uzaki Family" - }, - { - "episodes": [13, 19], - "chapters": [31, 46], - "arc": "Daily Life: New Faces, Valentine's & Outings" - }, - { - "episodes": [20, 25], - "chapters": [47, 61], - "arc": "Sakurai & Uzaki Grow Closer (Festivals, New Year)" - }, - { - "chapters": [62, 137], - "arc": "Relationship Deepens (ongoing, unadapted)" - } - ] -} diff --git a/src/data/mappings/uzumaki.json b/src/data/mappings/uzumaki.json deleted file mode 100644 index 4268c98..0000000 --- a/src/data/mappings/uzumaki.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 111314, - "anilistMangaId": 30436, - "title": "Uzumaki", - "sourceNotes": "Single season, 4 episodes (Adult Swim, 2024), adapting Junji Ito's complete 19-chapter, 3-volume horror manga (serialized 1998-1999) at roughly 5 chapters per 23-minute episode. Chapter boundaries are approximate, sourced from the manga's per-volume chapter-title breakdown and episode-airdate synopses (Wikipedia, CBR) rather than a dedicated fan sync guide. Manga complete at 19 core chapters; AniList's chapters count of 20 also includes the standalone bonus story 'Uzumaki Tokubetsu-hen: Ginga' (Lost Chapter: Galaxies), which the anime does not adapt and is listed here as an unadapted tail entry.", - "mappings": [ - { - "episodes": [1, 1], - "chapters": [1, 5], - "arc": "The Spiral Obsession / The Scar / The Firing Effect / Twisted Souls" - }, - { - "episodes": [2, 2], - "chapters": [6, 9], - "arc": "Medusa / Jack-in-the-Box / The Snail / The Black Lighthouse" - }, - { - "episodes": [3, 3], - "chapters": [10, 13], - "arc": "Mosquitoes / The Umbilical Cord / The Storm / The House" - }, - { - "episodes": [4, 4], - "chapters": [14, 19], - "arc": "Butterflies / Chaos / Erosion / Escape / The Labyrinth / Completion" - }, - { - "chapters": [20, 20], - "arc": "Lost Chapter: Galaxies (unadapted bonus story)" - } - ] -} diff --git a/src/data/mappings/vampire-knight.json b/src/data/mappings/vampire-knight.json deleted file mode 100644 index f298d18..0000000 --- a/src/data/mappings/vampire-knight.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 3457, - "anilistMangaId": 30618, - "title": "Vampire Knight", - "sourceNotes": "Cumulative episodes across S1 \"Vampire Knight\" (13, AniList 3457) + S2 \"Vampire Knight: Guilty\" (13, AniList 4752) = 26. Manga by Matsuri Hino is complete; AniList lists 108 total chapters, though the tankobon volumes collect the main story as 93 numbered \"Nights\" (1st Night - 93rd Night across 19 volumes) - the AniList total likely folds in bonus/omake chapters interspersed between volumes, so treat exact chapter numbers as approximate. Season 1 adapts roughly the first 5 volumes (through the 24th Night); Guilty continues through roughly the 43rd-47th Night as the anime caught up to ongoing serialization by late 2008. The manga continues well past the anime's ending into the Kuran family's full backstory and the Rido conflict.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 24], - "arc": "Cross Academy (Season 1)" - }, - { - "episodes": [14, 26], - "chapters": [25, 43], - "arc": "Yuki's Awakening (Guilty / Season 2)" - }, - { - "chapters": [44, 108], - "arc": "Rest of the manga (unadapted, approximate)" - } - ] -} diff --git a/src/data/mappings/vermeil-in-gold.json b/src/data/mappings/vermeil-in-gold.json deleted file mode 100644 index 51f8ada..0000000 --- a/src/data/mappings/vermeil-in-gold.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 146210, - "anilistMangaId": 118741, - "title": "Vermeil in Gold", - "sourceNotes": "Single 12-episode TV season (2022) sourced from the Monthly Shonen Gangan manga by Kota Amana and Yoko Umezu. The anime adapts manga chapters 1-17; the fandom/filler guides note the anime reordered some events (notably Vermeil's backstory and the close of the Iolite fight) but coverage is essentially linear at ~1.4 chapters/episode. Read on from chapter 18 (start of volume 5) to continue past the anime. The manga has no officially named story arcs, so arc labels here are descriptive, drawn from episode titles and story beats, and internal chapter boundaries between episodes are approximate. Manga is ongoing (latest ~ch. 41 as of mid-2026, 11 volumes); the final chapters-only entry covers the unadapted remainder through the current chapter.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 4], - "arc": "Summoning the Strongest Familiar" - }, - { - "episodes": [3, 3], - "chapters": [5, 6], - "arc": "The Dragonrider" - }, - { - "episodes": [4, 6], - "chapters": [7, 10], - "arc": "Rampage" - }, - { - "episodes": [7, 9], - "chapters": [11, 14], - "arc": "Class Representative Selection" - }, - { - "episodes": [10, 12], - "chapters": [15, 17], - "arc": "Vermeil's Past" - }, - { - "chapters": [18, 41], - "arc": "Beyond the Anime (unadapted)" - } - ] -} diff --git a/src/data/mappings/villainess-level-99.json b/src/data/mappings/villainess-level-99.json deleted file mode 100644 index 7c23963..0000000 --- a/src/data/mappings/villainess-level-99.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 163076, - "anilistMangaId": 122786, - "title": "Villainess Level 99: I May Be the Hidden Boss but I'm Not the Demon Lord", - "sourceNotes": "Mapped by LIGHT NOVEL VOLUME, not chapter. Satori Tanabata's light novel is the anime's actual source; the illustrated manga by Nokomi (AniList id 118519) is a separate, much slower retelling — by the time the 12-episode anime finished airing in March 2024 the manga had only reached chapter 19 (roughly episode 9's content), and it was still at chapter ~25 as of mid-2026 — so it cannot supply a usable chapter mapping. The `chapters` tuples below hold LN VOLUME numbers and `anilistMangaId` points to the light novel itself (AniList id 122786), the work these volumes index. The single-cour anime (12 eps) adapts all of LN Volume 1 but diverges into an anime-original finale not found in the source. The light novel is ongoing at 6 published Japanese volumes (as of late 2024, unchanged through mid-2026); Volumes 2-6 are the unadapted tail.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 1], - "arc": "Volume 1: Yumiella's academy life as the game's secret final boss, ending with an anime-original finale" - }, - { - "chapters": [2, 6], - "arc": "Volumes 2-6: unadapted continuation of the light novel" - } - ] -} diff --git a/src/data/mappings/villainess.json b/src/data/mappings/villainess.json deleted file mode 100644 index 8a68916..0000000 --- a/src/data/mappings/villainess.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "anilistAnimeId": 104647, - "anilistMangaId": 100559, - "title": "My Next Life as a Villainess: All Routes Lead to Doom!", - "sourceNotes": "Mapped by LIGHT NOVEL VOLUME, not chapter. The source is Satoru Yamaguchi's light novel (Otome Game no Hametsu Flag shika Nai Akuyaku Reijou ni Tensei shiteshimatta...), which the anime adapts faithfully. The standalone manga adaptation (AniList id 100560) is a separate, much slower retelling that does not track the anime, so the `chapters` tuples below hold LN VOLUME numbers and `anilistMangaId` points to the light novel itself (AniList id 100559), the work these volumes index. Cumulative episodes: Season 1 (id 104647, 12 eps) + sequel 'X' (id 120209, 12 eps = eps 13-24). Confirmed endpoints: S1 ep 12 ends at the close of LN Vol 2; S2 ep 24 ends at the close of LN Vol 4 — a viewer continues reading at Vol 5 (a side-story volume) or Vol 6 (story proper). The internal per-episode volume splits (Vol 1/2 boundary ~ep 6/7, Vol 3/4 boundary ~ep 18/19) are approximate; the season endpoints are firm. The main light novel is ongoing (~15 volumes as of 2025), so Vols 5-15 are the unadapted tail. The 2023 film is an all-new canon original story by Yamaguchi (not a recap) and does not correspond to a specific LN volume, so it carries no volume range. Side entries (the 'On the Verge of Doom!' / 'Girls Patch' spin-off manga, the 'Katarina's Inner Council' ONA shorts, and the 'X - I Met My Destined One...' OVA) are excluded.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 1], - "arc": "Childhood & doom-flag countermeasures (LN Vol 1): Catarina recalls she is the villainess of the otome game Fortune Lover, then befriends every love interest and rival; time-skip into the Academy of Magic" - }, - { - "episodes": [7, 12], - "chapters": [2, 2], - "arc": "Academy / Fortune Lover arc (LN Vol 2): Maria Campbell, the student council, and the dark-magic incident with Sirius (Raphael) — the original game's doom flags resolved" - }, - { - "episodes": [13, 18], - "chapters": [3, 3], - "arc": "Post-game daily life (LN Vol 3): the second-game (Fortune Lover II) characters appear; lead-in toward the Ministry of Magic" - }, - { - "episodes": [19, 24], - "chapters": [4, 4], - "arc": "Magical ministry / kidnapping arc (LN Vol 4): Catarina is taken to the dark-magic island, Raphael's past, and the 'X' finale" - }, - { - "chapters": [5, 15], - "arc": "Unadapted tail (LN Vols 5-15, ongoing): resume at Vol 5 (side stories) or Vol 6 (story proper)" - } - ], - "movies": [ - { - "anilistId": 139359, - "title": "My Next Life as a Villainess: All Routes Lead to Doom! The Movie", - "year": 2023, - "afterEpisode": 24, - "note": "Released Dec 8, 2023 (Japan). An all-new canon story written by original author Satoru Yamaguchi — not a recap. Catarina meets a mysterious boy from the visiting Mutrac circus caravan. Anime-original, so it maps to no specific LN volume; watch after the 'X' season." - } - ] -} diff --git a/src/data/mappings/vinland-saga.json b/src/data/mappings/vinland-saga.json deleted file mode 100644 index ff7d1ef..0000000 --- a/src/data/mappings/vinland-saga.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 101348, - "anilistMangaId": 30642, - "title": "Vinland Saga", - "sourceNotes": "Cumulative episodes across S1 (24) + S2 (24). Arc boundaries from the manga; refine via PR.", - "mappings": [ - { "episodes": [1, 3], "chapters": [1, 16], "arc": "Prologue / Iceland" }, - { "episodes": [4, 18], "chapters": [17, 44], "arc": "England Campaign" }, - { - "episodes": [19, 24], - "chapters": [45, 54], - "arc": "Royal Court / Askeladd's End" - }, - { "episodes": [25, 48], "chapters": [55, 100], "arc": "Farmland Saga" }, - { "chapters": [101, 166], "arc": "Eastern Expedition / Baltic" }, - { "chapters": [167, 220], "arc": "Vinland (finale)" } - ] -} diff --git a/src/data/mappings/violet-evergarden.json b/src/data/mappings/violet-evergarden.json deleted file mode 100644 index 5392b40..0000000 --- a/src/data/mappings/violet-evergarden.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "anilistAnimeId": 21827, - "anilistMangaId": 97298, - "title": "Violet Evergarden", - "sourceNotes": "Source is Kana Akatsuki's original 2-volume light novel (complete, 13 chapters: Vol 1 = ch 1-6, Vol 2 = ch 7-13); AniList lists no manga adaptation, so the novel entry (id 97298) is used. The single 13-episode TV season (KyoAni, 2018) needs no cumulative offset. The anime is an episodic anthology that adapts Volume 1's standalone 'Auto Memory Doll' vignettes out of order, wrapping them in anime-original framing and an anime-original ending, so the episode->chapter mapping is approximate (~one vignette per adapting episode); confirmed beats are ep7=ch1 (Oscar the playwright), ep6=ch4 (Leon the astronomer), and ep10=ch2 (Ann). Volume 2's conclusion (ch 7-13, Violet and Gilbert) is instead adapted by 'Violet Evergarden: the Movie' (2020), while 'Eternity and the Auto Memory Doll' (2019) adapts the separate Gaiden side novel rather than the main book.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 6], - "arc": "Auto Memory Doll (Volume 1 vignettes)" - } - ], - "movies": [ - { - "anilistId": 109190, - "title": "Violet Evergarden: Eternity and the Auto Memory Doll", - "year": 2019, - "afterEpisode": 13, - "note": "Canon side-story film adapting the separate 'Violet Evergarden Gaiden' side novel (Isabella/Amy and her sister Taylor); not part of the main 13-chapter book." - }, - { - "anilistId": 103047, - "title": "Violet Evergarden: the Movie", - "year": 2020, - "afterEpisode": 13, - "chapters": [7, 13], - "note": "Canon sequel film adapting Volume 2 — the novel's conclusion, Violet learning Gilbert's fate and their reunion; the ending the TV series left open." - } - ] -} diff --git a/src/data/mappings/vivy-fluorite-eyes-song.json b/src/data/mappings/vivy-fluorite-eyes-song.json deleted file mode 100644 index 05815af..0000000 --- a/src/data/mappings/vivy-fluorite-eyes-song.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 128546, - "anilistMangaId": 131940, - "title": "Vivy -Fluorite Eye's Song-", - "sourceNotes": "13-episode original anime (Wit Studio, story by Tappei Nagatsuki, 2021) paired with a concurrent 23-chapter (4-volume, complete) tie-in manga by Morito Yamataka that adapts the same story; the anime is a continuous narrative without distinct named arcs, so chapter ranges are proportioned across the story's two halves, split at the Ophelia/Antonio reveal in episode 8.", - "mappings": [ - { - "episodes": [1, 8], - "chapters": [1, 14], - "arc": "First Singularity Points: Elysium to the Zodiac Signs Fes" - }, - { - "episodes": [9, 13], - "chapters": [15, 23], - "arc": "Final Singularity / Vivy's Choice" - } - ] -} diff --git a/src/data/mappings/wagnaria.json b/src/data/mappings/wagnaria.json deleted file mode 100644 index 78097a1..0000000 --- a/src/data/mappings/wagnaria.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anilistAnimeId": 6956, - "anilistMangaId": 33044, - "title": "Wagnaria!!", - "sourceNotes": "Cumulative episodes across 3 TV seasons sharing the same source manga: Wagnaria!! S1 (13, 2010) + Wagnaria!!2 / Working'!! (13, 2011) + Wagnaria!!3 / Working!!! (13, 2015) = 39 eps. (The 2016 spinoff WWW.Wagnaria!! is excluded — it adapts a different, unrelated web-manga continuity, not Karino Takatsu's Young Gangan series.) Manga complete at 252 chapters (13 volumes, 2005-2014, plus a short run of Extra Chapters). Working!! is a 4-koma-style gag/slice-of-life comedy with no continuous story arcs, and fan sources note the anime pulls chapters out of publication order rather than adapting them sequentially — so the per-season chapter ranges below are approximate proportional estimates (roughly a third of the manga per season), not a precise sequential mapping.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 84], - "arc": "Season 1 (Wagnaria!!)" - }, - { - "episodes": [14, 26], - "chapters": [85, 168], - "arc": "Season 2 (Wagnaria!!2 / Working'!!)" - }, - { - "episodes": [27, 39], - "chapters": [169, 252], - "arc": "Season 3 (Wagnaria!!3 / Working!!!)" - } - ] -} diff --git a/src/data/mappings/waiting-in-the-summer.json b/src/data/mappings/waiting-in-the-summer.json deleted file mode 100644 index c2b7fc8..0000000 --- a/src/data/mappings/waiting-in-the-summer.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "anilistAnimeId": 11433, - "anilistMangaId": 65713, - "title": "Waiting in the Summer", - "sourceNotes": "Single season, 12 episodes. The 12-episode 2012 TV anime is an anime-original story; the 3-volume, 11-chapter manga by Pepako Dokuta (serialized in Dengeki Daioh, Mar. 2012-Feb. 2013) is a close tie-in adaptation that ran concurrently with the TV broadcast, compressing roughly one chapter per episode. Manga complete at 11 chapters. A separate light-novel adaptation (AniList id 84597, 30 chapters/2 volumes) also exists but is not used here. No distinct named story arcs; the show is a single continuous slice-of-life romance plot.", - "mappings": [ - { - "episodes": [1, 6], - "chapters": [1, 5], - "arc": "Ichika's Arrival / Filmmaking Club Forms" - }, - { - "episodes": [7, 12], - "chapters": [6, 11], - "arc": "Confessions / Ichika's Secret Revealed" - } - ] -} diff --git a/src/data/mappings/wandering-witch.json b/src/data/mappings/wandering-witch.json deleted file mode 100644 index fe4e71e..0000000 --- a/src/data/mappings/wandering-witch.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 112609, - "anilistMangaId": 105913, - "title": "Wandering Witch: The Journey of Elaina", - "sourceNotes": "Source is Jougi Shiraishi's light novel, a series of standalone short stories (25+ volumes). anilistMangaId points to the manga adaptation (AniList 105913, 24 chapters / 6 volumes), which retells largely the same short stories the anime draws from. The 2020 TV anime is an EPISODIC ANTHOLOGY: its 12 episodes cherry-pick self-contained short stories from LN volumes 1-5 OUT OF ORDER, drawing mostly from vols 1, 3 and 5 while skipping most of vols 2 and 4. Because the anime reorders and compresses stories, there is no clean one-to-one episode-to-chapter mapping; the chapter ranges below are APPROXIMATE, aligned to the sequential manga (manga vols 1-4 / chapters ~1-16 cover most of what the 12 episodes adapt), and arc labels describe the short stories each block covers.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 3], - "arc": "Origin & The Land of Mages - Elaina's apprenticeship under Fran, then the country where all use magic (LN Vol. 1)" - }, - { - "episodes": [3, 5], - "chapters": [4, 7], - "arc": "Bottled Happiness / The Girl as Pretty as a Flower / The Princess Without Subjects / Royal Celesteria (LN Vol. 1-2, anthology, approx.)" - }, - { - "episodes": [6, 8], - "chapters": [8, 11], - "arc": "The Land of Truth Tellers / The Wall Etched by Travelers / The Grape-Stomping Girl / The Ripper (LN Vol. 1, 3, anthology, approx.)" - }, - { - "episodes": [9, 12], - "chapters": [12, 16], - "arc": "A Deep Sorrow from the Past / The Two Teachers / The Two Apprentices / The Everyday Tale of Every Ashen Witch (LN Vol. 3, 5, anthology, approx.)" - }, - { - "chapters": [17, 24], - "arc": "Further short stories (manga Vol. 5-6 / later LN tales) not covered by the 12-episode anime" - } - ] -} diff --git a/src/data/mappings/watamote.json b/src/data/mappings/watamote.json deleted file mode 100644 index 890be61..0000000 --- a/src/data/mappings/watamote.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 16742, - "anilistMangaId": 58533, - "title": "WataMote: No Matter How I Look at It, It's You Guys' Fault I'm Not Popular!", - "sourceNotes": "Single-season 2013 TV anime by Silver Link (12 eps) adapts roughly the first four volumes / chapters 1-34 of Nico Tanigawa's ongoing manga, covering Tomoko's solo-misery first year of high school (before the later ensemble cast). The anime is episodic and non-linear: each episode bundles two or three thematically similar but chronologically separate chapters, and it skips/rearranges some (e.g. ch 30 marathon, ch 33 birthday), so the per-episode chapter ranges below are approximate. New unadapted content begins at ch 35. Manga is ongoing (~ch 238 as of Jan 2026; AniList chapter count null). The anime-original OVA (ep 13, id 20453) adapts no specific chapters and is omitted. No theatrical films.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 9], - "arc": "First Days of High School (Failed Popularity Schemes) — approx." - }, - { - "episodes": [4, 6], - "chapters": [10, 17], - "arc": "Summer Break Misery — approx." - }, - { - "episodes": [7, 9], - "chapters": [18, 26], - "arc": "Second Semester & Cultural Festival — approx." - }, - { - "episodes": [10, 12], - "chapters": [27, 34], - "arc": "Winter & End of First Year — approx." - }, - { - "chapters": [35, 238], - "arc": "Solo Misery to Ensemble Cast (ongoing, unadapted)" - } - ] -} diff --git a/src/data/mappings/way-of-the-househusband.json b/src/data/mappings/way-of-the-househusband.json deleted file mode 100644 index d229622..0000000 --- a/src/data/mappings/way-of-the-househusband.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 125426, - "anilistMangaId": 101233, - "title": "The Way of the Househusband", - "sourceNotes": "Kousuke Oono's gag manga 'Gokushufudou' is ongoing (~ch. 135 / 17 volumes as of mid-2026 per Bato/Wikipedia). Cumulative episodes use the first Netflix ONA id (125426): Season 1 Part 1 (5 eps, Apr 2021) + Season 1 Part 2 (5 eps, Oct 2021) + Season 2 (5 eps, Jan 2023) = 15 total; Season 2 was a single 5-episode block, not two parts. This is an episodic gag series the anime adapts selectively and out of order, splitting each episode into several short skits, so episode-to-chapter boundaries are coarse and APPROXIMATE. Season 1 (eps 1-10) adapts roughly chapters 1-26; Season 2's coverage is the least certain and cherry-picks skits from later volumes, so the resume point is a rough estimate. A reader can comfortably pick up around chapter 61 (~volume 7). Volume guides: vol 1 = ch 1-9, ~8-9 chapters per volume, vol 9 ~ch 76, vol 13 ~ch 109. No theatrical films.", - "mappings": [ - { - "episodes": [1, 5], - "chapters": [1, 13], - "arc": "Season 1 Part 1 (Tatsu's Househusband Debut)" - }, - { - "episodes": [6, 10], - "chapters": [14, 26], - "arc": "Season 1 Part 2 (Domestic Life Continues)" - }, - { - "episodes": [11, 15], - "chapters": [27, 60], - "arc": "Season 2 (More Househusband Misadventures)" - }, - { - "chapters": [61, 136], - "arc": "Ongoing Skits (unadapted)" - } - ] -} diff --git a/src/data/mappings/we-never-learn.json b/src/data/mappings/we-never-learn.json deleted file mode 100644 index 64b3543..0000000 --- a/src/data/mappings/we-never-learn.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "anilistAnimeId": 103900, - "anilistMangaId": 98235, - "title": "We Never Learn: BOKUBEN", - "sourceNotes": "Cumulative episodes across S1 (13) + S2 (13) = 26 TV episodes. The anime adapts roughly manga Questions 1-69 (through Volume 8's Cultural Festival arc), but Silver/Arvo reorder chapters non-linearly across episodes to feature all heroines evenly, so per-episode boundaries are approximate — ranges are given at the season-block level. Manga complete at 187 chapters / 21 volumes (Taishi Tsutsui, Weekly Shonen Jump). Volumes 9-16 (Questions ~70-141) continue the unadapted common route building to the fireworks confession. The final five volumes (17-21, Questions 142-187) form the famous \"Route:if\" branch — five parallel alternate endings, one per heroine, presented here in publication order: Uruka (Mermaid Princess), Rizu (Thumbelina), Fumino (Sleeping Beauty of the Literary Forest), Asumi (Pixie), and Mafuyu Kirisu (Queen of Thin Ice), the last also containing a harem omake. Two OVAs (side stories adapting beach/wedding chapters, bundled with manga volumes) are not part of the TV episode count. No theatrical films.", - "mappings": [ - { - "episodes": [1, 13], - "chapters": [1, 43], - "arc": "Season 1: The Genius Tutees (Fumino, Rizu, Uruka)" - }, - { - "episodes": [14, 26], - "chapters": [44, 69], - "arc": "Season 2: Deepening Bonds (Hot Spring & Cultural Festival)" - }, - { - "chapters": [70, 141], - "arc": "Common Route: The Path to the Fireworks (unadapted)" - }, - { - "chapters": [142, 150], - "arc": "Route:if — Uruka (Mermaid Princess)" - }, - { - "chapters": [151, 159], - "arc": "Route:if — Rizu (Thumbelina)" - }, - { - "chapters": [160, 168], - "arc": "Route:if — Fumino (Sleeping Beauty of the Literary Forest)" - }, - { - "chapters": [169, 177], - "arc": "Route:if — Asumi (Pixie)" - }, - { - "chapters": [178, 187], - "arc": "Route:if — Mafuyu Kirisu (Queen of Thin Ice) & Harem Ending" - } - ] -} diff --git a/src/data/mappings/welcome-to-the-ballroom.json b/src/data/mappings/welcome-to-the-ballroom.json deleted file mode 100644 index 043adff..0000000 --- a/src/data/mappings/welcome-to-the-ballroom.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 98005, - "anilistMangaId": 78347, - "title": "Welcome to the Ballroom", - "sourceNotes": "Single 24-episode season (Production I.G, 2017). Manga ongoing (current ch. 72, ~12 volumes). The anime adapts through ch. 54 (roughly volume 7), with its final two episodes running slightly ahead of the manga's pace at the time (anime-original beats covering content the manga hadn't yet drawn). Arc names and chapter ranges from the fandom wiki's Story Arcs / Chapters and Volumes pages; per-episode boundaries beyond the confirmed anchor points (ep. 7 opens the Tenpei Cup at ch. 8, ep. 11 closes it, ep. 18 opens the Metropolitan Tournament at ch. 35) are approximate reconstructions.", - "mappings": [ - { "episodes": [1, 2], "chapters": [1, 2], "arc": "Introduction" }, - { - "episodes": [3, 6], - "chapters": [3, 7], - "arc": "Mikasa Cup / Regional Qualifiers" - }, - { "episodes": [7, 11], "chapters": [8, 17], "arc": "Tenpei Cup" }, - { "episodes": [12, 14], "chapters": [18, 27], "arc": "Meeting Arc" }, - { "episodes": [15, 16], "chapters": [28, 30], "arc": "Grand Prix" }, - { "episodes": [17, 17], "chapters": [31, 34], "arc": "Camp Arc" }, - { - "episodes": [18, 24], - "chapters": [35, 54], - "arc": "Metropolitan Tournament" - }, - { - "chapters": [55, 72], - "arc": "Unadapted (manga continuation, incl. the eye-disease storyline)" - } - ] -} diff --git a/src/data/mappings/welcome-to-the-nhk.json b/src/data/mappings/welcome-to-the-nhk.json deleted file mode 100644 index 54aba96..0000000 --- a/src/data/mappings/welcome-to-the-nhk.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "anilistAnimeId": 1210, - "anilistMangaId": 30463, - "title": "Welcome to the NHK", - "sourceNotes": "Single 24-episode TV season (2006). Source is Tatsuhiko Takimoto's light novel, but this pairs the 40-chapter / 8-volume manga adaptation (AniList 30463, complete) since it tracks the anime far more closely than the novel. The anime heavily reorders and condenses the manga, so chapter ranges below are coarse phase approximations, not literal per-episode boundaries. The ending also diverges: in the anime Misaki's abusive-childhood backstory is genuine and the island rescue succeeds, whereas in the manga she admits she fabricated the story and Yamazaki diverts the rescue to Comiket. Anchors: ep 1 = ch 1 (Project), ep 13 'Heaven' = ch 10 (the suicide pact), ep 24 'Welcome to the N.H.K.!' = ch 40.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 3], - "arc": "Hikikomori & the Moe Game Project" - }, - { - "episodes": [5, 9], - "chapters": [4, 8], - "arc": "Counseling & the Mother's Visit" - }, - { - "episodes": [10, 13], - "chapters": [9, 10], - "arc": "The Offline Suicide Pact" - }, - { - "episodes": [14, 17], - "chapters": [11, 21], - "arc": "Online Game Addiction" - }, - { - "episodes": [18, 20], - "chapters": [22, 30], - "arc": "Pyramid Scheme & Despair" - }, - { - "episodes": [21, 24], - "chapters": [31, 40], - "arc": "Misaki's Past & the N.H.K. (anime-original ending)" - } - ] -} diff --git a/src/data/mappings/when-supernatural-battles-became-commonplace.json b/src/data/mappings/when-supernatural-battles-became-commonplace.json deleted file mode 100644 index aa6f23a..0000000 --- a/src/data/mappings/when-supernatural-battles-became-commonplace.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 20646, - "anilistMangaId": 85340, - "title": "When Supernatural Battles Became Commonplace", - "sourceNotes": "Single 12-episode 2014 Trigger adaptation of Kota Nozomi's light novel \"Inou-Battle wa Nichijou-kei no Naka de\" (source = the LN, AniList id 85340, format NOVEL, reported as 118 chapters across 13 volumes; series COMPLETE at Vol. 13, Jan 2018). The anime broadly adapts light novel Volumes 1-5, so chapter ranges here are approximate volume-proportional divisions of the 118-chapter count (~9 chapters per volume), NOT exact LN chapter boundaries. Trigger reordered several character arcs for pacing: notably Hatoko Kushikawa's Volume-2 emotional climax (\"Juggernaut On\" outburst) is pushed to the dramatic center at episodes 7-8, while the Chifuyu (Vol. 3) and Sayumi (Vol. 4) material fills the middle episodes. The episodes 11-12 finale (Mirei's possession by the imposter, Lucifirst, the \"Dark and Dark of the End\") is a partly anime-original/compressed climax. Volumes 6-13 are unadapted. Single cour, so episode numbers are not cumulative across seasons.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 9], - "arc": "Grateful Robber (Mirei Kudou joins)" - }, - { - "episodes": [3, 4], - "chapters": [10, 18], - "arc": "World Create (Chifuyu & Madoka)" - }, - { - "episodes": [5, 6], - "chapters": [19, 27], - "arc": "Sensitive Age & Vice Penalty (Tomoyo's Novel, Sayumi's Root of Origin)" - }, - { - "episodes": [7, 8], - "chapters": [28, 36], - "arc": "Juggernaut On (Hatoko's Outburst)" - }, - { - "episodes": [9, 12], - "chapters": [37, 45], - "arc": "Girls Approach & Usual Days (Confessions and the Imposter Finale)" - }, - { - "chapters": [46, 118], - "arc": "Post-Anime Volumes 6-13 (Unadapted)" - } - ] -} diff --git a/src/data/mappings/why-the-hell-are-you-here-teacher.json b/src/data/mappings/why-the-hell-are-you-here-teacher.json deleted file mode 100644 index 463b10b..0000000 --- a/src/data/mappings/why-the-hell-are-you-here-teacher.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 104325, - "anilistMangaId": 97827, - "title": "Why the hell are you here, Teacher!?", - "sourceNotes": "Single-cour TV_SHORT (12 episodes, ~7 min each) from 2019; episodes are cumulative within the one season. The source manga by Soborou is an omnibus told couple-by-couple (roughly 10 chapters per tankoubon volume), each volume centering a different older-female-teacher / younger-male-student pair. The anime adapts the first four couples in order — Kojima (ep 1-4), Matsukaze (ep 5-6), Hazakura (ep 7-9), and school-nurse Tachibana (ep 10-12) — covering chapters 1-40; anime-to-manga guides confirm chapter 40 ends the anime's couples and readers resume at chapter 41. Because it is a gag/omnibus 4-koma-style romcom with no continuous plot, chapter boundaries are per-couple volume splits and approximate. Manga complete at 131 chapters (AniList); a Blu-ray OVA \"Thirteenth Period\" special exists but is not theatrical. Chapters 41-131 introduce new pairings and are unadapted.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 10], - "arc": "Kana Kojima" - }, - { - "episodes": [5, 6], - "chapters": [11, 20], - "arc": "Mayu Matsukaze" - }, - { - "episodes": [7, 9], - "chapters": [21, 30], - "arc": "Hikari Hazakura" - }, - { - "episodes": [10, 12], - "chapters": [31, 40], - "arc": "Chizuru Tachibana" - }, - { - "chapters": [41, 131], - "arc": "New Couples (unadapted)" - } - ] -} diff --git a/src/data/mappings/wind-breaker.json b/src/data/mappings/wind-breaker.json deleted file mode 100644 index de1bb6c..0000000 --- a/src/data/mappings/wind-breaker.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 163270, - "anilistMangaId": 135083, - "title": "Wind Breaker", - "sourceNotes": "Cumulative episodes across S1 (13 eps, 2024 CloverWorks) + S2 (12 eps, eps 14-25) = 25 total. Paired with Nii Satoru's manga 'Wind Breaker' (Magazine Pocket; Bofurin / Furin High), ongoing at ~ch 220 / vol 20 as of mid-2026 per fan trackers. S1 adapts ch 1-41 (ends on 'For a Friend'); S2 adapts ch 42-90, so a viewer resumes reading at ch 91. Arc boundaries follow the Wind Breaker Fandom wiki and episode-to-chapter guides and align to episode breaks; chapter cutoffs are approximate. No theatrical films exist.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 9], - "arc": "Introduction Arc (Sakura Arrives at Bofurin / Furin High)" - }, - { - "episodes": [5, 13], - "chapters": [10, 41], - "arc": "Shishitoren Arc (Bofurin vs Shishitoren)" - }, - { - "episodes": [14, 16], - "chapters": [42, 55], - "arc": "KEEL Arc" - }, - { - "episodes": [17, 19], - "chapters": [56, 66], - "arc": "Sakura / Tsubakino Arc" - }, - { - "episodes": [20, 25], - "chapters": [67, 90], - "arc": "Roppo-Ichiza / Gravel Arc (S2 ends mid-arc)" - }, - { - "chapters": [91, 220], - "arc": "Roppo-Ichiza/Gravel conclusion through Noroshi War and beyond (ongoing, unadapted)" - } - ] -} diff --git a/src/data/mappings/wise-mans-grandchild.json b/src/data/mappings/wise-mans-grandchild.json deleted file mode 100644 index 23c63a9..0000000 --- a/src/data/mappings/wise-mans-grandchild.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 100112, - "anilistMangaId": 87293, - "title": "Wise Man's Grandchild", - "sourceNotes": "Source is Tsuyoshi Yoshioka's light novel (17 vols); paired here with Shunsuke Ogata's ongoing manga adaptation (id 87293, ~28 tankobon as of Feb 2026, latest ~ch. 98). The single 12-episode 2019 TV anime (id 100112) adapts roughly LN volumes 1-3, ending at manga chapter 21, so a viewer resumes reading at chapter 22. Episode-to-chapter boundaries are approximate; the anime is fairly faithful but compresses some material.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 5], - "arc": "Shin's Origin & Earlsheid Magic Academy Entrance" - }, - { - "episodes": [4, 6], - "chapters": [6, 10], - "arc": "Magic Academy Life & the Ultimate Magicians" - }, - { - "episodes": [7, 9], - "chapters": [11, 15], - "arc": "Oliver Schtrom & the Kurt Demonoid Incident" - }, - { - "episodes": [10, 12], - "chapters": [16, 21], - "arc": "Blusfia Empire Demonoid Invasion (Sweed)" - }, - { - "chapters": [22, 98], - "arc": "Post-Anime Story (ongoing, unadapted)" - } - ] -} diff --git a/src/data/mappings/wistoria-wand-and-sword.json b/src/data/mappings/wistoria-wand-and-sword.json deleted file mode 100644 index a73205e..0000000 --- a/src/data/mappings/wistoria-wand-and-sword.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "anilistAnimeId": 174576, - "anilistMangaId": 125116, - "title": "Wistoria: Wand and Sword", - "sourceNotes": "S1 only (12 eps). Manga is ongoing — covers Will's first-year academy storyline, roughly chapters 1-24. Arc boundaries approximate.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 4], - "arc": "Introduction / Dungeon Work" - }, - { "episodes": [3, 7], "chapters": [5, 13], "arc": "Grand Magic Festival" }, - { - "episodes": [8, 10], - "chapters": [14, 19], - "arc": "Praxis Exam / Party Formation" - }, - { - "episodes": [11, 12], - "chapters": [20, 24], - "arc": "Final Exam / Graduation" - }, - { "chapters": [25, 65], "arc": "Post-Terminalia / Goetia" } - ] -} diff --git a/src/data/mappings/witch-craft-works.json b/src/data/mappings/witch-craft-works.json deleted file mode 100644 index b732264..0000000 --- a/src/data/mappings/witch-craft-works.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "anilistAnimeId": 20503, - "anilistMangaId": 49896, - "title": "Witch Craft Works", - "sourceNotes": "Single-cour, 12 episodes. Manga complete (AniList lists 119 chapters across 17 volumes; some chapter-list aggregators count ~108 due to differing bonus-chapter tallies). The anime adapts roughly the first 29 chapters, climaxing with the manga's 'vs. Weekend' arc (ch. 18-27, vol. 5-6), leaving the bulk of the manga (ch. 30-119) unadapted. Chapter boundaries approximated from volume tables of contents — refine via PR.", - "mappings": [ - { - "episodes": [1, 9], - "chapters": [1, 17], - "arc": "Takamiya-kun and the Workshop Witches" - }, - { "episodes": [10, 12], "chapters": [18, 29], "arc": "Weekend Arc" }, - { "chapters": [30, 119], "arc": "Unadapted Manga Continuation" } - ] -} diff --git a/src/data/mappings/witch-hat-atelier.json b/src/data/mappings/witch-hat-atelier.json deleted file mode 100644 index 6ede38a..0000000 --- a/src/data/mappings/witch-hat-atelier.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "anilistAnimeId": 147105, - "anilistMangaId": 98263, - "title": "Witch Hat Atelier", - "sourceNotes": "S1 only (13 eps, 2026 ONA). Arc names from major manga story beats; chapter ranges approximate. Refine via PR.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 9], - "arc": "Coco's Wish / Qifrey's Atelier" - }, - { "episodes": [4, 7], "chapters": [10, 22], "arc": "Silver Eve Festival" }, - { - "episodes": [8, 10], - "chapters": [23, 33], - "arc": "Witch's Test / Brimhat Encounter" - }, - { - "episodes": [11, 13], - "chapters": [34, 44], - "arc": "Great Hall / Tartah's Glasses" - }, - { "chapters": [45, 70], "arc": "Sasaran Marketplace / Custas" }, - { "chapters": [71, 95], "arc": "Underground Lake / Olruggio's Past" } - ] -} diff --git a/src/data/mappings/witch-watch.json b/src/data/mappings/witch-watch.json deleted file mode 100644 index 3496f7f..0000000 --- a/src/data/mappings/witch-watch.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 180367, - "anilistMangaId": 128896, - "title": "WITCH WATCH", - "sourceNotes": "Season 1 only (25 episodes); a Season 2 has been announced but not yet aired, so it is excluded from episode counts. Manga ongoing (current ch. 253, 27 volumes released). Anime adapts manga chapters 1-98 essentially 1:1 with no filler; episodes compile multiple short chapters into anthology-style installments (~4 chapters/episode). The episode 13 cour/OP break aligns with the start of Volume 6 (ch. 45) and is used as the internal split point.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 44], - "arc": "Part 1: Otogi House / Kanshi Kazamatsuri" - }, - { - "episodes": [13, 25], - "chapters": [45, 98], - "arc": "Part 2: Keigo Magami / Miharu Kiryu" - }, - { - "chapters": [99, 253], - "arc": "Unadapted Continuation (manga only, ongoing)" - } - ] -} diff --git a/src/data/mappings/wolf-girl-and-black-prince.json b/src/data/mappings/wolf-girl-and-black-prince.json deleted file mode 100644 index d13cb99..0000000 --- a/src/data/mappings/wolf-girl-and-black-prince.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "anilistAnimeId": 20701, - "anilistMangaId": 58825, - "title": "Wolf Girl and Black Prince", - "sourceNotes": "Single season, 12 episodes. Manga complete; AniList lists 69 chapters (16 volumes, including bonus/extra stories woven into the main numbering used by most fan guides, which top out around ch. 58). The anime adapts the early relationship through roughly the main-numbering equivalent of Chapter 21-22 (end of Volume 6); the remainder of the romance plays out manga-only.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 25], - "arc": "Fake Boyfriend / Early Relationship" - }, - { "chapters": [26, 69], "arc": "Manga-Only Continuation" } - ] -} diff --git a/src/data/mappings/world-god-only-knows.json b/src/data/mappings/world-god-only-knows.json deleted file mode 100644 index ae7de91..0000000 --- a/src/data/mappings/world-god-only-knows.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 8525, - "anilistMangaId": 37519, - "title": "The World God Only Knows", - "sourceNotes": "Cumulative episodes across three TV seasons by Manglobe: S1 (12, eps 1-12, 2010), S2 'II' (12, eps 13-24, 2011) and 'Goddesses' / Megami-hen (12, eps 25-36, 2013) = 36 total; anilistAnimeId is the S1 entry (8525). Paired with Tamiki Wakaki's completed manga (AniList id 37519): 268 numbered FLAGs across 26 volumes -- AniList's listed count of 271 includes extra/special chapters. S1 adapts the early conquest intro arcs (ch 1-17). S2 adapts the Kusunoki, Haqua, Chihiro and Jun Nagase arcs (ch 18-64) while skipping several manga-only conquest arcs within that span (Tsukiyo Kujyo ch 43-46, Yukie Marui 47-49, Minami Ikoma 50-53). The TV anime then skips chapters 65-113 before the Goddesses season, which adapts the Old Conquest (Goddess) arc and Mai-High Festival -- the goddess hunt / Hell arc (ch 114-189); a TV-only viewer resumes reading at chapter 190. Parts of the skipped block are covered only by OVAs: the two-episode Tenri-hen OVA adapts the Childhood Friend / Tenri arc (ch 57-65) and '4 Girls and an Idol' adapts ch 54-55, and the Goddesses season also re-adapts the Tenri arc and flashbacks in its opening episodes (eps 25-28). The manga's final Heart of Jupiter arc (the Mother/Hat goddess-war finale, ch 190-268) is unadapted. No theatrical films. Arc boundaries are approximate.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 17], - "arc": "Season 1: Conquest intro arcs -- Ayumi, Mio, Kanon & Shiori" - }, - { - "episodes": [13, 24], - "chapters": [18, 64], - "arc": "Season 2 (II): Kusunoki, Haqua, Chihiro & Jun Nagase arcs (manga-only conquest arcs skipped)" - }, - { - "episodes": [25, 36], - "chapters": [114, 189], - "arc": "Goddesses (Megami-hen): Old Conquest / Goddess arc & Mai-High Festival (chapters 65-113 skipped by TV; partly in OVAs)" - }, - { - "chapters": [190, 268], - "arc": "Heart of Jupiter arc -- final Mother/Hat goddess-war finale (unadapted)" - } - ] -} diff --git a/src/data/mappings/world-trigger.json b/src/data/mappings/world-trigger.json deleted file mode 100644 index 004cbc9..0000000 --- a/src/data/mappings/world-trigger.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 20729, - "anilistMangaId": 78151, - "title": "World Trigger", - "sourceNotes": "Cumulative episodes across three cours: Season 1 (2014-2016, 73 eps) + Season 2 (2021, eps 74-85) + Season 3 (2021-2022, eps 86-99) = 99 total. Season 1 contains an anime-original Fugitive Arc (eps 48-63) that adapts no manga chapters; it is omitted, producing a gap in episode numbering. Per the animefillerguide episode-to-chapter conversion: S1 reaches ~chapter 124, S2 adapts ~ch 120-160 (light recap overlap at its start), and S3 covers ~ch 160-196 with episode 99 ending near ch 196. Manga ongoing: latest published chapter 262 (June 2026). The Away / Expedition Selection Test arc (ch 197-262+) is unadapted and listed chapters-only. Arc boundaries within S1 span several arcs continuously and are approximate — refine via PR.", - "mappings": [ - { - "episodes": [1, 47], - "chapters": [1, 64], - "arc": "Introduction / Large-Scale Invasion (Aftokrator) Arc" - }, - { - "episodes": [64, 73], - "chapters": [65, 124], - "arc": "Large-Scale Invasion finale into B-Rank Wars (start)" - }, - { - "episodes": [74, 85], - "chapters": [125, 160], - "arc": "B-Rank Wars / Rank Wars Arc (Season 2)" - }, - { - "episodes": [86, 99], - "chapters": [161, 196], - "arc": "B-Rank Wars / Rank Wars Arc (Season 3 finale)" - }, - { - "chapters": [197, 262], - "arc": "Away / Expedition Selection Test Arc (ongoing, current ch 262)" - } - ] -} diff --git a/src/data/mappings/worldend-sukasuka.json b/src/data/mappings/worldend-sukasuka.json deleted file mode 100644 index adf294c..0000000 --- a/src/data/mappings/worldend-sukasuka.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "anilistAnimeId": 21860, - "anilistMangaId": 87284, - "title": "WorldEnd: What are you doing at the end of the world? Are you busy? Will you save us?", - "sourceNotes": "Single-cour 12-episode adaptation (Spring 2017) of Akira Kareno's light novel \"Shuumatsu Nani Shitemasu ka?\" (SukaSuka). LN-based, so ranges are mapped by volume against the source's AniList NOVEL entry (id 87284), which reports 25 chapters across 5 volumes (5 chapters/volume). The anime adapts only volumes 1-3 (chapters 1-15); volumes 4-5 (chapters 16-25) of the original series were never animated, and the sequel SukaMoka series is unadapted. Per-volume episode boundaries are approximate — the anime condenses and re-weights the source toward Chtholly's perspective, and no episode-to-chapter guide exists, so splits are estimated at ~4 episodes per volume. Original LN series complete at 5 volumes; sequel SukaMoka complete at 11 volumes.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 5], - "arc": "Volume 1" - }, - { - "episodes": [5, 8], - "chapters": [6, 10], - "arc": "Volume 2" - }, - { - "episodes": [9, 12], - "chapters": [11, 15], - "arc": "Volume 3" - }, - { - "chapters": [16, 20], - "arc": "Volume 4 (unadapted)" - }, - { - "chapters": [21, 25], - "arc": "Volume 5 (unadapted)" - } - ] -} diff --git a/src/data/mappings/worlds-end-harem.json b/src/data/mappings/worlds-end-harem.json deleted file mode 100644 index 400661f..0000000 --- a/src/data/mappings/worlds-end-harem.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "anilistAnimeId": 118465, - "anilistMangaId": 87260, - "title": "World's End Harem", - "sourceNotes": "11-episode 2021-2022 anime adapts the first part of LINK's manga (12 vols, 87 ch, complete since 2020) up through ch.54 'Reunion' in Vol.8. Arc boundaries are inferred from matching episode/volume titles (ep2 'Two Women' = Vol.2's title; ep8 'Revenge' = Vol.6's title) since no official per-episode guide exists; ranges within the anime's run are APPROXIMATE. The sequel manga 'World's End Harem: After World' (AniList id 133871) and spin-off titles (Fantasia, Britannia Lumiere) continue/branch the story and are out of scope for this mapping.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 14], - "arc": "Cold Sleep & The New World (Vols. 1-2)" - }, - { - "episodes": [3, 5], - "chapters": [15, 28], - "arc": "Academy Secrets & Assassination Plots (Vols. 3-4)" - }, - { - "episodes": [6, 8], - "chapters": [29, 41], - "arc": "Refugee District Conspiracy & Revenge (Vols. 5-6)" - }, - { - "episodes": [9, 11], - "chapters": [42, 54], - "arc": "World Headquarters Plot & Reunion with Elisa (Vols. 7-8)" - }, - { - "chapters": [55, 87], - "arc": "Unadapted Part 1 finale (Vols. 8-12)" - } - ] -} diff --git a/src/data/mappings/worlds-finest-assassin.json b/src/data/mappings/worlds-finest-assassin.json deleted file mode 100644 index e6852d9..0000000 --- a/src/data/mappings/worlds-finest-assassin.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 129898, - "anilistMangaId": 107603, - "title": "The World's Finest Assassin Gets Reincarnated in Another World as an Aristocrat", - "sourceNotes": "12-ep S1 anime (2021) adapts the manga of Tougetsu Hamada (orig. light novel by Rui Tsukiyo). The finale (ep 12) ends at manga ch 23 plus the epilogue, covering roughly LN vols 1-3. Manga ongoing (current ch ~43 / 9 vols, English via MangaDex mid-2026; AniList lists chapters as null). Per-episode chapter boundaries are approximate beyond the confirmed ep-12 = ch-23 endpoint, so groupings are coarse. Resume reading at ch 24.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 6], - "arc": "Reincarnation & Childhood Training (Tuatha Dé arts, magic, Dia)" - }, - { - "episodes": [4, 5], - "chapters": [7, 10], - "arc": "The Goddess's Mission & Assassin Qualification" - }, - { - "episodes": [6, 7], - "chapters": [11, 14], - "arc": "Building the Network (Tarte & Maha)" - }, - { - "episodes": [8, 10], - "chapters": [15, 19], - "arc": "Royal Academy & the Hero Epona" - }, - { - "episodes": [11, 12], - "chapters": [20, 23], - "arc": "The Hero Subjugation (Setanta & the God Spear; incl. epilogue)" - }, - { - "chapters": [24, 43], - "arc": "Post-anime (ongoing, unadapted)" - } - ] -} diff --git a/src/data/mappings/wotakoi.json b/src/data/mappings/wotakoi.json deleted file mode 100644 index a3edde6..0000000 --- a/src/data/mappings/wotakoi.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 99578, - "anilistMangaId": 86717, - "title": "Wotakoi: Love is Hard for Otaku", - "sourceNotes": "Single-season anime (11 eps, 2018). Paired with Fujita's manga (AniList id 86717), complete at 11 volumes (Comic POOL, ended July 2021); AniList counts 115 short web 'chapters' (other sources cite ~82 main numbered chapters). The anime is episodic and adapts roughly volumes 1-3 (through ~chapter 28), so boundaries are approximate.", - "mappings": [ - { - "episodes": [1, 11], - "chapters": [1, 28], - "arc": "Narumi & Hirotaka / Hanako & Kabakura (vols 1-3)" - }, - { - "chapters": [29, 115], - "arc": "Later chapters (vols 4-11; manga complete, unadapted by TV)" - } - ] -} diff --git a/src/data/mappings/wrong-way-to-use-healing-magic.json b/src/data/mappings/wrong-way-to-use-healing-magic.json deleted file mode 100644 index c7053dc..0000000 --- a/src/data/mappings/wrong-way-to-use-healing-magic.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "anilistAnimeId": 137908, - "anilistMangaId": 96942, - "title": "The Wrong Way to Use Healing Magic", - "sourceNotes": "Single-cour 13-episode 2024 TV anime (Studio Add / Shin-Ei). Source is Kurokata's light novel (AniList id 96942, NOVEL format), complete at 12 volumes (2016-2020). The separate Reki Kugayama manga adaptation (AniList id 99775) lags far behind the anime and AniList lists no chapter count for it, so this mapping uses LIGHT-NOVEL VOLUME numbers as the 'chapters' unit (same approach as arifureta.json / cheat-skill.json). Community episode-to-source guides confirm the anime adapts LN vols 1-2 and a reader resumes at vol 3. Vol 1 covers the otherworld summoning and the Rescue Team's hellish training; vol 2 covers Usato's first battle in the demon-army war, culminating in the Black Knight fight. Per-volume episode boundaries are approximate. A Season 2 has been announced (AniList id 179981, not yet released) and is not mapped here. No theatrical films.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 1], - "arc": "Otherworld Summoning & the Rescue Team's Training from Hell (LN vol 1)" - }, - { - "episodes": [5, 13], - "chapters": [2, 2], - "arc": "The Demon Lord's Army Invasion & the Black Knight (LN vol 2)" - }, - { - "chapters": [3, 12], - "arc": "Beyond the Anime (unadapted LN vols 3-12)" - } - ] -} diff --git a/src/data/mappings/ya-boy-kongming.json b/src/data/mappings/ya-boy-kongming.json deleted file mode 100644 index 65525d7..0000000 --- a/src/data/mappings/ya-boy-kongming.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "anilistAnimeId": 141774, - "anilistMangaId": 123034, - "title": "Ya Boy Kongming!", - "sourceNotes": "The 12-episode TV anime (2022) adapts manga chapters 1-28 with no filler, ending after the Battle of 109 (AZALEA rivalry) where episode 12 closes out chapter 28; readers continue at chapter 29. Manga is ongoing (Comic Days / Kodansha); latest serialized chapter is ~167 as of mid-2026, with 25 tankobon volumes collected (Vol. 25, May 2026). Chapters 29-167 are the unadapted tail. The 'Road to Summer Sonia' film is a recap compilation of chapters 1-29 and is excluded. Arc names are the Fandom wiki's (labelled unofficial); chapter ranges for the anime-covered arcs (1-28) are wiki-confirmed, while post-anime arc ranges are interpolated from the volume-to-chapter table and are approximate (+/- 1-2 chapters).", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 4], - "arc": "Introduction / Lady's Ready Night (Kongming meets Eiko, becomes her tactician)" - }, - { - "episodes": [3, 6], - "chapters": [5, 16], - "arc": "Yoyogi Festival / MC Battle (recruiting and reigniting Kabe-Taijin)" - }, - { - "episodes": [7, 12], - "chapters": [17, 28], - "arc": "Battle of 109 (Eiko + Kabe-Taijin vs. AZALEA)" - }, - { - "chapters": [29, 46], - "arc": "Wakatsuki Siblings / Interlude (unadapted)" - }, - { - "chapters": [47, 90], - "arc": "Kyoto Festival / Fourth Kingdom (unadapted)" - }, - { "chapters": [91, 122], "arc": "Arabesque / Hospital (unadapted)" }, - { - "chapters": [123, 167], - "arc": "Summer Sonia / Solo Concert / Rock Battle Japan (unadapted, ongoing)" - } - ] -} diff --git a/src/data/mappings/yakuzas-guide-to-babysitting.json b/src/data/mappings/yakuzas-guide-to-babysitting.json deleted file mode 100644 index 866550e..0000000 --- a/src/data/mappings/yakuzas-guide-to-babysitting.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 138882, - "anilistMangaId": 107896, - "title": "The Yakuza's Guide to Babysitting", - "sourceNotes": "Single-cour 12-episode TV anime (Feel/Gaina, 2022). Manga ongoing (16 tankobon volumes, current ch. ~64 as of 2026; AniList lists no fixed chapter count for the ongoing series). Fan continue-reading guides point viewers to resume the manga at chapter 37 after the anime, putting the season's coverage at chapters 1-36. No distinct named story arcs are used by the source material, so broad season-based entries are used instead.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 36], - "arc": "Season 1" - }, - { - "chapters": [37, 64], - "arc": "Unadapted (manga continues, approximate)" - } - ] -} diff --git a/src/data/mappings/yamada-and-the-seven-witches.json b/src/data/mappings/yamada-and-the-seven-witches.json deleted file mode 100644 index 6eb582a..0000000 --- a/src/data/mappings/yamada-and-the-seven-witches.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "anilistAnimeId": 20966, - "anilistMangaId": 65003, - "title": "Yamada-kun and the Seven Witches", - "sourceNotes": "S1 anime (12 eps, 2015, LIDEN FILMS) adapts manga chapters 1-90 — the first 'Seven Witches' saga, ending with all seven original witches losing their powers (Witch Hunting arc concludes ~ch 89); resume reading at ch 91. The anime covers 5 of Volume 11's 9 chapters (86-90). Paired with Miki Yoshikawa's complete manga: 243 numbered story chapters across 28 volumes (Jun 2012 - Apr 2017); AniList counts 246 because it lists ~3 bonus/omake chapters separately, so the final tail extends to 246. The 'Student Council election' belongs to the unadapted tail, not the anime: the Student Council Formation arc begins ch 91 and the election between Tamaki and Ichijo (Second Witch War) is ~ch 169. OVA/ONA shorts and the live-action drama/film are excluded. Tail arc boundaries are approximate.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 90], - "arc": "Supernatural Studies Club Restoration → Witch Hunting (First Witch War; anime portion)" - }, - { - "chapters": [91, 164], - "arc": "Student Council Formation → Seven New Witches → Winter Break" - }, - { - "chapters": [165, 246], - "arc": "Second Witch War (student council election) → Stolen Notes → Graduation finale (ch 244-246 are bonus chapters)" - } - ] -} diff --git a/src/data/mappings/yona-of-the-dawn.json b/src/data/mappings/yona-of-the-dawn.json deleted file mode 100644 index 6271664..0000000 --- a/src/data/mappings/yona-of-the-dawn.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "anilistAnimeId": 20770, - "anilistMangaId": 51525, - "title": "Yona of the Dawn", - "sourceNotes": "Anime complete at 24 episodes (2014-2015), faithfully adapting ch 1-47 (no filler). Manga concluded December 2025 at 47 volumes (~280 chapters; AniList chapter count not yet finalized). Post-anime arcs (Kai Empire, Sky Tribe rebellion, Final Battle) are unadapted.", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 10], - "arc": "Hiryuu Castle / Yona's Flight" - }, - { - "episodes": [5, 12], - "chapters": [11, 25], - "arc": "Gathering the Four Dragons" - }, - { "episodes": [13, 18], "chapters": [26, 34], "arc": "Awa Pirates" }, - { - "episodes": [19, 24], - "chapters": [35, 47], - "arc": "Fire Tribe / Sui Province" - }, - { - "chapters": [48, 280], - "arc": "Kai Empire / Sky Tribe Rebellion / Final Arc (unadapted)" - } - ] -} diff --git a/src/data/mappings/yosuga-no-sora.json b/src/data/mappings/yosuga-no-sora.json deleted file mode 100644 index 7bbede8..0000000 --- a/src/data/mappings/yosuga-no-sora.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "anilistAnimeId": 8861, - "anilistMangaId": 45821, - "title": "Yosuga no Sora: In Solitude Where We are Least Alone", - "sourceNotes": "Single 12-episode 2010 TV series (no sequel seasons, so episode numbers are already absolute). Source is CUFFS' 2008 visual novel Yosuga no Sora, which has no AniList media entry and no linear chapter numbering, so mappings use the VN's route (branch) structure as the \"chapter\" basis: 1=Common route, 2=Kazuha route, 3=Akira route, 4=Nao route, 5=Sora route. anilistMangaId points to the only printed AniList relation (id 45821), a 14-chapter manga that is a minor side-adaptation covering essentially the Sora/incest route only, not the full VN. The anime is an omnibus: episodes 1-2 form a shared common setup, then it branches per heroine (unique route episodes 3-4 Kazuha, 5-6 Akira, 8-9 Nao, 10-12 Sora, with ep 7 as the Nao/Sora foundation). Motoka Nogisaka's route appears only as comedic super-deformed omake segments at the end of each episode and is not tracked as a feature arc here. Route boundaries are approximate since the branches share early episodes.", - "mappings": [ - { - "episodes": [1, 2], - "chapters": [1, 1], - "arc": "Common Route" - }, - { - "episodes": [3, 4], - "chapters": [2, 2], - "arc": "Kazuha Migiwa Route" - }, - { - "episodes": [5, 6], - "chapters": [3, 3], - "arc": "Akira Amatsume Route" - }, - { - "episodes": [7, 9], - "chapters": [4, 4], - "arc": "Nao Yorihime Route" - }, - { - "episodes": [10, 12], - "chapters": [5, 5], - "arc": "Sora Kasugano Route" - } - ] -} diff --git a/src/data/mappings/you-and-i-are-polar-opposites.json b/src/data/mappings/you-and-i-are-polar-opposites.json deleted file mode 100644 index f495e04..0000000 --- a/src/data/mappings/you-and-i-are-polar-opposites.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "anilistAnimeId": 184951, - "anilistMangaId": 147997, - "title": "You and I Are Polar Opposites", - "sourceNotes": "Season 1 (12 eps, Winter 2026, Lapin Track) is a faithful, zero-filler adaptation of Kocha Agasawa's Shonen Jump+ romance manga at roughly 2.5 chapters per episode, covering ch 1-31 (a viewer resumes reading at ch 32). The manga is complete: AniList lists 76 chapters across 8 volumes (the main story ran to ch 65, with the remainder being bonus/extra chapters). Season 2 (AniList id 210031, 13 eps, Summer 2026) adapts ch 32 onward, but its per-episode chapter boundaries are not yet documented, so the ch 32-76 remainder is listed as a chapters-only tail. Episode ranges are cumulative; S2 would begin at episode 13. Arc names are editorial groupings of this episodic slice-of-life romance, which has no official arc titles; the per-episode chapter mapping follows published episode guides.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 5], - "arc": "Opposites Attract: Suzuki & Tani Start Dating" - }, - { - "episodes": [4, 5], - "chapters": [6, 11], - "arc": "Summer Nights & the Friend Group" - }, - { - "episodes": [6, 6], - "chapters": [12, 14], - "arc": "Cultural Festival" - }, - { - "episodes": [7, 9], - "chapters": [15, 22], - "arc": "Autumn Feelings" - }, - { - "episodes": [10, 12], - "chapters": [23, 31], - "arc": "Class Trip (S1 Finale)" - }, - { - "chapters": [32, 76], - "arc": "Beyond the Anime (Season 2 onward)" - } - ] -} diff --git a/src/data/mappings/your-lie-in-april.json b/src/data/mappings/your-lie-in-april.json deleted file mode 100644 index 0c755c1..0000000 --- a/src/data/mappings/your-lie-in-april.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "anilistAnimeId": 20665, - "anilistMangaId": 67707, - "title": "Your Lie in April", - "sourceNotes": "The 22-episode TV anime adapts the COMPLETE manga: 44 chapters across 11 volumes (4 chapters per volume), ending with chapter 44 'Spring Breeze'. Cadence is a clean ~2 chapters per episode (22 x 2 = 44), anchored by near-identical episode/chapter titles. Arc boundaries follow the manga's competition structure; the cumulative ranges are accurate but individual episode boundaries may shift by ~1 chapter where the anime expanded competition sequences. The only film is a 2016 live-action movie (excluded, not anime); the OVA 'Moments' is a childhood side-story (excluded).", - "mappings": [ - { - "episodes": [1, 4], - "chapters": [1, 8], - "arc": "Meeting Kaori / Kousei returns to piano" - }, - { - "episodes": [5, 6], - "chapters": [9, 12], - "arc": "Towa Hall violin competition / Gala" - }, - { - "episodes": [7, 11], - "chapters": [13, 22], - "arc": "East Japan Piano Competition (vs. Emi & Takeshi)" - }, - { - "episodes": [12, 16], - "chapters": [23, 32], - "arc": "Gala concert & relationship arc / Kaori's hospitalization" - }, - { - "episodes": [17, 18], - "chapters": [33, 36], - "arc": "School festival (four-hands with Nagi)" - }, - { - "episodes": [19, 22], - "chapters": [37, 44], - "arc": "Final performance & Kaori's death / letter" - } - ] -} diff --git a/src/data/mappings/yowamushi-pedal.json b/src/data/mappings/yowamushi-pedal.json deleted file mode 100644 index 1d2d59e..0000000 --- a/src/data/mappings/yowamushi-pedal.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "anilistAnimeId": 18179, - "anilistMangaId": 53627, - "title": "Yowamushi Pedal", - "sourceNotes": "Cumulative episodes across S1 (38) + S2 Grande Road (24) + S3 New Generation (25) + S4 Glory Line (25) + S5 Limit Break (25) = 137 episodes. The five seasons cover RIDE.1-658, ending at the close of the 42nd (2nd-year) Summer Inter-High. Manga ongoing (~100 volumes / ~ch. 710 as of mid-2026); the entire Third Year Saga (ch. 659 onward) is unadapted. The manga decompresses heavily, so per-season chapter boundaries are approximate.", - "mappings": [ - { - "episodes": [1, 38], - "chapters": [1, 73], - "arc": "First Year Saga: Intro / 41st Inter-High Day 1" - }, - { - "episodes": [39, 62], - "chapters": [74, 181], - "arc": "41st Summer Inter-High Day 2-3 (Grande Road)" - }, - { - "episodes": [63, 87], - "chapters": [182, 266], - "arc": "Second Year Saga: 42nd Inter-High Begins (New Generation)" - }, - { - "episodes": [88, 112], - "chapters": [267, 471], - "arc": "42nd Summer Inter-High Day 1-3 Start (Glory Line)" - }, - { - "episodes": [113, 137], - "chapters": [472, 658], - "arc": "42nd Summer Inter-High Day 3 Conclusion (Limit Break)" - }, - { "chapters": [659, 710], "arc": "Third Year Saga (unadapted, ongoing)" } - ], - "movies": [ - { - "anilistId": 21114, - "title": "Yowamushi Pedal: The Movie", - "year": 2015, - "afterEpisode": 62, - "note": "Bridge film with manga-author-original content (the Kumamoto 'Country of Fire' Yamanami race on Mt. Aso), set after the 41st Inter-High between S2 and S3; no clean chapter span." - } - ] -} diff --git a/src/data/mappings/yu-yu-hakusho.json b/src/data/mappings/yu-yu-hakusho.json deleted file mode 100644 index f2d6c55..0000000 --- a/src/data/mappings/yu-yu-hakusho.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "anilistAnimeId": 392, - "anilistMangaId": 30053, - "title": "Yu Yu Hakusho", - "sourceNotes": "Anime complete at 112 episodes (1992-1995). Manga complete at 176 chapters (1990-1994). Four canonical sagas; anime is a faithful adaptation.", - "mappings": [ - { - "episodes": [1, 25], - "chapters": [1, 51], - "arc": "Spirit Detective Saga" - }, - { - "episodes": [26, 66], - "chapters": [52, 112], - "arc": "Dark Tournament Saga" - }, - { - "episodes": [67, 94], - "chapters": [113, 153], - "arc": "Chapter Black Saga" - }, - { "episodes": [95, 112], "chapters": [154, 176], "arc": "Three Kings Saga" } - ], - "movies": [ - { - "anilistId": 882, - "title": "Yu Yu Hakusho: The Movie", - "year": 1993, - "note": "Theatrical side story." - }, - { - "anilistId": 883, - "title": "Yu Yu Hakusho the Movie: Poltergeist Report", - "year": 1994, - "note": "Theatrical side story." - } - ] -} diff --git a/src/data/mappings/yugioh-duel-monsters.json b/src/data/mappings/yugioh-duel-monsters.json deleted file mode 100644 index 92bfd52..0000000 --- a/src/data/mappings/yugioh-duel-monsters.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "anilistAnimeId": 481, - "anilistMangaId": 30054, - "title": "Yu-Gi-Oh! Duel Monsters", - "sourceNotes": "Duel Monsters anime (224 eps, 2000-2004) adapts manga ch 60-343, skipping the early Shadow Games arc (manga ch 1-59) which was covered by the separate 1998 Toei anime. Manga complete at 343 ch / 38 vols. GX and later series are separate franchises with their own manga.", - "mappings": [ - { "episodes": [1, 49], "chapters": [60, 130], "arc": "Duelist Kingdom" }, - { - "episodes": [50, 97], - "chapters": [131, 199], - "arc": "Battle City Preliminaries" - }, - { - "episodes": [98, 144], - "chapters": [200, 247], - "arc": "Battle City Finals" - }, - { - "episodes": [145, 185], - "chapters": [248, 280], - "arc": "Virtual World / Doma (anime-heavy)" - }, - { - "episodes": [186, 224], - "chapters": [281, 343], - "arc": "Millennium World / Memory World" - } - ], - "movies": [ - { - "anilistId": 1894, - "title": "Yu-Gi-Oh! The Movie: Pyramid of Light", - "year": 2004, - "note": "Side story (anime-original)." - }, - { - "anilistId": 6951, - "title": "Yu-Gi-Oh!: Bonds Beyond Time", - "year": 2010, - "note": "Crossover film with GX and 5D's." - }, - { - "anilistId": 21265, - "title": "Yu-Gi-Oh!: The Dark Side of Dimensions", - "year": 2016, - "afterEpisode": 224, - "note": "Canon sequel film set after the manga's ending." - } - ] -} diff --git a/src/data/mappings/yuru-yuri.json b/src/data/mappings/yuru-yuri.json deleted file mode 100644 index 8dcfc0f..0000000 --- a/src/data/mappings/yuru-yuri.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "anilistAnimeId": 10495, - "anilistMangaId": 41593, - "title": "YuruYuri", - "sourceNotes": "Cumulative episodes across S1 (12) + S2 ‘♪♪’ (12) + S3 ‘San☆Hai!’ (12) = 36. Manga ongoing (current ch. 235; no new volume since 2022), an episodic 4-koma-adjacent gag comedy with no named story arcs — finishing all three TV seasons leaves off around chapter 98, after which the manga continues unadapted. OVAs/specials (Nachuyachumi!, Ten, MiniYuri) are bonus anime-original content not mapped to specific chapters; the Ōmuro-ke films are a separate spin-off manga/continuity and are excluded.", - "mappings": [ - { - "episodes": [1, 36], - "chapters": [1, 98], - "arc": "TV Series (Seasons 1-3)" - }, - { - "chapters": [99, 235], - "arc": "Post-anime material (manga-only, ongoing)" - } - ] -} diff --git a/src/data/mappings/yuuna-and-the-haunted-hot-springs.json b/src/data/mappings/yuuna-and-the-haunted-hot-springs.json deleted file mode 100644 index d827672..0000000 --- a/src/data/mappings/yuuna-and-the-haunted-hot-springs.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "anilistAnimeId": 100483, - "anilistMangaId": 87213, - "title": "Yuuna and the Haunted Hot Springs", - "sourceNotes": "Single 12-episode TV series (Xebec, 2018); manga by Tadahiro Miura is ongoing (222 chapters as of AniList). The anime is an ecchi harem adaptation that frequently interleaves and reorders manga chapters for pacing (e.g. episode 6 splices in chapter 19 alongside chapter 7), so boundaries below are APPROXIMATE and grouped by the manga's own named arcs rather than a strict linear chapter count; the anime adapts up to roughly chapter 29 by its finale, with some anime-original content in the last three episodes. The 4-episode OVA (AniList id 101581) is a separate, non-contiguous bonus release bundled with specific volumes (adapting scattered chapters like 12, 35-36, 99, and 141) and is excluded from this cumulative episode count. Manga is far ahead of the anime and the unadapted tail is included as chapters-only.", - "mappings": [ - { - "episodes": [1, 3], - "chapters": [1, 6], - "arc": "Yuragi Inn / Yukemuri High School Arc" - }, - { - "episodes": [4, 6], - "chapters": [7, 11], - "arc": "Nonko & the Youkai of Yuragi-sou" - }, - { "episodes": [7, 8], "chapters": [13, 16], "arc": "Ryuuga Family Arc" }, - { - "episodes": [9, 9], - "chapters": [17, 18], - "arc": "A Night at Yuragi Inn Arc" - }, - { - "episodes": [10, 12], - "chapters": [19, 29], - "arc": "Chisaki of the Yuragi Inn / Finale" - }, - { "chapters": [30, 222], "arc": "Unadapted (ongoing)" } - ] -} diff --git a/src/data/mappings/zom-100.json b/src/data/mappings/zom-100.json deleted file mode 100644 index 1dcc268..0000000 --- a/src/data/mappings/zom-100.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "anilistAnimeId": 159831, - "anilistMangaId": 104660, - "title": "Zom 100: Bucket List of the Dead", - "sourceNotes": "Single 12-episode TV season (2023). Manga by Haro Aso & Kotaro Takata (Monthly Sunday Gene-X) is ONGOING (roughly ch 88 / 22 volumes by mid-2026, with hiatuses). The anime adapts ch 1-22, concluding with the 'Hometown of the Dead' arc; everything after is an unadapted manga-only tail. Per-episode chapter boundaries are approximate (the anime's broadcast was heavily delayed). Only the 2023 live-action Netflix film exists — no animated film — so no movies are listed.", - "mappings": [ - { - "episodes": [1, 5], - "chapters": [1, 7], - "arc": "Tokyo Outbreak (Bucket List begins / Flight Attendants / Hero, vols 1-2)" - }, - { - "episodes": [6, 8], - "chapters": [8, 11], - "arc": "RV & Truck Stop (vol 3)" - }, - { - "episodes": [9, 12], - "chapters": [12, 22], - "arc": "Hot Springs & Hometown of the Dead (vols 4-6)" - }, - { - "chapters": [23, 88], - "arc": "Cross-Country journey onward (Spartathalon → Vaccine of the Dead) — manga only, ongoing" - } - ] -} diff --git a/src/data/mappings/zombie-land-saga.json b/src/data/mappings/zombie-land-saga.json deleted file mode 100644 index 35f3ce2..0000000 --- a/src/data/mappings/zombie-land-saga.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "anilistAnimeId": 103871, - "anilistMangaId": 104714, - "title": "ZOMBIE LAND SAGA", - "sourceNotes": "Original anime (12 episodes); the tie-in manga by Megumu Soramichi is complete at 30 chapters (4 volumes). The manga is a Kotaro-focused companion retelling, not a scene-for-scene adaptation: its first 4 chapters compile events already seen across the 12 TV episodes, while chapters 5-30 follow Kotaro's own original side-story (his search for 'Saga', the Three Wise Men, and the climactic battle) that runs parallel to, rather than adapting, the anime's S1 timeline. Chapter boundaries past ch. 4 are therefore approximate volume-level estimates. The 'Revenge' sequel (S2), 'Gaiden: The First Zombie' prequel manga, and the Anthology spin-off are separate adaptations and are out of scope here.", - "mappings": [ - { - "episodes": [1, 12], - "chapters": [1, 4], - "arc": "Franchouchou's Formation (compiled from the TV anime)" - }, - { "chapters": [5, 16], "arc": "Kotaro's Search for Saga (manga-original)" }, - { - "chapters": [17, 23], - "arc": "The Three Wise Men & the Battle for Saga (manga-original)" - }, - { "chapters": [24, 30], "arc": "Ekimae Fudosan (manga-original epilogue)" } - ] -} diff --git a/src/data/searchAliases.ts b/src/data/searchAliases.ts index b1f5a1a..63d1e50 100644 --- a/src/data/searchAliases.ts +++ b/src/data/searchAliases.ts @@ -1,43 +1,7 @@ -// Seeded from the `search_aliases` table at launch (see catalog fetch); these -// bundled defaults cover the first render before the catalog resolves. -const DEFAULT_ALIASES: Record = { - // concatenated titles AniList won't match without spaces - deathnote: "death note", - onepiece: "one piece", - spyfamily: "spy x family", - spyxfamily: "spy x family", - chainsawman: "chainsaw man", - demonslayer: "demon slayer", - attackontitan: "attack on titan", - myheroacademia: "my hero academia", - jujutsukaisen: "jujutsu kaisen", - fullmetalalchemist: "fullmetal alchemist", - bleach: "bleach", - blackclover: "black clover", - fairytail: "fairy tail", - mobpsycho: "mob psycho", - drstone: "dr. stone", - kaijuno8: "kaiju no. 8", - sakamotodays: "sakamoto days", - goldenkamuy: "golden kamuy", - - // common acronyms - aot: "attack on titan", - snk: "shingeki no kyojin", - mha: "my hero academia", - bnha: "boku no hero academia", - jjk: "jujutsu kaisen", - fmab: "fullmetal alchemist brotherhood", - fma: "fullmetal alchemist", - ohshc: "ouran high school host club", - ygo: "yu-gi-oh", - hxh: "hunter x hunter", - tbhk: "toilet-bound hanako-kun", - ksdk: "kaguya-sama love is war", -}; - -// Mutable so the catalog fetch can swap in the DB-backed table at runtime. -let aliases: Record = DEFAULT_ALIASES; +// Search aliases now live in the `search_aliases` table and are loaded at +// launch by the catalog fetch (see `useHydrateSearchAliases`). Until that +// resolves the table is empty and queries pass through unchanged. +let aliases: Record = {}; export function setSearchAliases(next: Record): void { aliases = next; diff --git a/src/data/top100-manifest.json b/src/data/top100-manifest.json deleted file mode 100644 index 71c827f..0000000 --- a/src/data/top100-manifest.json +++ /dev/null @@ -1,792 +0,0 @@ -[ - { - "animeId": 154587, - "animeTitle": "Frieren: Beyond Journey’s End", - "episodes": 28, - "mangaId": 118586, - "mangaTitle": "Frieren: Beyond Journey’s End", - "mangaChapters": null - }, - { - "animeId": 20996, - "animeTitle": "Gintama Season 3", - "episodes": 51, - "mangaId": 30044, - "mangaTitle": "Gin Tama", - "mangaChapters": 709 - }, - { - "animeId": 5114, - "animeTitle": "Fullmetal Alchemist: Brotherhood", - "episodes": 64, - "mangaId": 30025, - "mangaTitle": "Fullmetal Alchemist", - "mangaChapters": 116 - }, - { - "animeId": 104578, - "animeTitle": "Attack on Titan Season 3 Part 2", - "episodes": 10, - "mangaId": 53390, - "mangaTitle": "Attack on Titan", - "mangaChapters": 141 - }, - { - "animeId": 124194, - "animeTitle": "Fruits Basket The Final Season", - "episodes": 13, - "mangaId": 30102, - "mangaTitle": "Fruits Basket", - "mangaChapters": 137 - }, - { - "animeId": 11061, - "animeTitle": "Hunter x Hunter (2011)", - "episodes": 148, - "mangaId": 30026, - "mangaTitle": "Hunter x Hunter", - "mangaChapters": null - }, - { - "animeId": 9253, - "animeTitle": "Steins;Gate", - "episodes": 24, - "noMangaSource": true - }, - { - "animeId": 21745, - "animeTitle": "Owarimonogatari Second Season", - "episodes": 7, - "mangaId": 143747, - "mangaTitle": "Owarimonogatari: End Tale", - "mangaChapters": 117 - }, - { - "animeId": 15417, - "animeTitle": "Gintama Season 2 Part 2", - "episodes": 13, - "mangaId": 30044, - "mangaTitle": "Gin Tama", - "mangaChapters": 709 - }, - { - "animeId": 125367, - "animeTitle": "Kaguya-sama: Love is War -Ultra Romantic-", - "episodes": 13, - "mangaId": 86635, - "mangaTitle": "Kaguya-sama: Love is War", - "mangaChapters": 281 - }, - { - "animeId": 98478, - "animeTitle": "March comes in like a lion Season 2", - "episodes": 22, - "mangaId": 31224, - "mangaTitle": "March Comes in Like a Lion", - "mangaChapters": null - }, - { - "animeId": 9969, - "animeTitle": "Gintama Season 2", - "episodes": 51, - "mangaId": 30044, - "mangaTitle": "Gin Tama", - "mangaChapters": 709 - }, - { - "animeId": 97889, - "animeTitle": "Gintama Season 4", - "episodes": 12, - "mangaId": 30044, - "mangaTitle": "Gin Tama", - "mangaChapters": 709 - }, - { - "animeId": 2921, - "animeTitle": "Tomorrow's Joe 2", - "episodes": 47, - "mangaId": 31303, - "mangaTitle": "Ashita no Joe: Fighting for Tomorrow", - "mangaChapters": 171 - }, - { - "animeId": 176301, - "animeTitle": "The Apothecary Diaries Season 2", - "episodes": 24, - "mangaId": 99026, - "mangaTitle": "The Apothecary Diaries", - "mangaChapters": null - }, - { - "animeId": 116674, - "animeTitle": "BLEACH: Thousand-Year Blood War", - "episodes": 13, - "mangaId": 30012, - "mangaTitle": "Bleach", - "mangaChapters": 706 - }, - { - "animeId": 136430, - "animeTitle": "Vinland Saga Season 2", - "episodes": 24, - "mangaId": 30642, - "mangaTitle": "Vinland Saga", - "mangaChapters": 220 - }, - { - "animeId": 182255, - "animeTitle": "Frieren: Beyond Journey’s End Season 2", - "episodes": 10, - "mangaId": 118586, - "mangaTitle": "Frieren: Beyond Journey’s End", - "mangaChapters": null - }, - { - "animeId": 19, - "animeTitle": "Monster", - "episodes": 74, - "mangaId": 30001, - "mangaTitle": "Monster", - "mangaChapters": 162 - }, - { - "animeId": 161645, - "animeTitle": "The Apothecary Diaries", - "episodes": 24, - "mangaId": 99026, - "mangaTitle": "The Apothecary Diaries", - "mangaChapters": null - }, - { - "animeId": 17074, - "animeTitle": "Monogatari Series Second Season", - "episodes": 26, - "mangaId": 53751, - "mangaTitle": "Nekomonogatari: Cat Tale (White)", - "mangaChapters": 40 - }, - { - "animeId": 4181, - "animeTitle": "Clannad: After Story", - "episodes": 24, - "noMangaSource": true - }, - { - "animeId": 101338, - "animeTitle": "Mob Psycho 100 II", - "episodes": 13, - "mangaId": 85189, - "mangaTitle": "Mob Psycho 100", - "mangaChapters": 113 - }, - { - "animeId": 109731, - "animeTitle": "Sound! Euphonium 3", - "episodes": 13, - "noMangaSource": true - }, - { - "animeId": 101925, - "animeTitle": "Gintama.: Silver Soul Arc - Second Half War", - "episodes": 14, - "mangaId": 30044, - "mangaTitle": "Gin Tama", - "mangaChapters": 709 - }, - { - "animeId": 101348, - "animeTitle": "Vinland Saga", - "episodes": 24, - "mangaId": 30642, - "mangaTitle": "Vinland Saga", - "mangaChapters": 220 - }, - { - "animeId": 21, - "animeTitle": "ONE PIECE", - "episodes": null, - "mangaId": 96427, - "mangaTitle": "ONE PIECE: Loguetown-hen", - "mangaChapters": null - }, - { - "animeId": 177385, - "animeTitle": "Journal with Witch", - "episodes": 13, - "mangaId": 106331, - "mangaTitle": "Ikoku Nikki", - "mangaChapters": 62 - }, - { - "animeId": 21698, - "animeTitle": "HAIKYU!! 3rd Season", - "episodes": 10, - "mangaId": 65243, - "mangaTitle": "Haikyu!!", - "mangaChapters": 404 - }, - { - "animeId": 182896, - "animeTitle": "My Hero Academia FINAL SEASON", - "episodes": 11, - "mangaId": 85486, - "mangaTitle": "My Hero Academia", - "mangaChapters": 432 - }, - { - "animeId": 140439, - "animeTitle": "Mob Psycho 100 III", - "episodes": 12, - "mangaId": 85189, - "mangaTitle": "Mob Psycho 100", - "mangaChapters": 113 - }, - { - "animeId": 2904, - "animeTitle": "Code Geass: Lelouch of the Rebellion R2", - "episodes": 25, - "mangaId": 31528, - "mangaTitle": "Code Geass: Lelouch of the Rebellion", - "mangaChapters": 40 - }, - { - "animeId": 189046, - "animeTitle": "Re:ZERO -Starting Life in Another World- Season 4", - "episodes": 19, - "mangaId": 85737, - "mangaTitle": "Re:ZERO -Starting Life in Another World-", - "mangaChapters": null - }, - { - "animeId": 151384, - "animeTitle": "Kaguya-sama: Love is War -The First Kiss That Never Ends-", - "episodes": 4, - "mangaId": 86635, - "mangaTitle": "Kaguya-sama: Love is War", - "mangaChapters": 281 - }, - { - "animeId": 110277, - "animeTitle": "Attack on Titan Final Season", - "episodes": 16, - "mangaId": 53390, - "mangaTitle": "Attack on Titan", - "mangaChapters": 141 - }, - { - "animeId": 130003, - "animeTitle": "BOCCHI THE ROCK!", - "episodes": 12, - "mangaId": 111258, - "mangaTitle": "Bocchi the Rock!", - "mangaChapters": null - }, - { - "animeId": 131586, - "animeTitle": "86 EIGHTY-SIX Part 2", - "episodes": 12, - "mangaId": 98610, - "mangaTitle": "86―EIGHTY-SIX", - "mangaChapters": null - }, - { - "animeId": 263, - "animeTitle": "Hajime no Ippo: The Fighting!", - "episodes": 75, - "mangaId": 30007, - "mangaTitle": "Hajime no Ippo: Fighting Spirit!", - "mangaChapters": null - }, - { - "animeId": 131681, - "animeTitle": "Attack on Titan Final Season Part 2", - "episodes": 12, - "mangaId": 53390, - "mangaTitle": "Attack on Titan", - "mangaChapters": 141 - }, - { - "animeId": 166216, - "animeTitle": "The Dangers in My Heart Season 2", - "episodes": 13, - "mangaId": 101557, - "mangaTitle": "The Dangers in My Heart", - "mangaChapters": null - }, - { - "animeId": 145064, - "animeTitle": "JUJUTSU KAISEN Season 2", - "episodes": 23, - "mangaId": 101517, - "mangaTitle": "Jujutsu Kaisen", - "mangaChapters": 272 - }, - { - "animeId": 169755, - "animeTitle": "BLEACH: Thousand-Year Blood War - The Conflict", - "episodes": 14, - "mangaId": 30012, - "mangaTitle": "Bleach", - "mangaChapters": 706 - }, - { - "animeId": 21733, - "animeTitle": "Descending Stories: Showa Genroku Rakugo Shinju", - "episodes": 12, - "mangaId": 56704, - "mangaTitle": "Descending Stories: Showa Genroku Rakugo Shinju", - "mangaChapters": 32 - }, - { - "animeId": 20751, - "animeTitle": "MUSHI-SHI The Next Passage 2", - "episodes": 10, - "mangaId": 30418, - "mangaTitle": "Mushishi", - "mangaChapters": 50 - }, - { - "animeId": 100784, - "animeTitle": "Gintama.: Silver Soul Arc", - "episodes": 12, - "mangaId": 30044, - "mangaTitle": "Gin Tama", - "mangaChapters": 709 - }, - { - "animeId": 182587, - "animeTitle": "【OSHI NO KO】Season 3", - "episodes": 11, - "mangaId": 117195, - "mangaTitle": "[Oshi no Ko]", - "mangaChapters": 171 - }, - { - "animeId": 172463, - "animeTitle": "JUJUTSU KAISEN Season 3: The Culling Game Part 1", - "episodes": 12, - "mangaId": 101517, - "mangaTitle": "Jujutsu Kaisen", - "mangaChapters": 272 - }, - { - "animeId": 151514, - "animeTitle": "Orb: On the Movements of the Earth", - "episodes": 25, - "mangaId": 124139, - "mangaTitle": "Orb: On the Movements of the Earth", - "mangaChapters": 62 - }, - { - "animeId": 113108, - "animeTitle": "Kingdom Season 3", - "episodes": 26, - "mangaId": 46765, - "mangaTitle": "Kingdom", - "mangaChapters": null - }, - { - "animeId": 195240, - "animeTitle": "Umamusume: Cinderella Gray 2nd Cour", - "episodes": 10, - "mangaId": 119247, - "mangaTitle": "Uma Musume: Cinderella Gray", - "mangaChapters": 211 - }, - { - "animeId": 159322, - "animeTitle": "BLEACH: Thousand-Year Blood War - The Separation", - "episodes": 13, - "mangaId": 30012, - "mangaTitle": "Bleach", - "mangaChapters": 706 - }, - { - "animeId": 20992, - "animeTitle": "HAIKYU!! 2nd Season", - "episodes": 25, - "mangaId": 65243, - "mangaTitle": "Haikyu!!", - "mangaChapters": 404 - }, - { - "animeId": 99147, - "animeTitle": "Attack on Titan Season 3", - "episodes": 12, - "mangaId": 53390, - "mangaTitle": "Attack on Titan", - "mangaChapters": 141 - }, - { - "animeId": 3297, - "animeTitle": "ARIA The ORIGINATION", - "episodes": 13, - "mangaId": 30081, - "mangaTitle": "Aria", - "mangaChapters": 67 - }, - { - "animeId": 1, - "animeTitle": "Cowboy Bebop", - "episodes": 26, - "mangaId": 30173, - "mangaTitle": "Cowboy Bebop", - "mangaChapters": 11 - }, - { - "animeId": 142329, - "animeTitle": "Demon Slayer: Kimetsu no Yaiba Entertainment District Arc", - "episodes": 11, - "mangaId": 87216, - "mangaTitle": "Demon Slayer: Kimetsu no Yaiba", - "mangaChapters": 207 - }, - { - "animeId": 20607, - "animeTitle": "Ping Pong the Animation", - "episodes": 11, - "mangaId": 35744, - "mangaTitle": "Ping Pong", - "mangaChapters": 55 - }, - { - "animeId": 20595, - "animeTitle": "MUSHI-SHI The Next Passage", - "episodes": 10, - "mangaId": 30418, - "mangaTitle": "Mushishi", - "mangaChapters": 50 - }, - { - "animeId": 112641, - "animeTitle": "Kaguya-sama: Love is War?", - "episodes": 12, - "mangaId": 86635, - "mangaTitle": "Kaguya-sama: Love is War", - "mangaChapters": 281 - }, - { - "animeId": 111762, - "animeTitle": "Fruits Basket Season 2", - "episodes": 25, - "mangaId": 30102, - "mangaTitle": "Fruits Basket", - "mangaChapters": 137 - }, - { - "animeId": 21827, - "animeTitle": "Violet Evergarden", - "episodes": 13, - "mangaId": 97298, - "mangaTitle": "Violet Evergarden", - "mangaChapters": 13 - }, - { - "animeId": 5258, - "animeTitle": "Hajime no Ippo: The Fighting! New Challenger", - "episodes": 26, - "mangaId": 30007, - "mangaTitle": "Hajime no Ippo: Fighting Spirit!", - "mangaChapters": null - }, - { - "animeId": 114745, - "animeTitle": "Made in Abyss: The Golden City of the Scorching Sun", - "episodes": 12, - "mangaId": 86551, - "mangaTitle": "Made in Abyss", - "mangaChapters": null - }, - { - "animeId": 113538, - "animeTitle": "HAIKYU!! TO THE TOP Part 2", - "episodes": 12, - "mangaId": 65243, - "mangaTitle": "Haikyu!!", - "mangaChapters": 404 - }, - { - "animeId": 140350, - "animeTitle": "Kingdom Season 4", - "episodes": 26, - "mangaId": 46765, - "mangaTitle": "Kingdom", - "mangaChapters": null - }, - { - "animeId": 128547, - "animeTitle": "ODDTAXI", - "episodes": 13, - "mangaId": 128564, - "mangaTitle": "Odd Taxi", - "mangaChapters": 37 - }, - { - "animeId": 11665, - "animeTitle": "Natsume's Book of Friends Season 4", - "episodes": 13, - "mangaId": 31859, - "mangaTitle": "Natsume's Book of Friends", - "mangaChapters": null - }, - { - "animeId": 180516, - "animeTitle": "Umamusume: Cinderella Gray", - "episodes": 13, - "mangaId": 119247, - "mangaTitle": "Uma Musume: Cinderella Gray", - "mangaChapters": 211 - }, - { - "animeId": 163263, - "animeTitle": "Bungo Stray Dogs 5", - "episodes": 11, - "mangaId": 85307, - "mangaTitle": "Bungo Stray Dogs", - "mangaChapters": null - }, - { - "animeId": 155227, - "animeTitle": "Kingdom Season 5", - "episodes": 13, - "mangaId": 46765, - "mangaTitle": "Kingdom", - "mangaChapters": null - }, - { - "animeId": 97983, - "animeTitle": "Natsume's Book of Friends Season 6", - "episodes": 11, - "mangaId": 31859, - "mangaTitle": "Natsume's Book of Friends", - "mangaChapters": null - }, - { - "animeId": 16498, - "animeTitle": "Attack on Titan", - "episodes": 25, - "mangaId": 53390, - "mangaTitle": "Attack on Titan", - "mangaChapters": 141 - }, - { - "animeId": 877, - "animeTitle": "NANA", - "episodes": 47, - "mangaId": 30028, - "mangaTitle": "Nana", - "mangaChapters": null - }, - { - "animeId": 127720, - "animeTitle": "Mushoku Tensei: Jobless Reincarnation Cour 2", - "episodes": 12, - "mangaId": 85470, - "mangaTitle": "Mushoku Tensei: Jobless Reincarnation", - "mangaChapters": 334 - }, - { - "animeId": 1575, - "animeTitle": "Code Geass: Lelouch of the Rebellion", - "episodes": 25, - "mangaId": 31528, - "mangaTitle": "Code Geass: Lelouch of the Rebellion", - "mangaChapters": 40 - }, - { - "animeId": 166531, - "animeTitle": "Oshi no Ko Season 2", - "episodes": 13, - "mangaId": 117195, - "mangaTitle": "[Oshi no Ko]", - "mangaChapters": 171 - }, - { - "animeId": 20958, - "animeTitle": "Attack on Titan Season 2", - "episodes": 12, - "mangaId": 53390, - "mangaTitle": "Attack on Titan", - "mangaChapters": 141 - }, - { - "animeId": 2001, - "animeTitle": "Gurren Lagann", - "episodes": 27, - "mangaId": 31648, - "mangaTitle": "Tengen Toppa Gurren Lagann", - "mangaChapters": 65 - }, - { - "animeId": 181444, - "animeTitle": "The Fragrant Flower Blooms With Dignity", - "episodes": 13, - "mangaId": 140475, - "mangaTitle": "The Fragrant Flower Blooms With Dignity", - "mangaChapters": null - }, - { - "animeId": 918, - "animeTitle": "Gintama", - "episodes": 201, - "mangaId": 30044, - "mangaTitle": "Gin Tama", - "mangaChapters": 709 - }, - { - "animeId": 189117, - "animeTitle": "Dr. STONE SCIENCE FUTURE Cour 2", - "episodes": 12, - "mangaId": 98416, - "mangaTitle": "Dr. STONE", - "mangaChapters": 236 - }, - { - "animeId": 176496, - "animeTitle": "Solo Leveling Season 2 -Arise from the Shadow-", - "episodes": 13, - "mangaId": 105398, - "mangaTitle": "Solo Leveling", - "mangaChapters": 201 - }, - { - "animeId": 19647, - "animeTitle": "Hajime No Ippo: The Fighting! - Rising -", - "episodes": 25, - "mangaId": 30007, - "mangaTitle": "Hajime no Ippo: Fighting Spirit!", - "mangaChapters": null - }, - { - "animeId": 153518, - "animeTitle": "Delicious in Dungeon", - "episodes": 24, - "mangaId": 86082, - "mangaTitle": "Delicious in Dungeon", - "mangaChapters": 111 - }, - { - "animeId": 102883, - "animeTitle": "JoJo's Bizarre Adventure: Golden Wind", - "episodes": 39, - "mangaId": 33008, - "mangaTitle": "JoJo's Bizarre Adventure Part 5: Golden Wind", - "mangaChapters": 155 - }, - { - "animeId": 101215, - "animeTitle": "Chihayafuru 3", - "episodes": 24, - "mangaId": 43245, - "mangaTitle": "Chihayafuru", - "mangaChapters": 248 - }, - { - "animeId": 97986, - "animeTitle": "Made in Abyss", - "episodes": 13, - "mangaId": 86551, - "mangaTitle": "Made in Abyss", - "mangaChapters": null - }, - { - "animeId": 21262, - "animeTitle": "Owarimonogatari", - "episodes": 12, - "mangaId": 143747, - "mangaTitle": "Owarimonogatari: End Tale", - "mangaChapters": 117 - }, - { - "animeId": 7785, - "animeTitle": "The Tatami Galaxy", - "episodes": 11, - "noMangaSource": true - }, - { - "animeId": 457, - "animeTitle": "MUSHI-SHI", - "episodes": 26, - "mangaId": 30418, - "mangaTitle": "Mushishi", - "mangaChapters": 50 - }, - { - "animeId": 11741, - "animeTitle": "Fate/Zero Season 2", - "episodes": 12, - "mangaId": 33649, - "mangaTitle": "Fate/Zero", - "mangaChapters": 18 - }, - { - "animeId": 190840, - "animeTitle": "Kingdom Season 6", - "episodes": 13, - "mangaId": 46765, - "mangaTitle": "Kingdom", - "mangaChapters": null - }, - { - "animeId": 113415, - "animeTitle": "JUJUTSU KAISEN", - "episodes": 24, - "mangaId": 101517, - "mangaTitle": "Jujutsu Kaisen", - "mangaChapters": 272 - }, - { - "animeId": 21450, - "animeTitle": "JoJo's Bizarre Adventure: Diamond is Unbreakable", - "episodes": 39, - "mangaId": 33006, - "mangaTitle": "JoJo's Bizarre Adventure Part 4: Diamond is Unbreakable", - "mangaChapters": 174 - }, - { - "animeId": 245, - "animeTitle": "GTO: Great Teacher Onizuka", - "episodes": 43, - "mangaId": 30336, - "mangaTitle": "GTO: Great Teacher Onizuka", - "mangaChapters": 208 - }, - { - "animeId": 166611, - "animeTitle": "Natsume's Book of Friends Season 7", - "episodes": 12, - "mangaId": 31859, - "mangaTitle": "Natsume's Book of Friends", - "mangaChapters": null - }, - { - "animeId": 21710, - "animeTitle": "Natsume's Book of Friends Season 5", - "episodes": 11, - "mangaId": 31859, - "mangaTitle": "Natsume's Book of Friends", - "mangaChapters": null - }, - { - "animeId": 21507, - "animeTitle": "Mob Psycho 100", - "episodes": 12, - "mangaId": 85189, - "mangaTitle": "Mob Psycho 100", - "mangaChapters": 113 - }, - { - "animeId": 21127, - "animeTitle": "Steins;Gate 0", - "episodes": 23, - "noMangaSource": true - }, - { - "animeId": 10379, - "animeTitle": "Natsume's Book of Friends Season 3", - "episodes": 13, - "mangaId": 31859, - "mangaTitle": "Natsume's Book of Friends", - "mangaChapters": null - } -] From 1ebed34cdd3d690f5cb0f6c7fb0261dafc485e92 Mon Sep 17 00:00:00 2001 From: CJ Rivas Date: Wed, 15 Jul 2026 23:44:38 -0400 Subject: [PATCH 12/12] KSN: update README for the Supabase-backed catalog - Document mappings/aliases/genre filters living in Supabase - Rewrite "Contributing a mapping" as a SQL insert into `series` + `arc_mappings` instead of a JSON file + `index.ts` import - Refresh the stack list and project layout --- README.md | 44 +++++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 3ca5c7d..7838e55 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,8 @@ Drill into a single arc to see per-episode ↔ per-chapter alignment: - **Expo Router** for file-based universal routes - **TanStack Query** + **Zustand** - **AniList GraphQL** for anime/manga metadata -- Bundled JSON in `src/data/mappings/` for episode↔chapter alignments +- **Supabase** (Postgres + RLS) for episode↔chapter mappings, search aliases, + genre filters, and synced user progress/preferences - **Tauri 2** for desktop binaries ## Getting started @@ -80,24 +81,31 @@ Desktop is shipped via Tauri 2 wrapping the Expo web export. One-time setup: ## Contributing a mapping +Mappings live in Supabase — the `series`, `arc_mappings`, and `movies` tables +(see `supabase/migrations/`) — not in the repo, so a new or corrected mapping +reaches every client on next launch with no app release. The catalog tables are +read-only under RLS; write via the Supabase dashboard, SQL editor, or a +service-role script. + 1. Find the AniList anime ID and manga ID for the series. -2. Add a file at `src/data/mappings/.json` following the schema in `src/types/index.ts` → `SeriesMapping`. -3. Import it in `src/data/index.ts`. - -The mapping schema: - -```json -{ - "anilistAnimeId": 21, - "anilistMangaId": 30013, - "title": "One Piece", - "mappings": [ - { "episodes": [1, 3], "chapters": [1, 7], "arc": "Romance Dawn" } - ] -} +2. Insert a `series` row and its arcs: + +```sql +with s as ( + insert into series (anilist_anime_id, anilist_manga_id, title) + values (21, 30013, 'One Piece') + returning id +) +insert into arc_mappings + (series_id, position, episode_start, episode_end, chapter_start, chapter_end, arc) +select s.id, v.* +from s, (values + (0, 1, 3, 1, 7, 'Romance Dawn') +) as v(position, episode_start, episode_end, chapter_start, chapter_end, arc); ``` -Episode and chapter ranges are inclusive. +Episode and chapter ranges are inclusive; omit `episode_start`/`episode_end` +for manga-only arcs. ## Project layout @@ -109,8 +117,10 @@ app/ # Expo Router routes src/ api/anilist.ts # GraphQL client components/ # SeriesCard, EpisodeChapterRail - data/ # bundled mappings + lookup helpers + data/ # Supabase catalog fetch + mapping helpers + state/ # zustand stores + cloud sync types/ # shared TS types +supabase/migrations/ # database schema docs/superpowers/specs/ # design docs src-tauri/ # desktop wrapper (added after web bundle works) ```