Image hosts are now server storage (30 days), litterbox (<=72h, direct from the browser), catbox (permanent) and direct. The server becomes one web-standard fetch handler with Cloudflare Workers and Bun.serve entries, and an optional shared password gates every route, assets included. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44 lines
2.5 KiB
Markdown
44 lines
2.5 KiB
Markdown
# Architecture
|
|
|
|
How `mangabaka-seeder` is built today. Update in the same commit as any structural change.
|
|
|
|
## Overview
|
|
No code exists yet. The design is in [`specs/001-webtoons-covers.md`](specs/001-webtoons-covers.md):
|
|
one pure TypeScript core (`src/core/`) that turns a MangaBaka series link and a Webtoons series
|
|
link into a cover submission, used by three front ends — a static page served by a small,
|
|
optionally password-gated server that runs on Cloudflare Workers or self-hosted under Bun
|
|
(primary), a userscript, and later a Bun CLI. Replace this section with reality as modules land.
|
|
|
|
## Map (planned — spec §4)
|
|
| Path | Responsibility |
|
|
|---|---|
|
|
| `src/core/` | Pure pipeline: sources, Wayback history, image inspection, dedupe, seed, MangaBaka client. No DOM, Bun, Node or `GM_*` APIs. |
|
|
| `src/web/` | Static page UI. |
|
|
| `src/server/` | Portable `fetch` handler (`app.ts`) + password gate; entries `worker.ts` (Cloudflare, R2) and `bun.ts` (self-hosted, S3). Static assets, `/api/fetch` allowlisted proxy, `/api/upload`. |
|
|
| `src/userscript/` | Userscript on mangabaka.org; network via `GM_xmlhttpRequest`. |
|
|
| `src/cli/` | Later: Bun CLI. |
|
|
| `test/fixtures/` | Saved real responses; tests never hit the network. |
|
|
|
|
## Data flow
|
|
Links → series id + `source.resolve` → current + Wayback candidates → inspect (bytes, size,
|
|
sha256) → dedupe against MangaBaka → seed → user reviews → rehost (explicit) → submit or manual entry.
|
|
|
|
## External dependencies
|
|
| Service | Reached via | If unavailable |
|
|
|---|---|---|
|
|
| `api.mangabaka.org` | direct (CORS open) | Nothing works. |
|
|
| Webtoons HTML / `swebtoon-phinf.pstatic.net` | server proxy or `GM_xmlhttpRequest` | Nothing works. |
|
|
| Wayback (`web.archive.org`) | same | Warning; current covers only. |
|
|
| Server storage (R2 binding or S3 bucket) | server | `server` host hidden; litterbox/catbox/direct still work. |
|
|
| litterbox / catbox | browser directly (litterbox), server or `GM_xmlhttpRequest` (catbox) | That host fails; others still work. |
|
|
|
|
## Invariants
|
|
- `src/core/` never imports from `web/`, `server/`, `userscript/` or `cli/`.
|
|
- The MangaBaka token is only ever sent to `api.mangabaka.org`, never through our server.
|
|
- With `MBSEED_PASSWORD` set, every route except `/login` requires a session (or Bearer password).
|
|
- Nothing is uploaded or submitted without an explicit user action; saves use `save_mode: "review"`.
|
|
- `/api/fetch` only fetches allowlisted hosts; `/api/upload` only takes a source URL, never bytes.
|
|
|
|
## Known rough edges
|
|
See the open questions in spec §7 and [`TODO.md`](TODO.md).
|