Blame view

sources/lib/private/preview/movies.php 3.31 KB
31b7f2792   Kload   Upgrade to ownclo...
1
2
3
4
5
6
7
8
9
10
11
  <?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) {
6d9380f96   Cédric Dupont   Update sources OC...
12
  	exec('command -v ' . escapeshellarg($program) . ' 2> /dev/null', $output, $returnCode);
31b7f2792   Kload   Upgrade to ownclo...
13
14
15
16
17
18
19
20
  	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
  	$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 ?
31b7f2792   Kload   Upgrade to ownclo...
44

6d9380f96   Cédric Dupont   Update sources OC...
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
  				$fileInfo = $fileview->getFileInfo($path);
  				$useFileDirectly = (!$fileInfo->isEncrypted() && !$fileInfo->isMounted());
  
  				if ($useFileDirectly) {
  					$absPath = $fileview->getLocalFile($path);
  				} else {
  					$absPath = \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);
  				}
  
  				$result = $this->generateThumbNail($maxX, $maxY, $absPath, 5);
  				if ($result === false) {
  					$result = $this->generateThumbNail($maxX, $maxY, $absPath, 1);
  					if ($result === false) {
  						$result = $this->generateThumbNail($maxX, $maxY, $absPath, 0);
  					}
  				}
  
  				if (!$useFileDirectly) {
  					unlink($absPath);
  				}
31b7f2792   Kload   Upgrade to ownclo...
72

6d9380f96   Cédric Dupont   Update sources OC...
73
74
75
76
77
78
79
80
81
82
83
84
85
86
  				return $result;
  			}
  
  			/**
  			 * @param int $maxX
  			 * @param int $maxY
  			 * @param string $absPath
  			 * @param string $tmpPath
  			 * @param int $second
  			 * @return bool|\OC_Image
  			 */
  			private function generateThumbNail($maxX, $maxY, $absPath, $second)
  			{
  				$tmpPath = \OC_Helper::tmpFile();
31b7f2792   Kload   Upgrade to ownclo...
87
88
  
  				if (self::$avconvBinary) {
6d9380f96   Cédric Dupont   Update sources OC...
89
  					$cmd = self::$avconvBinary . ' -an -y -ss ' . escapeshellarg($second) .
31b7f2792   Kload   Upgrade to ownclo...
90
91
92
  						' -i ' . escapeshellarg($absPath) .
  						' -f mjpeg -vframes 1 -vsync 1 ' . escapeshellarg($tmpPath) .
  						' > /dev/null 2>&1';
6d9380f96   Cédric Dupont   Update sources OC...
93
94
  				} else {
  					$cmd = self::$ffmpegBinary . ' -y -ss ' . escapeshellarg($second) .
31b7f2792   Kload   Upgrade to ownclo...
95
96
97
98
99
100
101
102
  						' -i ' . escapeshellarg($absPath) .
  						' -f mjpeg -vframes 1' .
  						' -s ' . escapeshellarg($maxX) . 'x' . escapeshellarg($maxY) .
  						' ' . escapeshellarg($tmpPath) .
  						' > /dev/null 2>&1';
  				}
  
  				exec($cmd, $output, $returnCode);
31b7f2792   Kload   Upgrade to ownclo...
103
104
105
106
107
108
  				if ($returnCode === 0) {
  					$image = new \OC_Image();
  					$image->loadFromFile($tmpPath);
  					unlink($tmpPath);
  					return $image->valid() ? $image : false;
  				}
6d9380f96   Cédric Dupont   Update sources OC...
109
  				unlink($tmpPath);
31b7f2792   Kload   Upgrade to ownclo...
110
111
112
113
114
115
116
117
118
119
120
  				return false;
  			}
  		}
  
  		// a bit hacky but didn't want to use subclasses
  		Movie::$avconvBinary = $avconvBinary;
  		Movie::$ffmpegBinary = $ffmpegBinary;
  
  		\OC\Preview::registerProvider('OC\Preview\Movie');
  	}
  }