Skip to content

feat(download): download multi-connessione (HTTP Range) per episodi più veloci - #48

Open
andrealiberatoreilardi wants to merge 2 commits into
fexh10:mainfrom
andrealiberatoreilardi:feat/segmented-download
Open

feat(download): download multi-connessione (HTTP Range) per episodi più veloci#48
andrealiberatoreilardi wants to merge 2 commits into
fexh10:mainfrom
andrealiberatoreilardi:feat/segmented-download

Conversation

@andrealiberatoreilardi

Copy link
Copy Markdown

Problema

Il download di un episodio usa una singola connessione e legge lo stream a blocchi da 1 KB. Molti CDN (incluso quello di AnimeWorld, sweetpixel.org) limitano la banda per-connessione: il risultato è che un download resta lento (~1.5 MB/s) anche su linee molto veloci, e la CPU spende tempo in ~300k iterazioni Python per un file da 300 MB.

Soluzione

Ogni episodio viene ora scaricato a segmenti, con più connessioni parallele sullo stesso file tramite richieste HTTP Range, aggirando il limite di banda per-connessione. In più i blocchi di lettura passano da 1 KB a 1 MB.

  • Nuova opzione di configurazione connections-per-download (default 4), letta esattamente come la già esistente parallel-downloads. Nessuna modifica al file di config di default richiesta (config.toml è generato per-utente).
  • Fallback automatico alla connessione singola quando il server non dichiara Accept-Ranges: bytes o non espone la dimensione del file: nessuna regressione sui provider che non supportano i range.
  • Integrità verificata: l'output del download segmentato è byte-identico a quello a connessione singola (stesso MD5).

Benchmark

Misurato sul CDN di AnimeWorld scaricando un episodio reale:

Connessioni Throughput
1 (attuale) ~1.5 MB/s
4 (nuovo default) ~6 MB/s
8 ~11 MB/s
32 ~24 MB/s (plateau del CDN)

Il default di 4 offre un miglioramento immediato (~4×) restando conservativo verso i server; chi ha bisogno di più può alzarlo in configurazione.

Nota sul secondo commit (fix test)

Incluso anche un piccolo fix indipendente: test_animeworld_episode_link confrontava l'URL del video con un host CDN hardcoded (srv23-abbaia…), ma quel sottodominio ruota nel tempo e le fixtures si rigenerano dal vivo → il test diventa rosso in CI a ogni rotazione. Ora verifica la struttura stabile dell'URL (dominio + path) con una regex. Se preferisci tenerlo separato, posso spostarlo in una PR a parte.

Verifica

  • uv run pyright → 0 errori, 0 warning
  • uv run pytest → 65 passed (prima: 64 passed, 1 failed per il flake di cui sopra)

…nge)

Molti CDN limitano la banda per-connessione, quindi un download a
connessione singola resta lento anche su linee veloci. Ora ogni episodio
viene scaricato a segmenti con più connessioni parallele tramite richieste
HTTP Range, aggirando il limite per-connessione.

- nuova opzione di configurazione "connections-per-download" (default 4),
  letta come la già esistente "parallel-downloads"
- fallback automatico alla connessione singola se il server non supporta i
  range o non espone la dimensione del file
- blocchi di lettura portati da 1 KB a 1 MB per ridurre l'overhead su file
  di centinaia di MB
…eworld_episode_link

Le fixtures si rigenerano dal vivo e il sottodominio del CDN
(es. "srv23-masafi") ruota nel tempo, quindi il confronto con un URL
hardcoded rendeva il test instabile (rosso in CI a ogni rotazione).
Ora verifichiamo la struttura stabile dell'URL (dominio + path) con una
regex, mantenendo il controllo sul corretto parsing del <source>.
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.

1 participant