我在我的CentOS 6 / Plesk 10 Dedicated服务器上安装了youtube-dl,通过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"
这很奇怪,考虑到a)昨天我得到了一个空的url [],那个b)即使现在我得到的看起来像一个普通的youtube-dl返回,它只包含3个第一行,而我在指定的路径中看不到任何视频文件...有什么想法吗?
答案 0 :(得分:7)
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