Что я хочу сделать, это выполнить youtube-dl -x --audio-format mp3 "token"
используя php и получите json следующих аргументов:
[avconv] Destination: Jennifer Lopez - Booty ft. Iggy Azalea-nxtIRArhVD4.mp3
)Вот код PHP, который я написал.
<?php
if ($_GET["token"]) {
$url = $_GET["token"];
$template = '/home/website/public_html/%(id)s.%(ext)s';
$string = ('youtube-dl -x --audio-format mp3 ' . escapeshellarg($url) . ' ' . 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));
}
?>
В основном это выполняется
youtube-dl -x --audio-format mp3 "token"
Когда я выполняю ту же команду в консоли (через SSH), я получаю такой результат
[youtube] Setting language
[youtube] Confirming age
[youtube] nxtIRArhVD4: Downloading webpage
[youtube] nxtIRArhVD4: Downloading video info webpage
[youtube] nxtIRArhVD4: Extracting video information
[youtube] nxtIRArhVD4: Encrypted signatures detected.
[youtube] nxtIRArhVD4: Downloading js player vflE7vgXe
[download] Destination: Jennifer Lopez - Booty ft. Iggy Azalea-nxtIRArhVD4.m4a
[download] 100% of 3.93MiB in 00:00
[avconv] Destination: Jennifer Lopez - Booty ft. Iggy Azalea-nxtIRArhVD4.mp3
Deleting original file Jennifer Lopez - Booty ft. Iggy Azalea-nxtIRArhVD4.m4a (pass -k to keep)
Когда я выполняю ту же команду в среде php, получаю следующий результат json
{
"status":1,
"errors":"WARNING: The url doesn't specify the protocol, trying with http\nWARNING: Could not send HEAD request to http:\/\/\/home\/website\/public_html\/%(id)s.%(ext)s: \nWARNING: Falling back on generic information extractor.\nERROR: Unable to download webpage: \n",
"url_orginal":"nxtIRArhVD4",
"output":"[youtube] Setting language\n[youtube] Confirming age\n[youtube] nxtIRArhVD4: Downloading webpage\n[youtube] nxtIRArhVD4: Downloading video info webpage\n[youtube] nxtIRArhVD4: Extracting video information\n[youtube] nxtIRArhVD4: Encrypted signatures detected.\n[youtube] nxtIRArhVD4: Downloading js player vflE7vgXe\n[download] Destination: Jennifer Lopez - Booty ft. Iggy Azalea-nxtIRArhVD4.m4a\n\r[download] 0.0% of 3.93MiB at 729.44KiB\/s ETA 00:05\r[download] 0.1% of 3.93MiB at 1.86MiB\/s ETA 00:02\r[download] 0.2% of 3.93MiB at 3.86MiB\/s ETA 00:01\r[download] 0.4% of 3.93MiB at 7.69MiB\/s ETA 00:00\r[download] 0.8% of 3.93MiB at 13.79MiB\/s ETA 00:00\r[download] 1.6% of 3.93MiB at 17.80MiB\/s ETA 00:00\r[download] 3.2% of 3.93MiB at 17.64MiB\/s ETA 00:00\r[download] 6.3% of 3.93MiB at 17.79MiB\/s ETA 00:00\r[download] 12.7% of 3.93MiB at 20.88MiB\/s ETA 00:00\r[download] 25.4% of 3.93MiB at 25.21MiB\/s ETA 00:00\r[download] 50.8% of 3.93MiB at 28.47MiB\/s ETA 00:00\r[download] 100.0% of 3.93MiB at 41.23MiB\/s ETA 00:00\r[download] 100% of 3.93MiB in 00:00\n[avconv] Destination: Jennifer Lopez - Booty ft. Iggy Azalea-nxtIRArhVD4.mp3\nDeleting original file Jennifer Lopez - Booty ft. Iggy Azalea-nxtIRArhVD4.m4a (pass -k to keep)\n[generic] %(id)s: Requesting header\n[generic] %(id)s: Downloading webpage\n",
"command":"youtube-dl --extract-audio --audio-format mp3 'nxtIRArhVD4' '\/home\/website\/public_html\/%(id)s.%(ext)s'"}
На самом деле php выполняет работу и сохраняет файл, но выходные данные не совпадают, и я не могу получить URL файла назначения.
Что я делаю неправильно? Какие-либо предложения?
Похоже, ваша команда $string
не генерируется должным образом. Ваш $url
Параметр может быть пустым.
Если вы посмотрите на ошибку, она пытается загрузить веб-страницу http:///home/website/public_html/%(id)s.%(ext)s
Я догадываюсь $url
должен быть пустым, что приводит к тому, что 4-й аргумент (ваш выходной файл) становится 3-м аргументом (URL-адресом видео), поэтому он пытается загрузить его как URL-адрес, что приводит к ошибке.
Попробуйте посмотреть на содержимое $url
после того, как вы его инициируете, посмотрите, что это за значение, убедитесь, что это действительно URL. Если это правильно, то проверьте содержимое $string
убедитесь, что команда на самом деле завершена, и даже попробуйте запустить эту команду вручную и посмотреть, что произойдет, escapeshellarg()
может вызывать больше проблем, чем предполагалось решить; Я бы порекомендовал вам сделать разные проверки на входе, например preg_match()
для URL YouTube.
Других решений пока нет …