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/private/Preview | |
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/private/Preview')
-rw-r--r-- | lib/private/Preview/MimeIconProvider.php | 98 |
1 files changed, 98 insertions, 0 deletions
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; + } +} |