diff --git a/internal/reader/icon/finder.go b/internal/reader/icon/finder.go index 0fb3751c..1477d9f9 100644 --- a/internal/reader/icon/finder.go +++ b/internal/reader/icon/finder.go @@ -27,6 +27,7 @@ import ( "github.com/PuerkitoBio/goquery" "golang.org/x/image/draw" + "golang.org/x/image/webp" ) type iconFinder struct { @@ -195,8 +196,8 @@ func (f *iconFinder) downloadIcon(iconURL string) (*model.Icon, error) { func resizeIcon(icon *model.Icon) *model.Icon { r := bytes.NewReader(icon.Content) - if !slices.Contains([]string{"image/jpeg", "image/png", "image/gif"}, icon.MimeType) { - slog.Info("icon isn't a png/gif/jpeg, can't resize", slog.String("mimetype", icon.MimeType)) + if !slices.Contains([]string{"image/jpeg", "image/png", "image/gif", "image/webp"}, icon.MimeType) { + slog.Info("icon isn't a png/gif/jpeg/webp, can't resize", slog.String("mimetype", icon.MimeType)) return icon } @@ -221,6 +222,8 @@ func resizeIcon(icon *model.Icon) *model.Icon { src, err = png.Decode(r) case "image/gif": src, err = gif.Decode(r) + case "image/webp": + src, err = webp.Decode(r) } if err != nil || src == nil { slog.Warn("unable to decode the icon", slog.Any("error", err)) diff --git a/internal/reader/icon/finder_test.go b/internal/reader/icon/finder_test.go index 22561ece..4ae07174 100644 --- a/internal/reader/icon/finder_test.go +++ b/internal/reader/icon/finder_test.go @@ -170,6 +170,21 @@ func TestResizeIconPng(t *testing.T) { } } +func TestResizeIconWebp(t *testing.T) { + data, err := base64.StdEncoding.DecodeString("UklGRkAAAABXRUJQVlA4IDQAAADwAQCdASoBAAEAAQAcJaACdLoB+AAETAAA/vW4f/6aR40jxpHxcP/ugT90CfugT/3NoAAA") + if err != nil { + t.Fatal(err) + } + icon := model.Icon{ + Content: data, + MimeType: "image/webp", + } + + if !bytes.Equal(icon.Content, resizeIcon(&icon).Content) { + t.Fatalf("Converted webp smaller than 16x16") + } +} + func TestResizeInvalidImage(t *testing.T) { icon := model.Icon{ Content: []byte("invalid data"),