diff options
-rw-r--r-- | lib/private/Preview/Movie.php | 31 | ||||
-rw-r--r-- | lib/private/Preview/ProviderV2.php | 7 |
2 files changed, 29 insertions, 9 deletions
diff --git a/lib/private/Preview/Movie.php b/lib/private/Preview/Movie.php index e7fc7745996..b139758596c 100644 --- a/lib/private/Preview/Movie.php +++ b/lib/private/Preview/Movie.php @@ -50,17 +50,34 @@ class Movie extends ProviderV2 { public function getThumbnail(File $file, int $maxX, int $maxY): ?IImage { // TODO: use proc_open() and stream the source file ? - $absPath = $this->getLocalFile($file, 5242880); // only use the first 5MB + $result = null; + if ($this->useTempFile($file)) { + // try downloading 5 MB first as it's likely that the first frames are present there + // in some cases this doesn't work for example when the moov atom is at the + // end of the file, so if it fails we fall back to getting the full file + $sizeAttempts = [5242880, null]; + } else { + // size is irrelevant, only attempt once + $sizeAttempts = [null]; + } - $result = $this->generateThumbNail($maxX, $maxY, $absPath, 5); - if ($result === null) { - $result = $this->generateThumbNail($maxX, $maxY, $absPath, 1); + foreach ($sizeAttempts as $size) { + $absPath = $this->getLocalFile($file, $size); + + $result = $this->generateThumbNail($maxX, $maxY, $absPath, 5); if ($result === null) { - $result = $this->generateThumbNail($maxX, $maxY, $absPath, 0); + $result = $this->generateThumbNail($maxX, $maxY, $absPath, 1); + if ($result === null) { + $result = $this->generateThumbNail($maxX, $maxY, $absPath, 0); + } } - } - $this->cleanTmpFiles(); + $this->cleanTmpFiles(); + + if ($result !== null) { + break; + } + } return $result; } diff --git a/lib/private/Preview/ProviderV2.php b/lib/private/Preview/ProviderV2.php index e7cabd10337..1b5bee0e5cc 100644 --- a/lib/private/Preview/ProviderV2.php +++ b/lib/private/Preview/ProviderV2.php @@ -70,6 +70,10 @@ abstract class ProviderV2 implements IProviderV2 { */ abstract public function getThumbnail(File $file, int $maxX, int $maxY): ?IImage; + protected function useTempFile(File $file) { + return $file->isEncrypted() || !$file->getStorage()->isLocal(); + } + /** * Get a path to either the local file or temporary file * @@ -78,8 +82,7 @@ abstract class ProviderV2 implements IProviderV2 { * @return string */ protected function getLocalFile(File $file, int $maxSize = null): string { - $useTempFile = $file->isEncrypted() || !$file->getStorage()->isLocal(); - if ($useTempFile) { + if ($this->useTempFile($file)) { $absPath = \OC::$server->getTempManager()->getTemporaryFile(); $content = $file->fopen('r'); |