Un addon per Stremio che estrae sorgenti streaming dai siti vixsrc e animeunity animesaturn daddy e vavoo per permetterti di guardare film, serie TV, anime e tv con la massima semplicità.
Istanza ElfHosted a pagamento CON Mediaflo Proxy incluso (Per Eventi Sportivi)
Istanza ElfHosted con Mediaflow
- ✅ Supporto Film: Trova flussi streaming per i film utilizzando il loro ID TMDB.
- 📺 Supporto Serie TV: Trova flussi per ogni episodio di una serie TV, basandosi su ID TMDB in formato stagione/episodio.
- 🇪🇺 Eurostreaming (ES) Episodi: Integrazione sperimentale per episodi tramite pulsante toggle (titolo StreamViX ES) con estrazione Python dedicata.
- ⛩️ Supporto Anime: Trova flussi per ogni episodio di una determinato Anime, ora supporta ricerca sia da cinemeta, sia da tmdb che da kitsu.
- 📡 Supporto Live TV: Canali TV italiani con EPG integrato.
- 📡 Supporto Eventi Sportivi: Eventi sportivi aggiornati ogni giorno.
- 🔗 Integrazione Perfetta: Si integra meravigliosamente con l'interfaccia di Stremio per un'esperienza utente fluida.
- 🌐 Proxy Unificato: Un solo proxy MFP per tutti i contenuti (film, serie, anime, TV, eventi sportivi).
- ⚽ Eventi Sportivi Avanzati:
- SPON (Schedule-based): Matching automatico eventi sportivi con canali Sportzonline (wrap MFP diretto + fallback estrattore TypeScript)
- SPSO: Integrazione playlist SportSOnline con varianti
[SPSO]OFF - RB77: Flussi italiani certificati con simboli dinamici (🚫/�) OFF
- Streamed: Arricchimento playlist con matching fuzzy e finestre temporali OFF
- P🐽D (Pig): Stream prioritari broadcaster (SKY, DAZN, Eurosport) OFF
- 🎯 Ottimizzazione Automatica: MFP wrap diretto per massima velocità, estrattori TypeScript come fallback sicuro
- 📡 Supporto Live TV: Canali TV italiani e Eventi Sportivi visibili senza Mediaflow Proxy, scegliere i canali [Vavoo] o con 🏠.
- 🔓 Supporto Stream Senza Mediaflow Proxy: Canali TV italiani e Eventi Sportivi, Film e Serie TV, scegliere gli stream con 🔓 per avviarli senza aver bisogno di un MediaflowProxy. (Nota Bene, per avviare gli stream senza proxy ci potrebbe essere bisogno di un player esterno o VLC, prova con il player di default, se non va usa un player esterno tipo VLC)
Comandi per Live TV da browser
http://urladdon/live/update aggiorna lista live events (include processing SPON)
http://urladdon/live/purge cancella vecchi eventi
http://urladdon/live/reload aggiorna il catalogo stremio
http://urladdon/static/reload ricarica canali TV statici
Endpoint aggiuntivi per arricchimento
http://urladdon/streamed/reload avvia arricchimento Streamed
http://urladdon/rbtv/reload avvia arricchimento RB77/RBTV
http://urladdon/spso/reload avvia arricchimento SPSO
http://urladdon/amstaff/reload avvia arricchimento MPD
http://urladdon/rm/reload avvia arricchimento MPD2
http://urladdon/tn/reload avvia arricchimento TN
StreamViX utilizza un sistema di proxy unificato che semplifica la configurazione:
- Un solo URL e password per tutti i contenuti (film, serie, anime, TV)
MFP_URL: URL del tuo proxy MFP (es:https://mfp.tuodominio.com)MFP_PASSWORDoMFP_PSW: Password del proxy MFPTMDB_API_KEY: Chiave API TMDB per metadati (OPZIONALE)ANIMEUNITY_ENABLED: Abilita AnimeUnity (true/false)ANIMESATURN_ENABLED: Abilita AnimeSaturn (true/false)Enable MPD Streams: (true/false) Non funzionanti, lasciare falseEnable Live TV: Abilita per vedere live TV e eventi sportivi (true/false)DLHD_PROXY: ENV pubblica proxy residenziale kubernetes - config mapsPROXY: ENV pubblico proxy personale kubernetes - config maps
SPON_PROG_URL: URL custom per download prog.txt Sportzonline (default: auto)SPON_PROG_FALLBACKS: URL fallback aggiuntivi separati da virgolaRBTV_PLAYLIST_URL: URL playlist RB77 (default: auto)SPSO_PLAYLIST_URL: URL playlist SPSO (default: auto)STREAMED_ENABLE: Abilita integrazione Streamed (0/1)STREAMED_PLAYLIST_URL: URL playlist Streamed
Per ottenere correttamente i flussi VixSrc in Full HD (forzatura &h=1 + endpoint synthetic) nelle installazioni locali o su VPS è necessario impostare una variabile d'ambiente che dica all'estrattore qual è la BASE URL pubblicamente raggiungibile del tuo addon.
Imposta (SENZA lo slash finale):
ADDON_BASE_URL=https://tuo-dominio-o-ip
Note importanti:
- Nessuno slash finale (✅
https://mioaddon.example❌https://mioaddon.example/). - Serve solo su installazioni locali / VPS / Docker self‑host: le istanze pubbliche già integrate (es. quella di default
https://streamvix.hayd.uk) non richiedono configurazione manuale. - Se non la imposti, l'addon userà il fallback interno
https://streamvix.hayd.uke i flussi funzioneranno comunque, ma nelle installazioni dietro IP locale/pubby NAT potresti non ottenere il synthetic FHD. - La variabile viene usata per costruire l'endpoint interno
/vixsynthetic(multi‑lingua + best video) — senza un BASE corretto non può generare quell'URL. - Non inserire il dominio di VixSrc stesso (verrà ignorato).
Opzionale correlato:
VIX_DUAL=1
Abilita il pairing (Direct/Proxy + varianti Synthetic FHD) anche quando la pill “FHD” è disattivata in landing perché stai usando una configurazione legacy o script headless.
Esempio blocco environment in docker-compose.yml:
environment:
- ADDON_BASE_URL=https://streamvix.miodominio.xyz
- MFP_URL=https://mfp.miodominio.xyz
- MFP_PSW=supersecret
- VIX_DUAL=1 # opzionale
- TMDB_API_KEY=xxxxxSe cambi ADDON_BASE_URL riavvia il container / processo per far sì che venga letto all'avvio.
Nella pagina di installazione / configurazione dell'addon (landing) ora è mostrato un badge subito sopra il toggle VixSrc con il testo:
Addon Base URL: <valore> (protocollo rimosso, es: streamvix.miodominio.xyz)
Questo valore è quello che l'addon ha realmente risolto all'avvio. Usalo per verificare che la tua variabile d'ambiente sia attiva.
| Cosa vedi nel badge | Significato | Azione |
|---|---|---|
| Il tuo dominio/IP | OK, configurazione corretta | Nessuna |
streamvix.hayd.uk ma ti aspetti altro |
Fallback attivo: ADDON_BASE_URL non letta |
Controlla variabile + riavvio |
Checklist quando resta il fallback:
- Variabile scritta correttamente (maiuscole esatte, niente slash finale).
- Hai riavviato il container / processo dopo averla aggiunta o modificata.
- Stai aprendo la landing usando esattamente l'host pubblico configurato (non un IP locale diverso).
- Nessun carattere strano o spazio invisibile (ricopia a mano se dubbio).
- Non hai usato il dominio di VixSrc (non valido come base).
- Reverse proxy passa gli header Host / X-Forwarded-* corretti (se dubbi prova accesso diretto alla porta per confronto).
Se dopo il riavvio il badge continua a mostrare il fallback ma sei certo dei punti sopra, prova a:
- Stampare le variabili con
docker compose exec <container> env | grep ADDON_BASE_URL. - Verificare che non esistano doppi
ADDON_BASE_URLin compose / override.
Gli eventi sportivi utilizzano un sistema multi-layer con wrap MFP diretto e fallback intelligenti:
- Strategia principale: Wrap MFP diretto dell'URL canale Sportzonline
- MFP gestisce server-side: download pagina → iframe → unpacking P.A.C.K.E.R. → estrazione m3u8 → proxy HLS
- Velocissimo (nessuna elaborazione TypeScript), bypass CORS automatico
- Fallback sicuro: Se MFP wrap non produce stream, chiama estrattore TypeScript
- Estrae m3u8 + headers, poi wrappa in MFP o usa behaviorHints
- Limita a max 3 canali per performance
- Dominio unificato: Usa solo
sportzonline.st(domini legacy rimossi) - Matching eventi: Fuzzy matching squadre + supporto eventi single-entity (F1, MotoGP, Tennis)
- Logs:
[SPON][ROW][MFP-WRAP](wrap diretto) /[SPON][FALLBACK][ROW](estrattore TypeScript)
- [P🐽D] (Pig): Stream broadcaster prioritari (SKY, DAZN, Eurosport) - sempre in cima
- [RB77🇮🇹]: Flussi italiani certificati con simboli dinamici (🚫 pre-start / 🔴 live)
- [SPSO]: Playlist SportSOnline con varianti compatte
- [Strd]: Streamed playlist con matching fuzzy tollerante
[P🐽D]+ cluster 🇮🇹[SPON🇮🇹](canali italiani HD7/HD8)[SPON](altri canali)[RB77🇮🇹]/[RB77][SPSO][Strd]- Altri dinamici / Vavoo
Live.py viene eseguito automaticamente OGNI 2 ORE a partire dalle 08:10 Europe/Rome nelle seguenti fasce: 08:10, 10:10, 12:10, 14:10, 16:10, 18:10, 20:10, 22:10, 00:10, 02:10, 04:10, 06:10.
Ad ogni esecuzione:
- Scarica / rigenera
dynamic_channels.json. - La cache dinamica in memoria viene invalidata e ricaricata.
- L'addon legge sempre
config/dynamic_channels.jsoncosì com'è ad ogni richiesta. - Nessun filtro runtime per data è applicato di default.
- Questo garantisce che ciò che vedi nel catalogo corrisponde sempre al contenuto del file JSON aggiornato dallo scheduler/
/live/update.
Se in futuro vuoi riattivare la logica di filtro per data:
DYNAMIC_DISABLE_RUNTIME_FILTER=0abilita il filtro runtime.DYNAMIC_PURGE_HOUR(default8): ora (Europe/Rome) dopo cui gli eventi del giorno precedente NON vengono più mostrati a catalogo.DYNAMIC_KEEP_YESTERDAY(default0): se1, mantiene visibili anche gli eventi di ieri fino al purge fisico.DYNAMIC_EVENT_MAX_AGE_HOURS(default0disabilitato): se > 0, rimuove (runtime filter + purge fisico) qualsiasi evento il cuieventStartè più vecchio di N ore rispetto all'orario corrente (Europe/Rome). Esempio: impostandoDYNAMIC_EVENT_MAX_AGE_HOURS=8un evento iniziato alle 10:00 sparirà dopo le 18:00 anche se è ancora “oggi”.
Aspettative quando riattivi il filtro:
- Prima di
DYNAMIC_PURGE_HOUR: vedrai eventi di oggi e, se presenti, ancora quelli di ieri (seDYNAMIC_KEEP_YESTERDAY=1). - Dopo
DYNAMIC_PURGE_HOUR: vedrai solo gli eventi coneventStartdi oggi (quelli di ieri spariscono dal catalogo). - Purge fisico alle 02:05 riscrive il file rimuovendo definitivamente gli eventi di ieri a prescindere dal filtro runtime.
La rimozione degli eventi del giorno precedente avviene in due modi:
- Filtro runtime: se
process.env.DYNAMIC_PURGE_HOUR(default 08) è passato, gli eventi coneventStartdel giorno precedente non vengono più mostrati a catalogo. - Purge fisico programmato: alle 02:05 viene eseguito un purge che riscrive il file eliminando gli eventi obsoleti (endpoint manuale:
/live/purge). Reload di sicurezza alle 02:30.
Nota: con il comportamento "JSON as-is" attivo (default), la visibilità degli eventi dipende solo dal contenuto del JSON e dal purge fisico; il filtro runtime è disabilitato.
Se vuoi modificare solo la finestra di visibilità estesa fino a una certa ora, imposta DYNAMIC_PURGE_HOUR (es. DYNAMIC_PURGE_HOUR=9).
| Prefisso / Emoji | Condizione |
|---|---|
[Player Esterno] |
Aggiunto a flussi FAST / leftover generic non già marcati [Strd], [RB77…], [SPSO], [P🐽D], [🌍dTV] |
[Strd] |
Stream provenienti da playlist Streamed |
[RB77🇮🇹] / [RB77] |
Flussi RBTV italiani / fallback |
[SPSO] |
Varianti playlist SportSOnline (solo tag variante) |
[P🐽D] |
Broadcaster playlist PD |
| Emoji 🇮🇹 | Riconoscimento sorgente/titolo italiano |
| Endpoint | Descrizione |
|---|---|
/live/update |
Esegue subito Live.py e ricarica dinamici (include SPON) |
/live/reload |
Invalida cache e ricarica senza rieseguire script |
/live/purge |
Purge fisico file eventi vecchi |
/static/reload |
Ricarica canali TV statici |
/streamed/reload |
Avvia arricchimento Streamed in finestra |
/streamed/reload?force=1 |
Forza Streamed (ignora finestre) |
/rbtv/reload |
Avvia arricchimento RBTV in finestra |
/rbtv/reload?force=1 |
Forza RBTV (ignora finestre) |
/spso/reload |
Avvia arricchimento SPSO (SportSOnline) |
/spso/reload?force=1 |
Forza SPSO (placeholder future finestre) |
| Variabile | Default | Descrizione |
|---|---|---|
MFP_URL |
- | OBBLIGATORIO - URL MediaFlow Proxy per wrap SPON |
MFP_PASSWORD / MFP_PSW |
- | OBBLIGATORIO - Password MediaFlow Proxy |
SPON_PROG_URL |
auto | URL custom prog.txt Sportzonline (opzionale) |
SPON_PROG_FALLBACKS |
- | URL fallback prog.txt separati da virgola |
SPON_PROG_FORCE_REFRESH |
0 | 1 = ignora cache 4h prog.txt, refresh sempre |
DYNAMIC_PURGE_HOUR |
8 | Ora (Rome) dopo cui gli eventi del giorno precedente spariscono dal catalogo |
DYNAMIC_DISABLE_RUNTIME_FILTER |
1 | 1 = non filtrare per data (usa JSON as-is); 0 = abilita filtro giorno |
RBTV_DISCOVERY_BEFORE_MIN |
15 | Minuti prima start per discovery RB77 |
RBTV_DISCOVERY_AFTER_MIN |
10 | Minuti dopo start per discovery RB77 |
STREAMED_ENABLE |
0 | 1 = abilita integrazione Streamed |
SPSO_PLAYLIST_URL |
auto | URL playlist SPSO custom |
STATIC_DADDY_LAZY |
1 | Estrazione DaddyHD canali statici: 1 (default) = lazy/veloce (link diretto, non estratto, estrazione al play), 0 = eager/lento (estrazione preventiva prima di mostrare lista) |
L'integrazione [P🐽D] aggiunge flussi prioritari provenienti da playlist esterne per:
- Canali TV statici italiani esistenti (
tv_channels.json): viene aggiunto il campopdUrlFse il canale è presente anche nella playlist ITALY (nessuna creazione di nuovi canali). - Eventi sportivi dinamici (
dynamic_channels.json): vengono iniettati uno o più stream[P🐽D] <Broadcaster>in testa alla lista degli stream dell'evento se esiste una corrispondenza tra le squadre (match "Team A vs Team B").
- Mai creati canali nuovi: solo arricchimento di quelli già presenti.
- Idempotente: riesecuzioni non duplicano
pdUrlFné gli stream[P🐽D]. - Ordinamento: gli stream
[P🐽D]sono sempre in cima; seguono eventuali stream Vavoo, poi gli altri. - Mapping speciale Sky Calcio: nomi tipo
Sky Calcio 1 (251)→Sky Sport 251(esteso automaticamente 251–269). - Filtri broadcaster: accetta solo etichette contenenti SKY SPORT / SKY (con IT/ITALY), DAZN, EUROSPORT, PRIME, AMAZON.
Live.py genera dynamic_channels.json → viene eseguito pig_channels.py → aggiorna tv_channels.json (pdUrlF) + inietta [P🐽D] negli eventi → l'addon carica/merge e serve.
| Variabile | Default | Descrizione |
|---|---|---|
WATCH_INTERVAL_MS |
300000 | Intervallo (ms) loop watcher unificato che ricarica static/dynamic se i file cambiano (fallback: TV_STATIC_WATCH_INTERVAL_MS / DYNAMIC_WATCH_INTERVAL_MS). |
TV_STATIC_WATCH_INTERVAL_MS |
– | Fallback legacy per l'intervallo static (usato se WATCH_INTERVAL_MS non presente). |
DYNAMIC_WATCH_INTERVAL_MS |
– | Fallback legacy per l'intervallo dynamic (usato se WATCH_INTERVAL_MS non presente). |
DIAG_PD |
1 | Abilita diagnostica startup: stampa hash/presenza di pig_channels.py, tv_channels.json, dynamic_channels.json e conteggio label [P🐽D]. Mettere 0 per disattivare. |
PYTHON_BIN |
python3 | Binario Python usato per script di arricchimento opzionali. |
DYNAMIC_FILE |
autodetect | Path al file dinamico (passato anche agli script figli se definito). |
Per rieseguire post-processing manuale:
python3 pig_channels.py --dynamic /percorso/dynamic_channels.json --tv-config config/tv_channels.json
Prefissi:
[PD][BOOT]avvio script[PD][HTTP]download playlist[PD][PARSE]parsing M3U[PD][PATH]diagnostica file input[PD][STATE]riepilogo eventi dinamici trovati[PD][DONE]completamento iniezione
| Endpoint / Script | Azione | Note |
|---|---|---|
/live/update |
Esegue Live.py quindi il post-processing pig_channels.py |
Rigenera completamente dynamic_channels.json e re-inietta gli stream [P🐽D]. Aggiorna anche pdUrlF nei canali statici. |
/live/reload |
Ricarica in memoria il file dinamico già processato | Non rilancia gli script: mantiene le ultime iniezioni [P🐽D]. |
/static/reload |
Ricarica i canali statici (tv_channels.json) |
Utile dopo modifiche manuali a pdUrlF o mapping Sky Calcio. |
python3 pig_channels.py --dynamic /path/dynamic_channels.json --tv-config config/tv_channels.json |
Post-processing manuale standalone | Non rigenera gli eventi: ri-applica solo l'arricchimento [P🐽D] e pdUrlF. |
Re-iniezione rapida senza aspettare la prossima finestra schedulata:
- Modifica playlist esterna / mapping.
- Chiama
/live/update(o eseguiLive.pymanualmente) per pipeline completa, oppure esegui direttamentepig_channels.pyse vuoi solo reiniettare.
Diagnostica iniziale (se DIAG_PD=1) mostra:
- Conteggio stream
[P🐽D]trovati negli eventi - Quanti canali statici hanno
pdUrlF - Hash/mtime dei file coinvolti
La sorgente RB77 (script rbtv_streams.py) arricchisce gli eventi dinamici con flussi marcati esplicitamente come italiani tramite tag tra parentesi quadre (es. [HDD B ITALIANO], [SD ITA], [VDO ITALY]).
- Iniettare solo varianti chiaramente italiane (riducendo falsi positivi tipo “digital”).
- Persistenza dei flussi: una volta scoperti restano associati all'evento anche fuori finestra (con simbolo aggiornato).
- Matching squadre molto preciso per evitare contaminazioni tra partite diverse (nessun cross-match Udinese↔Verona ecc.).
- Supporto eventi single-entity (MotoGP / F1 / Tennis) tramite elenco keyword.
| Parametro | Descrizione |
|---|---|
RBTV_DISCOVERY_BEFORE_MIN |
Minuti prima dell'eventStart in cui iniziare a cercare (default 15) |
RBTV_DISCOVERY_AFTER_MIN |
Minuti dopo l'inizio evento in cui continuare ad aggiungere nuove varianti (default 10) |
RBTV_FORCE |
Se impostata (1/true) ignora completamente le finestre e prova per tutti gli eventi (utile test) |
Fuori finestra (e non in force) lo script aggiorna solo l'emoji (🚫 / 🔴) dei flussi già presenti e prova un restore da cache se il titolo è scomparso.
Accetta SOLO titoli che abbiano almeno un tag tra parentesi quadre contenente token italiani:
ita, italy, italia, italiano, oppure forme parziali ital se configurate.
Variabili:
| Variabile | Default | Note |
|---|---|---|
RBTV_LANG_KEYWORDS |
italiano,italia,italy,ita,[ita] |
Lista include (csv, case-insensitive) |
RBTV_EXCLUDE_KEYWORDS |
(lista lingue estere) | Esclude se matcha (evita english, spanish, ecc.) |
RBTV_STRICT |
0 | Se 1 richiede presenza [ITA] o parola intera italy/italia/italiano |
- Parse nome evento (pattern
Team A vs Team B) usando l'ULTIMO separatorev|vs|vs.presente nel titolo (elimina prefissi tipo "Serie A - "). - Normalizzazione: minuscole, rimozione rumore (ac, fc, calcio, club, anni), mapping sinonimi (
internazionale→inter,hellas→verona,juventus→juve, ecc.). - Confronto ordine-indipendente (set esatto). Solo se entrambe le coppie coincidono viene accettato direttamente.
- (Opzionale) Fuzzy: se il match esatto fallisce e fuzzy abilitato verifica due possibili accoppiamenti con
difflib.SequenceMatcherusando soglia media e minima per singolo team. - Partial / single-side matching DISATTIVATI di default (riduce rumorosità). Possono essere riattivati con
RBTV_ALLOW_PARTIAL=1.
| Variabile | Default | Descrizione |
|---|---|---|
RBTV_FUZZY_RATIO |
0.75 | Soglia media fuzzy (clamp 0.5–0.95). Per-team min = max(0.55, soglia-0.2) |
RBTV_ALLOW_PARTIAL |
0 | Se 1 riabilita match parziali / single-side (sconsigliato in produzione) |
RBTV_DEBUG_MATCH |
0 | Log dettagli per ogni titolo saltato / accettato |
RBTV_DEBUG_SUMMARY |
0 | Riepilogo per evento (conteggio exact/partial/single/fuzzy) |
RBTV_MAX_VARIANTS |
0 | Limita numero varianti per stesso incontro (scoring HDD B > HDD A > VDO > SD) |
| Elemento | Significato |
|---|---|
[RB77🇮🇹] |
Variante con tag lingua italiana riconosciuta |
[RB77] |
Fallback (nessuna variante italiana trovata per competizioni target) |
| 🚫 | Mancano >10 minuti allo start evento |
| 🔴 | Evento imminente (≤10 min) o iniziato |
Fallback: se (a) l'evento appartiene a categorie target (Serie A/B/C, F1, MotoGP, Tennis, Volleyball) e (b) non è stata trovata NESSUNA variante italiana → vengono iniettate tutte le varianti NON SD (filtrando titoli contenenti SD/LOW). Se almeno una variante italiana è trovata, SOLO quelle italiane sono iniettate (nessun mixing fallback).
Ordinamento:
- Blocchi
[P🐽D]+ cluster 🇮🇹 preesistente - Blocchi RB77 (
[RB77🇮🇹]oppure fallback[RB77]) [SPSO][Strd]- Leftover dinamici
Aggiornamento simboli (🚫/🔴) anche fuori discovery per stream persistiti.
File cache: /tmp/rbtv_streams_persist.json contiene per-evento i flussi RB77 già scoperti; se il file dinamico viene rigenerato gli stessi stream vengono reiniettati (con prefisso aggiornato) purché l’evento esista ancora.
| Obiettivo | Azione |
|---|---|
| Rendere matching ancora più severo | Aumenta RBTV_FUZZY_RATIO a 0.8–0.85 e lascia RBTV_ALLOW_PARTIAL=0 |
| Consentire varianti parziali (nomi incompleti) | RBTV_ALLOW_PARTIAL=1 (attenzione a possibili cross-match) |
| Limitare varianti per pulizia UI | RBTV_MAX_VARIANTS=2 |
| Debug profondo | RBTV_DEBUG_MATCH=1 RBTV_DEBUG_SUMMARY=1 |
| Sintomo | Possibile Causa | Soluzione |
|---|---|---|
| Nessun flusso RB77 appare | Fuori discovery e RBTV_FORCE non impostato |
Imposta RBTV_FORCE=1 per test oppure attendi finestra |
| Flussi non marcati 🚫 / 🔴 correttamente | Clock server timezone non UTC o eventStart formattato male |
Verifica ISO eventStart (termina con Z) |
| Cross-match tra partite | RBTV_ALLOW_PARTIAL=1 attivo + fuzzy troppo basso |
Disabilita partial o alza soglia fuzzy |
| Varianti eccessive stesso match | Nessun limite e playlist include A/B/SD/VDO | Imposta RBTV_MAX_VARIANTS |
| Playlist vuota | URL non raggiungibile o filtri italiani troppo stretti | Disabilita RBTV_STRICT temporaneamente e controlla log fetch |
- De-duplicazione tra eventi invertiti (A vs B / B vs A) selezionando evento primario.
- Lista sinonimi estesa (Serie B/C) caricabile da file esterno.
- Modalità “audit” che salva CSV con motivazioni di skip.
La sorgente SPSO (spso_streams.py) aggiunge varianti addizionali provenienti dalla playlist SportSOnline.
- Titolo minimale:
[SPSO] ⚽ [HDD A](solo prefisso + emoji + ultima variante tra parentesi quadre originaria). - Nessun nome evento ripetuto (riduce lunghezza UI).
- Ordering fisso: dopo RB77 / prima di
[Strd]. - Matching squadre con separatore
x(es.Napoli x Pisa). - Persistenza locale:
/tmp/spso_streams_persist.jsonper reiniezione post rigenerazione dinamici. - Filtro lingua opzionale (disattivo di default) attivabile con
SPSO_LANG_FILTER=1. - Nessun simbolo dinamico (🚫/🔴) per ora.
| Endpoint | Descrizione |
|---|---|
/spso/reload |
Fetch + arricchimento immediato playlist SPSO |
/spso/reload?force=1 |
Force mode (placeholder future finestre) |
| Variabile | Default | Descrizione |
|---|---|---|
SPSO_PLAYLIST_URL |
https://world-proxifier.xyz/sportsonline/playlist.m3u8 | URL principale |
SPSO_FALLBACK_URL |
(stesso) | URL fallback |
SPSO_FORCE |
0 | Forza elaborazione (futuro: ignora finestre) |
SPSO_FETCH_ATTEMPTS |
3 | Tentativi download |
SPSO_FETCH_TIMEOUT |
12 | Timeout singolo (s) |
SPSO_DEBUG_FETCH |
0 | Log dettagli HTTP |
SPSO_FAST_FORCE |
0 | Percorso rapido se insieme a force |
SPSO_LANG_FILTER |
0 | Abilita filtro lingua |
SPSO_LANG_KEYWORDS |
italiano,italia,italy,ita | Token accettati se filtro attivo |
SPSO_UA |
(auto) | User-Agent personalizzato |
[P🐽D]/ cluster 🇮🇹[RB77🇮🇹]/[RB77][SPSO][Strd]- Altri dinamici / leftover
| Sintomo | Causa | Azione |
|---|---|---|
Nessun stream [SPSO] |
Playlist non raggiungibile | Verifica URL / abilita SPSO_DEBUG_FETCH=1 |
| Duplicati variante | Persist + nuova playlist con titoli quasi identici | Cancella /tmp/spso_streams_persist.json e reload |
Prefisso rimappato a [Player Esterno] |
Regex addon non aggiornata (versione vecchia) | Aggiorna addon con patch whitelist SPSO |
Arricchisce gli eventi sportivi dinamici con stream provenienti da una playlist M3U esterna. Funzione disabilitata di default. (Vecchio prefisso legacy [Streamed] ancora riconosciuto per evitare duplicati durante la transizione.)
- Prefisso più corto:
[Strd]. - Matching fuzzy tollerante: ordine squadre invertito, descrizioni aggiuntive, tag finali vengono ignorati.
- Supporto eventi single-entity / tournament (F1, MotoGP, Tennis, coppe, practice/qualifying): matching per parole chiave con soglia configurabile.
- Modalità debug per vedere i match fuzzy accettati.
- Sottotoken opzionali (es: "man" dentro "manchester") disattivabili.
- Parse del nome evento
⏰ HH:MM : Team A vs Team B - League ...per estrarreTeam A,Team B. - Normalizzazione: rimozione prefissi (AC/AS/FC/US/SSC...), mapping speciali (Inter, Milan, Juventus, ecc.), fallback ultimo token.
- Match diretto esatto ordine-indipendente se il titolo playlist contiene esplicitamente le due parti separate da
vs. - Fallback fuzzy: il titolo della playlist deve contenere almeno un alias per Team A e uno per Team B (con o senza sottotoken, configurabile).
Log fuzzy (se STREAMED_MATCH_DEBUG=1):
[STREAMED][MATCH][FUZZ] teams 'milan' 'inter' title='Serie A - Inter vs AC Milan [ECHO]'
Usato quando non si trovano due squadre chiare. Esempi: Qatar Airways Azerbaijan GP : Practice 1, Roland Garros - Day 3.
- Identificazione evento single-entity se contiene almeno una keyword (gp, grand prix, formula 1, motogp, qualifying, roland garros, wimbledon, atp, wta, masters, cup, champions league, ecc.).
- Costruzione bag di token significativi (>2 caratteri) dal segmento principale del nome evento (prima di
- League). - Un titolo playlist è accettato se contiene almeno
STREAMED_MIN_KEYWORD_HITSdi quei token (default 2). Soglia minima reale 1. - Log debug (se attivo):
[STREAMED][MATCH][FUZZ][SINGLE] hits=3 title='Azerbaijan GP Practice 1 HD' event='⏰ 10:30 : Qatar Airways Azerbaijan GP vs Practice 1 - Motorsport 19/09' tokens=['azerbaijan','practice','gp',...]
| Fase | Finestra | Descrizione |
|---|---|---|
| Pre-start fetch | da start - PRE_START a start |
Inizio matching prima dell'evento |
| Post-start fetch | start → start + POST_FETCH |
Continua a cercare nuove varianti |
| Keep window | start + POST_FETCH → start + POST_KEEP |
Mantiene ma non aggiunge dopo keep se già popolato |
Default: PRE_START=15, POST_FETCH=10, POST_KEEP=20 (minuti).
[P🐽D]- Vavoo
- Originali dinamici
[Strd] ...
| Variabile | Default | Descrizione |
|---|---|---|
STREAMED_ENABLE |
0 | Abilita polling/enrichment |
STREAMED_POLL_INTERVAL_MS |
60000 | Intervallo polling (>=30000) |
STREAMED_PLAYLIST_URL |
https://world-proxifier.xyz/streamed/playlist.m3u8 | URL playlist |
STREAMED_CACHE_TTL_SEC |
60 | Cache locale M3U |
STREAMED_PRE_START_WINDOW_MIN |
15 | Finestra pre-start |
STREAMED_POST_START_FETCH_WINDOW_MIN |
10 | Finestra fetch dopo start |
STREAMED_POST_START_KEEP_MIN |
20 | Mantieni fino a |
STREAMED_MIN_KEYWORD_HITS |
2 | Soglia keyword per single-entity (min 1) |
STREAMED_MATCH_DEBUG |
0 | 1 abilita log match fuzzy |
STREAMED_ALLOW_SUBTOKEN |
1 | 0 richiede match parola intera; 1 permette sottostringhe |
STREAMED_UA |
browser UA | Header User-Agent |
STREAMED_REFERER |
https://embedsports.top/ | Header Referer |
STREAMED_ORIGIN |
https://embedsports.top | Header Origin |
STREAMED_PLAYLIST_HEADERS |
– | Extra headers K:V;K2:V2 |
STREAMED_FETCH_RETRIES |
3 | Tentativi fetch |
STREAMED_PROPAGATE_HEADERS |
0 | 1 = propaga eventuali header estratti nel link stream finale |
STREAMED_HEADER_MODE |
url_params | Modalità propagazione (solo url_params supportata ora) |
STREAMED_HEADER_PARAM_PREFIX |
h_ | Prefisso parametri query header (es: h_Origin=) |
DYNAMIC_FILE |
autodetect | Path file dinamico |
PYTHON_BIN |
python3 | Binario script |
| Metodo | Come |
|---|---|
| Query Param | /streamed/reload?force=1 |
| Env | STREAMED_FORCE=1 python3 streamed_channels.py |
| CLI | python3 streamed_channels.py --force |
In force mode ignora le finestre, prova a matchare TUTTI gli eventi ([STREAMED][INJECT][FORCE]).
- Evita duplicati per URL o titolo completo
[Strd] .... - Riconosce e converte eventuali vecchi titoli
[Streamed]→[Strd]senza duplicare. - Cache disco
/tmp/streamed_playlist_cache.json.
Browser-like headers, DNS log, retry con backoff, fallback requests, cache TTL.
Ogni /live/update resetta gli stream [Strd]; serve un nuovo ciclo polling / reload per reiniettarli.
Alcuni flussi necessitano header HTTP specifici (Origin, Referer, User-Agent) per funzionare correttamente quando aperti direttamente da un player.
Quando STREAMED_PROPAGATE_HEADERS=1 e la playlist M3U contiene direttive #EXTVLCOPT:http-<header>=<valore>, questi header vengono incorporati nell'URL finale come parametri di query:
Esempio URL trasformato:
https://cdn.example.xyz/abcd/index.m3u8?h_Origin=https%3A%2F%2Fembedsports.top&h_Referer=https%3A%2F%2Fembedsports.top%2F&h_User-Agent=Mozilla%2F5.0...
Dettagli:
- Modalità attuale:
STREAMED_HEADER_MODE=url_params(unica implementata). - Prefisso configurabile:
STREAMED_HEADER_PARAM_PREFIX(defaulth_). - Viene anche aggiunto il campo
xHeadersnello stream (metadato) con la mappa originale per client che vogliono ricostruire gli header. - Nessuna logica lato server di re-fetch con header al momento: il player deve gestire (o ignorare) i parametri.
Motivazione: evitare un proxy interno dedicato finché non strettamente necessario, mantenendo link diretti ma auto-descrittivi.
| Variabile | Effetto |
|---|---|
STREAMED_PROPAGATE_HEADERS=1 |
Abilita trasformazione URL con parametri header |
STREAMED_HEADER_MODE=url_params |
Usa parametri di query (futuro: proxy) |
STREAMED_HEADER_PARAM_PREFIX=h_ |
Cambia prefisso (h_Origin, h_Referer, ecc.) |
{
"id": "evt123",
"name": "⏰ 20:45 : Inter vs Milan - Serie A 19/09",
"streams": [
{ "title": "[P🐽D] SKY SPORT", "url": "https://.../sky.m3u8" },
{ "title": "[Strd] Inter vs Milan HD", "url": "https://edge.cdn/foo/index.m3u8?h_Origin=https%3A%2F%2Fembedsports.top&h_Referer=https%3A%2F%2Fembedsports.top%2F", "xHeaders": { "Origin": "https://embedsports.top", "Referer": "https://embedsports.top/" } }
]
}- Alcuni player ignorano parametri informativi: se un flusso non parte, prova un player esterno (VLC) o l'uso del proxy MFP.
- Non inserire header sensibili (token auth) — diventano visibili nel link.
- Se l'URL originale aveva query params, vengono preservati e merge-ati.
- In caso di conflitto di chiavi, l'ultima scrittura (header propagato) prevale.
Se emergono molti player che non rispettano i parametri, verrà introdotta una modalità STREAMED_HEADER_MODE=proxy che:
- Riconosce parametri
h_*. - Effettua fetch server-side con header reali.
- Risponde con passthrough (senza esporre header al client).
Attualmente questa modalità NON è implementata per ridurre complessità e latenza.
| Sintomo | Possibile Causa | Azione |
|---|---|---|
Stream [Strd] non parte, altri sì |
Player ignora header | Testa con VLC / abilita proxy MFP |
| Header non appaiono in URL | STREAMED_PROPAGATE_HEADERS non impostato |
Esporta variabile a 1 e reinietta (reload/force) |
| Parametri duplicati | Prefisso cambiato più volte | Uniforma STREAMED_HEADER_PARAM_PREFIX |
| Troppi parametri lunghi | User-Agent molto esteso | Usa UA più corto tramite STREAMED_UA |
| Meccanismo | Orari / Intervallo (Europe/Rome) | Cosa fa | Coinvolge |
|---|---|---|---|
| Live.py cron interno | Ogni 2h: 08:10,10:10,...,06:10 | Rigenera eventi dinamici + post-processing [P🐽D] |
Dynamic + PD |
| Purge fisico | 02:05 | Rimuove eventi giorno precedente dal file | Dynamic |
| Reload sicurezza | 02:30 | Ricarica cache addon | Dynamic |
| Watcher unificato | WATCH_INTERVAL_MS (default 5m) |
Rileva mtime cambiato e ricarica in memoria statici/dinamici | Static + Dynamic |
| Streamed poller | STREAMED_POLL_INTERVAL_MS (default 60s) se abilitato |
Aggiunge [Streamed] durante finestre |
Streamed |
/streamed/reload |
On demand | Singolo arricchimento Streamed | Streamed |
/streamed/reload?force=1 |
On demand | Forza arricchimento completo | Streamed |
/live/update |
On demand | Rigenera + PD injection (poi serve run Streamed) | PD + Dynamic |
/live/reload |
On demand | Ricarica file già arricchito | Dynamic |
/static/reload |
On demand | Ricarica canali statici (pdUrlF compresi) | Static + PD |
Note:
- Gli stream
[P🐽D]sono persistiti nel file rigenerato a ogni/live/update(non serve un endpoint dedicato PD). - Gli stream
[Streamed]non sono persistiti tra rigenerazioni: ogni nuova rigenerazione richiede un nuovo ciclo Streamed. - Force mode Streamed è pensato solo per test / validazione; in produzione lasciare alla logica temporale per evitare clutter.
| Feature | Dettagli | Ordering Impatto |
|---|---|---|
| RBTV / RB77 | Nuova sorgente playlist italiana (poll ~120s). Filtra solo titoli con token IT (italiano/italia/italy/ital/ita/ it ). Persistenza per evento. Prefisso [RB77🇮🇹] + simbolo dinamico (🚫 / 🔴). |
Inserito dopo blocco [P🐽D] + cluster 🇮🇹 e prima di [Strd]. |
| PD Relax Competizioni | Per Serie A/B/C, coppe, F1, MotoGP, Tennis, Volley ecc: ignorato brand allowlist; richiesti team match (o single-entity) + token italiano nel broadcaster. Altre competizioni: brand + token IT obbligatori. (Nessun simbolo dinamico per PD). | Mantiene blocco iniziale in cima agli stream evento. |
Streamed [Strd] |
Aggiunti simboli dinamici (🚫 >10m prima, 🔴 da -10m in poi). Persistenza fuori discovery conservata + refresh simboli. | Continua a posizionarsi dopo RB77. |
| Simboli Dinamici | Applicati solo a RB77 e Strd (🚫 / 🔴). | Non altera logica ordering, solo titoli (PD escluso). |
SPSO [SPSO] |
Playlist SportSOnline: varianti compatte [SPSO] ⚽ [VARIANTE], nessun nome evento. Persistenza su file dedicato. |
Posizionato tra RB77 e [Strd]. |
- 🚫 = evento non ancora in finestra di start (mancano >10 minuti)
- 🔴 = evento imminente (<10 minuti) o già iniziato
[P🐽D](con simboli)- 🇮🇹 altri stream prioritari (se presenti)
[RB77🇮🇹][SPSO][Strd]- Restanti dinamici / leftover
| Variabile | Default | Uso |
|---|---|---|
RBTV_PLAYLIST_URL |
https://world-proxifier.xyz/rbtv/playlist.m3u8 | Sorgente RB77 |
RBTV_DISCOVERY_BEFORE_MIN |
15 | Minuti prima start per discovery RB77 |
RBTV_DISCOVERY_AFTER_MIN |
10 | Minuti dopo start per discovery RB77 |
RBTV_FORCE |
(off) | Ignora finestre RB77 |
STREAMED_POLL_INTERVAL_MS |
120000 (se aggiornato in addon) | Cadenza polling playlist Streamed |
Definito un secondo URL identico di backup (non ancora usato automaticamente): se la sorgente primaria eventi risultasse indisponibile si può estendere lo script PD per provarlo come fallback.
Puoi installare StreamViX solamente in locale, su un server casalingo o su una VPN non flaggata o con smartdns per verdere animeunity, per il resto, animesaturn e vixsrc va bene anche Huggingface, ma hanno iniziato a bannare StreamViX, quindi a tuo rischio e pericolo. per Le installazioni locali serve sempre un dominio https per installare l'addon. Oppure utilizzare un fork di mediaflow proxy EXE su windows. (funziona solo se il pc rimane acceso https://github.com/qwertyuiop8899/mediaflow-proxy_exe/ )
Questo metodo ti permette di avere la tua istanza personale dell'addon online, gratuitamente e con la massima semplicità.
- Account Render: Crea un account qui.
- (OPZIONALE) Chiave API di TMDB: Ottienine una gratuitamente registrandoti su The Movie Database (TMDB).
- URL MediaflowProxy (MFP): Devi avere un'istanza di MediaflowProxy (https://github.com/nzo66/mediaflow-proxy) già deployata su Render/Locale/VPS. Assicurati che sia una versione aggiornata
-
Crea un Nuovo Space 🆕
- Vai su Render e accedi.
- Clicca sul + in alto a destra e poi su
Web Service. - Public Git Repository: Incolla il repo
(https://github.com/qwertyuiop8899/StreamViX)). - Connect
- Scegli il nome
- Branch
render - Instance Type
Free - Deploy Web Service
-
Build e Deploy 🚀
- Render avvierà automaticamente la build del tuo addon. Puoi monitorare il processo nella scheda
Logs. - Una volta che vedi lo stato "Running", il tuo addon è pronto!
- Render avvierà automaticamente la build del tuo addon. Puoi monitorare il processo nella scheda
-
Installa in Stremio 🎬
- Nella pagina principale del tuo Space, in alto a sinistra vedrai un link viola, clicca e configura streamvix per poi installarlo su stremio con gli appositi pulsanti.
Ideale se hai un server o una VPS e vuoi gestire l'addon tramite Docker.
Salva il seguente contenuto in un file chiamato docker-compose.yml, oppure aggiungi questo compose al tuo file esistente:
services:
streamvix:
image: qwertyuiop8899/streamvix:latest
container_name: streamvix
ports:
- "7860:7860"
environment:
# Configurazione Base (OBBLIGATORIA)
- BOTHLINK=true
- MFP_URL=https://mfp.tuodominio.com # MediaFlow Proxy URL
- MFP_PASSWORD=tuapassword # MediaFlow Proxy password
- TMDB_API_KEY=tua_chiave_tmdb # https://www.themoviedb.org/settings/api
# Anime (opzionale)
- ANIMEUNITY_ENABLED=true
- ANIMESATURN_ENABLED=true
# Live TV & Eventi Sportivi
- Enable_Live_TV=true
# Eventi Sportivi Avanzati (opzionale - configurazione automatica se omesso)
# - SPON_PROG_URL=https://sportzonline.st/prog.txt
# - RBTV_DISCOVERY_BEFORE_MIN=15
# - STREAMED_ENABLE=1
# Installazione Locale/VPS (opzionale - per FHD VixSrc synthetic)
# - ADDON_BASE_URL=https://streamvix.tuodominio.com
restart: always
# Watchtower per aggiornamenti automatici immagine (opzionale)
# watchtower:
# image: containrrr/watchtower
# container_name: watchtower
# volumes:
# - /var/run/docker.sock:/var/run/docker.sock
# restart: alwaysTMDB Api KEY, MFP link e MFP password e i due flag necessari verranno gestiti dalla pagina di installazione.
Apri un terminale nella directory dove hai salvato il docker-compose.yml ed esegui il seguente comando per costruire l'immagine e avviare il container in background:
docker compose up -dCon watchtower l'immagine sara' aggiornata automaticamente.
Usa questo metodo se vuoi modificare il codice sorgente, testare nuove funzionalità o contribuire allo sviluppo di StreamViX.
-
Clona il repository:
git clone https://github.com/qwertyuiop8899/StreamViX.git # Assicurati che sia il repository corretto di StreamViX cd StreamViX # Entra nella directory del progetto appena clonata
-
Installa le dipendenze:
pip install -r requirements.txt pnpm install
-
Compila il progetto:
pnpm run build -
Avvia l'addon:
pnpm start
L'addon sarà disponibile localmente all'indirizzo http://localhost:7860.
| Problema | Possibili Cause | Soluzione |
|---|---|---|
| Nessun stream SPON negli eventi | MFP non configurato | Verifica MFP_URL e MFP_PASSWORD nelle env vars |
| Stream SPON non funzionano | MFP non raggiungibile o password errata | Testa MFP direttamente, controlla logs [SPON][FALLBACK] |
| Pochi canali SPON | File prog.txt vuoto o non scaricato | Controlla logs [SPON][SCHEDULE], verifica sportzonline.st raggiungibile |
| Eventi spariscono troppo presto | DYNAMIC_PURGE_HOUR troppo basso |
Aumenta a 8+ o imposta DYNAMIC_DISABLE_RUNTIME_FILTER=1 |
| Download prog.txt fallisce | Dominio sportzonline.st temporaneamente down | Imposta SPON_PROG_URL custom o SPON_PROG_FALLBACKS |
| Estrattore TypeScript non viene chiamato | MFP wrap funziona sempre | Comportamento normale (fallback solo se wrap MFP fallisce) |
Questo progetto è inteso esclusivamente a scopo educativo. L'utente è l'unico responsabile dell'utilizzo che ne fa. Assicurati di rispettare le leggi sul copyright e i termini di servizio delle fonti utilizzate.
StreamViX supporta la disabilitazione completa di singoli provider di stream tramite variabili d'ambiente o modifiche hardcoded nel codice.
| Provider | Variabile ENV | Default | Descrizione |
|---|---|---|---|
| STREAMED | STREAMED_ENABLE |
0 (OFF) |
Polling + arricchimento playlist Streamed ogni 8min |
| RBTV | RBTV_ENABLE |
0 (OFF) |
Polling + arricchimento playlist RB77 ogni 8min |
| SPSO | SPSO_ENABLE |
0 (OFF) |
Polling + arricchimento playlist SportSOnline ogni 8min |
| PD | PD_ENABLE |
0 (OFF) |
Post-processing pig_channels in Live.py |
| TVTAP | TVTAP_ENABLE |
0 (OFF) |
Caricamento cache + risoluzione stream + aggiornamenti periodici |
Per abilitare un provider (se disabilitato di default):
STREAMED_ENABLE=1
RBTV_ENABLE=1
SPSO_ENABLE=1
PD_ENABLE=1
TVTAP_ENABLE=1Per disabilitare un provider:
STREAMED_ENABLE=0
# oppure
STREAMED_ENABLE=false
# oppure
STREAMED_ENABLE=offSe vuoi disabilitare permanentemente nel codice senza ENV:
- File:
src/addon.ts - Linea: ~867
- Modifica: Cambia
|| ''in|| '0'
let enableRaw = (process.env.STREAMED_ENABLE || '0').toString().toLowerCase();- File:
src/addon.ts - Linea: ~925
- Modifica: Cambia
|| ''in|| '0'
let enableRaw = (process.env.RBTV_ENABLE || '0').toString().toLowerCase();- File:
src/addon.ts - Linea: ~982
- Modifica: Cambia
|| ''in|| '0'
let enableRaw = (process.env.SPSO_ENABLE || '0').toString().toLowerCase();- File:
Live.py - Linea: ~795
- Modifica: Cambia default
'1'in'0'
pd_enable_raw = os.environ.get('PD_ENABLE', '0').lower()- File:
src/addon.ts - Linee: ~1427, ~1493, ~3210
- Modifica: Cambia
|| '1'in|| '0'(già disabilitato di default)
const isTVTapEnabled = ['1', 'true', 'on', 'yes'].includes((process.env.TVTAP_ENABLE || '0').toString().toLowerCase());- File:
src/addon.ts - Linee: ~2299
- Modifica: Cambia
|| '0'in|| '1'
const disableGdStream = /^(1|true|on)$/i.test(String(process?.env?.GDPLAYER_STREAM_DISABLE||''));- PD e TVTAP sono già disabilitati di default (valore
'0') - STREAMED, RBTV, SPSO sono abilitati di default (valore
''che diventa'1') - Dopo ogni modifica al codice, ricorda di eseguire
npm run build - Le variabili ENV hanno precedenza sulle modifiche hardcoded
Se le righe cambiano, usa questi comandi per trovarle velocemente:
# STREAMED
grep -n "process.env.STREAMED_ENABLE" src/addon.ts
# RBTV
grep -n "process.env.RBTV_ENABLE" src/addon.ts
# SPSO
grep -n "process.env.SPSO_ENABLE" src/addon.ts
# PD
grep -n "PD_ENABLE" Live.py
# TVTAP
grep -n "TVTAP_ENABLE" src/addon.ts
# GD
grep -n "GDPLAYER_STREAM_DISABLE" src/addon.tsOriginal extraction logic written by https://github.com/mhdzumair for the extractor code https://github.com/mhdzumair/mediaflow-proxy Thanks to https://github.com/ThEditor https://github.com/ThEditor/stremsrc for the main code and stremio addon Un ringraziamento speciale a @UrloMythus per gli extractor e per la logica kitsu
Funzionalità dinamiche FAST / CAP / purge implementate nel 2025.