Blame view

sources/lib/private/preview/movies.php 2.44 KB
31b7f2792   Kload   Upgrade to ownclo...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  <?php
  /**
   * Copyright (c) 2013 Frank Karlitschek frank@owncloud.org
   * Copyright (c) 2013 Georg Ehrke georg@ownCloud.com
   * This file is licensed under the Affero General Public License version 3 or
   * later.
   * See the COPYING-README file.
   */
  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()) {
a293d369c   Kload   Update sources to...
21
  	$isExecEnabled = \OC_Helper::is_function_enabled('exec');
31b7f2792   Kload   Upgrade to ownclo...
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
  	$ffmpegBinary = null;
  	$avconvBinary = null;
  
  	if ($isExecEnabled) {
  		$avconvBinary = findBinaryPath('avconv');
  		if (!$avconvBinary) {
  			$ffmpegBinary = findBinaryPath('ffmpeg');
  		}
  	}
  
  	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();
  
  				$handle = $fileview->fopen($path, 'rb');
  
  				// we better use 5MB (1024 * 1024 * 5 = 5242880) instead of 1MB.
  				// in some cases 1MB was no enough to generate thumbnail
  				$firstmb = stream_get_contents($handle, 5242880);
  				file_put_contents($absPath, $firstmb);
  
  				if (self::$avconvBinary) {
  					$cmd = self::$avconvBinary . ' -an -y -ss 5'.
  						' -i ' . escapeshellarg($absPath) .
  						' -f mjpeg -vframes 1 -vsync 1 ' . escapeshellarg($tmpPath) .
  						' > /dev/null 2>&1';
  				}
  				else {
  					$cmd = self::$ffmpegBinary . ' -y -ss 5' .
  						' -i ' . escapeshellarg($absPath) .
  						' -f mjpeg -vframes 1' .
  						' -s ' . escapeshellarg($maxX) . 'x' . escapeshellarg($maxY) .
  						' ' . escapeshellarg($tmpPath) .
  						' > /dev/null 2>&1';
  				}
  
  				exec($cmd, $output, $returnCode);
  
  				unlink($absPath);
  
  				if ($returnCode === 0) {
  					$image = new \OC_Image();
  					$image->loadFromFile($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');
  	}
  }