update process image
This commit is contained in:
parent
fbacedc6dd
commit
412d0b12f0
115
processor.go
115
processor.go
@ -20,19 +20,13 @@ func ProcessImage(ctx context.Context, client *minio.Client, bucket, key string)
|
||||
return err
|
||||
}
|
||||
|
||||
contentType := stat.ContentType
|
||||
if !strings.HasPrefix(contentType, "image/") {
|
||||
if !strings.HasPrefix(stat.ContentType, "image/") {
|
||||
log.Printf("⏭️ Skipping non-image file: %s", key)
|
||||
return nil
|
||||
}
|
||||
|
||||
if processed := stat.UserMetadata["X-Amz-Meta-Processed"]; processed == "true" {
|
||||
log.Printf("♻️ Already processed: %s", key)
|
||||
return nil
|
||||
}
|
||||
|
||||
if processed := stat.UserMetadata["Processed"]; processed == "true" {
|
||||
log.Printf("♻️ Already processed: %s", key)
|
||||
if stat.UserMetadata["Processed"] == "true" || stat.UserMetadata["X-Amz-Meta-Processed"] == "true" {
|
||||
log.Printf("⏭️ Skipping already processed image: %s", key)
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -44,8 +38,7 @@ func ProcessImage(ctx context.Context, client *minio.Client, bucket, key string)
|
||||
defer object.Close()
|
||||
|
||||
sourceBuffer := new(bytes.Buffer)
|
||||
_, err = sourceBuffer.ReadFrom(object)
|
||||
if err != nil {
|
||||
if _, err := sourceBuffer.ReadFrom(object); err != nil {
|
||||
log.Printf("🚨 Failed to read object: %s, error: %v", key, err)
|
||||
return err
|
||||
}
|
||||
@ -59,67 +52,63 @@ func ProcessImage(ctx context.Context, client *minio.Client, bucket, key string)
|
||||
"Processed": "true",
|
||||
}
|
||||
|
||||
// Generate optimized JPEG: just convert without resizing, keep quality high
|
||||
jpegBuf, err := img.Process(bimg.Options{
|
||||
Quality: 90,
|
||||
Type: bimg.JPEG,
|
||||
StripMetadata: true,
|
||||
NoAutoRotate: false,
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to generate optimized jpeg: %w", err)
|
||||
if err := generateAndUploadJPEG(ctx, client, img, bucket, filePath, fileName, meta); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Generate optimized WebP: just convert without resizing, keep quality high
|
||||
webpBuf, err := img.Process(bimg.Options{
|
||||
Quality: 90,
|
||||
Type: bimg.WEBP,
|
||||
StripMetadata: true,
|
||||
NoAutoRotate: false,
|
||||
})
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to generate webp: %w", err)
|
||||
if err := generateAndUploadWebP(ctx, client, img, bucket, filePath, fileName, meta); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Generate thumbnail: resize to 400px width
|
||||
thumbBuf, err := img.Process(bimg.Options{
|
||||
Width: 400,
|
||||
Quality: 85,
|
||||
Type: bimg.JPEG,
|
||||
StripMetadata: true,
|
||||
NoAutoRotate: false,
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to generate thumbnail: %w", err)
|
||||
if err := generateAndUploadThumbnail(ctx, client, img, bucket, filePath, fileName, meta); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Upload optimized JPEG
|
||||
err = UploadToMinIO(ctx, client, bucket, path.Join(filePath, "optimized", fileName), "image/jpeg", jpegBuf, meta)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to upload optimized jpeg: %w", err)
|
||||
}
|
||||
|
||||
// Upload WebP
|
||||
webpName := strings.TrimSuffix(fileName, filepath.Ext(fileName)) + ".webp"
|
||||
err = UploadToMinIO(ctx, client, bucket, path.Join(filePath, "webp", webpName), "image/webp", webpBuf, meta)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to upload webp image: %w", err)
|
||||
}
|
||||
|
||||
// Upload thumbnail
|
||||
err = UploadToMinIO(ctx, client, bucket, path.Join(filePath, "thumbs", fileName), "image/jpeg", thumbBuf, meta)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to upload thumbnail: %w", err)
|
||||
}
|
||||
|
||||
// Reupload original with processed=true metadata (unchanged)
|
||||
err = UploadToMinIO(ctx, client, bucket, key, contentType, sourceBuffer.Bytes(), meta)
|
||||
if err != nil {
|
||||
if err := UploadToMinIO(ctx, client, bucket, key, stat.ContentType, sourceBuffer.Bytes(), meta); err != nil {
|
||||
return fmt.Errorf("failed to reupload original image: %w", err)
|
||||
}
|
||||
|
||||
log.Printf("✅ Image processed: %s", key)
|
||||
return nil
|
||||
}
|
||||
|
||||
func generateAndUploadJPEG(ctx context.Context, client *minio.Client, img *bimg.Image, bucket, filePath, fileName string, meta map[string]string) error {
|
||||
jpegBuf, err := img.Process(bimg.Options{
|
||||
Quality: 90,
|
||||
Type: bimg.JPEG,
|
||||
StripMetadata: true,
|
||||
})
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to generate optimized JPEG: %w", err)
|
||||
}
|
||||
|
||||
return UploadToMinIO(ctx, client, bucket, path.Join(filePath, "optimized", fileName), "image/jpeg", jpegBuf, meta)
|
||||
}
|
||||
|
||||
func generateAndUploadWebP(ctx context.Context, client *minio.Client, img *bimg.Image, bucket, filePath, fileName string, meta map[string]string) error {
|
||||
webpBuf, err := img.Process(bimg.Options{
|
||||
Quality: 90,
|
||||
Type: bimg.WEBP,
|
||||
StripMetadata: true,
|
||||
})
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to generate WebP: %w", err)
|
||||
}
|
||||
|
||||
webpName := strings.TrimSuffix(fileName, filepath.Ext(fileName)) + ".webp"
|
||||
return UploadToMinIO(ctx, client, bucket, path.Join(filePath, "webp", webpName), "image/webp", webpBuf, meta)
|
||||
}
|
||||
|
||||
func generateAndUploadThumbnail(ctx context.Context, client *minio.Client, img *bimg.Image, bucket, filePath, fileName string, meta map[string]string) error {
|
||||
thumbBuf, err := img.Process(bimg.Options{
|
||||
Width: 400,
|
||||
Quality: 85,
|
||||
Type: bimg.JPEG,
|
||||
StripMetadata: true,
|
||||
})
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to generate thumbnail: %w", err)
|
||||
}
|
||||
|
||||
return UploadToMinIO(ctx, client, bucket, path.Join(filePath, "thumbs", fileName), "image/jpeg", thumbBuf, meta)
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user