|
|
|
|
@ -1,4 +1,5 @@
|
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
|
|
|
|
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
|
@ -20,34 +21,20 @@ use OCP\IStreamImage;
|
|
|
|
|
use OCP\Preview\BeforePreviewFetchedEvent;
|
|
|
|
|
use OCP\Preview\IProviderV2;
|
|
|
|
|
use OCP\Preview\IVersionedPreviewFile;
|
|
|
|
|
use Psr\Log\LoggerInterface;
|
|
|
|
|
|
|
|
|
|
class Generator {
|
|
|
|
|
public const SEMAPHORE_ID_ALL = 0x0a11;
|
|
|
|
|
public const SEMAPHORE_ID_NEW = 0x07ea;
|
|
|
|
|
|
|
|
|
|
/** @var IPreview */
|
|
|
|
|
private $previewManager;
|
|
|
|
|
/** @var IConfig */
|
|
|
|
|
private $config;
|
|
|
|
|
/** @var IAppData */
|
|
|
|
|
private $appData;
|
|
|
|
|
/** @var GeneratorHelper */
|
|
|
|
|
private $helper;
|
|
|
|
|
/** @var IEventDispatcher */
|
|
|
|
|
private $eventDispatcher;
|
|
|
|
|
|
|
|
|
|
public function __construct(
|
|
|
|
|
IConfig $config,
|
|
|
|
|
IPreview $previewManager,
|
|
|
|
|
IAppData $appData,
|
|
|
|
|
GeneratorHelper $helper,
|
|
|
|
|
IEventDispatcher $eventDispatcher,
|
|
|
|
|
private IConfig $config,
|
|
|
|
|
private IPreview $previewManager,
|
|
|
|
|
private IAppData $appData,
|
|
|
|
|
private GeneratorHelper $helper,
|
|
|
|
|
private IEventDispatcher $eventDispatcher,
|
|
|
|
|
private LoggerInterface $logger,
|
|
|
|
|
) {
|
|
|
|
|
$this->config = $config;
|
|
|
|
|
$this->previewManager = $previewManager;
|
|
|
|
|
$this->appData = $appData;
|
|
|
|
|
$this->helper = $helper;
|
|
|
|
|
$this->eventDispatcher = $eventDispatcher;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -83,6 +70,16 @@ class Generator {
|
|
|
|
|
$mimeType,
|
|
|
|
|
));
|
|
|
|
|
|
|
|
|
|
$this->logger->debug('Requesting preview for {path} with width={width}, height={height}, crop={crop}, mode={mode}, mimeType={mimeType}', [
|
|
|
|
|
'path' => $file->getPath(),
|
|
|
|
|
'width' => $width,
|
|
|
|
|
'height' => $height,
|
|
|
|
|
'crop' => $crop,
|
|
|
|
|
'mode' => $mode,
|
|
|
|
|
'mimeType' => $mimeType,
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// since we only ask for one preview, and the generate method return the last one it created, it returns the one we want
|
|
|
|
|
return $this->generatePreviews($file, [$specification], $mimeType);
|
|
|
|
|
}
|
|
|
|
|
@ -100,6 +97,7 @@ class Generator {
|
|
|
|
|
public function generatePreviews(File $file, array $specifications, $mimeType = null) {
|
|
|
|
|
//Make sure that we can read the file
|
|
|
|
|
if (!$file->isReadable()) {
|
|
|
|
|
$this->logger->warning('Cannot read file: {path}, skipping preview generation.', ['path' => $file->getPath()]);
|
|
|
|
|
throw new NotFoundException('Cannot read file');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -121,6 +119,7 @@ class Generator {
|
|
|
|
|
$maxPreviewImage = null; // only load the image when we need it
|
|
|
|
|
if ($maxPreview->getSize() === 0) {
|
|
|
|
|
$maxPreview->delete();
|
|
|
|
|
$this->logger->error("Max preview generated for file {$file->getPath()} has size 0, deleting and throwing exception.");
|
|
|
|
|
throw new NotFoundException('Max preview size 0, invalid!');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -167,6 +166,7 @@ class Generator {
|
|
|
|
|
$maxPreviewImage = $this->helper->getImage($maxPreview);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$this->logger->warning('Cached preview not found for file {path}, generating a new preview.', ['path' => $file->getPath()]);
|
|
|
|
|
$preview = $this->generatePreview($previewFolder, $maxPreviewImage, $width, $height, $crop, $maxWidth, $maxHeight, $previewVersion);
|
|
|
|
|
// New file, augment our array
|
|
|
|
|
$previewFiles[] = $preview;
|
|
|
|
|
@ -335,6 +335,11 @@ class Generator {
|
|
|
|
|
$previewConcurrency = $this->getNumConcurrentPreviews('preview_concurrency_new');
|
|
|
|
|
$sem = self::guardWithSemaphore(self::SEMAPHORE_ID_NEW, $previewConcurrency);
|
|
|
|
|
try {
|
|
|
|
|
$this->logger->debug('Calling preview provider for {mimeType} with width={width}, height={height}', [
|
|
|
|
|
'mimeType' => $mimeType,
|
|
|
|
|
'width' => $width,
|
|
|
|
|
'height' => $height,
|
|
|
|
|
]);
|
|
|
|
|
$preview = $this->helper->getThumbnail($provider, $file, $width, $height);
|
|
|
|
|
} finally {
|
|
|
|
|
self::unguardWithSemaphore($sem);
|
|
|
|
|
@ -558,6 +563,7 @@ class Generator {
|
|
|
|
|
$path = $this->generatePath($width, $height, $crop, false, $mimeType, $prefix);
|
|
|
|
|
foreach ($files as $file) {
|
|
|
|
|
if ($file->getName() === $path) {
|
|
|
|
|
$this->logger->debug('Found cached preview: {path}', ['path' => $path]);
|
|
|
|
|
return $file;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|