Ga naar hoofdinhoud
50% korting alle plannen, beperkte tijd. Vanaf $2.48/mo
11 min left
Gaming en media

yt-dlp op een VPS draaien voor headless persoonlijke archivering

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

yt-dlp op een VPS draaien geeft lange downloads een machine die online blijft nadat je je laptop dichtklapt. Het legt ook een schoon pad van een geplande kanaalophaal naar een mediabibliotheek die Jellyfin kan inlezen.

De server verandert drie delen van de workflow: de installatie heeft actuele YouTube-afhankelijkheden nodig, video's achter een account hebben een veilige cookieoverdracht nodig, en automatisering heeft een bewust tempo van verzoeken nodig. De opzet hieronder dekt alle drie, zonder aan te nemen dat elke download cookies, een webinterface of een PO Token-provider nodig heeft.

TL;DR

  • Installeer yt-dlp in een virtuele Python-omgeving met ffmpeg, ffprobe, yt-dlp-ejs en een ondersteunde JavaScript-runtime. Deno is de runtime die het project momenteel aanraadt.
  • Begin zonder accountcookies. Voeg ze alleen toe voor privéafspeellijsten, video's met leeftijdsgrens, content alleen voor leden of een ander geval waarvoor een account nodig is.
  • Houd het standaardgedrag van yt-dlp met één fragment aan tot je een gemeten reden hebt om dat te wijzigen. Gebruik sleep-opties en gespreide schema's om de druk van verzoeken te verlagen.
  • Kale CLI plus systemd is de eenvoudigste betrouwbare opzet. Kies Pinchflat voor kanaalregels zonder omkijken, MeTube voor een wachtrij in de browser, of Tube Archivist voor een doorzoekbare kijkinterface.
  • Behandel opslag als de belangrijkste variabele bij het dimensioneren. Test een representatieve steekproef voordat je schijfcapaciteit koopt voor een volledig archief.

Gebruik yt-dlp verantwoord

Archiveer media alleen als je toestemming hebt en je gebruik voldoet aan de voorwaarden van het platform en aan de geldende wetgeving.

  • Goede kandidaten zijn je eigen uploads, materiaal in het publieke domein en content waarvan de rechthebbende het downloaden heeft toegestaan.
  • Een YouTube Premium-abonnement geeft op zichzelf geen toestemming om video's te kopiëren buiten de functies die YouTube zelf biedt.
  • De toestemmingen en beperkingen van YouTube beperken downloaden en geautomatiseerde toegang, tenzij de dienst of de betrokken rechthebbenden dat toestaan.
  • Deze handleiding gaat niet over het omzeilen van DRM, commerciële herdistributie of manieren om handhaving door het platform te ontwijken.

Wat je nodig hebt voordat je begint

De basisinstallatie is klein, de mediabestanden niet. Bereid de server en het opslagpad voor voordat je een heel kanaal downloadt.

  • Een VPS met Ubuntu 22.04 of nieuwer, of een actuele Debian-release, met SSH-toegang
  • Python 3.10 of nieuwer
  • Genoeg opslag voor een representatieve steekproef plus ruimte voor deelbestanden en nabewerking
  • Een aparte lokale browser, alleen als je accountcookies nodig hebt
  • Optioneel: Jellyfin, Emby of een andere mediaserver die de archiefmap kan lezen

Waarom yt-dlp op een VPS zetten?

Een VPS is nuttig wanneer de taak moet blijven draaien los van je dagelijkse computer. Hij geeft de downloader een blijvend proces, een voorspelbaar bestandssysteem en een planner die niet stopt als een laptop in slaapstand gaat of van netwerk wisselt.

De afwegingen doen ertoe. De maandelijkse datalimiet van je server kan een grens worden wanneer je het archief weer uitstreamt, en een VPS-IP loopt mogelijk eerder tegen verzoeklimieten aan dan je thuisverbinding. Je bent ook zelf verantwoordelijk voor updates, omgang met inloggegevens, back-ups, opruimen van opslag en de beveiliging van de mediaserver. Voor een eenmalige download is een laptop eenvoudiger. Voor terugkerende ophaalacties of een gedeelde mediabibliotheek is een VPS makkelijker te beheren.

Dimensioneer de VPS rond opslag en afspelen

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 downloadt en remuxt media; het transcodeert normaal gesproken niet elk bestand. Daardoor blijven de constante CPU- en geheugenbehoeften van de downloader bescheiden, terwijl het schijfgebruik varieert met duur, resolutie, codec en het gekozen formaat.

Gebruik deze toewijzingen als voorzichtige startpunten, niet als officiële minima:

InstallatieStarttoewijzingOpslagaanpakBeste pasvorm
Kale yt-dlp met systemd2 vCPU, 2 GB RAMDimensioneren op basis van een steekproefGeplande downloads zonder interface
MeTube of Pinchflat2 vCPU, 4 GB RAMDimensioneren op basis van een steekproefWachtrij in de browser of kanaalabonnementen
Tube Archivist4 vCPU, 8 GB RAMLokale schijf met ruimte om te groeienDoorzoekbaar archief met ingebouwd afspelen

Een kleine test heeft ongeveer 2 GB beschikbaar geheugen nodig en een middelgrote tot grote installatie ongeveer 4 GB, aldus de implementatiegids van Tube Archivist. Boven die ondergrens beginnen laat ruimte voor het besturingssysteem, Docker, de activiteit van Elasticsearch en nog een dienst zoals Jellyfin.

Voordat je een volledig archief dimensioneert, simuleer of download je een representatieve groep op de door jou gekozen resolutie. Bekijk de resulterende map met du, deel door het aantal voltooide video's en houd rekening met uitzonderlijk lange uploads.

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

De steekproef is nuttiger dan een algemene schatting in gigabytes per video, omdat die de werkelijke duur en formaatmix van het kanaal weerspiegelt.

yt-dlp en de huidige afhankelijkheden installeren

Het yt-dlp-project ondersteunt Python 3.10 en nieuwer. De afhankelijkhedenlijst van yt-dlp raadt ffmpeg, ffprobe, yt-dlp-ejs en een ondersteunde JavaScript-runtime sterk aan voor volledige YouTube-ondersteuning.

Begin met de systeempakketten en een geïsoleerde Python-omgeving:

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 staat in yt-dlp standaard aan en is de runtime die de EJS-gids EJS-gids van het project momenteel aanraadt. Installeer hem, voeg hem toe aan het pad van je shell en controleer elk onderdeel:

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"

De uitgebreide uitvoer somt de afhankelijkheden op die yt-dlp ziet. Ontbreekt ffmpeg, dan waarschuwt yt-dlp en kan het gescheiden video- en audiostreams van de beste kwaliteit niet samenvoegen en verschillende nabewerkingsstappen niet uitvoeren.

Bij een installatie via pip werk je bij door pip opnieuw uit te voeren binnen de virtuele omgeving. Het ingebouwde commando yt-dlp -U is bedoeld voor release-binaries, niet voor pip-pakketten.

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

De updatekanalen worden beschreven in de update-opmerkingen van yt-dlp. De kanalen stable, nightly en master zijn allemaal beschikbaar, en nightly is wat het project aanraadt voor gewone gebruikers, omdat extractorfixes daar eerder aankomen dan in de volgende stabiele release.

Voeg cookies alleen toe voor content waarvoor een account nodig is

Probeer de doel-URL eerst zonder cookies. De YouTube-gids van yt-dlp zegt dat cookies alleen nodig zijn voor content waarvoor een account vereist is, waaronder privéafspeellijsten, video's met leeftijdsgrens en content alleen voor leden. Inloggen via OAuth werkt niet meer met yt-dlp.

Als cookies wel nodig zijn, exporteer dan een aparte YouTube-sessie op je lokale computer. De cookie-exportprocedure van het project gebruikt een privévenster, zodat YouTube de geëxporteerde sessie niet vervangt in een openstaand gewoon tabblad:

  1. Open één privé- of incognitovenster en log in bij YouTube.
  2. Open in hetzelfde tabblad het robots.txt-bestand van YouTube.
  3. Exporteer alleen de cookies van youtube.com in Netscape-formaat, met een van de extensies die in de yt-dlp-FAQ staan.
  4. Sluit het privévenster en open die sessie niet opnieuw.
  5. Kopieer het bestand naar de VPS en beperk de rechten ervan.
scp cookies.txt your-user@your-vps-ip:~/cookies.txt
ssh your-user@your-vps-ip 'chmod 600 ~/cookies.txt'

Test het bestand met een URL waarvoor een account nodig is:

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

Cookiebestanden zijn sessiegegevens en browserextensies vragen om een zorgvuldige keuze, aldus de cookie-FAQ van yt-dlp. De gids voor de YouTube-extractor waarschuwt ook dat het gebruik van een account met yt-dlp tot een tijdelijke of permanente ban kan leiden. Gebruik cookies alleen wanneer het doel dat vereist, houd het bestand privé en gebruik een apart account in plaats van je belangrijkste Google-account.

Zet --cookies niet in de globale configuratie als de meeste doelen openbaar zijn. Gebruik een tweede configuratiebestand of voeg de vlag alleen toe aan de taken die hem nodig hebben.

Behandel PO Tokens als voorwaardelijke probleemoplossing

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

Een Proof of Origin Token is geen algemene installatievereiste. YouTube dwingt deze tokens momenteel af voor bepaalde combinaties van client en verzoek, en de precieze matrix verandert.

Wanneer de standaardclients falen, wordt een provider-plug-in voor de mweb-client aangeraden, aldus de PO Token-gids van yt-dlp. Daarin staat bgutil-ytdlp-pot-provider als een van de uitgelichte opties, maar die plug-in vereist zowel een tokenprovider als een yt-dlp-plug-in. Alleen het Python-pakket installeren is geen volledige opzet.

Volg deze volgorde wanneer een YouTube-download mislukt:

  1. Werk yt-dlp, yt-dlp-ejs en de JavaScript-runtime bij.
  2. Reproduceer de fout met --verbose en zonder extra client-override.
  3. Voeg alleen cookies toe als de video een account vereist.
  4. Wijst de fout op afdwinging van PO Tokens, volg dan de actuele instructies van de provider waarnaar de officiële gids linkt.

Zo houd je een wispelturige workaround buiten een verder stabiele basisinstallatie.

Kies een frontend op basis van je workflow

De hoofdkeuze is niet welke interface de langste functielijst heeft. Bepaal of je een wachtrij in de browser nodig hebt, abonnementen op basis van regels, of een volledige lokale bibliotheek in YouTube-stijl.

OptieInzetSterk inBelangrijkste afweging
Kale CLIGeen frontendScripts, configuratiebestanden, systemd, exacte controle over optiesGeen browserinterface
MeTubeEén Docker-containerDownloads via de browser plus abonnementen op kanalen en afspeellijstenBeperkt bibliotheekbeheer na het downloaden
PinchflatEén Docker-containerRegels voor kanalen en afspeellijsten, RSS, bewaartermijnen, uitvoer voor mediacentersGemaakt voor downloadbeheer, niet om in de app te kijken
Tube ArchivistContainers voor de app, Redis en ElasticsearchZoeken, metadata, wachtrijen, kanaalpagina's en afspelenHoogste geheugen- en beheerlast

Voor een lichte workflow in de browser ondersteunt MeTube abonnementen op kanalen en afspeellijsten die periodiek op nieuwe items controleren en die automatisch in de wachtrij zetten. Het blijft de eenvoudigste keuze wanneer je vooral een webformulier en een downloadwachtrij wilt.

Pinchflat past het best bij doorlopende kanaalarchivering die je later via Jellyfin, Plex, Kodi of een RSS-client bekijkt. Het is zelfstandig, controleert bronnen periodiek, ondersteunt bewaarregels en laat het afspelen bewust aan een andere applicatie over.

Tube Archivist verdient zijn extra diensten wanneer je wilt dat het archief zich zelf gedraagt als een doorzoekbare videosite. Levert Jellyfin al je afspeelinterface, begin dan met kale CLI of Pinchflat en voeg Tube Archivist pas toe als zijn zoek- en metadatamodel een probleem oplost dat je echt hebt.

Bouw een herhaalbare archiefconfiguratie

Houd de blijvende opties in één bestand en geef de kanaal-URL mee vanaf de opdrachtregel of de planner. Dit voorbeeld beperkt de uitvoer tot 1080p, noteert de id's van voltooide video's, spreidt de verzoeken licht en schrijft metadata die ook buiten yt-dlp bruikbaar blijft.

Maak de mappen en het configuratiebestand aan:

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

Voeg deze opties toe:

-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

Doe eerst een test met één video voordat je yt-dlp een heel kanaal geeft:

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

Draai daarna een kanaal- of afspeellijst-URL met dezelfde configuratie:

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

Het bestand --download-archive registreert de succesvol gedownloade id's, zodat latere runs ze overslaan. Houd in het begin de standaardwaarde --concurrent-fragments 1 aan. De YouTube-gids van yt-dlp raadt pauzes tussen video's aan wanneer een sessie tegen verzoeklimieten aanloopt; een universeel veilig plafond voor fragmentgelijktijdigheid bij VPS-IP's publiceert hij niet.

Downloads plannen met systemd

Een systemd-timer op gebruikersniveau geeft de taak blijvende planning en logs, zonder een lang commando in cron te zetten. De willekeurige vertraging voorkomt bovendien dat alle geplande bronnen op dezelfde seconde starten. Om niet afhankelijk te zijn van het PATH van de gebruikersmanager, wijst de service yt-dlp rechtstreeks naar de standaardinstallatielocatie van Deno.

Maak de service aan:

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

Maak de timer aan:

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

Zet de timer aan en sta toe dat de gebruikersservice draait wanneer je niet ingelogd bent:

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

Maak bij meerdere kanalen per kanaal een service-instantie aan of gebruik aparte timers. Spreid ze in de tijd in plaats van meerdere grote ophaalacties tegelijk te starten.

Het archief koppelen aan Jellyfin

Koppel of ontsluit dezelfde map ~/archive naar Jellyfin en voeg die daarna toe als bibliotheek. Voor de rauwe kanaal-/datumindeling past de Music Videos-bibliotheek van Jellyfin accepteert geneste mappen en willekeurige bestandsnamen, zonder online metadatakoppeling. Het label past niet perfect bij niet-muziekarchieven, maar sluit qua bestandsstructuur beter aan dan het type "Shows", dat serie- en seizoensmappen met afleveringsnamen in SxxEyy verwacht. Vermijd Mixed Content, tenzij je Jellyfins waarschuwing accepteert dat de metadataresultaten onbetrouwbaar kunnen zijn.

De opties voor metadata, thumbnail en ondertiteling in de yt-dlp-configuratie bewaren nuttige informatie naast of in elk bestand. Toch kan Jellyfin handmatige metadata-aanpassingen nodig hebben, omdat een YouTube-kanaal niet netjes op een tv-seriedatabase aansluit.

Wil je bestandsnamen en metadata die op Jellyfin zijn afgestemd met minder handwerk, dan heeft Pinchflat mediacenter-presets voor die workflow. Voor de bredere keuze tussen mediaservers behandelt onze vergelijking van Jellyfin en Plex de afwegingen rond afspelen, toegang op afstand en transcoderen.

Zet de stack op een permanente server

Zodra de workflow werkt op een kleine testset, verhuis hem naar Cloudzy's Linux VPS , zodat geplande downloads en je mediabibliotheek online blijven zonder je dagelijkse computer bezet te houden. Je kunt ook Jellyfin als één-klik-app en de bibliotheek ervan laten wijzen naar de uitvoermap van yt-dlp.

Bekijk Linux-plannen

Bouw op een Linux VPS met root-toegang, NVMe en AMD EPYC-kracht.

Bekijk Linux-plannen

Veelgestelde vragen

Heeft yt-dlp een GPU nodig op een VPS?

Nee. yt-dlp kan media downloaden en remuxen zonder GPU. Een GPU wordt relevant wanneer Jellyfin of een andere mediaserver video moet transcoderen voor incompatibele clients of verbindingen met minder bandbreedte; direct afspelen vraagt die conversie niet.

Kan yt-dlp een onderbroken download hervatten?

Ja. yt-dlp zet deelbestanden en hervatten standaard aan, dus een latere run pakt normaal gesproken de al gedownloade fragmenten weer op in plaats van opnieuw te beginnen. Voeg --no-continue, --no-part of --force-overwrites niet toe als je dat gedrag wilt.

Moeten yt-dlp en Jellyfin één VPS delen?

Ze kunnen één VPS delen wanneer opslag, CPU en uitgaand verkeer voor beide taken volstaan. Scheid ze wanneer afspelen of transcoderen concurreert met grote downloads, wanneer je onafhankelijke onderhoudsvensters nodig hebt, of wanneer het archief thuishoort op goedkopere opslag dan de streamingserver.

Delen

Meer van de blog

Blijf lezen.

Klaar om uit te rollen? Vanaf $2,48/mnd.

Onafhankelijke cloud, sinds 2008. AMD EPYC, NVMe, 40 Gbps. 14 dagen niet-goed-geld-terug.