A PHP wrapper for youtube-dl or yt-dlp.
First step is to download the youtube-dl or yt-dlp.
Second step is to install the wrapper using Composer:
composer require norkunas/youtube-dl-php:dev-master
<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
use YoutubeDl\Options;
use YoutubeDl\YoutubeDl;
$yt = new YoutubeDl();
$collection = $yt->download(
Options::create()
->downloadPath('/path/to/downloads')
->url('https://www.youtube.com/watch?v=oDAw7vW7H0c')
);
foreach ($collection->getVideos() as $video) {
if ($video->getError() !== null) {
echo "Error downloading video: {$video->getError()}.";
} else {
echo $video->getTitle(); // Will return Phonebloks
// $video->getFile(); // \SplFileInfo instance of downloaded file
}
}
<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
use YoutubeDl\Options;
use YoutubeDl\YoutubeDl;
$yt = new YoutubeDl();
$collection = $yt->download(
Options::create()
->downloadPath('/path/to/downloads')
->extractAudio(true)
->audioFormat('mp3')
->audioQuality('0') // best
->output('%(title)s.%(ext)s')
->url('https://www.youtube.com/watch?v=oDAw7vW7H0c')
);
foreach ($collection->getVideos() as $video) {
if ($video->getError() !== null) {
echo "Error downloading video: {$video->getError()}.";
} else {
$video->getFile(); // audio file
}
}
<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
use YoutubeDl\YoutubeDl;
$yt = new YoutubeDl();
$yt->onProgress(static function (?string $progressTarget, string $percentage, string $size, string $speed, string $eta, ?string $totalTime): void {
echo "Download file: $progressTarget; Percentage: $percentage; Size: $size";
if ($speed) {
echo "; Speed: $speed";
}
if ($eta) {
echo "; ETA: $eta";
}
if ($totalTime !== null) {
echo "; Downloaded in: $totalTime";
}
});
<?php
declare(strict_types=1);
namespace App\YoutubeDl;
use Symfony\Component\Process\Process;
use YoutubeDl\Process\ProcessBuilderInterface;
class ProcessBuilder implements ProcessBuilderInterface
{
public function build(?string $binPath, ?string $pythonPath, array $arguments = []): Process
{
$process = new Process([$binPath, $pythonPath, ...$arguments]);
// Set custom timeout or customize other things..
$process->setTimeout(60);
return $process;
}
}
<?php
declare(strict_types=1);
use App\YoutubeDl\ProcessBuilder;
use YoutubeDl\YoutubeDl;
$processBuilder = new ProcessBuilder();
// Provide your custom process builder as the first argument.
$yt = new YoutubeDl($processBuilder);
If you have any questions please open a discussion.
This library is released under the MIT License. See the bundled LICENSE file for details.