From 936166939cb83acc940de9e1bef495013c2dc162 Mon Sep 17 00:00:00 2001 From: provokateurin Date: Thu, 27 Mar 2025 08:33:13 +0100 Subject: [PATCH] feat(files_versions): Implement preview mime icon fallback Signed-off-by: provokateurin --- .../lib/Controller/PreviewController.php | 17 +++++++++++++- apps/files_versions/openapi.json | 23 +++++++++++++++++++ openapi.json | 23 +++++++++++++++++++ 3 files changed, 62 insertions(+), 1 deletion(-) diff --git a/apps/files_versions/lib/Controller/PreviewController.php b/apps/files_versions/lib/Controller/PreviewController.php index 909aac6ba71..be62c5eb957 100644 --- a/apps/files_versions/lib/Controller/PreviewController.php +++ b/apps/files_versions/lib/Controller/PreviewController.php @@ -13,11 +13,13 @@ use OCP\AppFramework\Http\Attribute\NoCSRFRequired; use OCP\AppFramework\Http\Attribute\OpenAPI; use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\Http\FileDisplayResponse; +use OCP\AppFramework\Http\RedirectResponse; use OCP\Files\IRootFolder; use OCP\Files\NotFoundException; use OCP\IPreview; use OCP\IRequest; use OCP\IUserSession; +use OCP\Preview\IMimeIconProvider; #[OpenAPI(scope: OpenAPI::SCOPE_DEFAULT)] class PreviewController extends Controller { @@ -29,6 +31,7 @@ class PreviewController extends Controller { private IUserSession $userSession, private IVersionManager $versionManager, private IPreview $previewManager, + private IMimeIconProvider $mimeIconProvider, ) { parent::__construct($appName, $request); } @@ -40,9 +43,11 @@ class PreviewController extends Controller { * @param int $x Width of the preview * @param int $y Height of the preview * @param string $version Version of the file to get the preview for - * @return FileDisplayResponse|DataResponse, array{}> + * @param bool $mimeFallback Whether to fallback to the mime icon if no preview is available + * @return FileDisplayResponse|DataResponse, array{}>|RedirectResponse * * 200: Preview returned + * 303: Redirect to the mime icon url if mimeFallback is true * 400: Getting preview is not possible * 404: Preview not found */ @@ -53,11 +58,13 @@ class PreviewController extends Controller { int $x = 44, int $y = 44, string $version = '', + bool $mimeFallback = false, ) { if ($file === '' || $version === '' || $x === 0 || $y === 0) { return new DataResponse([], Http::STATUS_BAD_REQUEST); } + $versionFile = null; try { $user = $this->userSession->getUser(); $userFolder = $this->rootFolder->getUserFolder($user->getUID()); @@ -68,6 +75,14 @@ class PreviewController extends Controller { $response->cacheFor(3600 * 24, false, true); return $response; } catch (NotFoundException $e) { + // If we have no preview enabled, we can redirect to the mime icon if any + if ($mimeFallback && $versionFile !== null) { + $url = $this->mimeIconProvider->getMimeIconUrl($versionFile->getMimeType()); + if ($url !== null) { + return new RedirectResponse($url); + } + } + return new DataResponse([], Http::STATUS_NOT_FOUND); } catch (\InvalidArgumentException $e) { return new DataResponse([], Http::STATUS_BAD_REQUEST); diff --git a/apps/files_versions/openapi.json b/apps/files_versions/openapi.json index 9c6a7e5f473..aea18edf3ec 100644 --- a/apps/files_versions/openapi.json +++ b/apps/files_versions/openapi.json @@ -103,6 +103,19 @@ "type": "string", "default": "" } + }, + { + "name": "mimeFallback", + "in": "query", + "description": "Whether to fallback to the mime icon if no preview is available", + "schema": { + "type": "integer", + "default": 0, + "enum": [ + 0, + 1 + ] + } } ], "responses": { @@ -132,6 +145,16 @@ "schema": {} } } + }, + "303": { + "description": "Redirect to the mime icon url if mimeFallback is true", + "headers": { + "Location": { + "schema": { + "type": "string" + } + } + } } } } diff --git a/openapi.json b/openapi.json index ff87fc71c7a..fffdec3ad35 100644 --- a/openapi.json +++ b/openapi.json @@ -22048,6 +22048,19 @@ "type": "string", "default": "" } + }, + { + "name": "mimeFallback", + "in": "query", + "description": "Whether to fallback to the mime icon if no preview is available", + "schema": { + "type": "integer", + "default": 0, + "enum": [ + 0, + 1 + ] + } } ], "responses": { @@ -22077,6 +22090,16 @@ "schema": [] } } + }, + "303": { + "description": "Redirect to the mime icon url if mimeFallback is true", + "headers": { + "Location": { + "schema": { + "type": "string" + } + } + } } } }