veza/veza-backend-api/internal/workers/thumbnail_job.go

82 lines
2.3 KiB
Go

package workers
import (
"context"
"fmt"
"os"
"path/filepath"
"github.com/disintegration/imaging"
"go.uber.org/zap"
)
// ThumbnailJob représente un job de génération de thumbnail
type ThumbnailJob struct {
InputPath string // Chemin du fichier source
OutputPath string // Chemin du fichier thumbnail à générer
Width int // Largeur du thumbnail (0 = auto, conserve ratio)
Height int // Hauteur du thumbnail (0 = auto, conserve ratio)
}
// NewThumbnailJob crée un nouveau job de thumbnail
func NewThumbnailJob(inputPath, outputPath string, width, height int) *ThumbnailJob {
// Valeurs par défaut si non spécifiées
if width == 0 {
width = 300 // Largeur par défaut
}
if height == 0 {
height = 300 // Hauteur par défaut
}
return &ThumbnailJob{
InputPath: inputPath,
OutputPath: outputPath,
Width: width,
Height: height,
}
}
// Execute exécute le job de génération de thumbnail
func (j *ThumbnailJob) Execute(ctx context.Context, logger *zap.Logger) error {
// Vérifier que le fichier source existe
if _, err := os.Stat(j.InputPath); os.IsNotExist(err) {
return fmt.Errorf("input file does not exist: %s", j.InputPath)
}
// Créer le répertoire de destination s'il n'existe pas
outputDir := filepath.Dir(j.OutputPath)
if err := os.MkdirAll(outputDir, 0755); err != nil {
return fmt.Errorf("failed to create output directory: %w", err)
}
// Ouvrir l'image source
src, err := imaging.Open(j.InputPath)
if err != nil {
return fmt.Errorf("failed to open image: %w", err)
}
// Générer le thumbnail avec l'algorithme Lanczos (qualité élevée)
thumbnail := imaging.Resize(src, j.Width, j.Height, imaging.Lanczos)
// Déterminer le format de sortie depuis l'extension
ext := filepath.Ext(j.OutputPath)
// Ajuster l'extension si nécessaire
if ext == "" {
j.OutputPath = j.OutputPath + ".jpg"
ext = ".jpg"
}
// Sauvegarder le thumbnail (imaging.Save détecte automatiquement le format depuis l'extension)
if err := imaging.Save(thumbnail, j.OutputPath); err != nil {
return fmt.Errorf("failed to save thumbnail: %w", err)
}
logger.Info("Thumbnail generated successfully",
zap.String("input", j.InputPath),
zap.String("output", j.OutputPath),
zap.Int("width", j.Width),
zap.Int("height", j.Height),
)
return nil
}