diff options
author | John Molakvoæ <skjnldsv@protonmail.com> | 2023-08-11 14:32:42 +0200 |
---|---|---|
committer | John Molakvoæ <skjnldsv@protonmail.com> | 2023-08-17 18:56:38 +0200 |
commit | 28725c46a84db6e733c42e38cbc5e1b7f0e3854b (patch) | |
tree | 6915d025434815635017439555006a3d2e5e0ee8 /lib | |
parent | 9df5212a40f5a5011755f987eaf9b63652ef6848 (diff) | |
download | nextcloud-server-28725c46a84db6e733c42e38cbc5e1b7f0e3854b.tar.gz nextcloud-server-28725c46a84db6e733c42e38cbc5e1b7f0e3854b.zip |
feat: redirect to the mime icon if no preview available
Signed-off-by: John Molakvoæ <skjnldsv@protonmail.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/composer/composer/autoload_classmap.php | 2 | ||||
-rw-r--r-- | lib/composer/composer/autoload_static.php | 2 | ||||
-rw-r--r-- | lib/private/Preview/MimeIconProvider.php | 98 | ||||
-rw-r--r-- | lib/private/Server.php | 3 | ||||
-rw-r--r-- | lib/public/Files/IMimeTypeDetector.php | 6 | ||||
-rw-r--r-- | lib/public/Preview/IMimeIconProvider.php | 37 |
6 files changed, 148 insertions, 0 deletions
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 2e5c239b6ed..4b99fc18135 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -533,6 +533,7 @@ return array( 'OCP\\OCS\\IDiscoveryService' => $baseDir . '/lib/public/OCS/IDiscoveryService.php', 'OCP\\PreConditionNotMetException' => $baseDir . '/lib/public/PreConditionNotMetException.php', 'OCP\\Preview\\BeforePreviewFetchedEvent' => $baseDir . '/lib/public/Preview/BeforePreviewFetchedEvent.php', + 'OCP\\Preview\\IMimeIconProvider' => $baseDir . '/lib/public/Preview/IMimeIconProvider.php', 'OCP\\Preview\\IProvider' => $baseDir . '/lib/public/Preview/IProvider.php', 'OCP\\Preview\\IProviderV2' => $baseDir . '/lib/public/Preview/IProviderV2.php', 'OCP\\Preview\\IVersionedPreviewFile' => $baseDir . '/lib/public/Preview/IVersionedPreviewFile.php', @@ -1479,6 +1480,7 @@ return array( 'OC\\Preview\\MSOffice2007' => $baseDir . '/lib/private/Preview/MSOffice2007.php', 'OC\\Preview\\MSOfficeDoc' => $baseDir . '/lib/private/Preview/MSOfficeDoc.php', 'OC\\Preview\\MarkDown' => $baseDir . '/lib/private/Preview/MarkDown.php', + 'OC\\Preview\\MimeIconProvider' => $baseDir . '/lib/private/Preview/MimeIconProvider.php', 'OC\\Preview\\Movie' => $baseDir . '/lib/private/Preview/Movie.php', 'OC\\Preview\\Office' => $baseDir . '/lib/private/Preview/Office.php', 'OC\\Preview\\OpenDocument' => $baseDir . '/lib/private/Preview/OpenDocument.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index 48c6701c7c6..121931b60d0 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -566,6 +566,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 'OCP\\OCS\\IDiscoveryService' => __DIR__ . '/../../..' . '/lib/public/OCS/IDiscoveryService.php', 'OCP\\PreConditionNotMetException' => __DIR__ . '/../../..' . '/lib/public/PreConditionNotMetException.php', 'OCP\\Preview\\BeforePreviewFetchedEvent' => __DIR__ . '/../../..' . '/lib/public/Preview/BeforePreviewFetchedEvent.php', + 'OCP\\Preview\\IMimeIconProvider' => __DIR__ . '/../../..' . '/lib/public/Preview/IMimeIconProvider.php', 'OCP\\Preview\\IProvider' => __DIR__ . '/../../..' . '/lib/public/Preview/IProvider.php', 'OCP\\Preview\\IProviderV2' => __DIR__ . '/../../..' . '/lib/public/Preview/IProviderV2.php', 'OCP\\Preview\\IVersionedPreviewFile' => __DIR__ . '/../../..' . '/lib/public/Preview/IVersionedPreviewFile.php', @@ -1512,6 +1513,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 'OC\\Preview\\MSOffice2007' => __DIR__ . '/../../..' . '/lib/private/Preview/MSOffice2007.php', 'OC\\Preview\\MSOfficeDoc' => __DIR__ . '/../../..' . '/lib/private/Preview/MSOfficeDoc.php', 'OC\\Preview\\MarkDown' => __DIR__ . '/../../..' . '/lib/private/Preview/MarkDown.php', + 'OC\\Preview\\MimeIconProvider' => __DIR__ . '/../../..' . '/lib/private/Preview/MimeIconProvider.php', 'OC\\Preview\\Movie' => __DIR__ . '/../../..' . '/lib/private/Preview/Movie.php', 'OC\\Preview\\Office' => __DIR__ . '/../../..' . '/lib/private/Preview/Office.php', 'OC\\Preview\\OpenDocument' => __DIR__ . '/../../..' . '/lib/private/Preview/OpenDocument.php', diff --git a/lib/private/Preview/MimeIconProvider.php b/lib/private/Preview/MimeIconProvider.php new file mode 100644 index 00000000000..1e44e8ca80a --- /dev/null +++ b/lib/private/Preview/MimeIconProvider.php @@ -0,0 +1,98 @@ +<?php +/** + * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com> + * + * @author John Molakvoæ <skjnldsv@protonmail.com> + * + * @license AGPL-3.0-or-later + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ +namespace OC\Preview; + +use OCA\Theming\ThemingDefaults; +use OCP\App\IAppManager; +use OCP\Files\IMimeTypeDetector; +use OCP\IConfig; +use OCP\IURLGenerator; +use OCP\Preview\IMimeIconProvider; + +class MimeIconProvider implements IMimeIconProvider { + public function __construct( + protected IMimeTypeDetector $mimetypeDetector, + protected IConfig $config, + protected IURLGenerator $urlGenerator, + protected IAppManager $appManager, + protected ThemingDefaults $themingDefaults, + ) { + } + + public function getMimeIconUrl(string $mime): null|string { + if (!$mime) { + return null; + } + + // Fetch all the aliases + $aliases = $this->mimetypeDetector->getAllAliases(); + + // Remove comments + $aliases = array_filter($aliases, static function ($key) { + return !($key === '' || $key[0] === '_'); + }, ARRAY_FILTER_USE_KEY); + + // Map all the aliases recursively + foreach ($aliases as $alias => $value) { + if ($alias === $mime) { + $mime = $value; + } + } + + $fileName = str_replace('/', '-', $mime); + if ($url = $this->searchfileName($fileName)) { + return $url; + } + + $mimeType = explode('/', $mime)[0]; + if ($url = $this->searchfileName($mimeType)) { + return $url; + } + + return null; + } + + private function searchfileName(string $fileName): null|string { + // If the file exists in the current enabled legacy + // custom theme, let's return it + $theme = $this->config->getSystemValue('theme', ''); + if (!empty($theme)) { + $path = "/themes/$theme/core/img/filetypes/$fileName.svg"; + if (file_exists(\OC::$SERVERROOT . $path)) { + return $this->urlGenerator->getAbsoluteURL($path); + } + } + + // Previously, we used to pass thi through Theming + // But it was only used to colour icons containing + // 0082c9. Since with vue we moved to inline svg icons, + // we can just use the default core icons. + + // Finally, if the file exists in core, let's return it + $path = "/core/img/filetypes/$fileName.svg"; + if (file_exists(\OC::$SERVERROOT . $path)) { + return $this->urlGenerator->getAbsoluteURL($path); + } + + return null; + } +} diff --git a/lib/private/Server.php b/lib/private/Server.php index e9966e83cae..e1de1b84e29 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -127,6 +127,7 @@ use OC\Notification\Manager; use OC\OCS\DiscoveryService; use OC\Preview\GeneratorHelper; use OC\Preview\IMagickSupport; +use OC\Preview\MimeIconProvider; use OC\Remote\Api\ApiFactory; use OC\Remote\InstanceFactory; use OC\RichObjectStrings\Validator; @@ -262,6 +263,7 @@ use OCA\Files_External\Service\GlobalStoragesService; use OCA\Files_External\Service\BackendService; use OCP\Profiler\IProfiler; use OC\Profiler\Profiler; +use OCP\Preview\IMimeIconProvider; /** * Class Server @@ -337,6 +339,7 @@ class Server extends ServerContainer implements IServerContainer { }); /** @deprecated 19.0.0 */ $this->registerDeprecatedAlias('PreviewManager', IPreview::class); + $this->registerAlias(IMimeIconProvider::class, MimeIconProvider::class); $this->registerService(\OC\Preview\Watcher::class, function (ContainerInterface $c) { return new \OC\Preview\Watcher( diff --git a/lib/public/Files/IMimeTypeDetector.php b/lib/public/Files/IMimeTypeDetector.php index 11ba5cfc95f..9992c153edc 100644 --- a/lib/public/Files/IMimeTypeDetector.php +++ b/lib/public/Files/IMimeTypeDetector.php @@ -82,4 +82,10 @@ interface IMimeTypeDetector { * @since 8.2.0 */ public function mimeTypeIcon($mimeType); + + /** + * @return string[] + * @since 28.0.0 + */ + public function getAllAliases(): array; } diff --git a/lib/public/Preview/IMimeIconProvider.php b/lib/public/Preview/IMimeIconProvider.php new file mode 100644 index 00000000000..cb397ddfda7 --- /dev/null +++ b/lib/public/Preview/IMimeIconProvider.php @@ -0,0 +1,37 @@ +<?php +/** + * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com> + * + * @author John Molakvoæ <skjnldsv@protonmail.com> + * + * @license AGPL-3.0-or-later + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ +namespace OCP\Preview; + +/** + * Interface IMimeIconProvider + * + * @since 28.0.0 + */ +interface IMimeIconProvider { + /** + * Get the URL to the icon for the given mime type + * Used by the preview provider to show a mime icon + * if no preview is available. + * @since 28.0.0 + */ + public function getMimeIconUrl(string $mime): string|null; +} |