# AniKoKo > Hindi-dub anime, streamed clean. FastAPI scraping backend + zero-build vanilla JS frontend. Self-hosted aggregator that scrapes DesiDubAnime for metadata and stream sources, normalizes them into one JSON API, and serves them through a lightweight client with HLS playback, embed fallbacks, and downloads. ## Layout ``` backend/ — FastAPI scraping + streaming API frontend/ — Single-page client (HTML + CSS + vanilla JS) ``` ## Quick start ### 1. Backend ```bash python3 -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate pip install -r requirements.txt cp backend/.env.example backend/.env # edit if you need a proxy python3 -m backend.main ``` API lives at `http://localhost:8000` — docs at `/docs`. ### 2. Frontend Serve the static files from any HTTP server: ```bash cd frontend python3 -m http.server 5500 ``` Open `http://localhost:5500`. The frontend talks to `http://localhost:8000` by default. To point it somewhere else, edit the `` tag in `index.html`. ## API | Endpoint | Purpose | |----------|---------| | `GET /api/latest?provider=&page=1` | Latest additions | | `GET /api/search?q=&provider=` | Search (alias + fuzzy) | | `GET /api/anime?url=&provider=` | Series detail + episode list | | `GET /api/sources?url=&provider=` | Per-episode stream sources | | `GET /api/resolve?url=` | Debug an embed URL resolver | | `GET /proxy/stream?url=&referer=` | HLS/MP4 streaming proxy | | `GET /proxy/download?url=&filename=` | Download proxy | | `GET /proxy/img?url=&referer=` | Image proxy | ## Provider - **desidubanime** — `https://www.desidubanime.me` (kiranime WordPress theme) Adding a provider means: 1. copy `backend/scrapers/desidubanime.py` to a new module 2. update selectors / API shapes for the new site 3. register it in `backend/scrapers/registry.py` and `backend/config.py` ## Notes - HLS playback uses hls.js on the client (loaded from CDN) with native fallback on Safari. - Vidmoly sources are intentionally filtered out — CDN is rate-limited and stalls playback. - Metadata comes from WP REST `/wp-json/wp/v2/anime`; episodes come from HTML because kiranime doesn't expose the series→episode relation via REST. ## License MIT — see LICENSE.