Я установил youtube-dl на моем CentOS 6 / Plesk 10 Dedicated server, и через SSH все работает как шарм!
Дело в том, что я пытаюсь написать php-скрипт, который принимает параметр POST, содержащий URL-адрес видео, которое я хочу скопировать на сервер, скопируйте его и обработайте с помощью ffmpeg.
Я думал, что буду использовать функцию exec ().
Я могу получить вывод, если я повторю результаты youtube-dl --help
, но каждый раз, когда я прошу php выполнить команду, которая на самом деле что-то делает с видео, он возвращает статус «1» и ничего не выводит.
Любые идеи о том, что я делаю неправильно?
Вот мой php-код:
<?php $result = array(); $status; $url = $_POST['src']; $string = 'youtube-dl "'.$url.'" -f 18 -o "/var/www/vhosts/my.virtual.host.net/httpdocs/downloader/downloads/%(id)s.%(ext)s"'; $string2 = 'youtube-dl --help'; exec($string, $result, $status); echo json_encode(array('status' => $status, 'url_orginal'=>$url, 'url' => $result)); ?>
Когда я выполняю $ string2, я получаю статус: «0» и «url»: [youtube-dl help text lines]
Но когда я выполняю $ string, ничего не происходит, я получаю «статус»: «1» и ничего больше, видео не загружается. Я попробовал также симуляцию с параметром «-g» и вариантами, но как только youtube-dl должен получить видео, он ломается.
Заранее спасибо !
РЕДАКТИРОВАТЬ
Я отредактировал мой код, чтобы он выглядел так:
<?php $result = array(); $status; $url = $_POST['src']; $string = 'youtube-dl "'.$url.'" -f 18 -o "/var/www/vhosts/my.virtual.host.net/httpdocs/downloader/downloads/%(id)s.%(ext)s"'; $string2 = 'youtube-dl --help'; exec($string, $result, $status); echo json_encode(array('status' => $status, 'url_orginal'=>$url, 'url' => $result, 'command' => $string)); ?>
и результат, который я вчера не получил, это:
command: "youtube-dl "http://www.youtube.com/watch?v=coq9klG41R8" -f 18 -o "/var/www/vhosts/my.virtual.host.net/httpdocs/downloader/downloads/%(id)s.%(ext)s"" status: 1 url: 0: "[youtube] Setting language" 1: "[youtube] coq9klG41R8: Downloading video info webpage" 2: "[youtube] coq9klG41R8: Extracting video information" url_orginal: "http://www.youtube.com/watch?v=coq9klG41R8"
Что странно, учитывая, а) что вчера я получил пустой url [], и что b), даже если теперь я получаю то, что, по-видимому, выглядит как обычный возврат youtube-dl, он содержит только три первые строки, и я не вижу никаких видеофайл по указанному пути … Любые идеи?
exec
читает только stdout, поэтому вам не хватает сообщения об ошибке на stderr, что бы это ни было.
Для получения stderr используйте следующий код:
$url = 'http://www.youtube.com/watch?v=coq9klG41R8'; $template = '/var/www/vhosts/my.virtual.host.net/httpdocs/downloader/' . 'downloads/%(id)s.%(ext)s'; $string = ('youtube-dl ' . escapeshellarg($url) . ' -f 18 -o ' . escapeshellarg($template)); $descriptorspec = array( 0 => array("pipe", "r"), // stdin 1 => array("pipe", "w"), // stdout 2 => array("pipe", "w"), // stderr ); $process = proc_open($string, $descriptorspec, $pipes); $stdout = stream_get_contents($pipes[1]); fclose($pipes[1]); $stderr = stream_get_contents($pipes[2]); fclose($pipes[2]); $ret = proc_close($process); echo json_encode(array('status' => $ret, 'errors' => $stderr, 'url_orginal'=>$url, 'output' => $stdout, 'command' => $string));
Скорее всего, у вас нет разрешения на запись в этот каталог. Чтобы проверить эту теорию, проверьте,
touch /var/www/vhosts/my.virtual.host.net/httpdocs/downloader/downloads/test
работает. Вы можете использовать chmod
и chown
для изменения прав доступа.