Vai al contenuto principale
50% di sconto tutti i piani, tempo limitato. A partire da $2.48/mo
11 min left
Gaming e media

Eseguire yt-dlp su un VPS per l'archiviazione personale headless

S Di Sajjad 11 min di lettura
yt-dlp running headless on a VPS, feeding scheduled downloads into an organized video library that a media server can scan

Eseguire yt-dlp su un VPS dà ai download lunghi una macchina che resta online dopo che hai chiuso il portatile. Crea anche un percorso pulito da un prelievo pianificato di un canale a una libreria multimediale che Jellyfin può scansionare.

Il server cambia tre parti del flusso di lavoro: l'installazione richiede le dipendenze YouTube attuali, i video legati a un account richiedono un trasferimento sicuro dei cookie e l'automazione richiede un ritmo di richieste ponderato. La configurazione qui sotto copre tutte e tre senza dare per scontato che ogni download abbia bisogno di cookie, di un'interfaccia web o di un provider di PO Token.

TL;DR

  • Installa yt-dlp in un ambiente virtuale Python insieme a ffmpeg, ffprobe, yt-dlp-ejs e un runtime JavaScript supportato. Deno è il runtime che il progetto consiglia attualmente.
  • Parti senza cookie dell'account. Aggiungili solo per playlist private, video con limiti d'età, contenuti riservati ai membri o un altro caso che richieda un account.
  • Mantieni il comportamento predefinito di yt-dlp a frammento singolo finché non hai un motivo misurato per cambiarlo. Usa le opzioni di attesa e pianificazioni sfalsate per ridurre la pressione delle richieste.
  • La CLI nuda più systemd è la configurazione affidabile più semplice. Scegli Pinchflat per regole sui canali che non richiedono interventi, MeTube per una coda dal browser o Tube Archivist per un'interfaccia di visione con ricerca.
  • Considera lo storage la variabile principale del dimensionamento. Prova un campione rappresentativo prima di acquistare capacità disco per un archivio completo.

Usa yt-dlp in modo responsabile

Archivia contenuti solo quando ne hai il permesso e il tuo uso rispetta i termini della piattaforma e la legge applicabile.

  • Buoni candidati sono i tuoi caricamenti, i contenuti di pubblico dominio e il materiale il cui titolare dei diritti ha autorizzato il download.
  • Un abbonamento a YouTube Premium non concede di per sé il permesso di copiare video al di fuori delle funzioni offerte da YouTube.
  • Le autorizzazioni e restrizioni di YouTube limitano il download e l'accesso automatizzato, salvo autorizzazione del servizio o dei titolari dei diritti interessati.
  • Questa guida non tratta l'aggiramento del DRM, la redistribuzione commerciale né i modi per eludere le misure di applicazione della piattaforma.

Che cosa ti serve prima di iniziare

L'installazione di base è piccola, i file multimediali no. Prepara il server e il percorso di archiviazione prima di scaricare un canale intero.

  • Un VPS con Ubuntu 22.04 o successivo, oppure una versione attuale di Debian, con accesso SSH
  • Python 3.10 o successivo
  • Spazio sufficiente per un campione rappresentativo più margine per file parziali e post-elaborazione
  • Un browser locale separato, solo se ti servono i cookie dell'account
  • Facoltativo: Jellyfin, Emby o un altro media server in grado di leggere la cartella dell'archivio

Perché mettere yt-dlp su un VPS?

Un VPS è utile quando il lavoro deve continuare a girare indipendentemente dal computer che usi tutti i giorni. Dà al downloader un processo persistente, un filesystem prevedibile e uno scheduler che non si ferma quando un portatile va in standby o cambia rete.

I compromessi contano. Il traffico mensile incluso del tuo server può diventare un limite quando ritrasmetti l'archivio verso l'esterno, e un IP di VPS può incontrare limiti di richiesta prima della tua connessione di casa. Sei tu a farti carico di aggiornamenti, gestione delle credenziali, backup, pulizia dello storage e sicurezza del media server. Per un download una tantum un portatile è più semplice. Per prelievi ricorrenti o una libreria condivisa un VPS è più facile da gestire.

Dimensiona il VPS attorno a storage e riproduzione

yt-dlp VPS sizing guide: starting allocations of 2 vCPU and 2 GB RAM for raw yt-dlp with systemd, 2 vCPU and 4 GB RAM for MeTube or Pinchflat, and 4 vCPU and 8 GB RAM for Tube Archivist, beside a method for projecting storage from a sample download

yt-dlp scarica e rimultiplexa i file; di norma non transcodifica ogni file. Questo mantiene contenuti i requisiti costanti di CPU e memoria del downloader, mentre l'uso del disco varia con durata del video, risoluzione, codec e formato scelto.

Usa queste allocazioni come punti di partenza prudenti, non come minimi ufficiali:

ConfigurazioneAllocazione inizialeApproccio allo storagePiù Adatto
yt-dlp nudo con systemd2 vCPU, 2 GB RAMDimensionare da un campioneDownload pianificati senza interfaccia
MeTube o Pinchflat2 vCPU, 4 GB RAMDimensionare da un campioneCoda dal browser o iscrizioni ai canali
Tube Archivist4 vCPU, 8 GB RAMDisco locale con margine di crescitaArchivio con ricerca e riproduzione integrata

Un piccolo test richiede circa 2 GB di memoria disponibile e un'installazione da media a grande circa 4 GB, secondo la guida al deployment di Tube Archivist. Partire sopra quella soglia lascia spazio al sistema operativo, a Docker, all'attività di Elasticsearch e a un altro servizio come Jellyfin.

Prima di dimensionare un archivio completo, simula o scarica un gruppo rappresentativo alla risoluzione scelta. Controlla la cartella risultante con du, dividi per il numero di video completati e tieni conto dei caricamenti insolitamente lunghi.

du -sh ~/archive
find ~/archive -type f \( -name '*.mp4' -o -name '*.mkv' \) | wc -l
df -h ~/archive

Il campione è più utile di una stima generica in gigabyte per video, perché riflette la durata reale e il mix di formati di quel canale.

Installare yt-dlp e le sue dipendenze attuali

Il progetto yt-dlp supporta Python 3.10 e successivi. L' elenco delle dipendenze di yt-dlp consiglia vivamente ffmpeg, ffprobe, yt-dlp-ejs e un runtime JavaScript supportato per il pieno supporto di YouTube.

Parti dai pacchetti di sistema e da un ambiente Python isolato:

sudo apt update
sudo apt install -y python3 python3-venv ffmpeg curl nano
python3 -m venv ~/yt-dlp-venv
source ~/yt-dlp-venv/bin/activate
python -m pip install -U --pre "yt-dlp[default]"

Deno è abilitato per impostazione predefinita in yt-dlp ed è il runtime che la guida EJS guida EJS del progetto consiglia attualmente. Installalo, aggiungilo al path della tua shell e verifica ogni componente:

curl -fsSL https://deno.land/install.sh | sh
export PATH="$HOME/.deno/bin:$PATH"
echo 'export PATH="$HOME/.deno/bin:$PATH"' >> ~/.profile
yt-dlp --version
ffmpeg -version | head -1
deno --version
yt-dlp --simulate --verbose "https://www.youtube.com/watch?v=VIDEO_ID"

L'output dettagliato elenca le dipendenze che yt-dlp riesce a vedere. Se manca ffmpeg, yt-dlp avvisa e non può unire i flussi video e audio separati di qualità migliore né eseguire diversi passaggi di post-elaborazione.

Per un'installazione via pip, aggiorna rieseguendo pip all'interno dell'ambiente virtuale. Il comando integrato yt-dlp -U vale per i binari di release, non per i pacchetti pip.

source ~/yt-dlp-venv/bin/activate
python -m pip install -U --pre "yt-dlp[default]"

I canali di aggiornamento sono descritti nelle note di aggiornamento di yt-dlp. I canali stable, nightly e master sono tutti disponibili, e nightly è quello che il progetto consiglia agli utenti comuni, perché le correzioni degli extractor arrivano lì prima della release stabile successiva.

Aggiungi i cookie solo per i contenuti che richiedono un account

Prova prima l'URL di destinazione senza cookie. La guida di yt-dlp per YouTube dice che i cookie servono solo per contenuti che richiedono un account, comprese playlist private, video con limiti d'età e contenuti riservati ai membri. L'accesso tramite OAuth non funziona più con yt-dlp.

Quando i cookie servono davvero, esporta una sessione YouTube dedicata sul tuo computer locale. La procedura di esportazione dei cookie del progetto usa una finestra di navigazione privata, così YouTube non ruota la sessione esportata in una normale scheda rimasta aperta:

  1. Apri una sola finestra privata o in incognito e accedi a YouTube.
  2. Nella stessa scheda, apri il file robots.txt di YouTube.
  3. Esporta solo i cookie di youtube.com in formato Netscape, con una delle estensioni elencate nelle FAQ di yt-dlp.
  4. Chiudi la finestra privata e non riaprire quella sessione.
  5. Copia il file sul VPS e limitane i permessi.
scp cookies.txt your-user@your-vps-ip:~/cookies.txt
ssh your-user@your-vps-ip 'chmod 600 ~/cookies.txt'

Prova il file con un URL che richiede un account:

~/yt-dlp-venv/bin/yt-dlp \
  --cookies ~/cookies.txt \
  --simulate \
  "https://www.youtube.com/watch?v=VIDEO_ID"

I file dei cookie sono credenziali di sessione e le estensioni del browser vanno scelte con attenzione, secondo le FAQ di yt-dlp sui cookie. La guida dell'extractor di YouTube avverte anche che usare un account con yt-dlp può portare a un ban temporaneo o permanente. Usa i cookie solo quando il target li richiede, tieni il file riservato e usa un account separato invece del tuo account Google principale.

Non mettere --cookies nella configurazione globale quando la maggior parte dei target è pubblica. Usa un secondo file di configurazione o aggiungi l'opzione solo ai job che ne hanno bisogno.

Tratta i PO Token come una risoluzione dei problemi condizionale

yt-dlp access troubleshooting flow: simulate the URL first, then branch to no cookies needed for a working public video, a cookie export for account-gated content, or a dependency update and PO Token check when failures continue

Un Proof of Origin Token non è un requisito universale di installazione. YouTube al momento impone questi token per alcune combinazioni di client e richiesta, e la matrice esatta cambia.

Quando i client predefiniti falliscono, si consiglia un plugin provider per il client mweb, secondo la guida ai PO Token di yt-dlp. Vi è indicato bgutil-ytdlp-pot-provider come una delle opzioni in evidenza, ma quel plugin richiede sia un provider di token sia un plugin per yt-dlp. Installare solo il pacchetto Python non è una configurazione completa.

Segui questo ordine quando un download da YouTube fallisce:

  1. Aggiorna yt-dlp, yt-dlp-ejs e il runtime JavaScript.
  2. Riproduci l'errore con --verbose e senza forzare alcun client aggiuntivo.
  3. Aggiungi i cookie solo se il video richiede un account.
  4. Se l'errore rimanda all'imposizione dei PO Token, segui le istruzioni aggiornate del provider collegate dalla guida ufficiale.

Così tieni fuori un rimedio instabile da un'installazione di base per il resto stabile.

Scegli un frontend in base al flusso di lavoro

La decisione principale non è quale interfaccia abbia l'elenco di funzioni più lungo. Stabilisci se ti serve una coda dal browser, iscrizioni basate su regole o una libreria locale completa in stile YouTube.

OpzioneDistribuzionePunti di forzaPrincipale compromesso
CLI nudaNessun frontendScript, file di configurazione, systemd, controllo preciso delle opzioniNessuna interfaccia browser
MeTubeUn solo container DockerDownload dal browser più iscrizioni a canali e playlistGestione della libreria limitata dopo il download
PinchflatUn solo container DockerRegole per canali e playlist, RSS, conservazione, output per media centerCostruito per gestire i download, non per guardare nell'app
Tube ArchivistContainer di app, Redis ed ElasticsearchRicerca, metadati, code, pagine dei canali e riproduzioneIl maggiore carico di memoria e gestione

Per un flusso leggero dal browser, MeTube supporta iscrizioni a canali e playlist che controllano periodicamente i nuovi elementi e li accodano in automatico. Resta la scelta più semplice quando vuoi soprattutto un modulo web e una coda di download.

Pinchflat è la scelta più adatta all'archiviazione continua di canali che poi guarderai tramite Jellyfin, Plex, Kodi o un client RSS. È autonomo, controlla le fonti periodicamente, supporta regole di conservazione e lascia deliberatamente la riproduzione a un'altra applicazione.

Tube Archivist si merita i suoi servizi aggiuntivi quando vuoi che l'archivio stesso si comporti come un sito video con ricerca. Se l'interfaccia di riproduzione te la dà già Jellyfin, parti dalla CLI nuda o da Pinchflat e aggiungi Tube Archivist solo quando il suo modello di ricerca e metadati risolve un problema che hai davvero.

Costruisci una configurazione d'archivio ripetibile

Tieni le opzioni durature in un unico file e passa l'URL del canale dalla riga di comando o dallo scheduler. Questo esempio limita l'output a 1080p, registra gli ID dei video completati, distanzia leggermente le richieste e scrive metadati che restano utili anche fuori da yt-dlp.

Crea le cartelle e il file di configurazione:

mkdir -p ~/.config/yt-dlp ~/archive
nano ~/.config/yt-dlp/archive.conf

Aggiungi queste opzioni:

-P "~/archive"
-o "%(channel)s/%(upload_date>%Y-%m-%d)s - %(title)s [%(id)s].%(ext)s"
-f "bv*[height<=1080]+ba/b[height<=1080]"
--merge-output-format mp4
--download-archive ~/archive/downloaded.txt
--sleep-requests 1
--sleep-interval 5
--max-sleep-interval 10
--write-info-json
--write-thumbnail
--write-subs
--write-auto-subs
--sub-langs en.*
--embed-subs
--embed-thumbnail
--embed-metadata
--sponsorblock-mark all

Fai una prova con un solo video prima di dare a yt-dlp un canale intero:

~/yt-dlp-venv/bin/yt-dlp \
  --config-location ~/.config/yt-dlp/archive.conf \
  "https://www.youtube.com/watch?v=VIDEO_ID"

Poi esegui l'URL di un canale o di una playlist con la stessa configurazione:

~/yt-dlp-venv/bin/yt-dlp \
  --config-location ~/.config/yt-dlp/archive.conf \
  "https://www.youtube.com/@CHANNEL/videos"

Il file --download-archive registra gli ID scaricati con successo, così le esecuzioni successive li saltano. All'inizio mantieni il valore predefinito --concurrent-fragments 1. La guida di yt-dlp per YouTube consiglia pause tra un video e l'altro quando una sessione tocca i limiti di richiesta; non pubblica però un tetto universale e sicuro di concorrenza dei frammenti per gli IP dei VPS.

Pianificare i download con systemd

Un timer systemd a livello utente dà al job una pianificazione persistente e dei log, senza mettere un comando lungo in cron. Il ritardo casuale evita inoltre che tutte le fonti pianificate partano nello stesso secondo. Per non dipendere dal PATH del gestore utente, il servizio punta yt-dlp direttamente al percorso di installazione predefinito di Deno.

Crea il servizio:

mkdir -p ~/.config/systemd/user
nano ~/.config/systemd/user/yt-dlp-archive.service
[Unit]
Description=Archive a YouTube channel with yt-dlp

[Service]
Type=oneshot
ExecStart=%h/yt-dlp-venv/bin/yt-dlp --js-runtimes deno:%h/.deno/bin/deno --config-location %h/.config/yt-dlp/archive.conf https://www.youtube.com/@CHANNEL/videos

Crea il timer:

nano ~/.config/systemd/user/yt-dlp-archive.timer
[Unit]
Description=Run the yt-dlp archive daily

[Timer]
OnCalendar=*-*-* 04:00:00
RandomizedDelaySec=30m
Persistent=true

[Install]
WantedBy=timers.target

Abilita il timer e consenti al servizio utente di girare anche quando non hai effettuato l'accesso:

systemctl --user daemon-reload
systemctl --user enable --now yt-dlp-archive.timer
sudo loginctl enable-linger "$USER"
systemctl --user list-timers
journalctl --user -u yt-dlp-archive.service -n 100 --no-pager

Con più canali, crea un'istanza di servizio per canale o usa timer separati. Sfalsali nel tempo invece di lanciare insieme diversi prelievi corposi.

Collegare l'archivio a Jellyfin

Monta o esponi la stessa cartella ~/archive a Jellyfin, poi aggiungila come libreria. Per la struttura grezza canale/data va bene la libreria Music Videos di Jellyfin accetta cartelle annidate e nomi di file arbitrari, senza abbinamento dei metadati online. L'etichetta non è perfetta per archivi non musicali, ma sul piano del filesystem calza meglio del tipo "Shows", che si aspetta cartelle di serie e stagioni con nomi di episodio SxxEyy. Evita Mixed Content, a meno che tu non accetti l'avvertenza di Jellyfin secondo cui i risultati sui metadati possono essere inaffidabili.

Le opzioni per metadati, miniatura e sottotitoli nella configurazione di yt-dlp conservano informazioni utili accanto a ciascun file o al suo interno. Jellyfin potrebbe comunque richiedere correzioni manuali dei metadati, perché un canale YouTube non si mappa in modo pulito su un database di serie TV.

Se vuoi nomi di file e metadati su misura per Jellyfin con meno lavoro manuale, Pinchflat offre preset per media center pensati per questo flusso. Per la scelta più ampia tra media server, il nostro confronto tra Jellyfin e Plex articolo affronta i compromessi su riproduzione, accesso remoto e transcodifica.

Metti lo stack su un server sempre acceso

Una volta che il flusso funziona su un piccolo insieme di prova, spostalo su Il VPS Linux di Cloudzy , così i download pianificati e la tua libreria multimediale restano online senza tenere occupato il computer di tutti i giorni. Puoi anche distribuire Jellyfin come app a un clic e puntare la sua libreria alla cartella di output di yt-dlp.

Vedi piani Linux

Costruisci su un VPS Linux con accesso root, NVMe e la potenza di AMD EPYC.

Vedi piani Linux

Domande frequenti

yt-dlp ha bisogno di una GPU su un VPS?

No. yt-dlp può scaricare e rimultiplexare i file senza GPU. La GPU diventa rilevante quando Jellyfin o un altro media server deve transcodificare il video per client incompatibili o connessioni a banda ridotta; la riproduzione diretta non richiede quella conversione.

yt-dlp può riprendere un download interrotto?

Sì. yt-dlp abilita per impostazione predefinita i file parziali e la ripresa, quindi un'esecuzione successiva di norma riprende i frammenti già scaricati invece di ricominciarli. Non aggiungere --no-continue, --no-part o --force-overwrites se vuoi questo comportamento.

yt-dlp e Jellyfin devono condividere un solo VPS?

Possono condividere un solo VPS quando storage, CPU e traffico in uscita bastano per entrambi i lavori. Separali quando la riproduzione o la transcodifica compete con download corposi, quando ti servono finestre di manutenzione indipendenti, o quando l'archivio sta meglio su uno storage più economico del server di streaming.

Condividi

Altro dal blog

Continua a leggere.

Pronto a distribuire? Da 2,48 $/mese.

Cloud indipendente, dal 2008. AMD EPYC, NVMe, 40 Gbps. Rimborso entro 14 giorni.