# MangaDex Wrapper Wrapper Node.js (ESM) untuk API publik MangaDex. **Tanpa API key.** Bisa dipakai sebagai CLI atau module. ```bash npm install axios # package.json harus ada: "type": "module" ``` --- ## Konsep MangaDex (wajib dibaca) Di situs manga biasa biasanya: ``` 1 Judul └─ Chapter 1, 2, 3, ... (berurutan, 1 bahasa) ``` Di **MangaDex** strukturnya beda: ``` 1 Manga (1 UUID) ├─ Chapter 1 EN Group A pages: 30 ├─ Chapter 1 EN Group B pages: 28 ← nomor sama, group beda ├─ Chapter 1 ID Group C pages: 30 ├─ Chapter 1 EN Webnovel pages: 0 ← external, tidak bisa di-read └─ Chapter 2 EN Group A pages: 25 ``` Artinya: | Istilah | Arti di MangaDex | |---------|------------------| | **manga id** | ID unik 1 judul/series (UUID) | | **chapter id** | ID unik **1 upload** chapter (bukan nomor chapter) | | **chapter** (nomor) | "1", "2", "10.5" — bisa dobel karena banyak group/bahasa | | **pages** | Jumlah gambar. `0` = tidak ada file di MD (external/official) | | **lang** | Bahasa terjemahan: `en`, `id`, `ja`, ... | **Alur yang benar:** ``` search / home ↓ dapat manga id detail ↓ info judul chapters --lang id ↓ dapat chapter id (pilih yang pages > 0) read ↓ dapat URL gambar ``` Jangan harap `detail` mengembalikan daftar chapter. Jangan pakai nomor chapter ("1", "2") untuk `read` — harus **UUID chapter**. --- ## CLI cepat ```bash node mangadex.js home --limit 5 --pretty node mangadex.js search "one piece" --limit 5 --pretty node mangadex.js detail --pretty node mangadex.js chapters --lang en --limit 20 --pretty node mangadex.js read --pretty ``` ### Semua command | Command | Input | Output | |---------|-------|--------| | `home` | — | popular + latest + recent | | `search` | `"judul"` | list manga | | `detail` | manga-id | 1 manga (judul, cover, tags, ...) | | `chapters` | manga-id | list chapter **bisa dibaca** (pages > 0) | | `read` | chapter-id | `{ count, urls: [...] }` gambar | | `popular` | — | manga populer | | `recent` | — | manga baru | | `latest` | — | chapter terbaru (pages > 0) | | `allchapters` | manga-id | semua chapter (auto page) | | `chapter` | chapter-id | meta 1 chapter | | `covers` | manga-id | cover volumes | | `tags` | — | semua tag | | `stats` | manga-id | follows & rating | | `random` | — | manga acak | ### Options | Flag | Default | Fungsi | |------|---------|--------| | `--limit ` | 20 | jumlah item | | `--offset ` | 0 | geser halaman | | `--lang ` | en | filter bahasa (`en`, `id`, `ja`, ...) | | `--quality ` | data | `data` (asli) / `data-saver` (kecil) | | `--empty` | off | ikutkan chapter pages=0 / external | | `--pretty` | off | JSON rapi | --- ## Contoh lengkap (copy-paste) ### 1) Cari judul ```bash node mangadex.js search "frieren" --limit 3 --pretty ``` Ambil `"id"` dari hasil, misalnya: `b0b721ff-c388-4486-aa0f-c2b0bb321512` ### 2) Lihat detail ```bash node mangadex.js detail b0b721ff-c388-4486-aa0f-c2b0bb321512 --pretty ``` ### 3) List chapter (pilih bahasa) ```bash # English node mangadex.js chapters b0b721ff-c388-4486-aa0f-c2b0bb321512 --lang en --limit 10 --pretty # Indonesia node mangadex.js chapters b0b721ff-c388-4486-aa0f-c2b0bb321512 --lang id --limit 10 --pretty ``` Hasil contoh: ```json { "data": [ { "id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", "chapter": "1", "volume": "1", "title": null, "lang": "en", "pages": 30, "groups": ["Some Scans"] } ], "total": 100, "limit": 10, "offset": 0 } ``` - Pakai field **`"id"`** (UUID) untuk `read` - Abaikan field `"chapter"` (nomor) untuk pemanggilan API - Default **hanya** chapter dengan `pages > 0` (bisa dibaca di MD) Kalau hasil `"data": []`: - Bahasa itu tidak tersedia / di-takedown (sering terjadi di judul besar EN) - Coba `--lang id` atau bahasa lain - Atau cek judul lain dari `home` → `latest` (biasanya masih ada pages) ### 4) Baca chapter (URL gambar) ```bash node mangadex.js read aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee --pretty node mangadex.js read aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee --quality data-saver --pretty ``` Hasil: ```json { "chapterId": "...", "quality": "data", "count": 30, "urls": [ "https://....mangadex.network/data/.../1-xxx.png", "https://....mangadex.network/data/.../2-xxx.png" ] } ``` Buka URL **segera** — base URL MD@Home hanya valid sekitar 15 menit. Kalau 404, jalankan `read` lagi (wrapper auto-ganti server). ### 5) ID siap tes (dari feed terbaru) ```bash # chapter dengan pages > 0 node mangadex.js read 71f5daf9-f4f1-47a2-9041-264f6e0098fa --pretty # manga + chapters-nya node mangadex.js detail 9a1c3ea1-048b-4b97-b642-2f493039e771 --pretty node mangadex.js chapters 9a1c3ea1-048b-4b97-b642-2f493039e771 --lang en --limit 10 --pretty ``` --- ## Module (di kode) ```js import MangaDex from './mangadex.js'; const md = new MangaDex(); // cari const found = await md.search({ title: 'one piece', limit: 5 }); const mangaId = found.data[0].id; // detail const info = await md.detail(mangaId); // chapters 1 bahasa, hanya yang bisa dibaca const ch = await md.chapters(mangaId, { lang: 'en', limit: 50 }); // ch.data[0].id → chapter UUID // ch.data[0].chapter → nomor "1", "2", ... // semua chapter (pagination otomatis) const all = await md.allChapters(mangaId, { lang: 'id' }); // URL gambar const pages = await md.read(ch.data[0].id); // pages.urls → array string URL // ikutkan external / pages=0 const raw = await md.chapters(mangaId, { lang: 'en', includeEmpty: true, }); ``` ### Method ringkas ```js md.home({ limit, lang }) md.search({ title, limit, offset, lang, status }) md.detail(mangaId) md.chapters(mangaId, { limit, offset, lang, includeEmpty }) md.allChapters(mangaId, { lang, includeEmpty }) md.chapter(chapterId) md.read(chapterId, quality, { retries }) // quality: 'data' | 'data-saver' md.popular({ limit }) / md.recent({ limit }) / md.latest({ limit, lang }) md.covers(mangaId) / md.tags() / md.stats(mangaId) / md.random() ``` --- # EXAMPLE OUTPUT CHECKOUT [CLICK](https://pastefy.app/C0JzbNps/raw) ## FAQ **Q: Kenapa `chapters` kosong padahal judul terkenal?** A: Sering karena official takedown. English fan translation dihapus, sisa link external (`pages: 0`). Coba `--lang id` atau judul dari `latest`. **Q: Kenapa 1 nomor chapter muncul berkali-kali?** A: Beda scanlation group dan/atau bahasa. Filter `--lang` dan di app kamu bisa group by `chapter` nomor, pilih group favorit. **Q: `read` dapat URL tapi browser 404?** A: Node MD@Home mati atau URL expired. Jalankan `read` ulang. Wrapper sudah auto-retry + ganti server. **Q: Bedanya `detail` / `chapters` / `read`?** | | Input | Hasil | |--|-------|--------| | detail | manga-id | info seri | | chapters | manga-id | daftar episode + chapter-id | | read | chapter-id | URL halaman gambar | **Q: Bisa tanpa filter bahasa?** A: Bisa, tapi hasil campur EN/ID/JP dan dobel nomor. Disarankan selalu set `--lang`. --- ## Catatan API - Rate limit ±5 request/detik (wrapper sudah throttle) - Tidak perlu login / API key untuk endpoint publik ini - Wajib credit MangaDex dan scanlation group jika menampilkan chapter - Jangan dipakai untuk layanan beriklan / berbayar (kebijakan MD) ## License MIT