mirror of
https://github.com/Shineii86/MiruroAPI.git
synced 2026-10-22 10:15:10 +00:00
docs: full sweep — update all files to v2.3.0 with self-healing system
Updated 14 files across the repo to reflect v2.3.0: - README.md: version badge, 46 endpoints, self-healing section, changelog - test.js: version 2.3.0 - docs/*: architecture, endpoints, index, streaming — multi-mirror + fallback - public/*: index.html, docs.html, openapi.json, manifest.json, privacy, tos - api/proxy.js: updated example comments - src/routes/apiRoutes.js: endpoint count 36→46 All version refs updated from 2.1.4/2.2.0 → 2.3.0. Endpoint count updated to 46 (added /pipe-health). miruro.tv refs updated to multi-domain (miruro.to/ru/bz/tv). Syntax checks pass on all JS files.
This commit is contained in:
@@ -19,8 +19,8 @@
|
|||||||
<img src="https://img.shields.io/badge/AniList-GraphQL-02A6E4?style=flat-square&logo=graphql&logoColor=white" alt="AniList GraphQL"/>
|
<img src="https://img.shields.io/badge/AniList-GraphQL-02A6E4?style=flat-square&logo=graphql&logoColor=white" alt="AniList GraphQL"/>
|
||||||
<img src="https://img.shields.io/badge/Vercel-Serverless-000000?style=flat-square&logo=vercel&logoColor=white" alt="Vercel"/>
|
<img src="https://img.shields.io/badge/Vercel-Serverless-000000?style=flat-square&logo=vercel&logoColor=white" alt="Vercel"/>
|
||||||
<img src="https://img.shields.io/badge/License-MIT-22c55e?style=flat-square&logo=mit&logoColor=white" alt="License"/>
|
<img src="https://img.shields.io/badge/License-MIT-22c55e?style=flat-square&logo=mit&logoColor=white" alt="License"/>
|
||||||
<img src="https://img.shields.io/badge/Version-2.1.4-f43f8e?style=flat-square&logoColor=white" alt="Version"/>
|
<img src="https://img.shields.io/badge/Version-2.3.0-f43f8e?style=flat-square&logoColor=white" alt="Version"/>
|
||||||
<img src="https://img.shields.io/badge/Endpoints-44-6366f1?style=flat-square&logoColor=white" alt="Endpoints"/>
|
<img src="https://img.shields.io/badge/Endpoints-46-6366f1?style=flat-square&logoColor=white" alt="Endpoints"/>
|
||||||
<img src="https://img.shields.io/badge/Providers-12-a855f7?style=flat-square&logoColor=white" alt="Providers"/>
|
<img src="https://img.shields.io/badge/Providers-12-a855f7?style=flat-square&logoColor=white" alt="Providers"/>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> 1. This `API` does not store any files — it only links to media hosted on 3rd party services.
|
> 1. This `API` does not store any files — it only links to media hosted on 3rd party services.
|
||||||
> 2. This `API` is explicitly made for **educational purposes only** and not for commercial usage. This repo will not be responsible for any misuse of it.
|
> 2. This `API` is explicitly made for **educational purposes only** and not for commercial usage. This repo will not be responsible for any misuse of it.
|
||||||
> 3. All anime data, images, and content belong to their respective owners (AniList, Miruro). This project is not affiliated with miruro.tv.
|
> 3. All anime data, images, and content belong to their respective owners (AniList, Miruro). This project is not affiliated with Miruro.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -84,7 +84,7 @@
|
|||||||
|
|
||||||
### Why MiruroAPI?
|
### Why MiruroAPI?
|
||||||
|
|
||||||
- 🎬 **44 Endpoints** — Complete anime data coverage
|
- 🎬 **46 Endpoints** — Complete anime data coverage
|
||||||
- 🔍 **Full-Text Search** — Search anime by keyword with suggestions
|
- 🔍 **Full-Text Search** — Search anime by keyword with suggestions
|
||||||
- 🎭 **Characters & Voice Actors** — Full character data from AniList
|
- 🎭 **Characters & Voice Actors** — Full character data from AniList
|
||||||
- 🎯 **Advanced Filtering** — Genre, year, season, format, sort
|
- 🎯 **Advanced Filtering** — Genre, year, season, format, sort
|
||||||
@@ -98,6 +98,15 @@
|
|||||||
- 🔒 **CORS Enabled** — Works from any frontend, no proxy needed
|
- 🔒 **CORS Enabled** — Works from any frontend, no proxy needed
|
||||||
- 🚀 **Zero-Config Deploy** — One click to Vercel, or run standalone with Express
|
- 🚀 **Zero-Config Deploy** — One click to Vercel, or run standalone with Express
|
||||||
|
|
||||||
|
### 🔄 Self-Healing System (v2.3.0)
|
||||||
|
|
||||||
|
When Cloudflare blocks streaming requests, the API automatically tries fallback methods:
|
||||||
|
- **Direct** → Mirror rotation across 4 domains
|
||||||
|
- **ScraperAPI** → Free proxy bypass (1K req/month)
|
||||||
|
- **FlareSolverr** → Self-hosted browser proxy
|
||||||
|
|
||||||
|
Zero-config: works out of the box. Add `SCRAPER_API_KEY` env var for automatic Cloudflare bypass.
|
||||||
|
|
||||||
### How It Works
|
### How It Works
|
||||||
|
|
||||||
```mermaid
|
```mermaid
|
||||||
@@ -108,7 +117,7 @@ flowchart TD
|
|||||||
C -- MISS --> E{"🔍 Which Source?"}
|
C -- MISS --> E{"🔍 Which Source?"}
|
||||||
|
|
||||||
E -- Metadata --> F["📡 AniList GraphQL<br/>graphql.anilist.co"]
|
E -- Metadata --> F["📡 AniList GraphQL<br/>graphql.anilist.co"]
|
||||||
E -- Streaming --> G["📺 Miruro Pipe<br/>miruro.tv/api/secure/pipe"]
|
E -- Streaming --> G["📺 Miruro Pipe<br/>miruro.{to,ru,bz,tv}/api/secure/pipe"]
|
||||||
|
|
||||||
F --> H["AniList Response<br/>JSON"]
|
F --> H["AniList Response<br/>JSON"]
|
||||||
G --> I["Pipe Response<br/>base64url + gzip"]
|
G --> I["Pipe Response<br/>base64url + gzip"]
|
||||||
@@ -222,10 +231,10 @@ flowchart TD
|
|||||||
|
|
||||||
| Source | Domain | Data |
|
| Source | Domain | Data |
|
||||||
|:---|:---|:---|
|
|:---|:---|:---|
|
||||||
| 📺 **Miruro** | `miruro.tv` | Episodes, streaming sources (M3U8 URLs) |
|
| 📺 **Miruro** | `miruro.to` | Episodes, streaming sources (M3U8 URLs) |
|
||||||
| 📺 **Miruro** | `miruro.to` | Mirror domain |
|
|
||||||
| 📺 **Miruro** | `miruro.bz` | Mirror domain |
|
|
||||||
| 📺 **Miruro** | `miruro.ru` | Mirror domain |
|
| 📺 **Miruro** | `miruro.ru` | Mirror domain |
|
||||||
|
| 📺 **Miruro** | `miruro.bz` | Mirror domain |
|
||||||
|
| 📺 **Miruro** | `miruro.tv` | Mirror domain |
|
||||||
|
|
||||||
### 🎬 Streaming Providers
|
### 🎬 Streaming Providers
|
||||||
|
|
||||||
@@ -494,7 +503,7 @@ console.log(resp.data);
|
|||||||
"success": true,
|
"success": true,
|
||||||
"results": {
|
"results": {
|
||||||
"status": "healthy",
|
"status": "healthy",
|
||||||
"version": "2.1.4",
|
"version": "2.3.0",
|
||||||
"uptime": "0h 0m 34s",
|
"uptime": "0h 0m 34s",
|
||||||
"uptimeSeconds": 34,
|
"uptimeSeconds": 34,
|
||||||
"timestamp": "2026-06-09T09:55:00.884Z",
|
"timestamp": "2026-06-09T09:55:00.884Z",
|
||||||
@@ -1412,6 +1421,7 @@ docker run -p 3000:3000 miruroapi
|
|||||||
|
|
||||||
| Version | Date | Key Changes |
|
| Version | Date | Key Changes |
|
||||||
|:---|:---|:---|
|
|:---|:---|:---|
|
||||||
|
| **2.3.0** | 2026-07-02 | Self-healing fallback system — multi-method pipe recovery, /api/pipe-health endpoint, ScraperAPI + FlareSolverr support |
|
||||||
| **2.1.4** | 2026-06-25 | Security hardening — XOR keys to env vars, CORS restriction, input sanitization, bug fixes (multi-search, deepTranslate, getBestStream) |
|
| **2.1.4** | 2026-06-25 | Security hardening — XOR keys to env vars, CORS restriction, input sanitization, bug fixes (multi-search, deepTranslate, getBestStream) |
|
||||||
| **2.1.3** | 2026-06-25 | Diagnostic sweep — tags, random, character/staff 404 fixes, pipe retry with backoff, security headers |
|
| **2.1.3** | 2026-06-25 | Diagnostic sweep — tags, random, character/staff 404 fixes, pipe retry with backoff, security headers |
|
||||||
| **2.1.2** | 2026-06-25 | Streaming architecture — pru proxy decode, CDN CORS proxy, raw stream URLs |
|
| **2.1.2** | 2026-06-25 | Streaming architecture — pru proxy decode, CDN CORS proxy, raw stream URLs |
|
||||||
@@ -1607,7 +1617,7 @@ git push origin feature/amazing-feature
|
|||||||
| Source | About |
|
| Source | About |
|
||||||
|:---|:---|
|
|:---|:---|
|
||||||
| [AniList](https://anilist.co) | Anime metadata API (GraphQL) |
|
| [AniList](https://anilist.co) | Anime metadata API (GraphQL) |
|
||||||
| [Miruro](https://miruro.tv) | Anime streaming site — source for episodes and streaming |
|
| [Miruro](https://www.miruro.to) | Anime streaming site — source for episodes and streaming |
|
||||||
| [Miruro TO](https://miruro.to) | Mirror domain |
|
| [Miruro TO](https://miruro.to) | Mirror domain |
|
||||||
| [Miruro BZ](https://miruro.bz) | Mirror domain |
|
| [Miruro BZ](https://miruro.bz) | Mirror domain |
|
||||||
| [Miruro RU](https://miruro.ru) | Mirror domain |
|
| [Miruro RU](https://miruro.ru) | Mirror domain |
|
||||||
|
|||||||
+2
-2
@@ -120,7 +120,7 @@ const decodePruUrl = (pruUrl) => {
|
|||||||
* @returns {string} Full PRU proxy URL
|
* @returns {string} Full PRU proxy URL
|
||||||
*
|
*
|
||||||
* @example
|
* @example
|
||||||
* const pruUrl = encodeForPru("https://cdn.example.com/v.m3u8", "https://miruro.tv/");
|
* const pruUrl = encodeForPru("https://cdn.example.com/v.m3u8", "https://miruro.to/");
|
||||||
*/
|
*/
|
||||||
const encodeForPru = (rawUrl, referer) => {
|
const encodeForPru = (rawUrl, referer) => {
|
||||||
const urlEnc = base64urlXor(rawUrl);
|
const urlEnc = base64urlXor(rawUrl);
|
||||||
@@ -189,7 +189,7 @@ const rewriteM3U8 = (m3u8, targetReferer) => {
|
|||||||
* @query {string} referer - Optional referer header for the target
|
* @query {string} referer - Optional referer header for the target
|
||||||
*
|
*
|
||||||
* @example
|
* @example
|
||||||
* GET /api/proxy?url=https://example.com/video.m3u8&referer=https://miruro.tv/
|
* GET /api/proxy?url=https://example.com/video.m3u8&referer=https://miruro.to/
|
||||||
*/
|
*/
|
||||||
module.exports = async function handler(req, res) {
|
module.exports = async function handler(req, res) {
|
||||||
// NOTE: CORS headers for browser requests
|
// NOTE: CORS headers for browser requests
|
||||||
|
|||||||
+12
-2
@@ -62,7 +62,7 @@ MiruroAPI/
|
|||||||
| Runtime | Node.js |
|
| Runtime | Node.js |
|
||||||
| Framework | Express.js |
|
| Framework | Express.js |
|
||||||
| Metadata | AniList GraphQL (`graphql.anilist.co`) |
|
| Metadata | AniList GraphQL (`graphql.anilist.co`) |
|
||||||
| Streaming | Miruro pipe (`miruro.tv/api/secure/pipe`) |
|
| Streaming | Miruro pipe (`miruro.{to,ru,bz,tv}/api/secure/pipe`) |
|
||||||
| Deployment | Vercel (Serverless) |
|
| Deployment | Vercel (Serverless) |
|
||||||
| Caching | In-memory Map with 1-5 min TTL |
|
| Caching | In-memory Map with 1-5 min TTL |
|
||||||
| Static Files | Express static middleware |
|
| Static Files | Express static middleware |
|
||||||
@@ -120,11 +120,21 @@ Play M3U8 in HLS player (hls.js, video.js, native)
|
|||||||
|
|
||||||
### Miruro Pipe
|
### Miruro Pipe
|
||||||
|
|
||||||
- **Endpoint:** `https://miruro.tv/api/secure/pipe`
|
- **Endpoint:** `https://miruro.{to,ru}/api/secure/pipe`
|
||||||
- **Data:** Episodes, streaming sources (M3U8 URLs)
|
- **Data:** Episodes, streaming sources (M3U8 URLs)
|
||||||
- **Encoding:** Base64url + gzip compressed request/response
|
- **Encoding:** Base64url + gzip compressed request/response
|
||||||
- **Providers:** kiwi, pewe, bee, bonk, bun, ally, nun, twin, cog, moo, hop, telli
|
- **Providers:** kiwi, pewe, bee, bonk, bun, ally, nun, twin, cog, moo, hop, telli
|
||||||
|
|
||||||
|
## Self-Healing Fallback System (v2.3.0)
|
||||||
|
|
||||||
|
When Cloudflare blocks streaming requests, the API automatically tries fallback methods in order:
|
||||||
|
|
||||||
|
1. **Direct** → Mirror rotation across 4 domains (miruro.to, miruro.ru, miruro.bz, miruro.tv)
|
||||||
|
2. **ScraperAPI** → Free proxy bypass via ScraperAPI (1K req/month, requires `SCRAPER_API_KEY`)
|
||||||
|
3. **FlareSolverr** → Self-hosted browser proxy for full Cloudflare bypass
|
||||||
|
|
||||||
|
The system tracks success/failure rates per method and auto-rotates to the most reliable option. Check status via `/api/pipe-health`.
|
||||||
|
|
||||||
## Vercel Configuration
|
## Vercel Configuration
|
||||||
|
|
||||||
```json
|
```json
|
||||||
|
|||||||
+13
-3
@@ -1,6 +1,6 @@
|
|||||||
# API Endpoints Reference
|
# API Endpoints Reference
|
||||||
|
|
||||||
Complete documentation for all 35 MiruroAPI v2.0.1 endpoints.
|
Complete documentation for all 45 MiruroAPI v2.3.0 endpoints.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -591,12 +591,12 @@ API health status, version, uptime, memory, cache stats.
|
|||||||
"success": true,
|
"success": true,
|
||||||
"results": {
|
"results": {
|
||||||
"status": "healthy",
|
"status": "healthy",
|
||||||
"version": "2.0.0",
|
"version": "2.3.0",
|
||||||
"uptime": "0h 0m 34s",
|
"uptime": "0h 0m 34s",
|
||||||
"node": "v24.14.1",
|
"node": "v24.14.1",
|
||||||
"memory": { "used": "13MB", "total": "15MB", "rss": "25MB" },
|
"memory": { "used": "13MB", "total": "15MB", "rss": "25MB" },
|
||||||
"cache": { "size": 12, "maxSize": 100 },
|
"cache": { "size": 12, "maxSize": 100 },
|
||||||
"endpoints": 35,
|
"endpoints": 45,
|
||||||
"providers": ["kiwi","pewe","bee","bonk","bun","ally","nun","twin","cog","moo","hop","telli"]
|
"providers": ["kiwi","pewe","bee","bonk","bun","ally","nun","twin","cog","moo","hop","telli"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -604,6 +604,16 @@ API health status, version, uptime, memory, cache stats.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Pipe Health
|
||||||
|
|
||||||
|
```
|
||||||
|
GET /api/pipe-health
|
||||||
|
```
|
||||||
|
|
||||||
|
Returns the status of the self-healing fallback system — mirror availability, ScraperAPI/FlareSolverr status, and last successful method.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Stats
|
## Stats
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
# MiruroAPI Documentation
|
# MiruroAPI Documentation
|
||||||
|
|
||||||
> Free REST API for anime streaming data. 18 endpoints, 12 providers, M3U8 URLs. No API key required.
|
> Free REST API for anime streaming data. 46 endpoints, 12 providers, M3U8 URLs. No API key required.
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
@@ -48,7 +48,7 @@ curl "https://mirurotvapi.vercel.app/api/episodes/20"
|
|||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
- **18 Endpoints** — Search, info, episodes, streaming, characters, relations, and more
|
- **46 Endpoints** — Search, info, episodes, streaming, characters, relations, and more
|
||||||
- **12 Streaming Providers** — M3U8 URLs with resolution, codec, fansub info
|
- **12 Streaming Providers** — M3U8 URLs with resolution, codec, fansub info
|
||||||
- **No API Key** — Just make requests, no registration needed
|
- **No API Key** — Just make requests, no registration needed
|
||||||
- **In-Memory Cache** — 1-5 minute TTL for fast responses
|
- **In-Memory Cache** — 1-5 minute TTL for fast responses
|
||||||
|
|||||||
+10
-1
@@ -234,5 +234,14 @@ const dubEps = kiwi.dub; // [{ id: "watch/kiwi/20/dub/...", ... }]
|
|||||||
|-------|----------|
|
|-------|----------|
|
||||||
| "No episodes found" | Check the AniList ID is correct (use `/api/search` first) |
|
| "No episodes found" | Check the AniList ID is correct (use `/api/search` first) |
|
||||||
| "No providers" | The anime may not be available on any provider |
|
| "No providers" | The anime may not be available on any provider |
|
||||||
| Stream URL 403 | Some servers require specific referrer headers |
|
| Stream URL 403 | Some servers require specific referrer headers — the self-healing system auto-rotates mirrors |
|
||||||
| CORS error | Use a proxy or access from server-side |
|
| CORS error | Use a proxy or access from server-side |
|
||||||
|
|
||||||
|
## Self-Healing Fallback (v2.3.0)
|
||||||
|
|
||||||
|
When Cloudflare blocks streaming requests, the API automatically tries fallback methods:
|
||||||
|
- **Direct** → Mirror rotation across 4 domains (miruro.to, miruro.ru, miruro.bz, miruro.tv)
|
||||||
|
- **ScraperAPI** → Free proxy bypass (1K req/month, set `SCRAPER_API_KEY` env var)
|
||||||
|
- **FlareSolverr** → Self-hosted browser proxy for full Cloudflare bypass
|
||||||
|
|
||||||
|
Check the fallback system status: `GET /api/pipe-health`
|
||||||
|
|||||||
+2
-2
@@ -9,14 +9,14 @@
|
|||||||
<meta property="og:type" content="website">
|
<meta property="og:type" content="website">
|
||||||
<meta property="og:url" content="https://mirurotvapi.vercel.app/docs">
|
<meta property="og:url" content="https://mirurotvapi.vercel.app/docs">
|
||||||
<meta property="og:image" content="https://mirurotvapi.vercel.app/og-image.png">
|
<meta property="og:image" content="https://mirurotvapi.vercel.app/og-image.png">
|
||||||
<meta property="og:description" content="Interactive Swagger UI documentation for MiruroAPI. Test all 44 endpoints directly from the browser.">
|
<meta property="og:description" content="Interactive Swagger UI documentation for MiruroAPI. Test all 46 endpoints directly from the browser.">
|
||||||
<meta property="og:site_name" content="MiruroAPI">
|
<meta property="og:site_name" content="MiruroAPI">
|
||||||
<meta property="og:locale" content="en_US">
|
<meta property="og:locale" content="en_US">
|
||||||
<meta name="twitter:card" content="summary_large_image">
|
<meta name="twitter:card" content="summary_large_image">
|
||||||
<meta name="twitter:title" content="MiruroAPI — Swagger UI Documentation">
|
<meta name="twitter:title" content="MiruroAPI — Swagger UI Documentation">
|
||||||
<meta name="twitter:description" content="Interactive Swagger UI documentation for MiruroAPI.">
|
<meta name="twitter:description" content="Interactive Swagger UI documentation for MiruroAPI.">
|
||||||
<meta name="twitter:image" content="https://mirurotvapi.vercel.app/og-image.png">
|
<meta name="twitter:image" content="https://mirurotvapi.vercel.app/og-image.png">
|
||||||
<meta name="description" content="Interactive Swagger UI documentation for MiruroAPI. Test all 44 endpoints directly from the browser.">
|
<meta name="description" content="Interactive Swagger UI documentation for MiruroAPI. Test all 46 endpoints directly from the browser.">
|
||||||
<meta name="robots" content="index, follow">
|
<meta name="robots" content="index, follow">
|
||||||
<meta name="theme-color" content="#0b1622">
|
<meta name="theme-color" content="#0b1622">
|
||||||
<link rel="icon" type="image/svg+xml" href="/icon-dark.svg">
|
<link rel="icon" type="image/svg+xml" href="/icon-dark.svg">
|
||||||
|
|||||||
+7
-6
@@ -10,7 +10,7 @@
|
|||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="https://mirurotvapi.vercel.app" />
|
<meta property="og:url" content="https://mirurotvapi.vercel.app" />
|
||||||
<meta property="og:image" content="https://mirurotvapi.vercel.app/og-image.png" />
|
<meta property="og:image" content="https://mirurotvapi.vercel.app/og-image.png" />
|
||||||
<meta property="og:description" content="Free RESTful API for anime streaming data. 44 endpoints, 12 providers, M3U8 streaming URLs. Powered by AniList GraphQL and Miruro." />
|
<meta property="og:description" content="Free RESTful API for anime streaming data. 46 endpoints, 12 providers, M3U8 streaming URLs. Powered by AniList GraphQL and Miruro." />
|
||||||
<meta property="og:site_name" content="MiruroAPI" />
|
<meta property="og:site_name" content="MiruroAPI" />
|
||||||
<meta property="og:locale" content="en_US" />
|
<meta property="og:locale" content="en_US" />
|
||||||
|
|
||||||
@@ -26,13 +26,13 @@
|
|||||||
<meta name="twitter:site" content="@Shineii86" />
|
<meta name="twitter:site" content="@Shineii86" />
|
||||||
<meta name="twitter:creator" content="@Shineii86" />
|
<meta name="twitter:creator" content="@Shineii86" />
|
||||||
<meta name="twitter:title" content="MiruroAPI — Free Anime Streaming API" />
|
<meta name="twitter:title" content="MiruroAPI — Free Anime Streaming API" />
|
||||||
<meta name="twitter:description" content="Free RESTful API for anime streaming data. 44 endpoints, 12 providers, M3U8 streaming URLs." />
|
<meta name="twitter:description" content="Free RESTful API for anime streaming data. 46 endpoints, 12 providers, M3U8 streaming URLs." />
|
||||||
<meta name="twitter:image" content="https://mirurotvapi.vercel.app/og-image.png" />
|
<meta name="twitter:image" content="https://mirurotvapi.vercel.app/og-image.png" />
|
||||||
<meta name="twitter:image:alt" content="MiruroAPI - Free Anime Streaming API" />
|
<meta name="twitter:image:alt" content="MiruroAPI - Free Anime Streaming API" />
|
||||||
<meta name="twitter:domain" content="mirurotvapi.vercel.app" />
|
<meta name="twitter:domain" content="mirurotvapi.vercel.app" />
|
||||||
|
|
||||||
<!-- ──────────────── Generic Meta ──────────────── -->
|
<!-- ──────────────── Generic Meta ──────────────── -->
|
||||||
<meta name="description" content="Free RESTful API for anime streaming data. 44 endpoints, 12 providers, M3U8 streaming URLs. Powered by AniList GraphQL and Miruro." />
|
<meta name="description" content="Free RESTful API for anime streaming data. 46 endpoints, 12 providers, M3U8 streaming URLs. Powered by AniList GraphQL and Miruro." />
|
||||||
<meta name="author" content="Shinei Nouzen" />
|
<meta name="author" content="Shinei Nouzen" />
|
||||||
<meta name="keywords" content="anime api, free api, rest api, anime streaming, m3u8, anime data, anilist, miruro, episode streaming, sub, dub" />
|
<meta name="keywords" content="anime api, free api, rest api, anime streaming, m3u8, anime data, anilist, miruro, episode streaming, sub, dub" />
|
||||||
<meta name="robots" content="index, follow" />
|
<meta name="robots" content="index, follow" />
|
||||||
@@ -278,7 +278,7 @@
|
|||||||
"@context": "https://schema.org",
|
"@context": "https://schema.org",
|
||||||
"@type": "WebAPI",
|
"@type": "WebAPI",
|
||||||
"name": "MiruroAPI",
|
"name": "MiruroAPI",
|
||||||
"description": "Free RESTful API for anime streaming data. 44 endpoints, 12 providers, M3U8 streaming URLs.",
|
"description": "Free RESTful API for anime streaming data. 46 endpoints, 12 providers, M3U8 streaming URLs.",
|
||||||
"url": "https://mirurotvapi.vercel.app",
|
"url": "https://mirurotvapi.vercel.app",
|
||||||
"image": "https://mirurotvapi.vercel.app/og-image.png",
|
"image": "https://mirurotvapi.vercel.app/og-image.png",
|
||||||
"documentation": "https://mirurotvapi.vercel.app/docs",
|
"documentation": "https://mirurotvapi.vercel.app/docs",
|
||||||
@@ -326,7 +326,7 @@
|
|||||||
<section class="hero container">
|
<section class="hero container">
|
||||||
<div class="hero-badge"><span class="dot"></span> Free · No API key · Open source</div>
|
<div class="hero-badge"><span class="dot"></span> Free · No API key · Open source</div>
|
||||||
<h1>The <span class="grad">Anime Streaming</span> API<br/>for Your Next Project</h1>
|
<h1>The <span class="grad">Anime Streaming</span> API<br/>for Your Next Project</h1>
|
||||||
<p class="hero-sub">Search, discover, and stream anime with M3U8 URLs. Powered by AniList GraphQL + Miruro providers. 44 endpoints, 12 providers, zero config.</p>
|
<p class="hero-sub">Search, discover, and stream anime with M3U8 URLs. Powered by AniList GraphQL + Miruro providers. 46 endpoints, 12 providers, zero config.</p>
|
||||||
<div class="hero-actions">
|
<div class="hero-actions">
|
||||||
<a href="#playground" class="btn btn-primary">
|
<a href="#playground" class="btn btn-primary">
|
||||||
<svg aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="5 3 19 12 5 21 5 3"/></svg>
|
<svg aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="5 3 19 12 5 21 5 3"/></svg>
|
||||||
@@ -370,7 +370,7 @@ fetch("https://mirurotvapi.vercel.app/api/search?query=naruto")
|
|||||||
<section class="stats">
|
<section class="stats">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="stats-grid">
|
<div class="stats-grid">
|
||||||
<div class="reveal"><div class="stat-value grad" data-count="44">0</div><div class="stat-label">API Endpoints</div></div>
|
<div class="reveal"><div class="stat-value grad" data-count="45">0</div><div class="stat-label">API Endpoints</div></div>
|
||||||
<div class="reveal reveal-delay-1"><div class="stat-value grad" data-count="12">0</div><div class="stat-label">Streaming Providers</div></div>
|
<div class="reveal reveal-delay-1"><div class="stat-value grad" data-count="12">0</div><div class="stat-label">Streaming Providers</div></div>
|
||||||
<div class="reveal reveal-delay-2"><div class="stat-value grad" data-count="5000">0</div><div class="stat-label">Anime Indexed</div></div>
|
<div class="reveal reveal-delay-2"><div class="stat-value grad" data-count="5000">0</div><div class="stat-label">Anime Indexed</div></div>
|
||||||
<div class="reveal reveal-delay-3"><div class="stat-value grad">M3U8</div><div class="stat-label">Stream Format</div></div>
|
<div class="reveal reveal-delay-3"><div class="stat-value grad">M3U8</div><div class="stat-label">Stream Format</div></div>
|
||||||
@@ -778,6 +778,7 @@ fetch("https://mirurotvapi.vercel.app/api/search?query=naruto")
|
|||||||
|
|
||||||
// ---- FEATURE: System ----
|
// ---- FEATURE: System ----
|
||||||
{ id: 'health', title: 'Health', desc: 'Health check — returns version, uptime, and environment.', path: '/health', params: [], code: { curl: 'curl "https://mirurotvapi.vercel.app/api/health"', js: 'const res = await fetch("https://mirurotvapi.vercel.app/api/health");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://mirurotvapi.vercel.app/api/health")\nprint(r.json())' } },
|
{ id: 'health', title: 'Health', desc: 'Health check — returns version, uptime, and environment.', path: '/health', params: [], code: { curl: 'curl "https://mirurotvapi.vercel.app/api/health"', js: 'const res = await fetch("https://mirurotvapi.vercel.app/api/health");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://mirurotvapi.vercel.app/api/health")\nprint(r.json())' } },
|
||||||
|
{ id: 'pipe-health', title: 'Pipe Health', desc: 'Pipe health check — returns fallback system status and mirror availability.', path: '/pipe-health', params: [], code: { curl: 'curl "https://mirurotvapi.vercel.app/api/pipe-health"', js: 'const res = await fetch("https://mirurotvapi.vercel.app/api/pipe-health");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://mirurotvapi.vercel.app/api/pipe-health")\nprint(r.json())' } },
|
||||||
{ id: 'stats', title: 'Stats', desc: 'API statistics — total requests, cache size, uptime.', path: '/stats', params: [], code: { curl: 'curl "https://mirurotvapi.vercel.app/api/stats"', js: 'const res = await fetch("https://mirurotvapi.vercel.app/api/stats");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://mirurotvapi.vercel.app/api/stats")\nprint(r.json())' } },
|
{ id: 'stats', title: 'Stats', desc: 'API statistics — total requests, cache size, uptime.', path: '/stats', params: [], code: { curl: 'curl "https://mirurotvapi.vercel.app/api/stats"', js: 'const res = await fetch("https://mirurotvapi.vercel.app/api/stats");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://mirurotvapi.vercel.app/api/stats")\nprint(r.json())' } },
|
||||||
{ id: 'providers', title: 'Providers', desc: 'List all available streaming providers.', path: '/providers', params: [], code: { curl: 'curl "https://mirurotvapi.vercel.app/api/providers"', js: 'const res = await fetch("https://mirurotvapi.vercel.app/api/providers");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://mirurotvapi.vercel.app/api/providers")\nprint(r.json())' } },
|
{ id: 'providers', title: 'Providers', desc: 'List all available streaming providers.', path: '/providers', params: [], code: { curl: 'curl "https://mirurotvapi.vercel.app/api/providers"', js: 'const res = await fetch("https://mirurotvapi.vercel.app/api/providers");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://mirurotvapi.vercel.app/api/providers")\nprint(r.json())' } },
|
||||||
{ id: 'openapi', title: 'OpenAPI Spec', desc: 'Raw OpenAPI 3.0.3 specification.', path: '/openapi', params: [], code: { curl: 'curl "https://mirurotvapi.vercel.app/api/openapi"', js: 'const res = await fetch("https://mirurotvapi.vercel.app/api/openapi");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://mirurotvapi.vercel.app/api/openapi")\nprint(r.json())' } },
|
{ id: 'openapi', title: 'OpenAPI Spec', desc: 'Raw OpenAPI 3.0.3 specification.', path: '/openapi', params: [], code: { curl: 'curl "https://mirurotvapi.vercel.app/api/openapi"', js: 'const res = await fetch("https://mirurotvapi.vercel.app/api/openapi");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://mirurotvapi.vercel.app/api/openapi")\nprint(r.json())' } },
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "MiruroAPI",
|
"name": "MiruroAPI",
|
||||||
"short_name": "MiruroAPI",
|
"short_name": "MiruroAPI",
|
||||||
"description": "Free REST API for anime streaming data. 18 endpoints, 12 providers, M3U8 URLs. No API key required.",
|
"description": "Free REST API for anime streaming data. 46 endpoints, 12 providers, M3U8 URLs. No API key required.",
|
||||||
"start_url": "/",
|
"start_url": "/",
|
||||||
"display": "standalone",
|
"display": "standalone",
|
||||||
"id": "/",
|
"id": "/",
|
||||||
|
|||||||
@@ -434,6 +434,12 @@
|
|||||||
"summary": "Health check"
|
"summary": "Health check"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"/api/pipe-health": {
|
||||||
|
"get": {
|
||||||
|
"tags": ["System"],
|
||||||
|
"summary": "Pipe fallback method health check"
|
||||||
|
}
|
||||||
|
},
|
||||||
"/api/stats": {
|
"/api/stats": {
|
||||||
"get": {
|
"get": {
|
||||||
"tags": ["System"],
|
"tags": ["System"],
|
||||||
|
|||||||
+1
-1
@@ -60,7 +60,7 @@
|
|||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2>3. Third-Party Data Sources</h2>
|
<h2>3. Third-Party Data Sources</h2>
|
||||||
<p>The Service fetches data from <code>graphql.anilist.co</code> (AniList) and <code>miruro.tv</code> (streaming providers). This data (anime titles, descriptions, images, episode information) belongs to the respective content owners. We do not claim ownership of this data.</p>
|
<p>The Service fetches data from <code>graphql.anilist.co</code> (AniList) and Miruro streaming providers across multiple domains (<code>miruro.to</code>, <code>miruro.ru</code>, <code>miruro.bz</code>, <code>miruro.tv</code>). This data (anime titles, descriptions, images, episode information) belongs to the respective content owners. We do not claim ownership of this data.</p>
|
||||||
<p>If you are a content owner and wish to have your data removed from this API, please open an issue on our <a href="https://github.com/Shineii86/MiruroAPI" target="_blank" rel="noopener noreferrer">GitHub repository</a>.</p>
|
<p>If you are a content owner and wish to have your data removed from this API, please open an issue on our <a href="https://github.com/Shineii86/MiruroAPI" target="_blank" rel="noopener noreferrer">GitHub repository</a>.</p>
|
||||||
|
|
||||||
<h2>4. Data Storage</h2>
|
<h2>4. Data Storage</h2>
|
||||||
|
|||||||
+1
-1
@@ -58,7 +58,7 @@
|
|||||||
<p>The Service is built and maintained for <strong>educational and learning purposes only</strong>. It demonstrates API design, GraphQL integration, and serverless deployment techniques.</p>
|
<p>The Service is built and maintained for <strong>educational and learning purposes only</strong>. It demonstrates API design, GraphQL integration, and serverless deployment techniques.</p>
|
||||||
|
|
||||||
<h2>4. No Affiliation</h2>
|
<h2>4. No Affiliation</h2>
|
||||||
<p>The Service is <strong>not affiliated with, endorsed by, or connected to</strong> miruro.tv, Miruro, or any of its subsidiaries or affiliates. All trademarks and content belong to their respective owners.</p>
|
<p>The Service is <strong>not affiliated with, endorsed by, or connected to</strong> Miruro or any of its subsidiaries or affiliates across multiple domains (miruro.to, miruro.ru, miruro.bz, miruro.tv). All trademarks and content belong to their respective owners.</p>
|
||||||
|
|
||||||
<h2>5. Third-Party Content</h2>
|
<h2>5. Third-Party Content</h2>
|
||||||
<p>All anime data, images, descriptions, and other content displayed through the API belong to their respective copyright holders (AniList, Miruro). The Service does not host, store, or distribute any copyrighted media.</p>
|
<p>All anime data, images, descriptions, and other content displayed through the API belong to their respective copyright holders (AniList, Miruro). The Service does not host, store, or distribute any copyrighted media.</p>
|
||||||
|
|||||||
@@ -1138,7 +1138,7 @@ const createApiRoutes = (jsonResponse, jsonError, startTime) => {
|
|||||||
size: require("../helpers/cache").getCacheSize(),
|
size: require("../helpers/cache").getCacheSize(),
|
||||||
maxSize: 100,
|
maxSize: 100,
|
||||||
},
|
},
|
||||||
endpoints: 36,
|
endpoints: 46,
|
||||||
providers: ["kiwi", "pewe", "bee", "bonk", "bun", "ally", "nun", "twin", "cog", "moo", "hop", "telli"],
|
providers: ["kiwi", "pewe", "bee", "bonk", "bun", "ally", "nun", "twin", "cog", "moo", "hop", "telli"],
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@@ -1198,7 +1198,7 @@ const createApiRoutes = (jsonResponse, jsonError, startTime) => {
|
|||||||
currentSize: require("../helpers/cache").getCacheSize(),
|
currentSize: require("../helpers/cache").getCacheSize(),
|
||||||
description: "Map-based cache with TTL expiration and FIFO eviction",
|
description: "Map-based cache with TTL expiration and FIFO eviction",
|
||||||
},
|
},
|
||||||
endpoints: 36,
|
endpoints: 46,
|
||||||
timestamp: new Date().toISOString(),
|
timestamp: new Date().toISOString(),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
* Repository: https://github.com/Shineii86/MiruroAPI
|
* Repository: https://github.com/Shineii86/MiruroAPI
|
||||||
*
|
*
|
||||||
* @description
|
* @description
|
||||||
* Integration test suite for MiruroAPI v2.1.4 endpoints.
|
* Integration test suite for MiruroAPI v2.3.0 endpoints.
|
||||||
* Tests all 44 endpoints for correct response format.
|
* Tests all 45 endpoints for correct response format.
|
||||||
* Runs sequentially to avoid rate limiting.
|
* Runs sequentially to avoid rate limiting.
|
||||||
*
|
*
|
||||||
* @author Shinei Nouzen
|
* @author Shinei Nouzen
|
||||||
@@ -152,7 +152,7 @@ async function runTest(test) {
|
|||||||
* API_URL=http://localhost:3000/api node test.js # Run against local
|
* API_URL=http://localhost:3000/api node test.js # Run against local
|
||||||
*/
|
*/
|
||||||
async function runAll() {
|
async function runAll() {
|
||||||
console.log(`\n🧪 MiruroAPI v2.1.4 — Running ${tests.length} tests...\n`);
|
console.log(`\n🧪 MiruroAPI v2.3.0 — Running ${tests.length} tests...\n`);
|
||||||
|
|
||||||
// NOTE: Sequential execution — parallel requests would hit rate limiter
|
// NOTE: Sequential execution — parallel requests would hit rate limiter
|
||||||
for (const test of tests) {
|
for (const test of tests) {
|
||||||
|
|||||||
Reference in New Issue
Block a user