Selaa lähdekoodia

FIx AvatarOptimize job

Daniel Supernault 1 kuukausi sitten
vanhempi
commit
27953d0969
1 muutettua tiedostoa jossa 51 lisäystä ja 7 poistoa
  1. 51 7
      app/Jobs/AvatarPipeline/AvatarOptimize.php

+ 51 - 7
app/Jobs/AvatarPipeline/AvatarOptimize.php

@@ -12,8 +12,12 @@ use Illuminate\Foundation\Bus\Dispatchable;
 use Illuminate\Queue\InteractsWithQueue;
 use Illuminate\Queue\InteractsWithQueue;
 use Illuminate\Queue\SerializesModels;
 use Illuminate\Queue\SerializesModels;
 use Illuminate\Support\Str;
 use Illuminate\Support\Str;
-use Image as Intervention;
 use Storage;
 use Storage;
+use Intervention\Image\ImageManager;
+use Intervention\Image\Encoders\JpegEncoder;
+use Intervention\Image\Encoders\WebpEncoder;
+use Intervention\Image\Encoders\AvifEncoder;
+use Intervention\Image\Encoders\PngEncoder;
 
 
 class AvatarOptimize implements ShouldQueue
 class AvatarOptimize implements ShouldQueue
 {
 {
@@ -50,14 +54,54 @@ class AvatarOptimize implements ShouldQueue
     {
     {
         $avatar = $this->profile->avatar;
         $avatar = $this->profile->avatar;
         $file = storage_path("app/$avatar->media_path");
         $file = storage_path("app/$avatar->media_path");
+        $fileInfo = pathinfo($file);
+        $extension = strtolower($fileInfo['extension'] ?? 'jpg');
+
+        $driver = match(config('image.driver')) {
+            'imagick' => new \Intervention\Image\Drivers\Imagick\Driver(),
+            'vips' => new \Intervention\Image\Drivers\Vips\Driver(),
+            default => new \Intervention\Image\Drivers\Gd\Driver()
+        };
+
+        $imageManager = new ImageManager(
+            $driver,
+            autoOrientation: true,
+            decodeAnimation: true,
+            blendingColor: 'ffffff',
+            strip: true
+        );
+
+        $quality = config_cache('pixelfed.image_quality');
+
+        $encoder = null;
+        switch ($extension) {
+            case 'jpeg':
+            case 'jpg':
+                $encoder = new JpegEncoder($quality);
+                break;
+            case 'png':
+                $encoder = new PngEncoder();
+                break;
+            case 'webp':
+                $encoder = new WebpEncoder($quality);
+                break;
+            case 'avif':
+                $encoder = new AvifEncoder($quality);
+                break;
+            case 'heic':
+                $encoder = new JpegEncoder($quality);
+                $extension = 'jpg';
+                break;
+            default:
+                $encoder = new JpegEncoder($quality);
+                $extension = 'jpg';
+        }
 
 
         try {
         try {
-            $img = Intervention::make($file)->orientate();
-            $img->fit(200, 200, function ($constraint) {
-                $constraint->upsize();
-            });
-            $quality = config_cache('pixelfed.image_quality');
-            $img->save($file, $quality);
+            $img = $imageManager->read($file);
+            $img = $img->coverDown(200, 200);
+            $encoded = $encoder->encode($img);
+            file_put_contents($file, $encoded->toString());
 
 
             $avatar = Avatar::whereProfileId($this->profile->id)->firstOrFail();
             $avatar = Avatar::whereProfileId($this->profile->id)->firstOrFail();
             $avatar->change_count = ++$avatar->change_count;
             $avatar->change_count = ++$avatar->change_count;