Skip to content

Commit ccbb652

Browse files
committed
feat(preview): add embedded preview support for CorelDRAW files
Signed-off-by: Dmitriy Pankratov <7snack7@gmail.com>
1 parent 1add8ce commit ccbb652

4 files changed

Lines changed: 94 additions & 0 deletions

File tree

lib/composer/composer/autoload_classmap.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2130,6 +2130,7 @@
21302130
'OC\\Preview\\BackgroundCleanupJob' => $baseDir . '/lib/private/Preview/BackgroundCleanupJob.php',
21312131
'OC\\Preview\\Bitmap' => $baseDir . '/lib/private/Preview/Bitmap.php',
21322132
'OC\\Preview\\Bundled' => $baseDir . '/lib/private/Preview/Bundled.php',
2133+
'OC\\Preview\\CDR' => $baseDir . '/lib/private/Preview/CDR.php',
21332134
'OC\\Preview\\Db\\Preview' => $baseDir . '/lib/private/Preview/Db/Preview.php',
21342135
'OC\\Preview\\Db\\PreviewMapper' => $baseDir . '/lib/private/Preview/Db/PreviewMapper.php',
21352136
'OC\\Preview\\EMF' => $baseDir . '/lib/private/Preview/EMF.php',

lib/composer/composer/autoload_static.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2171,6 +2171,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
21712171
'OC\\Preview\\BackgroundCleanupJob' => __DIR__ . '/../../..' . '/lib/private/Preview/BackgroundCleanupJob.php',
21722172
'OC\\Preview\\Bitmap' => __DIR__ . '/../../..' . '/lib/private/Preview/Bitmap.php',
21732173
'OC\\Preview\\Bundled' => __DIR__ . '/../../..' . '/lib/private/Preview/Bundled.php',
2174+
'OC\\Preview\\CDR' => __DIR__ . '/../../..' . '/lib/private/Preview/CDR.php',
21742175
'OC\\Preview\\Db\\Preview' => __DIR__ . '/../../..' . '/lib/private/Preview/Db/Preview.php',
21752176
'OC\\Preview\\Db\\PreviewMapper' => __DIR__ . '/../../..' . '/lib/private/Preview/Db/PreviewMapper.php',
21762177
'OC\\Preview\\EMF' => __DIR__ . '/../../..' . '/lib/private/Preview/EMF.php',

lib/private/Preview/CDR.php

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
7+
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
8+
* SPDX-License-Identifier: AGPL-3.0-only
9+
*/
10+
11+
namespace OC\Preview;
12+
13+
use OCP\Files\File;
14+
use OCP\Files\FileInfo;
15+
use OCP\IImage;
16+
use OCP\Image;
17+
18+
class CDR extends ProviderV2 {
19+
#[\Override]
20+
public function getMimeType(): string {
21+
return '/application\/coreldraw/';
22+
}
23+
#[\Override]
24+
public function isAvailable(FileInfo $file): bool {
25+
return $file->getSize() > 0;
26+
}
27+
#[\Override]
28+
public function getThumbnail(File $file, int $maxX, int $maxY): ?IImage {
29+
if (!$this->isAvailable($file)) {
30+
return null;
31+
}
32+
33+
$localFile = $this->getLocalFile($file);
34+
35+
if ($localFile === false) {
36+
return null;
37+
}
38+
39+
$data = $this->extractThumbnail($localFile);
40+
if ($data === null) {
41+
return null;
42+
}
43+
44+
$image = new Image();
45+
$image->loadFromData($data);
46+
47+
if (!$image->valid()) {
48+
return null;
49+
}
50+
51+
$image->scaleDownToFit($maxX, $maxY);
52+
53+
return $image;
54+
}
55+
/** * Extract ONLY thumbnail (no pages) */
56+
private function extractThumbnail(string $file): ?string {
57+
$zip = new \ZipArchive();
58+
59+
if ($zip->open($file) !== true) {
60+
return null;
61+
}
62+
63+
/**
64+
* Newer CorelDRAW files store the embedded preview in previews/thumbnail.png.
65+
*
66+
* Older CorelDRAW files store the embedded BMP thumbnail in
67+
* metadata/thumbnails/thumbnail.bmp.
68+
*/
69+
foreach ([
70+
'previews/thumbnail.png',
71+
'metadata/thumbnails/thumbnail.bmp',
72+
] as $thumbnail) {
73+
$idx = $zip->locateName($thumbnail);
74+
75+
if ($idx === false) {
76+
continue;
77+
}
78+
79+
$data = $zip->getFromIndex($idx);
80+
$zip->close();
81+
82+
return $data === false ? null : $data;
83+
}
84+
85+
$zip->close();
86+
87+
return null;
88+
}
89+
}

lib/private/PreviewManager.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Closure;
1212
use OC\AppFramework\Bootstrap\Coordinator;
1313
use OC\Preview\BMP;
14+
use OC\Preview\CDR;
1415
use OC\Preview\Db\PreviewMapper;
1516
use OC\Preview\EMF;
1617
use OC\Preview\Font;
@@ -271,6 +272,7 @@ protected function getEnabledDefaultProvider(): array {
271272
XBitmap::class,
272273
Krita::class,
273274
WebP::class,
275+
CDR::class,
274276
];
275277

276278
$this->defaultProviders = $this->config->getSystemValue('enabledPreviewProviders', array_merge([
@@ -317,6 +319,7 @@ protected function registerCoreProviders(): void {
317319
$this->registerCoreProvider(BMP::class, '/image\/bmp/');
318320
$this->registerCoreProvider(XBitmap::class, '/image\/x-xbitmap/');
319321
$this->registerCoreProvider(WebP::class, '/image\/webp/');
322+
$this->registerCoreProvider(CDR::class, '/application\/coreldraw/');
320323
$this->registerCoreProvider(Krita::class, '/application\/x-krita/');
321324
$this->registerCoreProvider(MP3::class, '/audio\/mpeg$/');
322325
$this->registerCoreProvider(OpenDocument::class, '/application\/vnd.oasis.opendocument.*/');

0 commit comments

Comments
 (0)