Skip to content
 
 

Repository files navigation

Nuvio Plugin & Stremio Addon

Questo repository contiene una collezione di provider italiani per lo streaming di Film, Serie TV e Anime. Il progetto è progettato per essere versatile e può essere utilizzato in due modi diversi:

  1. Come Plugin per Nuvio
  2. Come Addon per Stremio

📺 Provider Supportati

  • AnimeUnity (Anime)
  • AnimeWorld (Anime)
  • AnimeSaturn (Anime)
  • GuardoSerie (Film & Serie TV)
  • StreamingCommunity (Film & Serie TV)
  • AltadefinizioneStreaming (Film & Serie TV)
  • VidxGo (Film & Serie TV - solo Addon Stremio con EasyProxy)
  • Partite (Film , Serie TV & Anime)
  • Mediaset Infinity (TV & VOD - solo Addon Stremio con EasyProxy)
  • RaiPlay (TV & VOD - solo Addon Stremio con EasyProxy)
  • WittyTV (TV & VOD - solo Addon Stremio con EasyProxy)
  • Cinejoy (Film & Serie TV - link diretti, senza EasyProxy)
  • EasyJack (solo addon Stremio: catalogo torrent PostgreSQL con arricchimento asincrono tramite Jackett)

🚀 Installazione su Nuvio

Per installare i provider su Nuvio, basta seguire questi semplici passaggi:

  1. Apri Nuvio.
  2. Vai nelle Impostazioni > Plugin.
  3. Incolla il seguente link nel campo apposito per aggiungere un plugin esterno:
    https://raw.githubusercontent.com/realbestia1/easystreams/refs/heads/main/manifest.json
    
  4. I provider saranno immediatamente attivi.

🍿 Installazione su Stremio

Puoi trasformare questi provider in un Addon per Stremio che gira in locale o su un server.

Esecuzione Locale (Consigliata)

Poiché molti siti italiani bloccano gli IP dei server cloud (AWS, Heroku, ecc.), l'esecuzione locale è spesso la soluzione migliore.

  1. Apri il terminale nella cartella del progetto.
  2. Avvia l'addon:
    npm start
  3. L'addon si avvierà su http://localhost:7000.
  4. Apri il browser a quell'indirizzo.
  5. Clicca sul pulsante "INSTALL ADDON" per aggiungerlo automaticamente al tuo Stremio.

Esecuzione con Docker

Il pacchetto Docker è autosufficiente: include l'addon Stremio, PostgreSQL, Jackett, FlareSolverr, il worker EasyJack, il backup e Watchtower. Database, API key, collegamento tra Jackett e FlareSolverr, migration e indexer vengono preparati automaticamente. Non è necessario configurare manualmente né il database né Jackett: il pannello amministrativo opzionale è protetto da una password esplicita e viene attivato soltanto quando viene impostata EASYJACK_ADMIN_TOKEN.

Su una VPS appena preparata:

cd /opt
git clone -b dev https://github.com/WhiteGiso/easystreams.git easystreams
cd /opt/easystreams
docker compose config
docker compose up -d --build

L'addon sarà disponibile di default su http://IP_DELLA_VPS:7000. Nella configurazione principale dell'addon Stremio l'utente deve soltanto lasciare EasyJack attivo o disattivarlo insieme alle altre fonti. Se EasyJack è attivo ma uno dei servizi non è ancora pronto, la sorgente restituisce zero risultati senza bloccare gli altri provider.

Per aggiornare il codice e le immagini in modo esplicito:

cd /opt/easystreams
git pull --ff-only origin dev
docker compose pull flaresolverr jackett watchtower
docker compose build --pull
docker compose up -d --build

Su Coolify, per un commit che contiene codice o migration, eseguire un nuovo Deploy/Redeploy della risorsa Compose usando il branch aggiornato. Il job easyjack-bootstrap applica le migration pendenti, comprese le riparazioni dei componenti, prima che partano addon e worker; non eliminare i volumi PostgreSQL. Per un semplice riavvio senza aggiornare l'immagine è sufficiente:

docker compose restart easystreams easyjack-worker

I servizi con restart: "no" (torque-init, jackett-init ed easyjack-bootstrap) possono risultare Exited (0): è il comportamento corretto, perché sono procedure di inizializzazione terminate con successo.

Per controllare lo stack:

docker compose ps
docker compose logs --tail=200 postgres flaresolverr jackett \
  easyjack-bootstrap easystreams easyjack-worker easyjack-backup
curl -fS http://127.0.0.1:7000/manifest.json

Per una reinstallazione completamente vuota, il comando seguente elimina anche database, password, configurazione Jackett, impostazioni EasyJack e backup locali. Usarlo solo quando si desidera davvero ripartire da zero:

docker compose down --remove-orphans -v
docker compose up -d --build

Deploy su Cloud (HuggingFace, Render, ecc.)

Puoi caricare questo repository su servizi come HuggingFace. Tuttavia, tieni presente che alcuni provider potrebbero non funzionare a causa dei blocchi geografici o dei blocchi IP dei datacenter imposti dai siti sorgente.


⚙️ Configurazione Avanzata (Addon Stremio)

Quando l'addon viene eseguito su un server remoto (non in locale), alcuni provider potrebbero riscontrare problemi tecnici dovuti alle protezioni dei siti sorgente.

Pannello Admin EasyJack Jackett

Il pannello è disponibile su /easyjack/admin quando il servizio easystreams riceve EASYJACK_ADMIN_TOKEN con almeno 16 caratteri. La variabile è la password del pannello: non inserirla nel repository, nel link Stremio o nella configurazione del browser. Il Compose la inoltra al solo container HTTP easystreams; dopo averla aggiunta al file .env ricreare il servizio:

EASYJACK_ADMIN_TOKEN=imposta-qui-una-password-lunga-e-casuale
EASYJACK_ADMIN_JACKETT_TIMEOUT_MS=120000
docker compose up -d --build easystreams

La sezione EasyJack Jackett mostra soltanto gli indexer attivi come chip orizzontali. Il pulsante Aggiungi indexer apre un popup multiselezione con gli indexer non configurati; l’aggiunta usa i valori predefiniti di Jackett e poi ogni indexer può essere completato dal form ufficiale, testato o rimosso. La ricerca manuale parte in background e invia una sola query titolo agli indexer attivi e selezionati, direttamente tramite le API Torznab dei singoli indexer; non attende più la risposta aggregata all durante la richiesta HTTP. Il POST risponde subito con un job e la pagina mostra avanzamento, errori e risultati parziali per indexer, evitando il 502 del proxy sulle ricerche lente. Il risultato passa dalla stessa normalizzazione della ricerca EasyJack, quindi vengono persistiti soltanto film/serie con locator e info hash validi. La lingua non viene filtrata in scrittura: resta una proiezione della lettura Stremio. La API key di Jackett e le password restano server-side.

Seed e backup della configurazione Jackett

La directory docker/jackett-seed è montata in sola lettura nel job jackett-init. Può contenere jackett-config.tar.gz, un archivio della directory persistente Jackett/ con ServerConfig.json e tutte le configurazioni degli indexer. Per esportare la configurazione attuale senza modificarla:

docker compose exec -T jackett sh -c 'tar -czf - -C /config Jackett' > docker/jackett-seed/jackett-config.tar.gz

L’archivio contiene segreti (API key, password e possibili cookie) ed è ignorato da Git: non va committato né pubblicato. Può essere caricato nella directory del progetto sul server Coolify. Per conservarlo in uno storage persistentemente montato da Coolify, impostare nel .env o nelle variabili Compose JACKETT_CONFIG_SEED_HOST_PATH=/home/ubuntu/easystreams/data/jackett-seed:

JACKETT_CONFIG_SEED_HOST_PATH=/home/ubuntu/easystreams/data/jackett-seed
JACKETT_CONFIG_SEED_FILE=/seed/jackett-config.tar.gz

Il nome del file nel mount può essere cambiato impostando JACKETT_CONFIG_SEED_FILE. Il seed viene importato solo quando /home/ubuntu/easystreams/data/jackett è vuota; se esiste già un ServerConfig.json o una configurazione di indexer, il job non sovrascrive nulla. Dopo l’import viene creato il marker persistente .easyjack-jackett-seed-imported: i riavvii successivi mantengono il profilo importato e saltano il bootstrap predefinito degli indexer.

Per usare il profilo su un’installazione nuova, copiare l’archivio in docker/jackett-seed/jackett-config.tar.gz oppure nel percorso host indicato da JACKETT_CONFIG_SEED_HOST_PATH prima del deploy.

La sezione Ricerca veloce in EasyJackDB è la prima del pannello: interroga il catalogo con full-text PostgreSQL indicizzato e cerca i termini nel titolo, nell'indexer e nei titoli dei sottotorrent, anche quando i termini sono distribuiti tra torrent padre e componente. Ogni riga torrent si può espandere per vedere tutte le colonne del padre e, tramite relazione esterna, tutte le colonne dei figli.

La sezione Gestione Database mostra l'albero delle tabelle public e delle relative colonne. Il click su una tabella carica ed esegue automaticamente gli ultimi 200 record ordinati per la prima data disponibile (created_at, first_seen_at, applied_at o updated_at) e lascia la query visibile nel campo SQL. Le query manuali accettano solo letture (SELECT, WITH, EXPLAIN e SHOW), usano una transazione read-only, hanno timeout configurabile con EASYJACK_DATABASE_ADMIN_TIMEOUT_MS e restituiscono al massimo 2.000 righe. La sezione Gestione EasyJack Jackett resta in fondo e contiene le funzionalità ufficiali di Jackett già disponibili nel pannello.


🛠️ Sviluppo

  • Struttura: Ogni provider ha la sua cartella in src/.
  • Build: Lo script build.js compila i provider per Nuvio ed esclude i provider disponibili soltanto nell'addon Stremio.
  • Stremio: Il file stremio_addon.js funge da server e adattatore per convertire i risultati dei provider nel formato Stremio.

EasyJack

EasyJack interroga in parallelo il catalogo locale PostgreSQL e Torrentio usando la configurazione hardcoded https://torrentio.strem.fun/sort=qualitysize/manifest.json. I risultati Torrentio validi vengono deduplicati per info hash, salvati nel catalogo e restituiti immediatamente insieme ai record già presenti. Nel deployment Compose le sole richieste Torrentio passano dal proxy interno Torque/Tor, limitato dalla policy a torrentio.strem.fun:443, senza porte pubblicate: l'upstream non vede l'IP domestico/VPS. EASYJACK_TORRENTIO_PROXY_REQUIRED=true rende il percorso fail-closed: se Torque non è pronto, EasyJack usa cache e catalogo locale senza ripiegare silenziosamente sull'IP reale o su FlareSolverr. Disattivando esplicitamente tale opzione resta disponibile il precedente fallback diretto. In entrambi i casi resta attiva la configurazione Torrentio globale, senza filtri lingua applicati a monte.

Le richieste identiche simultanee vengono unificate. La cache fresca dura per default cinque minuti e la copia stale sei ore; le chiamate upstream sono distanziate di 200 ms e protette da concorrenza/coda limitate. Un 429 non viene inoltrato a un altro proxy: EasyJack rispetta Retry-After, entra in cooldown e serve cache/DB, evitando retry sincronizzati. I valori sono configurabili con EASYJACK_TORRENTIO_CACHE_TTL_MS, EASYJACK_TORRENTIO_STALE_CACHE_TTL_MS, EASYJACK_TORRENTIO_MIN_REQUEST_INTERVAL_MS e EASYJACK_TORRENTIO_RATE_LIMIT_COOLDOWN_MS. Camoufox non viene usato per Torrentio. La stessa richiesta viene poi deduplicata in public.jobs e processata da un unico worker separato dal processo HTTP con Jackett in background. Il worker usa un lock advisory PostgreSQL per impedire l'avvio di più istanze sullo stesso catalogo; la concorrenza interna riguarda job asincroni nello stesso processo, non processi worker aggiuntivi.

Torrentio viene sempre interrogato senza filtro linguistico. Anche Jackett riceve una sola query primaria, il titolo normalizzato senza stagione, episodio o lingua; il filtro lingua viene applicato dopo il recupero. In questo modo la stessa ricerca acquisisce ITA e tutte le altre lingue, indipendentemente dal flag selezionato in Stremio. Se il database EasyJack non è configurato, la sorgente EasyJack resta vuota e addon e provider precedenti continuano a funzionare normalmente.

Nel configuratore principale dell’addon, quando EasyJack è attivo, Lingua risultati consente di selezionare una o più lingue, oltre a Multi e Unknown; Tutte le lingue rimuove il filtro. Multi include i file che dichiarano MULTI/DUAL o più lingue audio, mentre Unknown include i file senza lingua verificabile o con metadati defaultati. L’ordine delle lingue selezionate è manuale: i risultati che corrispondono alla prima lingua vengono mostrati prima, poi quelli della seconda e così via; la lista si può riordinare trascinandola oppure usando le frecce. Il filtro viene applicato alla proiezione finale destinata a Stremio, dopo aver unito i risultati Torrentio freschi con la lettura del catalogo PostgreSQL: Torrentio mantiene la configurazione globale e il worker salva i risultati di tutte le lingue. languages contiene la proiezione delle lingue audio usabili da Stremio, mentre reported_languages conserva tutti i codici/bandiere ricevuti dalla sorgente e subtitle_languages conserva le lingue dei sottotitoli. Un nuovo recupero aggiorna la classificazione anche quando l’info hash è già presente. Le liste Torrentio molto ampie e generiche vengono conservate come evidenza non verificata ma non vengono trattate automaticamente come tracce audio: in assenza di un’indicazione audio esplicita il fallback è ENG. Prima della persistenza EasyJack ricontrolla la lingua italiana sui dati Torrentio: accetta i marker tecnici nel titolo/nome file, le lingue strutturate e le liste di bandiere non generiche; una lista densa di bandiere non dimostra da sola una traccia audio. Accetta inoltre un titolo o nome episodio chiaramente localizzato in italiano, senza considerare parole-titolo come It o Italian in un titolo inglese. Stremio mostra quindi le lingue audio classificate (per esempio ENG / ITA / FRE) e ammette la riga se la proiezione audio contiene almeno una lingua selezionata.

Per Jackett, EasyJack legge tutti gli attributi Torznab language (non soltanto il primo) e mantiene separati gli attributi subs. Se l’indexer non espone lingue audio strutturate, il parser usa titolo e description, rimuovendo prima forme come SUB-ITA, SUB ENG, French Subs e Sottotitoli Italiano; le lingue così riconosciute finiscono in subtitle_languages, non nella proiezione audio. Durante l’arricchimento del metainfo .torrent, la valutazione dei pack considera il nome del torrent padre e il basename di ogni file: un file con un proprio marker audio non eredita lingue del padre che lo contraddicono, mentre un file senza marker può ereditare le lingue audio esplicite del padre. Soltanto quando attributi, titolo, descrizione, padre e file non forniscono alcuna indicazione viene assegnato ENG. La migration impone array languages e reported_languages non vuoti sia sui torrent sia sui componenti.

I pack di serie conservano anche la copertura dichiarata nel titolo. Forme come S04E01-16, S04E01-S04E16, 4x01-16, S04 01-16 ed elenchi come S03E(14-15-16) indicano gli episodi coperti da una stagione; S01-11, S01-S11, Season 1-11, Saison 1-11, Temporada 1-11 e Sezon 01-11 indicano invece un pack multi-stagione. PostgreSQL usa questi insiemi prima di restituire il risultato, quindi un pack S04E01-16 è valido per S04E13 ma non per S04E17. Se il metainfo contiene componenti, il file dell’episodio richiesto resta la prova più precisa. Nella notazione ITA ENG SubS, ITA e ENG sono audio e SubS è un marker generico; forme esplicite come SUB-ITA, English Subs o Sottotitoli Italiano restano invece sottotitoli e non qualificano il filtro audio italiano.

Quando EasyJack è selezionato, i suoi stream vengono presentati prima delle fonti esistenti; al suo interno l’ordinamento può essere configurato con i criteri Resolution, Quality, Language, Audio Tag, Audio Channel ed Encode. Il primo criterio ha precedenza sugli altri; ogni criterio ha una lista Preferred Order riordinabile manualmente. I risultati non riconosciuti finiscono in fondo e, a parità di preferenza, restano i fallback qualità/dimensione precedenti. L’ordinamento relativo delle fonti precedenti resta invariato.

Nel configuratore Config EasyJack è possibile aggiungere più servizi Debrid (Real-Debrid, AllDebrid, Debrid-Link, Premiumize, TorBox, EasyDebrid, Debrider, PikPak, Offcloud e Torrin), in ordine di failover. Il collegamento usa StremThru: il checkbox Solo risultati cached dai Debrid esegue il controllo cache prima di mostrare i risultati; se disattivato, il servizio può avviare il download del magnet al primo playback e attende che sia pronto. L’URL pubblico dell’addon viene salvato automaticamente nella configurazione per il callback di playback. I token sono credenziali sensibili e finiscono nel link di configurazione Stremio: non condividere quel link.

Il catalogo non salva seeders, leechers, peers o stato Debrid. Conserva l'hash, il magnet/download locator, titolo, tipo, release kind, identificativi media, dimensione, qualità, indexer e date stabili. I pack sono rappresentati da release_kind e dalla tabella opzionale public.torrent_members per le associazioni esatte dei singoli film/episodi. Per un pack il padre mantiene la dimensione totale del payload, mentre il worker prova ad acquisire il metainfo .torrent dal download locator di Jackett e salva per ogni file video il percorso, il titolo e la dimensione propria; Stremio usa questi dati del componente. Un magnet da solo non contiene la lista file: senza .torrent il componente resta non arricchito e non viene inventata una dimensione.

EasyJack è opzionale a livello di sorgente: se l'utente lo disattiva dalla configurazione Stremio, l'addon continua a usare tutte le fonti precedenti. Se il Compose non viene usato o il catalogo non è disponibile, EasyJack restituisce zero risultati senza bloccare gli altri provider. EasyJack è intenzionalmente server-side: viene caricato da stremio_addon.js e non viene incluso nel manifest o nel bundle del plugin Nuvio.

Il bootstrap Docker:

  • crea automaticamente il database easyjack con utente dedicato e schema PostgreSQL public;
  • genera una password casuale persistente nel bind mount /home/ubuntu/easystreams/data/secrets;
  • configura Jackett con l'URL interno di FlareSolverr e gli indexer pubblici richiesti, senza importare cookie o credenziali del test locale;
  • configura Jackett con FlareSolverr in rete Docker; il proxy di Jackett è disabilitato per impostazione predefinita;
  • salva le impostazioni automatiche nel bind mount /home/ubuntu/easystreams/data/settings;
  • applica le migration prima dell'avvio dell'addon e del worker;
  • esegue un backup custom compresso al giorno, conservando di default 14 giorni.

I 32 indexer predefiniti sono: 1337x, 52bt, aniRena, bangumi-moe, BTdirectory, DaMagNet, E-Hentai, ExtraTorrent.st, EZTV, FileMood, Internet Archive, kickasstorrents.to, kickasstorrents.ws, Knaben, LimeTorrents, Magnetz, nekoBT, Nyaa.si, Shana Project, showRSS, SubsPlease, The Pirate Bay, TheRARBG, Torrent Downloads, TorrentByte, TorrentDownload, TorrentGalaxyClone, TorrentKitty, TorrentProject2, Torrents.csv, UIndex e YTS.

La porta PostgreSQL viene esposta sul solo loopback dell'host come 127.0.0.1:5433. Per una connessione dalla rete della VPS, impostare prima del Compose EASYJACK_POSTGRES_BIND=0.0.0.0 e limitare l'accesso con il firewall. La password generata può essere letta solo dall'amministratore Docker:

docker compose exec postgres cat /run/easyjack-secrets/postgres-password

Per cambiare porta, bind, retention dei backup o intervallo Watchtower si possono usare EASYJACK_POSTGRES_PORT, EASYJACK_POSTGRES_BIND, EASYJACK_JACKETT_PORT, EASYJACK_JACKETT_BIND, JACKETT_OMDB_API_KEY, FLARESOLVERR_LOG_LEVEL, FLARESOLVERR_LOG_HTML, EASYJACK_FLARESOLVERR_URL, EASYJACK_BACKUP_RETENTION_DAYS e WATCHTOWER_INTERVAL_SECONDS. Jackett e FlareSolverr vengono aggiornati automaticamente da Watchtower tramite label; PostgreSQL resta sul major version 16 per evitare upgrade automatici incompatibili.

JACKETT_OMDB_API_KEY è opzionale e viene applicata al campo OMDb di Jackett dal servizio jackett-init. Dopo averla aggiunta al file .env, ricreare jackett-init e Jackett:

docker compose up -d --force-recreate jackett-init jackett

Per impostazione predefinita Jackett e FlareSolverr effettuano le richieste direttamente dalla rete Docker, senza passare da Torque. Torque resta disponibile per le richieste proxy del processo EasyStreams tramite PROVIDER_PROXY.

Accesso a Jackett dalla rete locale

Jackett viene pubblicato sull'host soltanto quando il Compose è avviato con la porta configurata. Il default è 127.0.0.1:9117, quindi non è raggiungibile da altri computer. Per consentire l'accesso dalla LAN, individuare prima l'indirizzo privato della VPS e aggiungere nel file .env:

EASYJACK_JACKETT_BIND=192.168.1.50
EASYJACK_JACKETT_PORT=9117

Sostituire 192.168.1.50 con l'indirizzo LAN reale della VPS, poi ricreare solo il container Jackett:

docker compose up -d --force-recreate jackett
docker compose ps jackett

Dal computer nella stessa rete aprire quindi http://192.168.1.50:9117. Se la VPS non ha un indirizzo LAN raggiungibile, si può usare temporaneamente EASYJACK_JACKETT_BIND=0.0.0.0, ma soltanto con una regola firewall limitata all'IP del computer autorizzato: Jackett non va lasciato esposto pubblicamente.

Architettura dei container

Il Compose usa una rete Docker interna. Sono esposte sull'host soltanto la porta HTTP dell'addon e, opzionalmente, le porte PostgreSQL e Jackett; Jackett resta sul loopback per impostazione predefinita e FlareSolverr resta raggiungibile solo dai container del progetto.

Il container HTTP dell'addon avvia anche WARP per i provider che ne hanno bisogno. Durante l'avvio entrypoint.sh cattura gli indirizzi dei servizi Docker (postgres, jackett, flaresolverr e torque) in /etc/hosts, poi lascia attivo il resolver WARP per le destinazioni pubbliche come Torrentio e TMDB. Se una combinazione WARP/container lascia attivo il resolver Docker ma non risolve i domini pubblici, applica automaticamente un fallback DNS pubblico. Le porte di PostgreSQL, Jackett e FlareSolverr non vengono esposte per questo meccanismo.

Servizio Funzione Persistenza / comportamento
postgres Database PostgreSQL dedicato a EasyJack (easyjack, schema public) /home/ubuntu/easystreams/data/postgres; password in /home/ubuntu/easystreams/data/secrets
flaresolverr Risoluzione delle challenge usata da Jackett e fallback Torrentio Nessuna porta pubblica; API interna su 8191; aggiornato da Watchtower
torque-init Corregge proprietario e permessi della directory dati di Torque Job una tantum; imposta /home/ubuntu/easystreams/data/torque a 0700
torque Proxy Torrentio/Torznab con stato persistente /home/ubuntu/easystreams/data/torque; processo non-root
jackett-init Inizializzazione idempotente di ServerConfig.json e degli indexer Job una tantum; termina con Exited (0)
jackett Endpoint Torznab usato da EasyJack; UI/API pubblicabile opzionalmente sull'host /home/ubuntu/easystreams/data/jackett; aggiornato da Watchtower
easyjack-bootstrap Scrive le impostazioni locali e verifica l'API di Jackett Job una tantum; termina con Exited (0)
easystreams Processo HTTP dell'addon Stremio e fonte EasyJack /home/ubuntu/easystreams/data/settings; porta host 7000
easyjack-worker Unico worker persistente per le ricerche Jackett e lo scraping recente Lock advisory PostgreSQL contro duplicati
easyjack-backup Esegue pg_dump periodici /home/ubuntu/easystreams/data/backups; dump custom compressi
watchtower Aggiorna le immagini marcate Controllo giornaliero, cleanup delle immagini precedenti

container_name è prefissato easystreams- per i servizi ausiliari; il container HTTP principale si chiama semplicemente easystreams.

Ordine di avvio

Il primo docker compose up -d --build segue questa sequenza:

  1. PostgreSQL crea il database easyjack, l'utente dedicato e una password casuale persistente, poi attende il proprio healthcheck.
  2. torque-init prepara la directory persistente di Torque con proprietario 65532 e permessi 0700; Torque parte dopo il completamento del job.
  3. FlareSolverr viene avviato internamente e deve rispondere su /health.
  4. jackett-init prepara Jackett e collega FlareSolverr. Se trova un seed nella directory docker/jackett-seed e il volume è vuoto, importa il profilo completo; in assenza di seed usa soltanto il fallback degli indexer pubblici predefiniti. Un volume già popolato non viene sovrascritto.
  5. Jackett viene avviato e attende il proprio healthcheck HTTP.
  6. easyjack-bootstrap legge la API key presente nel ServerConfig.json di Jackett, crea il file locale condiviso easyjack-settings.json e verifica gli indexer tramite l'API Torznab. Quando è stato importato un seed, conserva gli indexer del profilo senza applicare il fallback hardcoded.
  7. Addon HTTP e worker partono dopo il completamento del bootstrap. Il database contiene già le migration applicate in public.schema_migrations; le tabelle applicative sono public.torrents, public.torrent_members e public.jobs.

Se il container del worker o dell'addon viene riavviato, i dati persistenti restano nei volumi e le procedure idempotenti non duplicano il catalogo.

Cosa succede a una richiesta Stremio

Quando EasyJack è selezionato e arriva una ricerca:

  1. L'addon legge subito PostgreSQL e interroga in parallelo Torrentio.
  2. I risultati Torrentio validi vengono deduplicati per info hash, proiettati secondo il flag italiano e restituiti insieme ai record locali già disponibili.
  3. Anche se il database contiene già risultati, la richiesta accoda comunque un job search di aggiornamento in background. Il cooldown predefinito è 60 secondi per la stessa chiave di ricerca, così richieste simultanee non generano una raffica duplicata di query.
  4. Il worker chiede a Jackett l'elenco degli indexer configurati e lancia una sola ricerca logica per titolo, in parallelo sugli indexer attivi. Ogni chiamata usa l'endpoint Torznab diretto del relativo indexer con t=search, q=<titolo>, limit=0, extended=1 e cache=false. Non vengono aggiunti token lingua, stagione o episodio: pack, episodi e tutte le lingue restano recuperabili e vengono filtrati localmente dopo il parsing.
  5. Se Stremio non fornisce un titolo ma solo un identificativo, EasyJack legge una volta le capability t=caps del singolo indexer e usa t=movie per un film oppure t=tvsearch per serie/anime soltanto quando la modalità e un parametro ID compatibile (imdbid, tmdbid o tvdbid) sono dichiarati. In quel caso invia una sola ricerca ID per indexer, con stagione, episodio, anno e categoria solo se supportati; altrimenti salta quell'indexer senza fare una ricerca vuota potenzialmente non correlata. Le capability restano in cache per 6 ore (EASYJACK_JACKETT_CAPABILITIES_CACHE_MS), quindi questo controllo non aggiunge richieste al normale percorso per titolo.
  6. Quando una risposta Torznab dichiara un totale superiore ai risultati già ricevuti, EasyJack segue automaticamente gli offset fino al totale, a una pagina vuota, a una pagina ripetuta o a un errore dell'indexer. Se il totale non è dichiarato, con una ricerca illimitata continua comunque fino a pagina vuota o ripetuta: non esiste un numero massimo di pagine imposto da EasyJack. Gli errori di un indexer non cancellano i risultati degli altri e vengono esposti come stato parziale.
  7. limit=0 elimina il tetto locale di EasyJack e l'uso degli indexer diretti evita il limite globale dell'aggregatore all. Non può però rendere infinita una definizione Cardigann che espone solo percorsi fissi, né inventare pagine quando il sito upstream è bloccato o non implementa offset. Per EXT Torrents la definizione Jackett espone le 10 pagine pubblicate dal sito: EasyJack non esegue più un crawler HTML esterno per acquisire i risultati.
  8. Il worker arricchisce i risultati quando è disponibile un file .torrent: ricava l'info hash verificato, i file video componenti, i titoli e le dimensioni dei singoli episodi. I valori inferiori a 1 MiB vengono trattati come non validi e non vengono mostrati come dimensioni reali.

Le categorie Torznab sono filtri, non ricerche aggiuntive: 2000 identifica i film, 5000 le serie/TV e 5070 gli anime. Le sottocategorie descrivono principalmente formato o qualità (2030 SD, 2040 HD, 2045 UHD, 2050 Blu-ray, 2080 WEB-DL per i film; equivalenti sotto 5000 per la TV). EasyJack non invia queste categorie nella ricerca per titolo, perché un indexer può non esporle o classificare male un pack. Le usa soltanto nella ricerca ID-only quando compaiono nella risposta t=caps; per anime, se 5070 non è dichiarata, non forza il filtro e mantiene la ricerca ID più ampia. 9. Il catalogo viene aggiornato con upsert su info hash. Un torrent senza info hash verificato non viene persistito come nuova identità, evitando le duplicazioni tra indexer e refresh.

Il flag solo torrent italiani è quindi una proiezione in lettura. Cerca marcatori come IT, ITA, Italian e titoli chiaramente italiani, controlla anche i componenti di serie e pack e non considera SUB-ITA come audio italiano. Disattivando il flag vengono restituiti tutti i risultati presenti.

Job e concorrenza del worker

La coda è nella tabella public.jobs e contiene due tipi di lavoro:

  • search: aggiornamento Jackett accodato dalle richieste Stremio. È deduplicato per identità e titolo normalizzato, indipendentemente da episodio, stagione o lingua, perché una ricerca titolo completa riempie il catalogo per tutte le proiezioni successive. Usa cache=false verso Jackett, così un risultato vuoto precedente non blocca l'arrivo di torrent nuovi.
  • recent: scraping incrementale periodico. Parte una volta subito all'avvio del worker e poi di default ogni ora. Esegue una ricerca recente per film e una per serie sugli indexer configurati, con massimo 100 risultati per tipo e una finestra di 90 minuti. È un'importazione incrementale distinta dalla ricerca titolo illimitata; la sovrapposizione di 90 minuti copre ritardi e sovrapposizioni tra due esecuzioni consecutive.

Il job recent non applica titoli o ID Stremio: importa torrent pubblicati di recente e li associa solo quando i metadati disponibili lo consentono. Anche questi risultati passano da arricchimento, verifica dell'info hash e upsert.

Il Compose avvia un solo processo easyjack-worker. Il worker può processare più job asincroni nello stesso processo, ma il lock advisory PostgreSQL fa terminare una seconda istanza che tentasse di lavorare sullo stesso catalogo. I valori predefiniti sono:

  • fino a 8 job applicativi contemporaneamente (EASYJACK_WORKER_CONCURRENCY);
  • fino a 4 chiamate dirette agli indexer Jackett concorrenti (EASYJACK_JACKETT_CONCURRENCY); la concorrenza limita il fan-out simultaneo, non il numero di pagine percorse per una ricerca;
  • timeout di 90 secondi per singola richiesta upstream (EASYJACK_JACKETT_TIMEOUT_MS); le ricerche manuali del pannello sono job asincroni e quindi non restano legate al timeout HTTP del proxy;
  • i nomi legacy EASYJACK_JACKETT_VARIANT_* restano accettati solo per compatibilità dei vecchi payload, ma non riattivano ricerche multiple;
  • lease di 5 minuti per un job in esecuzione;
  • massimo 4 tentativi per job, con backoff progressivo;
  • pulizia oraria dei job conclusi o falliti più vecchi di 14 giorni.

La pulizia riguarda soltanto la coda public.jobs, non elimina torrent dal catalogo. Un job fallito viene riprovato; se supera il numero massimo di tentativi resta failed con l'ultimo errore in last_error. Durante le ricerche lunghe il worker rinnova periodicamente il lease del job, evitando che un'altra iterazione lo consideri scaduto mentre Jackett sta ancora rispondendo.

Per osservare il worker e la coda:

docker compose logs -f easyjack-worker
docker compose exec postgres psql -U easyjack -d easyjack -c \
  "SELECT job_type, status, count(*) FROM public.jobs GROUP BY job_type, status ORDER BY job_type, status;"

Bind mount e dati persistenti

/home/ubuntu/easystreams/data/postgres    dati PostgreSQL e catalogo torrent
/home/ubuntu/easystreams/data/secrets     password PostgreSQL generata dal bootstrap
/home/ubuntu/easystreams/data/settings    configurazione locale condivisa da addon e worker
/home/ubuntu/easystreams/data/jackett     ServerConfig.json e configurazioni degli indexer
/home/ubuntu/easystreams/data/backups     file easyjack-YYYYMMDDTHHMMSSZ.dump
/home/ubuntu/easystreams/data/torque      stato persistente di Torque

I bind mount sono configurati nel Compose con Source Path sotto /home/ubuntu/easystreams/data/, quindi i dati sono visibili direttamente sull'host e non dentro i named volume Docker. Per vedere le dimensioni:

sudo du -sh /home/ubuntu/easystreams/data/*
sudo ls -lh /home/ubuntu/easystreams/data/backups

Migrazione dai named volume

Prima del primo avvio con il Compose a bind mount, ferma il progetto senza usare down -v e copia i dati dai named volume esistenti. Lo script interrompe la procedura se trova container attivi, destinazioni già popolate o più volumi possibili, e non elimina mai i named volume originali:

docker compose down
bash ./docker/migrate-named-volumes.sh --project-name NOME_COMPOSE
sudo chown -R 65532:65532 /home/ubuntu/easystreams/data/torque
sudo chmod 0700 /home/ubuntu/easystreams/data/torque
docker compose up -d --build

Su Coolify, NOME_COMPOSE è il project name usato nel deploy, per esempio mnjbxijdgmytm1mv3hueyxtk. Se il progetto non viene gestito dalla directory locale, eseguire lo script da una copia del repository con lo stesso Compose e indicare comunque il project name del deploy.

Backup automatici

easyjack-backup usa pg_dump --format=custom --no-owner --no-acl e crea un dump atomico ogni 24 ore. Prima scrive un file temporaneo, poi lo rinomina solo quando pg_dump termina correttamente. Il default conserva 14 giorni e scarta i dump più vecchi; il catalogo PostgreSQL non viene mai cancellato dal job di backup.

Impostazioni opzionali:

EASYJACK_BACKUP_INTERVAL_SECONDS=86400
EASYJACK_BACKUP_RETENTION_DAYS=14

Per modificare questi valori senza cambiare il Compose, inserirli in un file .env nella directory del progetto prima di ricreare il servizio:

cat > .env <<'EOF'
EASYJACK_BACKUP_INTERVAL_SECONDS=43200
EASYJACK_BACKUP_RETENTION_DAYS=30
EOF
docker compose up -d --build easyjack-backup

Un bind mount locale non è un backup off-site: la perdita del disco o la rimozione della directory elimina anche i dump. Copiare periodicamente almeno un dump fuori dalla VPS:

docker compose exec easyjack-backup sh -c 'ls -1t /backups/easyjack-*.dump | head -n 1'
docker compose cp easyjack-backup:/backups/NOME_DEL_DUMP.dump /var/backups/

La lista interna del dump si può verificare prima di archiviarlo:

docker compose exec easyjack-backup sh -c \
  'pg_restore --list "$(ls -1t /backups/easyjack-*.dump | head -n 1)" >/dev/null && echo backup-ok'

Ripristino di un backup

Il ripristino deve essere eseguito con addon, worker e backup fermi, per evitare scritture durante pg_restore. Il database PostgreSQL resta acceso:

docker compose cp easyjack-backup:/backups/NOME_DEL_DUMP.dump /tmp/easyjack-restore.dump
docker compose stop easystreams easyjack-worker easyjack-backup
docker compose exec -T postgres pg_restore \
  -U easyjack -d easyjack --clean --if-exists --no-owner --no-acl \
  < /tmp/easyjack-restore.dump
rm -f /tmp/easyjack-restore.dump
docker compose up -d easystreams easyjack-worker easyjack-backup

Dopo il ripristino controllare i log di addon e worker. Il backup deve provenire dalla stessa installazione o da una versione compatibile; dopo un ripristino da una versione precedente, applicare manualmente le migration mancanti con npm run easyjack:migrate prima di avviare l'addon.

Aggiornamenti automatici

Watchtower viene avviato con --label-enable --cleanup --interval 86400 usando nickfedor/watchtower, il fork mantenuto compatibile con le versioni recenti della Docker API. Aggiorna soltanto i container marcati, cioè Jackett e FlareSolverr, e rimuove le immagini precedenti dopo la sostituzione. PostgreSQL resta vincolato al major 16 e l'immagine EasyStreams viene aggiornata tramite git pull e docker compose build --pull, non automaticamente da Watchtower.

Diagnosi rapida

# stato e dipendenze
docker compose ps
docker compose config

# log del percorso di avvio
docker compose logs --tail=200 postgres flaresolverr jackett \
  jackett-init easyjack-bootstrap

# log applicativi
docker compose logs -f easystreams easyjack-worker

# stato database e migration
docker compose exec postgres pg_isready -U easyjack -d easyjack
docker compose exec postgres psql -U easyjack -d easyjack -c \
  "SELECT version, applied_at FROM public.schema_migrations ORDER BY version;"

Se il worker segnala che il database o Jackett non sono configurati, verificare prima che easyjack-bootstrap sia terminato con codice 0. Se Jackett è sano ma alcuni indexer falliscono, EasyJack conserva i risultati degli indexer che rispondono e registra l'errore nei log: FlareSolverr non garantisce che ogni sito sia sempre raggiungibile. Non esporre direttamente né la porta 9117 di Jackett né la 8191 di FlareSolverr.


Powered by realbestia1

About

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages