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 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:
| Installatie | Starttoewijzing | Opslagaanpak | Beste pasvorm |
|---|---|---|---|
| Kale yt-dlp met systemd | 2 vCPU, 2 GB RAM | Dimensioneren op basis van een steekproef | Geplande downloads zonder interface |
| MeTube of Pinchflat | 2 vCPU, 4 GB RAM | Dimensioneren op basis van een steekproef | Wachtrij in de browser of kanaalabonnementen |
| Tube Archivist | 4 vCPU, 8 GB RAM | Lokale schijf met ruimte om te groeien | Doorzoekbaar 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:
- Open één privé- of incognitovenster en log in bij YouTube.
- Open in hetzelfde tabblad het robots.txt-bestand van YouTube.
- Exporteer alleen de cookies van youtube.com in Netscape-formaat, met een van de extensies die in de yt-dlp-FAQ staan.
- Sluit het privévenster en open die sessie niet opnieuw.
- 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
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:
- Werk yt-dlp, yt-dlp-ejs en de JavaScript-runtime bij.
- Reproduceer de fout met --verbose en zonder extra client-override.
- Voeg alleen cookies toe als de video een account vereist.
- 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.
| Optie | Inzet | Sterk in | Belangrijkste afweging |
|---|---|---|---|
| Kale CLI | Geen frontend | Scripts, configuratiebestanden, systemd, exacte controle over opties | Geen browserinterface |
| MeTube | Eén Docker-container | Downloads via de browser plus abonnementen op kanalen en afspeellijsten | Beperkt bibliotheekbeheer na het downloaden |
| Pinchflat | Eén Docker-container | Regels voor kanalen en afspeellijsten, RSS, bewaartermijnen, uitvoer voor mediacenters | Gemaakt voor downloadbeheer, niet om in de app te kijken |
| Tube Archivist | Containers voor de app, Redis en Elasticsearch | Zoeken, metadata, wachtrijen, kanaalpagina's en afspelen | Hoogste 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.
Bouw op een Linux VPS met root-toegang, NVMe en AMD EPYC-kracht.
Bekijk Linux-plannenVeelgestelde 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.
