diff options
author | Vincent Petry <pvince81@owncloud.com> | 2013-11-08 15:09:58 +0400 |
---|---|---|
committer | Vincent Petry <pvince81@owncloud.com> | 2013-11-08 15:19:32 +0400 |
commit | 0c6af5511225aabadf626b279200671aa3e1a4ca (patch) | |
tree | 8641bdf17dff8d197099929161c0695016a852d7 /lib/private/preview | |
parent | 013444813e106dcc5ed45cb709696d5d6e24e89a (diff) |
Added ffmpeg fallback when avconv is not available
On some distros, avconv isn't available yet.
This fix adds a fallback to ffmpeg.
When none is found, no error message is displayed in the console any
more.
Fixes #5745
Also, this now uses exec() instead of shell_exec() to be able to get the
return code.
The binary path found with "which" is now used to prevent further FS
binary lookup when running the commands.
Moved the "-ss" parameter before "-i" for ffmpeg.
Diffstat (limited to 'lib/private/preview')
-rw-r--r-- | lib/private/preview/movies.php | 56 |
1 files changed, 45 insertions, 11 deletions
diff --git a/lib/private/preview/movies.php b/lib/private/preview/movies.php index 4d85e23c63c..5c6a156d351 100644 --- a/lib/private/preview/movies.php +++ b/lib/private/preview/movies.php @@ -8,21 +8,37 @@ */ namespace OC\Preview; +function findBinaryPath($program) { + exec('which ' . escapeshellarg($program) . ' 2> /dev/null', $output, $returnCode); + if ($returnCode === 0 && count($output) > 0) { + return escapeshellcmd($output[0]); + } + return null; +} + // movie preview is currently not supported on Windows if (!\OC_Util::runningOnWindows()) { - $isShellExecEnabled = !in_array('shell_exec', explode(', ', ini_get('disable_functions'))); - $whichAVCONV = ($isShellExecEnabled ? shell_exec('which avconv') : ''); - $isAVCONVAvailable = !empty($whichAVCONV); + $isExecEnabled = !in_array('exec', explode(', ', ini_get('disable_functions'))); + + if ($isExecEnabled) { + $avconvBinary = findBinaryPath('avconv'); + if (!$avconvBinary) { + $ffmpegBinary = findBinaryPath('ffmpeg'); + } + } - if($isShellExecEnabled && $isAVCONVAvailable) { + if($isExecEnabled && ( $avconvBinary || $ffmpegBinary )) { class Movie extends Provider { + public static $avconvBinary; + public static $ffmpegBinary; public function getMimeType() { return '/video\/.*/'; } public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview) { + // TODO: use proc_open() and stream the source file ? $absPath = \OC_Helper::tmpFile(); $tmpPath = \OC_Helper::tmpFile(); @@ -31,20 +47,38 @@ if (!\OC_Util::runningOnWindows()) { $firstmb = stream_get_contents($handle, 1048576); //1024 * 1024 = 1048576 file_put_contents($absPath, $firstmb); - //$cmd = 'ffmpeg -y -i ' . escapeshellarg($absPath) . ' -f mjpeg -vframes 1 -ss 1 -s ' . escapeshellarg($maxX) . 'x' . escapeshellarg($maxY) . ' ' . $tmpPath; - $cmd = 'avconv -an -y -ss 1 -i ' . escapeshellarg($absPath) . ' -f mjpeg -vframes 1 ' . escapeshellarg($tmpPath); + if (self::$avconvBinary) { + $cmd = self::$avconvBinary . ' -an -y -ss 1'. + ' -i ' . escapeshellarg($absPath) . + ' -f mjpeg -vframes 1 ' . escapeshellarg($tmpPath) . + ' > /dev/null 2>&1'; + } + else { + $cmd = self::$ffmpegBinary . ' -y -ss 1' . + ' -i ' . escapeshellarg($absPath) . + ' -f mjpeg -vframes 1' . + ' -s ' . escapeshellarg($maxX) . 'x' . escapeshellarg($maxY) . + ' ' . $tmpPath . + ' > /dev/null 2>&1'; + } - shell_exec($cmd); - - $image = new \OC_Image($tmpPath); + exec($cmd, $output, $returnCode); unlink($absPath); - unlink($tmpPath); - return $image->valid() ? $image : false; + if ($returnCode === 0) { + $image = new \OC_Image($tmpPath); + unlink($tmpPath); + return $image->valid() ? $image : false; + } + return false; } } + // a bit hacky but didn't want to use subclasses + Movie::$avconvBinary = $avconvBinary; + Movie::$ffmpegBinary = $ffmpegBinary; + \OC\Preview::registerProvider('OC\Preview\Movie'); } } |