82 lines
2.3 KiB
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
|
|
}
|