diff options
author | Vincent Petry <vincent@nextcloud.com> | 2021-09-18 10:46:48 +0200 |
---|---|---|
committer | Vincent Petry <vincent@nextcloud.com> | 2021-09-18 10:53:00 +0200 |
commit | 24e02553789ab16a731c752aa2990d01bd04e787 (patch) | |
tree | cf96bb734d403e60ac10ba9bbf0a7de81a42c00b /lib | |
parent | a46de28089df64047ec9ec1dd37b79a156d320b3 (diff) | |
download | nextcloud-server-24e02553789ab16a731c752aa2990d01bd04e787.tar.gz nextcloud-server-24e02553789ab16a731c752aa2990d01bd04e787.zip |
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 <vincent@nextcloud.com>
Diffstat (limited to 'lib')
-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'); |