|
9 | 9 | use wcf\data\file\thumbnail\FileThumbnailList; |
10 | 10 | use wcf\data\object\type\ObjectType; |
11 | 11 | use wcf\data\object\type\ObjectTypeCache; |
| 12 | +use wcf\event\file\GenerateThumbnail; |
| 13 | +use wcf\event\file\GenerateWebpVariant; |
12 | 14 | use wcf\system\database\util\PreparedStatementConditionBuilder; |
| 15 | +use wcf\system\event\EventHandler; |
13 | 16 | use wcf\system\exception\SystemException; |
14 | 17 | use wcf\system\file\processor\exception\DamagedImage; |
15 | 18 | use wcf\system\image\adapter\exception\ImageNotProcessable; |
@@ -159,32 +162,41 @@ public function generateWebpVariant(File $file): void |
159 | 162 | } |
160 | 163 | } |
161 | 164 |
|
162 | | - $imageAdapter = ImageHandler::getInstance()->getAdapter(); |
163 | | - if (!$imageAdapter->checkMemoryLimit($file->width, $file->height, $file->mimeType)) { |
164 | | - return; |
165 | | - } |
166 | | - |
167 | | - try { |
168 | | - $imageAdapter->loadSingleFrameFromFile($file->getPathname()); |
169 | | - } catch (SystemException | ImageNotReadable) { |
| 165 | + $event = new GenerateWebpVariant($file); |
| 166 | + EventHandler::getInstance()->fire($event); |
| 167 | + if ($event->sourceIsMarkedAsDamaged()) { |
170 | 168 | throw new DamagedImage($file->fileID); |
171 | | - } catch (ImageNotProcessable $e) { |
172 | | - logThrowable($e); |
173 | | - |
174 | | - return; |
175 | 169 | } |
176 | 170 |
|
177 | | - $filename = FileUtil::getTemporaryFilename(extension: 'webp'); |
| 171 | + $filename = $event->getPathname(); |
| 172 | + if ($filename === null) { |
| 173 | + $imageAdapter = ImageHandler::getInstance()->getAdapter(); |
| 174 | + if (!$imageAdapter->checkMemoryLimit($file->width, $file->height, $file->mimeType)) { |
| 175 | + return; |
| 176 | + } |
178 | 177 |
|
179 | | - try { |
180 | | - $imageAdapter->saveImageAs($imageAdapter->getImage(), $filename, 'webp', 80); |
181 | | - } catch (\Throwable $e) { |
182 | | - // Ignore any errors trying to save the file unless in debug mode. |
183 | | - if (\ENABLE_DEBUG_MODE) { |
184 | | - throw $e; |
| 178 | + try { |
| 179 | + $imageAdapter->loadSingleFrameFromFile($file->getPathname()); |
| 180 | + } catch (SystemException | ImageNotReadable) { |
| 181 | + throw new DamagedImage($file->fileID); |
| 182 | + } catch (ImageNotProcessable $e) { |
| 183 | + logThrowable($e); |
| 184 | + |
| 185 | + return; |
185 | 186 | } |
186 | 187 |
|
187 | | - return; |
| 188 | + $filename = FileUtil::getTemporaryFilename(extension: 'webp'); |
| 189 | + |
| 190 | + try { |
| 191 | + $imageAdapter->saveImageAs($imageAdapter->getImage(), $filename, 'webp', 80); |
| 192 | + } catch (\Throwable $e) { |
| 193 | + // Ignore any errors trying to save the file unless in debug mode. |
| 194 | + if (\ENABLE_DEBUG_MODE) { |
| 195 | + throw $e; |
| 196 | + } |
| 197 | + |
| 198 | + return; |
| 199 | + } |
188 | 200 | } |
189 | 201 |
|
190 | 202 | (new FileEditor($file))->update([ |
@@ -251,36 +263,45 @@ public function generateThumbnails(File $file): void |
251 | 263 | } |
252 | 264 | } |
253 | 265 |
|
254 | | - if ($imageAdapter === null) { |
255 | | - $imageAdapter = ImageHandler::getInstance()->getAdapter(); |
256 | | - if (!$imageAdapter->checkMemoryLimit($file->width, $file->height, $file->mimeType)) { |
257 | | - return; |
| 266 | + $event = new GenerateThumbnail($file, $format); |
| 267 | + EventHandler::getInstance()->fire($event); |
| 268 | + if ($event->sourceIsMarkedAsDamaged()) { |
| 269 | + throw new DamagedImage($file->fileID); |
| 270 | + } |
| 271 | + |
| 272 | + $filename = $event->getPathname(); |
| 273 | + if ($filename === null) { |
| 274 | + if ($imageAdapter === null) { |
| 275 | + $imageAdapter = ImageHandler::getInstance()->getAdapter(); |
| 276 | + if (!$imageAdapter->checkMemoryLimit($file->width, $file->height, $file->mimeType)) { |
| 277 | + return; |
| 278 | + } |
| 279 | + |
| 280 | + try { |
| 281 | + $imageAdapter->loadSingleFrameFromFile($file->getPathname()); |
| 282 | + } catch (SystemException | ImageNotReadable $e) { |
| 283 | + throw new DamagedImage($file->fileID, $e); |
| 284 | + } catch (ImageNotProcessable $e) { |
| 285 | + logThrowable($e); |
| 286 | + |
| 287 | + return; |
| 288 | + } |
258 | 289 | } |
259 | 290 |
|
| 291 | + \assert($imageAdapter instanceof ImageAdapter); |
| 292 | + |
260 | 293 | try { |
261 | | - $imageAdapter->loadSingleFrameFromFile($file->getPathname()); |
262 | | - } catch (SystemException | ImageNotReadable $e) { |
263 | | - throw new DamagedImage($file->fileID, $e); |
264 | | - } catch (ImageNotProcessable $e) { |
| 294 | + $image = $imageAdapter->createThumbnail($format->width, $format->height, $format->retainDimensions); |
| 295 | + } catch (\Throwable $e) { |
265 | 296 | logThrowable($e); |
266 | 297 |
|
267 | | - return; |
| 298 | + continue; |
268 | 299 | } |
269 | | - } |
270 | 300 |
|
271 | | - \assert($imageAdapter instanceof ImageAdapter); |
272 | | - |
273 | | - try { |
274 | | - $image = $imageAdapter->createThumbnail($format->width, $format->height, $format->retainDimensions); |
275 | | - } catch (\Throwable $e) { |
276 | | - logThrowable($e); |
277 | | - |
278 | | - continue; |
| 301 | + $filename = FileUtil::getTemporaryFilename(extension: 'webp'); |
| 302 | + $imageAdapter->saveImageAs($image, $filename, 'webp', 80); |
279 | 303 | } |
280 | 304 |
|
281 | | - $filename = FileUtil::getTemporaryFilename(extension: 'webp'); |
282 | | - $imageAdapter->saveImageAs($image, $filename, 'webp', 80); |
283 | | - |
284 | 305 | $fileThumbnail = FileThumbnailEditor::createFromTemporaryFile($file, $format, $filename); |
285 | 306 | $processor->adoptThumbnail($fileThumbnail); |
286 | 307 | } |
|
0 commit comments