diff options
author | Gabriel Arakaki Giovanini <mail@gabrielgio.me> | 2023-07-03 23:13:04 +0200 |
---|---|---|
committer | Gabriel Arakaki Giovanini <mail@gabrielgio.me> | 2023-07-03 23:13:04 +0200 |
commit | c2d666b43477ea7042b574ad940c508216cb0e83 (patch) | |
tree | a459b552374114c4ef9ebe9966ed6ec83bb9a11d /pkg | |
parent | 6e84441dab0a2b89869e33d7e89d14189d9b67c0 (diff) | |
download | lens-c2d666b43477ea7042b574ad940c508216cb0e83.tar.gz lens-c2d666b43477ea7042b574ad940c508216cb0e83.tar.bz2 lens-c2d666b43477ea7042b574ad940c508216cb0e83.zip |
fix: Fix content type
Content type was always being set to `text/html`.
Also swap lib for processing thumbnail for something that accepts HEIC.
Diffstat (limited to 'pkg')
-rw-r--r-- | pkg/ext/middleware.go | 4 | ||||
-rw-r--r-- | pkg/fileop/file.go | 5 | ||||
-rw-r--r-- | pkg/fileop/thumbnail.go | 49 | ||||
-rw-r--r-- | pkg/worker/list_processor.go | 13 | ||||
-rw-r--r-- | pkg/worker/thumbnail_scanner.go | 7 |
5 files changed, 46 insertions, 32 deletions
diff --git a/pkg/ext/middleware.go b/pkg/ext/middleware.go index d255c6d..c83b998 100644 --- a/pkg/ext/middleware.go +++ b/pkg/ext/middleware.go @@ -12,7 +12,9 @@ import ( func HTML(next fasthttp.RequestHandler) fasthttp.RequestHandler { return func(ctx *fasthttp.RequestCtx) { - ctx.Response.Header.SetContentType("text/html") + if len(ctx.Request.Header.ContentType()) > 0 { + ctx.Response.Header.SetContentType("text/html") + } next(ctx) } } diff --git a/pkg/fileop/file.go b/pkg/fileop/file.go index 07c08e5..10e2202 100644 --- a/pkg/fileop/file.go +++ b/pkg/fileop/file.go @@ -12,6 +12,9 @@ func GetHashFromPath(path string) string { } func IsMimeTypeSupported(mimetype string) bool { - return strings.HasPrefix(mimetype, "video") && + if mimetype == "image/svg+xml" { + return false + } + return strings.HasPrefix(mimetype, "video") || strings.HasPrefix(mimetype, "image") } diff --git a/pkg/fileop/thumbnail.go b/pkg/fileop/thumbnail.go index 32f6064..fcdfa12 100644 --- a/pkg/fileop/thumbnail.go +++ b/pkg/fileop/thumbnail.go @@ -1,60 +1,55 @@ package fileop import ( - "image" - "image/jpeg" - "os" + "bytes" + "fmt" "os/exec" + "strconv" - "github.com/disintegration/imaging" + "github.com/h2non/bimg" ) func EncodeImageThumbnail(inputPath string, outputPath string, width, height int) error { - inputImage, err := imaging.Open(inputPath, imaging.AutoOrientation(true)) + buffer, err := bimg.Read(inputPath) if err != nil { return err } - thumbImage := imaging.Fit(inputImage, width, height, imaging.Lanczos) - if err = encodeImageJPEG(thumbImage, outputPath, 60); err != nil { - return err - } - - return nil -} - -func encodeImageJPEG(image image.Image, outputPath string, jpegQuality int) error { - photo_file, err := os.Create(outputPath) - if err != nil { - return err + options := bimg.Options{ + Width: width, + Height: height, + Embed: true, + Type: bimg.JPEG, + StripMetadata: true, } - defer photo_file.Close() - err = jpeg.Encode(photo_file, image, &jpeg.Options{Quality: jpegQuality}) + newImage, err := bimg.NewImage(buffer).Process(options) if err != nil { return err } - return nil + return bimg.Write(outputPath, newImage) } -func EncodeVideoThumbnail(inputPath string, outputPath string, width, height int) error { +func EncodeVideoThumbnail(inputPath string, outputPath string, width, _ int) error { args := []string{ "-i", inputPath, - "-vframes", "1", // output one frame - "-an", // disable audio - "-vf", "scale='min(1024,iw)':'min(1024,ih)':force_original_aspect_ratio=decrease:force_divisible_by=2", - "-vf", "select=gte(n\\,100)", + "-y", + "-vframes", "1", + "-q:v", "1", + "-vf", "thumbnail,scale=" + strconv.Itoa(width) + ":-1", outputPath, } cmd := exec.Command("ffmpeg", args...) + var b bytes.Buffer + cmd.Stderr = &b + if err := cmd.Run(); err != nil { - return err + return fmt.Errorf("%s; %w", b.String(), err) } return nil - } diff --git a/pkg/worker/list_processor.go b/pkg/worker/list_processor.go index 0a07085..c060583 100644 --- a/pkg/worker/list_processor.go +++ b/pkg/worker/list_processor.go @@ -16,6 +16,10 @@ type ( Process(context.Context, T) error } + OnFail[T any] interface { + OnFail(context.Context, T, error) + } + BatchProcessor[T any] interface { Query(context.Context) ([]T, error) Process(context.Context, T) error @@ -77,6 +81,12 @@ func (l *batchProcessorWorker[T]) Start(ctx context.Context) error { var wg sync.WaitGroup for _, v := range values { + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + wg.Add(1) l.scheduler.Take() go func(v T) { @@ -84,6 +94,9 @@ func (l *batchProcessorWorker[T]) Start(ctx context.Context) error { defer wg.Done() if err := l.batchProcessor.Process(ctx, v); err != nil && !errors.Is(err, context.Canceled) { l.logrus.WithError(err).Error("Error processing batch") + if failure, ok := l.batchProcessor.(OnFail[T]); ok { + failure.OnFail(ctx, v, err) + } } }(v) } diff --git a/pkg/worker/thumbnail_scanner.go b/pkg/worker/thumbnail_scanner.go index cc201b8..168abef 100644 --- a/pkg/worker/thumbnail_scanner.go +++ b/pkg/worker/thumbnail_scanner.go @@ -2,6 +2,7 @@ package worker import ( "context" + "fmt" "math" "os" "path" @@ -47,12 +48,12 @@ func (t *ThumbnailScanner) Process(ctx context.Context, media *repository.Media) if media.IsVideo() { err := fileop.EncodeVideoThumbnail(media.Path, output, 1080, 1080) if err != nil { - return err + return fmt.Errorf("Error thumbnail video %d; %w", media.ID, err) } } else { - err := fileop.EncodeImageThumbnail(media.Path, output, 1080, math.MaxInt) + err := fileop.EncodeImageThumbnail(media.Path, output, 1080, math.MinInt32) if err != nil { - return err + return fmt.Errorf("Error thumbnail image %d; %w", media.ID, err) } } |