mirror of
https://github.com/Inside4ndroid/TMDB-Embed-API.git
synced 2026-10-22 09:35:11 +00:00
Add new providers for streaming services and utility functions
- Implement StreamFlix provider for fetching movie and episode streams. - Add VaPlayer provider to retrieve streaming URLs for movies and TV shows. - Introduce ZXCStreams provider for accessing various streaming links. - Create utility functions for fetching episode counts from Cinemeta. - Develop a title matching system for improved search results. - Implement TMDB title to IMDB ID resolution for better integration with TMDB API.
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
<img src="https://img.shields.io/badge/Node.js-18%2B-brightgreen?style=flat" />
|
||||
<img src="https://img.shields.io/badge/Status-Active-success?style=flat" />
|
||||
<img src="https://img.shields.io/badge/License-MIT-blue?style=flat" />
|
||||
<img src="https://img.shields.io/badge/Version-1.1.1-informational?style=flat" />
|
||||
<img src="https://img.shields.io/badge/Version-1.3.0-informational?style=flat" />
|
||||
<img src="https://img.shields.io/docker/pulls/inside4ndroid/tmdb-embed-api?label=Docker%20Pulls&style=flat" />
|
||||
</p>
|
||||
|
||||
@@ -33,30 +33,29 @@
|
||||
---
|
||||
|
||||
## ✨ Features
|
||||
- **Multi‑TMDB Key Rotation** – Supply multiple API keys; one is chosen randomly per request.
|
||||
- **Provider Aggregation** – Pluggable providers (Showbox/FebBox, 4KHDHub, VixSrc, Videasy, Vidlink, LordFlix, NoTorrent, DahmerMovies) with per‑provider enable toggles + default selection.
|
||||
- **🔥 Plugin System** – Drop new provider files in `providers/` and add its exported function to the registry map (`providers/registry.js` → `providerFunctionMap`).
|
||||
- **13 Built-in Providers** – Showbox/FebBox, 4KHDHub, VixSrc, Videasy, Vidlink, DahmerMovies, StreamFlix, VaPlayer, CastleTV, HDGharTV, NetMirror, OneTouchTV, ZXCStreams — with per-provider enable toggles + default selection.
|
||||
- **Multi-TMDB Key Rotation** – Supply multiple API keys; one is chosen randomly per request.
|
||||
- **🔥 Plugin System** – Drop new provider files in `providers/` and add its exported function to the registry map (`providers/registry.js` → `providerFunctionMap`). No core file edits required.
|
||||
- **Dynamic Filtering** – Minimum quality presets, custom JSON quality map, codec exclusion rules (presets + JSON).
|
||||
- **Runtime Overrides UI** – Fully interactive web admin at `/` (login protected) writing to `utils/user-config.json`.
|
||||
- **Session Auth + Rate Limiting** – Login system with brute‑force lockouts, logout, password change.
|
||||
- **Status & Health Panel** – Live metrics, provider status, endpoint list, functional provider checks.
|
||||
- **Runtime Overrides UI** – Fully interactive web admin at `/config.html` (login protected) writing to `utils/user-config.json`.
|
||||
- **Session Auth + Rate Limiting** – Login system with brute-force lockouts, logout, and password change.
|
||||
- **Status & Health Panel** – Live metrics, provider status, endpoint list, and per-provider functional checks (configurable check title via TMDB ID).
|
||||
- **Config Propagation** – Overrides mirrored to `process.env` for legacy compatibility (no `.env` required after first save).
|
||||
- **Back‑Navigation Safe** – Cache-control + visibility/session revalidation.
|
||||
- **Extensible** – Simple drop-in provider plugin system.
|
||||
- **Back-Navigation Safe** – Cache-control + visibility/session revalidation.
|
||||
- **Optional Stream Proxy Layer** – When enabled, rewrites returned stream URLs so HLS playlists, TS segments, and subtitles are served through internal endpoints (`/m3u8-proxy`, `/ts-proxy`, `/sub-proxy`) allowing uniform headers, origin shielding, and optional segment caching.
|
||||
When active the API omits per-stream `headers` objects from responses (they're no longer needed by clients) to avoid leaking upstream header requirements.
|
||||
|
||||
Proxy Tuning Parameters (query flags accepted by `/ts-proxy` – defaults shown):
|
||||
- `clampOpen` (on) – If a client sends an ambiguous `Range: bytes=0-`, constrain it to an initial window of `openChunkKB` (default 4096 KB) to avoid huge first reads.
|
||||
- `openChunkKB=4096` – Size (KB) used for both clamp window and each progressive expansion increment.
|
||||
- `progressiveOpen` (on) – Grow successive ambiguous head requests (`bytes=0-`) incrementally instead of one large span. Maintains a per‑URL expansion map.
|
||||
- `progressiveOpen` (on) – Grow successive ambiguous head requests (`bytes=0-`) incrementally instead of one large span. Maintains a per-URL expansion map.
|
||||
- `initChunkKB=512` – Size used for a synthetic initial partial (206) when no client range is provided and progressive growth is disabled. Capped 64–2048 KB.
|
||||
- `noSynth=1` – Disable synthetic initial partial generation (forces pass‑through behavior).
|
||||
- `noSynth=1` – Disable synthetic initial partial generation (forces pass-through behavior).
|
||||
- `force200=1` – Normalize upstream 206 responses to 200 (diagnostics / edge player testing).
|
||||
- `tailPrefetch` (on) – Enable asynchronous tail fetch of the file’s last bytes to satisfy rapid player tail probes.
|
||||
- `tailPrefetch` (on) – Enable asynchronous tail fetch of the file's last bytes to satisfy rapid player tail probes.
|
||||
- `tailPrefetchKB=256` – Tail window size (64–2048 KB). Cached in memory with TTL cleanup.
|
||||
Behavior Notes:
|
||||
- Synthetic partials auto‑disable when `progressiveOpen` is active (real progressive ranges preferred).
|
||||
- Synthetic partials auto-disable when `progressiveOpen` is active (real progressive ranges preferred).
|
||||
- Player tail probes (e.g., VLC metadata scans) are accelerated by the cached tail window.
|
||||
- Forced 200 mode strips `Content-Range` to emulate full responses for troubleshooting.
|
||||
- Host Overrides: `pixeldrain.*` and `video-downloads.googleusercontent.com` URLs are routed through `/ts-proxy` regardless of extension to ensure correct range + MIME handling.
|
||||
@@ -84,6 +83,8 @@ http://localhost:8787/
|
||||
curl http://localhost:8787/api/health
|
||||
```
|
||||
|
||||
**Default credentials (first run):** `admin` / `change-me` — **change them immediately** from the dashboard or via `POST /auth/change-password`.
|
||||
|
||||
---
|
||||
|
||||
## 🐳 Docker Usage
|
||||
@@ -92,7 +93,7 @@ curl http://localhost:8787/api/health
|
||||
If you just want to run it (no building):
|
||||
```bash
|
||||
docker pull inside4ndroid/tmdb-embed-api:latest
|
||||
docker run --name tmdb-embed-api -p 8787:8787 \
|
||||
docker run --name tmdb-embed-api -p 8787:8787 \
|
||||
-e TMDB_API_KEY=YOUR_TMDB_KEY \
|
||||
inside4ndroid/tmdb-embed-api:latest
|
||||
```
|
||||
@@ -123,7 +124,7 @@ docker run --name tmdb-embed -p 8787:8787 \
|
||||
After first login + save, the UI writes overrides into the mounted `user-config.json` so they persist across container restarts.
|
||||
|
||||
### docker-compose
|
||||
An example `docker-compose.yml` is included. Start with:
|
||||
An example `docker-compose.yml` is included (healthcheck + `restart: unless-stopped`). Start with:
|
||||
```bash
|
||||
docker compose up -d --build
|
||||
```
|
||||
@@ -146,38 +147,52 @@ docker run -p 8787:8787 \
|
||||
```
|
||||
or add / remove keys inside the Admin UI (Keys panel) and save.
|
||||
|
||||
If both `TMDB_API_KEY` and `TMDB_API_KEYS` are provided, rotation uses the array. Clearing the array in the UI also clears the legacy key.
|
||||
|
||||
### Key Environment Variables
|
||||
| Variable | Purpose | Notes |
|
||||
|----------|---------|-------|
|
||||
| `API_PORT` | Port the server listens on | Defaults to 8787 |
|
||||
| `API_PORT` | Port the server listens on | Defaults to `8787` |
|
||||
| `BIND_HOST` | Interface to bind | Defaults to `0.0.0.0` |
|
||||
| `TMDB_API_KEY` | Single TMDB key (legacy) | Use if you only have one key |
|
||||
| `TMDB_API_KEYS` | JSON array of keys | Overrides single key when present |
|
||||
| `PASSWORD_HASH` | Pre-seed admin password hash | Optional (UI can set) |
|
||||
| `ADMIN_USERNAME` | Override default username | Default: `admin` |
|
||||
|
||||
If both `TMDB_API_KEY` and `TMDB_API_KEYS` are provided, rotation uses the array. Clearing the array in the UI also clears the legacy key.
|
||||
|
||||
---
|
||||
| `DEFAULT_PROVIDERS` | Comma-separated default providers | Used by the aggregate endpoint |
|
||||
| `DEFAULT_REGION` / `FEBBOX_REGION` | Default region | Passed through for legacy compat |
|
||||
| `MIN_QUALITIES` | Min quality setting / JSON | Mirrored to the config model |
|
||||
| `EXCLUDE_CODECS` | Codec exclusion JSON | e.g. `{"excludeDV":true}` |
|
||||
| `FEBBOX_COOKIES` | FebBox JWT cookie(s) | Comma-separated; required for Showbox |
|
||||
| `ENABLE_<PROVIDER>_PROVIDER` | Per-provider enable flags | e.g. `ENABLE_4KHDHUB_PROVIDER=true` |
|
||||
| `DISABLE_CACHE` | Disable internal caches | `true`/`false` |
|
||||
| `ENABLE_PSTREAM_API` | PStream API flag | Default `true` |
|
||||
| `DISABLE_URL_VALIDATION` | Skip general URL checks | Default `false` |
|
||||
| `DISABLE_4KHDHUB_URL_VALIDATION` | Skip 4khdhub URL checks | Default `false` |
|
||||
| `ENABLE_PROXY` | Mount proxy routes | Default `false` |
|
||||
| `PROVIDER_CHECK_TMDB_ID` | Title for dashboard functional checks | Default `278` |
|
||||
| `SHOWBOX_CACHE_DIR` | Custom Showbox cache directory | Optional |
|
||||
| `NETMIRROR_API_BASE` | NetMirror embed base URL | Optional override |
|
||||
| `NETMIRROR_STREAM_REFERER` | NetMirror stream Referer header | Optional override |
|
||||
|
||||
### Updating the Image
|
||||
```bash
|
||||
docker compose pull # if using an external registry (future)
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
### Restart from Admin UI
|
||||
The Admin panel includes a Restart Server control.
|
||||
- Local (nodemon): the backend writes a `restart.trigger` file and exits; nodemon detects the change and restarts automatically.
|
||||
- Docker Compose: the container exits and is restarted by `restart: unless-stopped`.
|
||||
```
|
||||
|
||||
### Healthcheck
|
||||
Container health relies on `GET /api/health`. If you disable or modify that route, adjust the Dockerfile / compose healthcheck accordingly.
|
||||
|
||||
---
|
||||
|
||||
## �🔐 Authentication
|
||||
## 🔐 Authentication
|
||||
The root (`/`) serves the login page. After successful login a session cookie (`session`) is issued (HttpOnly; 12h lifetime). All admin pages (e.g. `config.html`) require an active session.
|
||||
|
||||
Credentials are stored in `utils/auth-users.json` (auto-created on first run with `admin` / `change-me`). Passwords are hashed with PBKDF2-SHA512 (100,000 iterations, random salt). There is no `PASSWORD_HASH` / `ADMIN_USERNAME` environment override — manage users directly in this file or via the change-password endpoint.
|
||||
|
||||
| Endpoint | Method | Purpose |
|
||||
|----------|--------|---------|
|
||||
| `/auth/login` | POST | Authenticate (JSON: `{ username, password }`) |
|
||||
@@ -185,7 +200,7 @@ The root (`/`) serves the login page. After successful login a session cookie (`
|
||||
| `/auth/session` | GET | Check session status |
|
||||
| `/auth/change-password` | POST | Update password (requires session) |
|
||||
|
||||
Repeated failed logins trigger exponential lockouts (Retry-After header emitted).
|
||||
Repeated failed logins trigger escalating lockouts (`Retry-After` header emitted; 5 attempts per window).
|
||||
|
||||
---
|
||||
|
||||
@@ -201,7 +216,8 @@ Saving in the UI writes only changed keys. Setting a field to empty removes the
|
||||
{
|
||||
"defaultProviders": ["4khdhub"],
|
||||
"tmdbApiKeys": ["KEY_A","KEY_B"],
|
||||
"enable4khdhubProvider": true
|
||||
"enable4khdhubProvider": true,
|
||||
"providerCheckTmdbId": "278"
|
||||
}
|
||||
```
|
||||
|
||||
@@ -229,11 +245,17 @@ The API supports a plugin system. Drop a new provider file in the `providers/` f
|
||||
- `4khdhub` - 4KHDHub streams
|
||||
- `vixsrc` - VixSrc streams
|
||||
- `videasy` - Videasy streams (10 servers via enc-dec.app)
|
||||
- `vidlink` - Vidlink streams (via enc-dec.app)
|
||||
- `lordflix` - LordFlix streams (9 servers via enc-dec.app)
|
||||
- `notorrent` - NoTorrent streams (Stremio addon API)
|
||||
- `vidlink` - Vidlink streams
|
||||
- `dahmermovies` - DahmerMovies streams (direct file links)
|
||||
- `streamflix` - StreamFlix streams (direct MP4 links)
|
||||
- `vaplayer` - VaPlayer streams (HLS via IMDb ID)
|
||||
- `castletv` - CastleTV streams (AES-128 encrypted API)
|
||||
- `hdghartv` - HDGharTV streams (title-matched search + IMDb verification)
|
||||
- `netmirror` - NetMirror streams (Netflix direct + NewTV platform fallback)
|
||||
- `onetouchtv` - OneTouchTV streams (AES-256 encrypted API)
|
||||
- `zxcstreams` - ZXCStreams streams (multi-server backend, dynamic domain discovery)
|
||||
|
||||
Providers that rely on title resolution against TMDB (`castletv`, `hdghartv`, `onetouchtv`, `zxcstreams`, `vaplayer`, `netmirror`) require at least one TMDB API key configured.
|
||||
|
||||
### Adding a New Provider
|
||||
1. **Create** `providers/yourprovider.js` with your stream fetching logic
|
||||
@@ -247,9 +269,14 @@ The API supports a plugin system. Drop a new provider file in the `providers/` f
|
||||
'vixsrc.js': 'getVixsrcStreams',
|
||||
'videasy.js': 'getVideasyStreams',
|
||||
'vidlink.js': 'getVidlinkStreams',
|
||||
'lordflix.js': 'getLordflixStreams',
|
||||
'notorrent.js': 'getNotorrentStreams',
|
||||
'dahmermovies.js': 'getDahmermoviesStreams',
|
||||
'streamflix.js': 'getStreamflixStreams',
|
||||
'vaplayer.js': 'getVaplayerStreams',
|
||||
'castletv.js': 'getCastletvStreams',
|
||||
'hdghartv.js': 'getHdghartvStreams',
|
||||
'netmirror.js': 'getNetmirrorStreams',
|
||||
'onetouchtv.js': 'getOnetouchtvStreams',
|
||||
'zxcstreams.js': 'getZxcstreamsStreams',
|
||||
'yourprovider.js': 'getYourproviderStreams'
|
||||
};
|
||||
```
|
||||
@@ -260,6 +287,7 @@ The API supports a plugin system. Drop a new provider file in the `providers/` f
|
||||
async function getYourproviderStreams(tmdbId, mediaType, season, episode) {
|
||||
// Your scraping/API logic here
|
||||
return [{
|
||||
name: "YourProvider",
|
||||
title: "Fight Club - 1080p [YourProvider #1]",
|
||||
url: "https://stream.url/video.mp4",
|
||||
quality: "1080p",
|
||||
@@ -287,30 +315,46 @@ The system automatically:
|
||||
|----------|-------------|
|
||||
| `GET /api/health` | Basic heartbeat |
|
||||
| `GET /api/metrics` | Runtime counters & summary |
|
||||
| `GET /api/status` | Metrics + providers + endpoints list |
|
||||
| `GET /api/providers` | Enabled providers summary |
|
||||
| `GET /api/status` | Metrics + providers + endpoints + `providerCheckTmdbId` |
|
||||
| `GET /api/providers` | All providers with enabled status |
|
||||
| `GET /api/providers/:name` | Single provider status |
|
||||
| `GET /api/streams/:type/:tmdbId` | Aggregate streams (`type` = movie|series) |
|
||||
| `GET /api/streams/:provider/:type/:tmdbId` | Provider-specific streams |
|
||||
| `GET /api/config` | `{ merged, override }` |
|
||||
| `POST /api/config` | Apply override patch |
|
||||
| `GET /api/streams/:type/:tmdbId` | Aggregate streams (`type` = movie\|series; supports `?season=&episode=`) |
|
||||
| `GET /api/streams/:provider/:type/:tmdbId` | Provider-specific streams (same query params) |
|
||||
| `GET /api/config` | `{ merged, override, overridePath }` |
|
||||
| `POST /api/config` | Apply override patch (persisted to `utils/user-config.json`) |
|
||||
| `POST /api/restart` | Graceful restart (writes `restart.trigger` + exits) |
|
||||
| `GET /api/debug/env` | Debug environment/config snapshot |
|
||||
|
||||
Aggregate endpoint auto-resolves IMDb when needed and merges provider output before filtering.
|
||||
Proxy routes (mounted only when `enableProxy` is on):
|
||||
| Endpoint | Description |
|
||||
|----------|-------------|
|
||||
| `GET /m3u8-proxy?url=...&headers=...` | Rewrites & serves HLS playlists/segments |
|
||||
| `GET /ts-proxy?url=...&headers=...` | Range-aware file/segment proxy |
|
||||
| `GET /sub-proxy?url=...` | Subtitle passthrough proxy |
|
||||
|
||||
The aggregate endpoint auto-resolves IMDb when needed, merges all enabled (or `defaultProviders`) provider output, then applies filtering. Provider timing is returned per provider (`providerTimings`).
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Stream Object Schema (Unified)
|
||||
```json
|
||||
{
|
||||
"title": "Fight Club - 1080p [MP4Hydra #2]",
|
||||
"name": "ProviderDisplay",
|
||||
"title": "Fight Club - 1080p [YourProvider #1]",
|
||||
"url": "https://stream.url/video.mp4",
|
||||
"quality": "1080p",
|
||||
"provider": "mp4hydra",
|
||||
"headers": { "User-Agent": "Mozilla/5.0" }
|
||||
"provider": "yourprovider",
|
||||
"headers": { "User-Agent": "Mozilla/5.0" },
|
||||
"subtitles": [ { "url": "https://.../en.srt", "lang": "English" } ]
|
||||
}
|
||||
```
|
||||
- `name` / `title` – display strings (often include quality/source hints).
|
||||
- `url` – direct upstream URL (or proxied URL when `enableProxy` is on).
|
||||
- `quality` – e.g. `Auto`, `1080p`, `720p`, `480p`, `4K`. Missing/unknown qualities parse as `0`.
|
||||
- `headers` – optional upstream request headers (stripped when proxying).
|
||||
- `subtitles` – optional embedded subtitle tracks (CastleTV, NetMirror, OneTouchTV, Showbox).
|
||||
|
||||
Filtering passes through `applyFilters` to enforce min quality + codec exclusions.
|
||||
Filtering passes through `applyFilters` to enforce min quality + codec exclusions (see below).
|
||||
|
||||
> Note: When the `enableProxy` flag is turned on, provider-specific request headers are stripped from each stream object before responding. Clients should use the proxied URL directly without adding custom Referer/Origin headers.
|
||||
|
||||
@@ -319,9 +363,14 @@ Filtering passes through `applyFilters` to enforce min quality + codec exclusion
|
||||
## ⚙️ Configuration Flags (Advanced Panel)
|
||||
| Flag | Default | Purpose |
|
||||
|------|---------|---------|
|
||||
| disableCache | false | Disables internal caches |\n| disableUrlValidation | false | Skip general URL pattern validation checks |
|
||||
| disable4khdhubUrlValidation | false | Skip 4khdhub-specific URL validation |
|
||||
| enableProxy | false | Mounts proxy routes and rewrites stream URLs through them |
|
||||
| `enable<Name>Provider` | true | Enable/disable a provider (e.g. `enableCastletvProvider`) |
|
||||
| `disableCache` | false | Disables internal caches |
|
||||
| `enablePStreamApi` | true | PStream API flag |
|
||||
| `disableUrlValidation` | false | Skip general URL pattern validation checks |
|
||||
| `disable4khdhubUrlValidation` | false | Skip 4khdhub-specific URL validation |
|
||||
| `enableProxy` | false | Mounts proxy routes and rewrites stream URLs through them |
|
||||
| `providerCheckTmdbId` | `278` | TMDB ID used by dashboard functional checks |
|
||||
| `showboxCacheDir` | — | Custom Showbox cache directory |
|
||||
|
||||
Toggle `enableProxy` to activate the internal proxy. This adds lightweight playlist/segment/subtitle rewriting without modifying provider code. Disable it to return direct upstream URLs.
|
||||
|
||||
@@ -329,10 +378,11 @@ Toggle `enableProxy` to activate the internal proxy. This adds lightweight playl
|
||||
|
||||
## 🧩 Quality & Codec Filtering
|
||||
- Presets: `all`, `480p`, `720p`, `1080p`, `1440p`, `2160p`.
|
||||
- Custom quality JSON example:
|
||||
- Custom quality JSON example (runtime applies the `default` entry; per-provider keys are preserved for future use):
|
||||
```json
|
||||
{ "default": "900p", "4khdhub": "1080p" }
|
||||
{ "default": "900p" }
|
||||
```
|
||||
- Quality strings are normalized numerically — `Auto` ≈ 1080, `HD` ≈ 720, `SD` ≈ 480, plus `4K`/`2160`, `1440`, `1080`, `720`, `576`, `480`, `360`, `240`.
|
||||
- Codec exclusion JSON example:
|
||||
```json
|
||||
{ "excludeDV": true, "excludeHDR": false }
|
||||
@@ -340,11 +390,20 @@ Toggle `enableProxy` to activate the internal proxy. This adds lightweight playl
|
||||
|
||||
---
|
||||
|
||||
## 📊 Server Status & Functional Checks
|
||||
The **Server Status** panel shows live metrics, the endpoint list, and a per-provider functional check table:
|
||||
|
||||
- **Run Provider Functional Checks** – hits `/api/streams/:provider/movie/:tmdbId` for each enabled provider and reports pass/fail with stream counts.
|
||||
- **Provider check TMDB ID** – the title used for the checks is configurable in the dashboard (default `278` = *The Shawshank Redemption*). The value is persisted to `utils/user-config.json` and exposed via `/api/status` as `providerCheckTmdbId`.
|
||||
|
||||
---
|
||||
|
||||
## 🔐 Security Notes
|
||||
- Admin UI requires login; session cookie is HttpOnly.
|
||||
- Cache-control headers disable storing sensitive pages.
|
||||
- Login is rate limited with escalating lockouts.
|
||||
- Password change endpoint enforces minimum length.
|
||||
- Login is rate limited with escalating lockouts (5 attempts per window).
|
||||
- Password change endpoint enforces minimum length (8+).
|
||||
- Default credentials (`admin` / `change-me`) are generated on first run — change them immediately.
|
||||
|
||||
---
|
||||
|
||||
@@ -354,6 +413,7 @@ Toggle `enableProxy` to activate the internal proxy. This adds lightweight playl
|
||||
| Node Version | 18+ LTS |
|
||||
| Reverse Proxy | Terminate TLS (e.g., Nginx) and forward to API port |
|
||||
| Persistent Config | Mount / persist `utils/user-config.json` |
|
||||
| Auth Users | Persist `utils/auth-users.json` so credentials survive restarts |
|
||||
| Logs | Pipe stdout to centralized logger |
|
||||
| Scaling | Use a single instance unless providers are CPU bound |
|
||||
|
||||
@@ -368,6 +428,8 @@ For ephemeral platforms (e.g., Vercel) note that some providers use temporary di
|
||||
| Provider missing in matrix | Ensure its enable flag exists & UI updated |
|
||||
| Empty merged config after restart | `user-config.json` deleted or unreadable |
|
||||
| Streams low quality | Adjust min quality preset or custom JSON |
|
||||
| Showbox shows nothing | Provide `FEBBOX_COOKIES` (comma-separated) under Keys |
|
||||
| Functional checks fail | Some providers 0-stream legit titles; try changing the *Provider check TMDB ID* |
|
||||
|
||||
---
|
||||
|
||||
@@ -393,7 +455,7 @@ Every contribution accelerates feature delivery & sustainability.
|
||||
---
|
||||
|
||||
## 📜 License
|
||||
MIT. See `LICENSE`.
|
||||
MIT.
|
||||
|
||||
---
|
||||
|
||||
@@ -404,4 +466,4 @@ Inspired by community scraping/stream aggregation efforts. Credits also to the o
|
||||
|
||||
> *Happy streaming & hacking!* ✨
|
||||
|
||||
---
|
||||
---
|
||||
Reference in New Issue
Block a user