From 1a3f26fb5c515f5672561449f91f6be6383b5a3a Mon Sep 17 00:00:00 2001 From: Sigrid Solveig Haflínudóttir Date: Tue, 6 Dec 2022 14:15:25 +0100 Subject: [feature] media: add webp support (#1155) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * media: add webp support Signed-off-by: Sigrid Solveig Haflínudóttir * bump exif-terminator to v0.5.0 Signed-off-by: Sigrid Solveig Haflínudóttir Signed-off-by: Sigrid Solveig Haflínudóttir --- internal/media/image.go | 7 ++++--- internal/media/processingmedia.go | 4 ++-- internal/media/types.go | 3 +++ internal/media/util.go | 2 ++ 4 files changed, 11 insertions(+), 5 deletions(-) (limited to 'internal/media') diff --git a/internal/media/image.go b/internal/media/image.go index e1fc5c331..b095a6c49 100644 --- a/internal/media/image.go +++ b/internal/media/image.go @@ -30,6 +30,7 @@ import ( "github.com/buckket/go-blurhash" "github.com/disintegration/imaging" + _ "golang.org/x/image/webp" // blank import to support WebP decoding ) const ( @@ -71,7 +72,7 @@ func decodeImage(r io.Reader, contentType string) (*imageMeta, error) { var err error switch contentType { - case mimeImageJpeg: + case mimeImageJpeg, mimeImageWebp: i, err = imaging.Decode(r, imaging.AutoOrientation(true)) case mimeImagePng: strippedPngReader := io.Reader(&PNGAncillaryChunkStripper{ @@ -104,7 +105,7 @@ func decodeImage(r io.Reader, contentType string) (*imageMeta, error) { } // deriveThumbnail returns a byte slice and metadata for a thumbnail -// of a given jpeg, png, or gif, or an error if something goes wrong. +// of a given jpeg, png, gif or webp, or an error if something goes wrong. // // If createBlurhash is true, then a blurhash will also be generated from a tiny // version of the image. This costs precious CPU cycles, so only use it if you @@ -117,7 +118,7 @@ func deriveThumbnail(r io.Reader, contentType string, createBlurhash bool) (*ima var err error switch contentType { - case mimeImageJpeg, mimeImageGif: + case mimeImageJpeg, mimeImageGif, mimeImageWebp: i, err = imaging.Decode(r, imaging.AutoOrientation(true)) case mimeImagePng: strippedPngReader := io.Reader(&PNGAncillaryChunkStripper{ diff --git a/internal/media/processingmedia.go b/internal/media/processingmedia.go index 81eef2f84..1fd9423f5 100644 --- a/internal/media/processingmedia.go +++ b/internal/media/processingmedia.go @@ -215,7 +215,7 @@ func (p *ProcessingMedia) loadFullSize(ctx context.Context) error { // decode the image ct := p.attachment.File.ContentType switch ct { - case mimeImageJpeg, mimeImagePng: + case mimeImageJpeg, mimeImagePng, mimeImageWebp: decoded, err = decodeImage(stored, ct) case mimeImageGif: decoded, err = decodeGif(stored) @@ -319,7 +319,7 @@ func (p *ProcessingMedia) store(ctx context.Context) error { p.attachment.Type = gtsmodel.FileTypeImage // nothing to terminate, we can just store the multireader readerToStore = multiReader - case mimeJpeg, mimePng: + case mimeJpeg, mimePng, mimeWebp: p.attachment.Type = gtsmodel.FileTypeImage if fileSize > 0 { terminated, err := terminator.Terminate(multiReader, int(fileSize), extension) diff --git a/internal/media/types.go b/internal/media/types.go index 763a8137f..b855d72b5 100644 --- a/internal/media/types.go +++ b/internal/media/types.go @@ -43,6 +43,9 @@ const ( mimePng = "png" mimeImagePng = mimeImage + "/" + mimePng + + mimeWebp = "webp" + mimeImageWebp = mimeImage + "/" + mimeWebp ) type processState int32 diff --git a/internal/media/util.go b/internal/media/util.go index 316d63dec..7efd788a1 100644 --- a/internal/media/util.go +++ b/internal/media/util.go @@ -37,6 +37,7 @@ func AllSupportedMIMETypes() []string { mimeImageJpeg, mimeImageGif, mimeImagePng, + mimeImageWebp, } } @@ -68,6 +69,7 @@ func supportedImage(mimeType string) bool { mimeImageJpeg, mimeImageGif, mimeImagePng, + mimeImageWebp, } for _, accepted := range acceptedImageTypes { if mimeType == accepted { -- cgit v1.2.3