2014-09-21 1 views
-1

Что я хочу сделать, это выполнить youtube-dl -x --audio-format mp3 "token" с помощью PHP и получить JSON из следующих аргументов:Выполнение скрипта внутри PHP кода

  • состояния (ошибка = 0/= успеха 1)
  • сохраненного URL файла (Вы увидите это в примере с консольными результатами: [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-адрес целевого файла.

Что я делаю неправильно? Какие-либо предложения?

ответ

0

Похоже, что ваша команда $string не сгенерирована должным образом. Ваш параметр $url может быть пустым.

Если посмотреть на ошибки он пытается загрузить веб-страницу http:///home/website/public_html/%(id)s.%(ext)s

Im Гадать $url должен быть пустым, который вызывает 4-ый аргумент (ваш выходной файл) стать третьим аргументом (видео URL), так потом он пытается загрузить это как URL-адрес, следовательно, ошибку.

Попробуйте посмотреть содержимое $url после того, как вы его инициируете, посмотрите, что это за значение, убедитесь, что оно на самом деле является URL-адресом. Если это правильно, проверьте содержимое $string, убедитесь, что команда на самом деле завершена, и даже попробуйте запустить эту команду вручную и посмотреть, что произойдет, escapeshellarg() может вызвать больше проблем, чем это необходимо для решения; Я бы порекомендовал вам выполнить некоторую другую проверку на входе, например preg_match() для URL-адреса YouTube.