From 7aaf41d0f63e104c9d8d4d9a643538aab64250d0 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Sat, 18 Sep 2021 10:46:48 +0200 Subject: [PATCH] Fall back to full file for video previews If the first 5 MB are not enough to grab a useful frame for the thumbnail preview, fall back to reading the full file. Signed-off-by: Vincent Petry --- lib/private/Preview/Movie.php | 31 +++++++++++++++++++++++------- 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 a8d013452e264..963b2cb746ee2 100644 --- a/lib/private/Preview/Movie.php +++ b/lib/private/Preview/Movie.php @@ -51,17 +51,34 @@ public function getMimeType(): string { 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 5a369639892b4..ae2c678d66db6 100644 --- a/lib/private/Preview/ProviderV2.php +++ b/lib/private/Preview/ProviderV2.php @@ -71,6 +71,10 @@ public function isAvailable(FileInfo $file): bool { */ 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 * @@ -79,8 +83,7 @@ abstract public function getThumbnail(File $file, int $maxX, int $maxY): ?IImage * @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');