Skip to content

feat: provider AnimeSaturn e download degli stream HLS - #50

Open
Purp7ePi3 wants to merge 1 commit into
fexh10:mainfrom
Purp7ePi3:animesaturn
Open

Purp7ePi3 wants to merge 1 commit into
fexh10:mainfrom
Purp7ePi3:animesaturn

Conversation

@Purp7ePi3

Copy link
Copy Markdown

Descrizione

Aggiunge AnimeSaturn come terzo provider, selezionabile dal menu di configurazione (aw-cli -a).

Implementazione

  • Ricerca: /filter?key=..., seguendo il link rel="next" fino a MAX_SEARCH_PAGES (3) pagine da 30 risultati.
  • Ultime uscite: feed RSS /rss/episodes, più stabile dell'HTML della homepage. I filtri sub/dub usano lo slug (le versioni doppiate hanno -ita- prima dell'ID).
  • Episodi: estratti dalla pagina dell'anime, ordinati per numero.
  • Info: tutte le righe della scheda (tipo, stagione, stato, studio, data, durata, voto...), più generi, trama e ID AniList.
  • Link video: pagina del player → iframe play.saturncdn.net/embed/{id}window.__E (id, token, scadenza) → endpoint /embed/{id}/playlist, che restituisce la sorgente offuscata (base64 + XOR con il token, come la funzione dec() del sito). Il risultato è una playlist HLS .m3u8, oppure un video YouTube per alcuni episodi.

Nessuna nuova dipendenza Python (l'RSS usa xml.etree della libreria standard).

Download degli stream HLS

AnimeSaturn fornisce stream HLS invece di mp4 diretti, quindi il download li salvava come file non validi.
La logica è tutta in un nuovo modulo streams.py: riconosce i link .m3u8 e li scarica con ffmpeg
(-c copy, senza ricodifica), mantenendo la barra di avanzamento. Se il link punta a YouTube,
il download si interrompe con un messaggio chiaro invece di salvare un file rotto.

download.py cambia solo di 5 righe aggiunte, senza modifiche al codice esistente: se il link è uno
stream lo gestisce streams.py, altrimenti prosegue il download multi-connessione introdotto in #48.
Il branch è già rebasato su main (v2.3.3).

ffmpeg serve solo per scaricare da provider HLS; la riproduzione con mpv funziona senza.

Altre modifiche

  • run.py: il menu di scelta del provider ora legge PROVIDERS_AVAILABLE invece di una lista scritta a mano.
  • run.py: corretto un errore di pyright già presente (Episode | str passato come Episode nel menu dopo la riproduzione), emerso toccando il file. isinstance(res, str) è equivalente al controllo precedente, perché l'unica stringa restituita dalle azioni è "break".
  • README.md: aggiunto AnimeSaturn tra le fonti e ffmpeg tra i requisiti per il download.

Test

  • tests/providers/test_animesaturn.py (14 test) e tests/core/test_streams.py (15 test). Le fixtures di AnimeSaturn sono aggiunte a conftest.py come le esistenti; embed e playlist sono simulate perché contengono token che scadono dopo ~12 ore.
  • uv run pytest → 102 test passati
  • uv run pyright → 0 errori
  • Provato manualmente: ricerca, riproduzione con mpv e download di un episodio.

@axtrat

axtrat commented Sep 12, 2026

Copy link
Copy Markdown
Collaborator

Per caso c'è un motivo particolare oltre alla ridondanza, per cui vuole aggiungere AnimeSaturn tra i providers?
Perche noi avevamo riscontrato che gli stream sono 720p come su AnimeWorld e per ora solo AnimeUnity pubblica in 1080p

@Purp7ePi3

Purp7ePi3 commented Sep 13, 2026

Copy link
Copy Markdown
Author

L'ho proposto principalmente per la continuità di servizio, quando uno dei due siti viene oscurato o cambia struttura, una terza fonte riduce la finestra di inoperatività della CLI prima della fix.

Se il costo di manutenzione non vale il beneficio, chiudo la PR senza problemi o posso adattarlo come fallback.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants