<?php
$youtubeUrl = "https://www.youtube.com/watch?v=Ko2JcxecV2E";
$content = json_encode ($file = shell_exec("youtube-dl.exe $youtubeUrl "));
$input_string =$content;
$regex_pattern = "/Destination:(.*.mp4)/";
$boolean = preg_match($regex_pattern, $input_string, $matches_out);
$extracted_string=$matches_out[0];
$file =explode(': ',$extracted_string,2)[1];
// Quick check to verify that the file exists
if( !file_exists($file) ) die("File not found");
// Force the download
header("Content-Disposition: attachment; filename=\"$file\"" );
header("Content-Length: " . filesize($file));
header("Content-Type: application/octet-stream;");
readfile($file);
?>
Когда я запускаю этот файл, соответствующее видео YouTube сначала загружается в папку сервера localhost, где находится этот файл PHP, используя youtube-dl.exe
и затем он выталкивается из этой папки для загрузки в браузер (принудительная загрузка).
Как напрямую начать загрузку в браузер пользователя?
Также файл работает нормально на локальном хосте, но не на удаленном сервере.
Во-первых, вам нужно использовать версию youtube-dl для платформы вашего веб-сервера. youtube-dl.exe
это сборка для Windows, в то время как большинство веб-хостингов используют Linux.
Затем используйте passthru
PHP функция для запуска youtube-dl
с -o -
параметр командной строки. Параметры делает youtube-dl
выводить загруженное видео на стандартный вывод, а passthru
передает стандартный вывод в браузер.
Вы также должны вывести заголовки до того, как passthru
, Обратите внимание, что вы не можете знать размер загрузки в этом случае.
header("Content-Disposition: attachment; filename=\"...\"" );
header("Content-Type: application/octet-stream");
passthru("youtube-dl -o - $youtubeUrl");
Если вам нужны метаданные видео (например, имя файла), вы можете запустить youtube-dl
сначала с -j
параметр командной строки, чтобы получить данные JSON без загрузки видео.
Также вам нужен 1) интерпретатор Python на веб-сервере 2) чтобы иметь возможность использовать passthru
функция 3) подключение к YouTube из скриптов PHP. Все это обычно ограничивается веб-хостингами.
Проблема, вероятно, в: shell_exec("youtube-dl.exe $youtubeUrl ")
Во-первых, некоторые хосты отключают shell_exec по соображениям безопасности.
Во-вторых, youtube-dl.exe выглядит так, как будто это сценарий Windows, где ваш удаленный сервер, вероятно, основан на Linux.