YouTube-video's downloaden met puur PHP zonder gedoe
Een bekend verhaal: je moet video-downloadfunctionaliteit aan je project toevoegen of gewoon een directe stream-URL ophalen. Het eerste wat in je opkomt is de goede oude youtube-dl. Maar problemen beginnen meteen. Je moet met systeemcalls werken, Python-installaties in je container beheren en hopen dat de binary niet breekt op het slechtst mogelijke moment.
Onlangs stuitte ik op de youtube- down-loader repository van ontwikkelaar Athlon1600. Het is een poging om een echte bibliotheek te bouwen in puur PHP die geen externe afhankelijkheden en externe tools meesleept.
Wat is het doel van dit project
De auteur verwoordt het simpel: de meeste PHP-bibliotheken voor YouTube zijn ofwel verlaten van vijf jaar geleden of ze verpakken gewoon calls naar Python-scripts. Dit project volgt een ander idee. Er zijn geen JavaScript-interpreteerders of shell-calls. Gewoon PHP en standaard HTTP-verzoeken.
Het project is geïnspireerd door giganten zoals yt-dlp, maar aangepast voor de specifieke kenmerken van webservers. Als je snel downloadfunctionaliteit moet integreren in een bestaande PHP-applicatie, is dit waarschijnlijk de makkelijkste weg.
Wat de bibliotheek kan doen
Het gereedschap dekt de basisbehoeften waarmee ontwikkelaars te maken krijgen bij het werken met videohostingsites.
Directe links ophalen
Het meest voorkomende scenario is het invoeren van een video-URL en het krijgen van een lijst met beschikbare formaten. De bibliotheek retourneert een DownloadOptions object met links naar video's in verschillende kwaliteit, audiotracks en gecombineerde streams.
Het meest voorkomende scenario is het invoeren van een video-URL en het krijgen van een lijst met beschikbare formaten. De bibliotheek retourneert een DownloadOptions object met links naar video's in verschillende kwaliteit, audiotracks en gecombineerde streams.
Video streamen via de server
Soms kun je de directe link niet aan de gebruiker blootstellen (bijvoorbeeld om je server-IP niet bloot te stellen of restricties te omzeilen). De bibliotheek heeft een ingebouwde YouTubeStreamer waarmee je de stream via je backend kunt proxyen.
Soms kun je de directe link niet aan de gebruiker blootstellen (bijvoorbeeld om je server-IP niet bloot te stellen of restricties te omzeilen). De bibliotheek heeft een ingebouwde YouTubeStreamer waarmee je de stream via je backend kunt proxyen.
Werken met restricties en cookies
YouTube houdt niet van automatisering. Als een video leeftijdsrestricties heeft of alleen beschikbaar is voor geautoriseerde gebruikers, retourneert een gewoon verzoek een fout. De bibliotheek laat je een cookies-bestand leveren dat is geëxporteerd uit je browser. Het is een "hacky" maar werkende manier om de service te laten denken dat het verzoek van een echt persoon komt.
YouTube houdt niet van automatisering. Als een video leeftijdsrestricties heeft of alleen beschikbaar is voor geautoriseerde gebruikers, retourneert een gewoon verzoek een fout. De bibliotheek laat je een cookies-bestand leveren dat is geëxporteerd uit je browser. Het is een "hacky" maar werkende manier om de service te laten denken dat het verzoek van een echt persoon komt.
Trouwens, er is zelfs een consentCookies() methode die programmatisch op de "Accepteren"-knop klikt in Europese cookie-meldingen. Een klein dingetje, maar het bespaart tijd bij het debuggen.
Hoe het onder de motorkap werkt
In plaats van de pagina te parsen met regex (wat onbetrouwbaar is), probeert de bibliotheek clientgedrag na te bootsen. Het parseert YouTube's interne datastructuren, vindt handtekeningen en decodeert links. Als je benieuwd bent naar hoe de YouTube-protocol reverse engineering eigenlijk werkt, heeft de auteur een geweldige collectie links naar artikelen en broncode van andere parsers in de README achtergelaten.
Praktische gebruiksscenario's
Waar dit echt van pas kan komen:
- Telegram-bots. Als je een video-downloadbot schrijft, kun je met een PHP-bibliotheek het spawnen van microservices in Python vermijden.
- Preview-services. Wanneer je snel metadata of een screenshot van een video moet ophalen zonder de zware en rate-gelimiteerde YouTube API te gebruiken.
- Content archivering. Lokale kopieën maken van belangrijke video's voor interne bedrijfsbehoeften.
Is het de moeite waard om te gebruiken
Het project ziet er actief uit: tests slagen, commits komen regelmatig binnen (wat cruciaal is voor dit soort tools omdat YouTube voortdurend zijn markup verandert).
Aan de negatieve kant — er is momenteel een probleem met downloadsnelheid. YouTube beperkt vaak verzoeken tot 100 kbps als ze verdacht lijken. De auteur weet hiervan en heeft het op de todo-lijst staan. Ook is er nog geen ingebouwde video- en audiomerging via ffmpeg, dus als je 4K nodig hebt (waar audio en video altijd apart komen), moet je deze logica zelf schrijven.
Als je een eenvoudige en straightforward PHP-oplossing nodig hebt zonder extra overhead, is youtube- down-loader een geweldige kandidaat voor je composer.json.
Gerelateerde projecten