Installation:
composer require das-l/youtube-dl-bundle
Add to config/bundles.php:
return [
// ...
DasL\YouTubeDlBundle\DasLYoutubeDlBundle::class => ['all' => true],
];
Configure config/packages/das_l_youtube_dl.yaml:
das_l_youtube_dl:
bin_path: '/usr/bin/yt-dlp' # or '/usr/bin/youtube-dl'
python_path: null # Optional, if needed for metadata extraction
First Use Case:
Inject YoutubeDl into a service and use it to download a video:
use YoutubeDl\Options;
use YoutubeDl\YoutubeDl;
class VideoService {
public function __construct(private YoutubeDl $youtubeDl) {}
public function fetchVideo(string $url): array {
$options = Options::create()->url($url);
return $this->youtubeDl->download($options)->toArray();
}
}
Basic Downloads:
$options = Options::create()
->url('https://youtube.com/watch?v=abc123')
->downloadPath(storage_path('videos'));
$this->youtubeDl->download($options);
Metadata Extraction:
$metadata = $this->youtubeDl->getMetadata($url);
$title = $metadata->getTitle();
Custom Options:
$options = Options::create()
->url($url)
->format('bestvideo+bestaudio') // Merge video/audio streams
->subtitles(true); // Enable subtitles
Batch Processing:
$urls = ['url1', 'url2', 'url3'];
foreach ($urls as $url) {
$this->youtubeDl->download(Options::create()->url($url));
}
Queue Jobs: Wrap downloads in a job for async processing:
use Illuminate\Bus\Queueable;
use YoutubeDl\Options;
class DownloadVideoJob implements Queueable {
public function handle(YoutubeDl $youtubeDl) {
$youtubeDl->download(Options::create()->url($this->url));
}
}
Event Listeners: Trigger events on download completion:
// config/packages/das_l_youtube_dl.yaml
das_l_youtube_dl:
listeners:
on_download_complete: ['App\Listeners\LogDownload', 'handle']
Custom Process Builder: Extend DefaultProcessBuilder for advanced use cases:
class CustomProcessBuilder extends DefaultProcessBuilder {
public function build(Options $options): Process {
// Custom logic (e.g., proxy support)
return parent::build($options);
}
}
Register in services.yaml:
das_l_youtube_dl.process_builder:
class: App\CustomProcessBuilder
Binary Path:
bin_path points to a valid youtube-dl or yt-dlp executable.which youtube-dl # or yt-dlp
Python Dependencies:
yt-dlp, Python may be required for metadata extraction. Install dependencies:
pip install yt-dlp
python_path in config if Python isn’t in PATH.Permissions:
www-data) has read/write access to the download directory.Rate Limiting:
--limit-rate in options:
->addOption('--limit-rate', '50K') // 50KB/s
Metadata Caching:
->addOption('--no-cache-dir')
Verbose Output: Enable debug mode to inspect commands:
das_l_youtube_dl:
debug: true
Or via code:
$options->addOption('-v'); // Verbose mode
Error Handling: Wrap downloads in try-catch:
try {
$this->youtubeDl->download($options);
} catch (ProcessFailedException $e) {
Log::error('Download failed: ' . $e->getProcess()->getOutput());
}
Custom Metadata Readers:
Extend DefaultMetadataReader to parse additional fields:
class CustomMetadataReader extends DefaultMetadataReader {
protected function parseJson(array $json): Metadata {
$metadata = parent::parseJson($json);
$metadata->setCustomField($json['custom_field']);
return $metadata;
}
}
Post-Processing: Use events to transform downloaded files:
// config/packages/das_l_youtube_dl.yaml
das_l_youtube_dl:
listeners:
on_download_complete: ['App\Services\VideoProcessor', 'process']
Proxy Support: Configure proxies via options:
->addOption('--proxy', 'http://user:pass@proxy.example.com:8080')
Fallback Binaries:
Dynamically switch between youtube-dl and yt-dlp:
$binPath = file_exists('/usr/bin/yt-dlp') ? '/usr/bin/yt-dlp' : '/usr/bin/youtube-dl';
$this->youtubeDl->setBinPath($binPath);
Concurrent Downloads:
Use Symfony’s Messenger component to parallelize downloads:
$bus->dispatch(new DownloadVideoJob($url));
Memory Management: Stream large files directly to disk instead of loading into memory:
$options->addOption('--no-playlist') // Avoid playlist processing
->addOption('--get-url'); // Get URL without downloading
How can I help you explore Laravel packages today?