Skip to content

Commit 73743d6

Browse files
committed
use Photos metadata for pre-sized, blurhashed image placeholders
Signed-off-by: Andrew Backhouse <andrew.backhouse@nextcloud.com>
1 parent 7e23376 commit 73743d6

5 files changed

Lines changed: 221 additions & 898 deletions

File tree

lib/Controller/AttachmentController.php

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -216,13 +216,18 @@ public function getImageFile(string $imageFileName, string $shareToken = '',
216216
$userId = $this->getUserId();
217217
$imageFile = $this->attachmentService->getImageFile($documentId, $imageFileName, $userId, $preferRawImage === 1);
218218
}
219-
return $imageFile !== null
220-
? new DataDownloadResponse(
219+
220+
if ($imageFile !== null) {
221+
$response = new DataDownloadResponse(
221222
$imageFile->getContent(),
222223
$imageFile->getName(),
223224
$this->getSecureMimeType($imageFile->getMimeType())
224-
)
225-
: new DataResponse('', Http::STATUS_NOT_FOUND);
225+
);
226+
$response->cacheFor(3600 * 24, false, true);
227+
return $response;
228+
}
229+
230+
return new DataResponse('', Http::STATUS_NOT_FOUND);
226231
} catch (Exception $e) {
227232
$this->logger->error('getImageFile error', ['exception' => $e]);
228233
return new DataResponse('', Http::STATUS_NOT_FOUND);

lib/Service/AttachmentService.php

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
use OCP\Files\NotFoundException;
2424
use OCP\Files\NotPermittedException;
2525
use OCP\Files\SimpleFS\ISimpleFile;
26+
use OCP\FilesMetadata\IFilesMetadataManager;
2627
use OCP\IPreview;
2728
use OCP\IURLGenerator;
2829
use OCP\Lock\LockedException;
@@ -39,6 +40,7 @@ public function __construct(
3940
private IMimeTypeDetector $mimeTypeDetector,
4041
private IURLGenerator $urlGenerator,
4142
private IFilenameValidator $filenameValidator,
43+
private IFilesMetadataManager $filesMetadataManager,
4244
) {
4345
}
4446

@@ -219,21 +221,34 @@ public function getAttachmentList(int $documentId, ?string $userId = null, ?Sess
219221

220222
$attachments = [];
221223
$userFolder = $userId !== null ? $this->rootFolder->getUserFolder($userId) : null;
224+
225+
$fileNodes = [];
226+
$fileIds = [];
222227
foreach ($attachmentDir->getDirectoryListing() as $node) {
223-
if (!($node instanceof File)) {
224-
// Ignore anything but files
225-
continue;
228+
if ($node instanceof File) {
229+
// we only want Files
230+
$fileNodes[] = $node;
231+
$fileIds[] = $node->getId();
226232
}
233+
}
234+
235+
// this is done outside the loop for efficiency
236+
$metadataMap = $this->filesMetadataManager->getMetadataForFiles($fileIds);
237+
238+
foreach ($fileNodes as $node) {
227239
$isImage = in_array($node->getMimetype(), AttachmentController::IMAGE_MIME_TYPES, true);
228240
$name = $node->getName();
241+
$fileId = $node->getId();
242+
$metadata = $metadataMap[$fileId] ?? null;
229243
$attachments[] = [
230-
'fileId' => $node->getId(),
244+
'fileId' => $fileId,
231245
'name' => $name,
232246
'size' => Util::humanFileSize($node->getSize()),
233247
'mimetype' => $node->getMimeType(),
234248
'mtime' => $node->getMTime(),
235249
'isImage' => $isImage,
236250
'davPath' => $userFolder?->getRelativePath($node->getPath()),
251+
'metadata' => $metadata,
237252
'fullUrl' => $isImage
238253
? $this->urlGenerator->linkToRouteAbsolute('text.Attachment.getImageFile') . $urlParamsBase . '&imageFileName=' . rawurlencode($name) . '&preferRawImage=1'
239254
: $this->urlGenerator->linkToRouteAbsolute('text.Attachment.getMediaFile') . $urlParamsBase . '&mediaFileName=' . rawurlencode($name),

0 commit comments

Comments
 (0)