Youtube-dl PHP
A PHP wrapper for youtube-dl tool.
Install
First step is to download the youtube-dl and add it's path to environment variables.
Second step is to install the wrapper using Composer:
composer require norkunas/youtube-dl-php
Download video
<?php
require __DIR__ . '/vendor/autoload.php';
use YoutubeDl\YoutubeDl;
use YoutubeDl\Exception\CopyrightException;
use YoutubeDl\Exception\NotFoundException;
use YoutubeDl\Exception\PrivateVideoException;
$dl = new YoutubeDl([
'continue' => true, // force resume of partially downloaded files. By default, youtube-dl will resume downloads if possible.
'format' => 'bestvideo',
]);
// For more options go to https://github.com/rg3/youtube-dl#user-content-options
$dl->setDownloadPath('/home/user/downloads');
// Enable debugging
/*$dl->debug(function ($type, $buffer) {
if (\Symfony\Component\Process\Process::ERR === $type) {
echo 'ERR > ' . $buffer;
} else {
echo 'OUT > ' . $buffer;
}
});*/
try {
$video = $dl->download('https://www.youtube.com/watch?v=oDAw7vW7H0c');
echo $video->getTitle(); // Will return Phonebloks
// $video->getFile(); // \SplFileInfo instance of downloaded file
} catch (NotFoundException $e) {
// Video not found
} catch (PrivateVideoException $e) {
// Video is private
} catch (CopyrightException $e) {
// The YouTube account associated with this video has been terminated due to multiple third-party notifications of copyright infringement
} catch (\Exception $e) {
// Failed to download
}
Download only audio (requires ffmpeg or avconv and ffprobe or avprobe)
<?php
require __DIR__ . '/vendor/autoload.php';
use YoutubeDl\YoutubeDl;
$dl = new YoutubeDl([
'extract-audio' => true,
'audio-format' => 'mp3',
'audio-quality' => 0, // best
'output' => '%(title)s.%(ext)s',
]);
$dl->setDownloadPath('/home/user/downloads');
$video = $dl->download('https://www.youtube.com/watch?v=oDAw7vW7H0c');
Download progress
<?php
$dl->onProgress(function ($progress) {
$percentage = $progress['percentage'];
$size = $progress['size'];
$speed = $progress['speed'] ?? null;
$eta = $progress['eta'] ?? null;
echo "Percentage: $percentage; Size: $size";
if ($speed) {
echo "; Speed: $speed";
}
if ($eta) {
echo "; ETA: $eta";
}
// Will print: Percentage: 21.3%; Size: 4.69MiB; Speed: 4.47MiB/s; ETA: 00:01
});
Disabled options which would break download:
list-formats, list-subs, list-thumbnails, get-url, get-title, get-id, get-thumbnail, get-description, get-duration, get-filename, get-format, dump-json, dump-single-json, print-json, write-info-json (used internally), newline, no-progress, console-title, verbose, dump-pages, write-pages, print-traffic, ignore-config (used internally), all-formats, playlist-start, playlist-end, playlist-items, playlist-reverse, yes-playlist, no-playlist (used internally).