From 72ff937e11a6375da5b13788f855eafcc2452b85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sun, 7 Jul 2024 12:54:30 +0200 Subject: [PATCH] Switch EXIF library Closes #10855 Closes #8586 Closes #8996 --- go.mod | 2 +- go.sum | 7 +- hugolib/image_test.go | 9 +- resources/image.go | 12 +- resources/image_extended_test.go | 14 +- resources/image_test.go | 14 +- resources/images/exif/exif.go | 333 +++++++++++------- resources/images/exif/exif_test.go | 65 ++-- resources/images/image.go | 25 +- resources/resource_spec.go | 4 +- .../cssjs/tailwindcss.go | 6 - resources/testdata/sunrise.webp | Bin 0 -> 95652 bytes 12 files changed, 297 insertions(+), 194 deletions(-) create mode 100644 resources/testdata/sunrise.webp diff --git a/go.mod b/go.mod index 2b7327aa3..d1d4da6d8 100644 --- a/go.mod +++ b/go.mod @@ -15,6 +15,7 @@ require ( github.com/bep/golibsass v1.1.1 github.com/bep/gowebp v0.3.0 github.com/bep/helpers v0.4.0 + github.com/bep/imagemeta v0.7.0 github.com/bep/lazycache v0.4.0 github.com/bep/logg v0.4.0 github.com/bep/mclib v1.20400.20402 @@ -60,7 +61,6 @@ require ( github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 github.com/pelletier/go-toml/v2 v2.2.2 github.com/rogpeppe/go-internal v1.12.0 - github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd github.com/sanity-io/litter v1.5.5 github.com/spf13/afero v1.11.0 github.com/spf13/cast v1.6.0 diff --git a/go.sum b/go.sum index 801a32cd2..b4250b46b 100644 --- a/go.sum +++ b/go.sum @@ -118,10 +118,6 @@ github.com/bep/clocks v0.5.0 h1:hhvKVGLPQWRVsBP/UB7ErrHYIO42gINVbvqxvYTPVps= github.com/bep/clocks v0.5.0/go.mod h1:SUq3q+OOq41y2lRQqH5fsOoxN8GbxSiT6jvoVVLCVhU= github.com/bep/debounce v1.2.0 h1:wXds8Kq8qRfwAOpAxHrJDbCXgC5aHSzgQb/0gKsHQqo= github.com/bep/debounce v1.2.0/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= -github.com/bep/gitmap v1.4.0 h1:GeWbPb2QDTfcZLBQmCB693N3sJmPQfeu81fDrD5r8x8= -github.com/bep/gitmap v1.4.0/go.mod h1:n+3W1f/rot2hynsqEGxGMErPRgT41n9CkGuzPvz9cIw= -github.com/bep/gitmap v1.5.0 h1:ExDl7HeDaRDG8FXFRTnv20qzbyJlC6ivdOboMYFvrms= -github.com/bep/gitmap v1.5.0/go.mod h1:n+3W1f/rot2hynsqEGxGMErPRgT41n9CkGuzPvz9cIw= github.com/bep/gitmap v1.6.0 h1:sDuQMm9HoTL0LtlrfxjbjgAg2wHQd4nkMup2FInYzhA= github.com/bep/gitmap v1.6.0/go.mod h1:n+3W1f/rot2hynsqEGxGMErPRgT41n9CkGuzPvz9cIw= github.com/bep/goat v0.5.0 h1:S8jLXHCVy/EHIoCY+btKkmcxcXFd34a0Q63/0D4TKeA= @@ -136,6 +132,8 @@ github.com/bep/gowebp v0.3.0 h1:MhmMrcf88pUY7/PsEhMgEP0T6fDUnRTMpN8OclDrbrY= github.com/bep/gowebp v0.3.0/go.mod h1:ZhFodwdiFp8ehGJpF4LdPl6unxZm9lLFjxD3z2h2AgI= github.com/bep/helpers v0.4.0 h1:ab9veaAiWY4ST48Oxp5usaqivDmYdB744fz+tcZ3Ifs= github.com/bep/helpers v0.4.0/go.mod h1:/QpHdmcPagDw7+RjkLFCvnlUc8lQ5kg4KDrEkb2Yyco= +github.com/bep/imagemeta v0.7.0 h1:I6Ve/UToNRdnh8qOlpuiR8dX56q6qi97hOqReaMsLMk= +github.com/bep/imagemeta v0.7.0/go.mod h1:5piPAq5Qomh07m/dPPCLN3mDJyFusvUG7VwdRD/vX0s= github.com/bep/lazycache v0.4.0 h1:X8yVyWNVupPd4e1jV7efi3zb7ZV/qcjKQgIQ5aPbkYI= github.com/bep/lazycache v0.4.0/go.mod h1:NmRm7Dexh3pmR1EignYR8PjO2cWybFQ68+QgY3VMCSc= github.com/bep/logg v0.4.0 h1:luAo5mO4ZkhA5M1iDVDqDqnBBnlHjmtZF6VAyTp+nCQ= @@ -409,7 +407,6 @@ github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99 github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd h1:CmH9+J6ZSsIjUK3dcGsnCnO41eRBOnY12zwkn5qVwgc= -github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= github.com/sanity-io/litter v1.5.5 h1:iE+sBxPBzoK6uaEP5Lt3fHNgpKcHXc/A2HGETy0uJQo= github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= github.com/shogo82148/go-shuffle v0.0.0-20180218125048-27e6095f230d/go.mod h1:2htx6lmL0NGLHlO8ZCf+lQBGBHIbEujyywxJArf+2Yc= diff --git a/hugolib/image_test.go b/hugolib/image_test.go index b3b933711..d58008512 100644 --- a/hugolib/image_test.go +++ b/hugolib/image_test.go @@ -82,12 +82,13 @@ SUNSET2: {{ $resized2.RelPermalink }}/{{ $resized2.Width }}/Lat: {{ $resized2.Ex // Check the file cache b.AssertImage(200, 200, "resources/_gen/images/bundle/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_200x200_resize_q75_box.jpg") - b.AssertFileContent("resources/_gen/images/bundle/sunset_3166614710256882113.json", - "DateTimeDigitized|time.Time", "PENTAX") + b.AssertFileContent("resources/_gen/images/bundle/sunset_9750822043026343402.json", + "FocalLengthIn35mmFormat|uint16", "PENTAX") b.AssertImage(123, 234, "resources/_gen/images/images/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_123x234_resize_q75_box.jpg") - b.AssertFileContent("resources/_gen/images/images/sunset_3166614710256882113.json", - "DateTimeDigitized|time.Time", "PENTAX") + + b.AssertFileContent("resources/_gen/images/images/sunset_9750822043026343402.json", + "FocalLengthIn35mmFormat|uint16", "PENTAX") b.AssertNoDuplicateWrites() } diff --git a/resources/image.go b/resources/image.go index 8f70a665a..188f49624 100644 --- a/resources/image.go +++ b/resources/image.go @@ -82,8 +82,9 @@ func (i *imageResource) Exif() *exif.ExifInfo { func (i *imageResource) getExif() *exif.ExifInfo { i.metaInit.Do(func() { - supportsExif := i.Format == images.JPEG || i.Format == images.TIFF - if !supportsExif { + mf := i.Format.ToImageMetaImageFormatFormat() + if mf == -1 { + // No Exif support for this format. return } @@ -114,7 +115,8 @@ func (i *imageResource) getExif() *exif.ExifInfo { } defer f.Close() - x, err := i.getSpec().imaging.DecodeExif(f) + filename := i.getResourcePaths().Path() + x, err := i.getSpec().imaging.DecodeExif(filename, mf, f) if err != nil { i.getSpec().Logger.Warnf("Unable to decode Exif metadata from image: %s", i.Key()) return nil @@ -471,7 +473,9 @@ func (i *imageResource) clone(img image.Image) *imageResource { } func (i *imageResource) getImageMetaCacheTargetPath() string { - const imageMetaVersionNumber = 1 // Increment to invalidate the meta cache + // Increment to invalidate the meta cache + // Last increment: v0.130.0 when change to the new imagemeta library for Exif. + const imageMetaVersionNumber = 2 cfgHash := i.getSpec().imaging.Cfg.SourceHash df := i.getResourcePaths() diff --git a/resources/image_extended_test.go b/resources/image_extended_test.go index 429e51fb6..2f1f4f4a4 100644 --- a/resources/image_extended_test.go +++ b/resources/image_extended_test.go @@ -20,22 +20,28 @@ import ( "testing" qt "github.com/frankban/quicktest" + "github.com/gohugoio/hugo/htesting/hqt" "github.com/gohugoio/hugo/media" ) func TestImageResizeWebP(t *testing.T) { c := qt.New(t) - _, image := fetchImage(c, "sunset.webp") + _, image := fetchImage(c, "sunrise.webp") c.Assert(image.MediaType(), qt.Equals, media.Builtin.WEBPType) - c.Assert(image.RelPermalink(), qt.Equals, "/a/sunset.webp") + c.Assert(image.RelPermalink(), qt.Equals, "/a/sunrise.webp") c.Assert(image.ResourceType(), qt.Equals, "image") - c.Assert(image.Exif(), qt.IsNil) + exif := image.Exif() + c.Assert(exif, qt.Not(qt.IsNil)) + c.Assert(exif.Tags["Copyright"], qt.Equals, "Bjørn Erik Pedersen") + c.Assert(exif.Lat, hqt.IsSameFloat64, 36.59744166666667) + c.Assert(exif.Long, hqt.IsSameFloat64, -4.50846) + c.Assert(exif.Date.IsZero(), qt.Equals, false) resized, err := image.Resize("123x") c.Assert(err, qt.IsNil) c.Assert(image.MediaType(), qt.Equals, media.Builtin.WEBPType) - c.Assert(resized.RelPermalink(), qt.Equals, "/a/sunset_hu36ee0b61ba924719ad36da960c273f96_59826_123x0_resize_q68_h2_linear_2.webp") + c.Assert(resized.RelPermalink(), qt.Equals, "/a/sunrise_hu6ad68bcbae1b79cbc2f6b451894deaf6_95652_123x0_resize_q68_h2_linear_2.webp") c.Assert(resized.Width(), qt.Equals, 123) } diff --git a/resources/image_test.go b/resources/image_test.go index 7e26c1f55..0a53b4117 100644 --- a/resources/image_test.go +++ b/resources/image_test.go @@ -19,7 +19,6 @@ import ( "image" "image/gif" "io/fs" - "math/big" "math/rand" "os" "path/filepath" @@ -30,6 +29,7 @@ import ( "testing" "time" + "github.com/bep/imagemeta" "github.com/gohugoio/hugo/htesting" "github.com/gohugoio/hugo/resources/images/webp" @@ -67,8 +67,13 @@ var eq = qt.CmpEquals( return m1.Type == m2.Type }), cmp.Comparer( - func(v1, v2 *big.Rat) bool { - return v1.RatString() == v2.RatString() + func(v1, v2 imagemeta.Rat[uint32]) bool { + return v1.String() == v2.String() + }, + ), + cmp.Comparer( + func(v1, v2 imagemeta.Rat[int32]) bool { + return v1.String() == v2.String() }, ), cmp.Comparer(func(v1, v2 time.Time) bool { @@ -392,7 +397,7 @@ func TestImageResize8BitPNG(t *testing.T) { c.Assert(image.MediaType().Type, qt.Equals, "image/png") c.Assert(image.RelPermalink(), qt.Equals, "/a/gohugoio.png") c.Assert(image.ResourceType(), qt.Equals, "image") - c.Assert(image.Exif(), qt.IsNil) + c.Assert(image.Exif(), qt.IsNotNil) resized, err := image.Resize("800x") c.Assert(err, qt.IsNil) @@ -443,6 +448,7 @@ func TestImageExif(t *testing.T) { c.Assert(lensModel, qt.Equals, "smc PENTAX-DA* 16-50mm F2.8 ED AL [IF] SDM") resized, _ := image.Resize("300x200") x2 := resized.Exif() + c.Assert(x2, eq, x) } diff --git a/resources/images/exif/exif.go b/resources/images/exif/exif.go index 0374cdc96..a7f0e0757 100644 --- a/resources/images/exif/exif.go +++ b/resources/images/exif/exif.go @@ -14,25 +14,18 @@ package exif import ( - "bytes" "fmt" "io" - "math" - "math/big" "regexp" + "strconv" "strings" "time" - "unicode" - "unicode/utf8" + "github.com/bep/imagemeta" + "github.com/bep/logg" "github.com/bep/tmc" - - _exif "github.com/rwcarlsen/goexif/exif" - "github.com/rwcarlsen/goexif/tiff" ) -const exifTimeLayout = "2006:01:02 15:04:05" - // ExifInfo holds the decoded Exif data for an Image. type ExifInfo struct { // GPS latitude in degrees. @@ -53,6 +46,15 @@ type Decoder struct { excludeFieldsrRe *regexp.Regexp noDate bool noLatLong bool + warnl logg.LevelLogger +} + +func (d *Decoder) shouldInclude(s string) bool { + return (d.includeFieldsRe == nil || d.includeFieldsRe.MatchString(s)) +} + +func (d *Decoder) shouldExclude(s string) bool { + return d.excludeFieldsrRe != nil && d.excludeFieldsrRe.MatchString(s) } func IncludeFields(expression string) func(*Decoder) error { @@ -91,6 +93,13 @@ func WithDateDisabled(disabled bool) func(*Decoder) error { } } +func WithWarnLogger(warnl logg.LevelLogger) func(*Decoder) error { + return func(d *Decoder) error { + d.warnl = warnl + return nil + } +} + func compileRegexp(expression string) (*regexp.Regexp, error) { expression = strings.TrimSpace(expression) if expression == "" { @@ -115,148 +124,222 @@ func NewDecoder(options ...func(*Decoder) error) (*Decoder, error) { return d, nil } -func (d *Decoder) Decode(r io.Reader) (ex *ExifInfo, err error) { +var ( + isTimeTag = func(s string) bool { + return strings.Contains(s, "Time") + } + isGPSTag = func(s string) bool { + return strings.HasPrefix(s, "GPS") + } +) + +// Filename is only used for logging. +func (d *Decoder) Decode(filename string, format imagemeta.ImageFormat, r io.Reader) (ex *ExifInfo, err error) { defer func() { if r := recover(); r != nil { err = fmt.Errorf("exif failed: %v", r) } }() - var x *_exif.Exif - x, err = _exif.Decode(r) - if err != nil { - if err.Error() == "EOF" { - // Found no Exif - return nil, nil - } - return + var tagInfos imagemeta.Tags + handleTag := func(ti imagemeta.TagInfo) error { + tagInfos.Add(ti) + return nil } + shouldInclude := func(ti imagemeta.TagInfo) bool { + if ti.Source == imagemeta.EXIF { + if !d.noDate { + // We need the time tags to calculate the date. + if isTimeTag(ti.Tag) { + return true + } + } + if !d.noLatLong { + // We need to GPS tags to calculate the lat/long. + if isGPSTag(ti.Tag) { + return true + } + } + + if !strings.HasPrefix(ti.Namespace, "IFD0") { + // Drop thumbnail tags. + return false + } + } + + if d.shouldExclude(ti.Tag) { + return false + } + + return d.shouldInclude(ti.Tag) + } + + var warnf func(string, ...any) + if d.warnl != nil { + // There should be very little warnings (fingers crossed!), + // but this will typically be unrecognized formats. + // To be able to possibly get rid of these warnings, + // we need to know what images are causing them. + warnf = func(format string, args ...any) { + format = fmt.Sprintf("%q: %s: ", filename, format) + d.warnl.Logf(format, args...) + } + } + + err = imagemeta.Decode( + imagemeta.Options{ + R: r.(io.ReadSeeker), + ImageFormat: format, + ShouldHandleTag: shouldInclude, + HandleTag: handleTag, + Sources: imagemeta.EXIF, // For now. TODO(bep) + Warnf: warnf, + }, + ) + var tm time.Time var lat, long float64 if !d.noDate { - tm, _ = x.DateTime() + tm, _ = tagInfos.GetDateTime() } if !d.noLatLong { - lat, long, _ = x.LatLong() - if math.IsNaN(lat) { - lat = 0 - } - if math.IsNaN(long) { - long = 0 - } + lat, long, _ = tagInfos.GetLatLong() } - walker := &exifWalker{x: x, vals: make(map[string]any), includeMatcher: d.includeFieldsRe, excludeMatcher: d.excludeFieldsrRe} - if err = x.Walk(walker); err != nil { - return + tags := make(map[string]any) + for k, v := range tagInfos.All() { + if d.shouldExclude(k) { + continue + } + if !d.shouldInclude(k) { + continue + } + tags[k] = v.Value } - ex = &ExifInfo{Lat: lat, Long: long, Date: tm, Tags: walker.vals} + ex = &ExifInfo{Lat: lat, Long: long, Date: tm, Tags: tags} return } -func decodeTag(x *_exif.Exif, f _exif.FieldName, t *tiff.Tag) (any, error) { - switch t.Format() { - case tiff.StringVal, tiff.UndefVal: - s := nullString(t.Val) - if strings.Contains(string(f), "DateTime") { - if d, err := tryParseDate(x, s); err == nil { - return d, nil - } - } - return s, nil - case tiff.OtherVal: - return "unknown", nil - } - - var rv []any - - for i := 0; i < int(t.Count); i++ { - switch t.Format() { - case tiff.RatVal: - n, d, _ := t.Rat2(i) - rat := big.NewRat(n, d) - // if t is int or t > 1, use float64 - if rat.IsInt() || rat.Cmp(big.NewRat(1, 1)) == 1 { - f, _ := rat.Float64() - rv = append(rv, f) - } else { - rv = append(rv, rat) - } - - case tiff.FloatVal: - v, _ := t.Float(i) - rv = append(rv, v) - case tiff.IntVal: - v, _ := t.Int(i) - rv = append(rv, v) - } - } - - if t.Count == 1 { - if len(rv) == 1 { - return rv[0], nil - } - } - - return rv, nil -} - -// Code borrowed from exif.DateTime and adjusted. -func tryParseDate(x *_exif.Exif, s string) (time.Time, error) { - dateStr := strings.TrimRight(s, "\x00") - // TODO(bep): look for timezone offset, GPS time, etc. - timeZone := time.Local - if tz, _ := x.TimeZone(); tz != nil { - timeZone = tz - } - return time.ParseInLocation(exifTimeLayout, dateStr, timeZone) -} - -type exifWalker struct { - x *_exif.Exif - vals map[string]any - includeMatcher *regexp.Regexp - excludeMatcher *regexp.Regexp -} - -func (e *exifWalker) Walk(f _exif.FieldName, tag *tiff.Tag) error { - name := string(f) - if e.excludeMatcher != nil && e.excludeMatcher.MatchString(name) { - return nil - } - if e.includeMatcher != nil && !e.includeMatcher.MatchString(name) { - return nil - } - val, err := decodeTag(e.x, f, tag) - if err != nil { - return err - } - e.vals[name] = val - return nil -} - -func nullString(in []byte) string { - var rv bytes.Buffer - for len(in) > 0 { - r, size := utf8.DecodeRune(in) - if unicode.IsGraphic(r) { - rv.WriteRune(r) - } - in = in[size:] - } - return rv.String() -} - var tcodec *tmc.Codec func init() { + newIntadapter := func(target any) tmc.Adapter { + var bitSize int + var isSigned bool + + switch target.(type) { + case int: + bitSize = 0 + isSigned = true + case int8: + bitSize = 8 + isSigned = true + case int16: + bitSize = 16 + isSigned = true + case int32: + bitSize = 32 + isSigned = true + case int64: + bitSize = 64 + isSigned = true + case uint: + bitSize = 0 + case uint8: + bitSize = 8 + case uint16: + bitSize = 16 + case uint32: + bitSize = 32 + case uint64: + bitSize = 64 + } + + intFromString := func(s string) (any, error) { + if bitSize == 0 { + return strconv.Atoi(s) + } + + var v any + var err error + + if isSigned { + v, err = strconv.ParseInt(s, 10, bitSize) + } else { + v, err = strconv.ParseUint(s, 10, bitSize) + } + + if err != nil { + return 0, err + } + + if isSigned { + i := v.(int64) + switch target.(type) { + case int: + return int(i), nil + case int8: + return int8(i), nil + case int16: + return int16(i), nil + case int32: + return int32(i), nil + case int64: + return i, nil + } + } + + i := v.(uint64) + switch target.(type) { + case uint: + return uint(i), nil + case uint8: + return uint8(i), nil + case uint16: + return uint16(i), nil + case uint32: + return uint32(i), nil + case uint64: + return i, nil + + } + + return 0, fmt.Errorf("unsupported target type %T", target) + } + + intToString := func(v any) (string, error) { + return fmt.Sprintf("%d", v), nil + } + + return tmc.NewAdapter(target, intFromString, intToString) + } + + ru, _ := imagemeta.NewRat[uint32](1, 2) + ri, _ := imagemeta.NewRat[int32](1, 2) + tmcAdapters := []tmc.Adapter{ + tmc.NewAdapter(ru, nil, nil), + tmc.NewAdapter(ri, nil, nil), + newIntadapter(int(1)), + newIntadapter(int8(1)), + newIntadapter(int16(1)), + newIntadapter(int32(1)), + newIntadapter(int64(1)), + newIntadapter(uint(1)), + newIntadapter(uint8(1)), + newIntadapter(uint16(1)), + newIntadapter(uint32(1)), + newIntadapter(uint64(1)), + } + + tmcAdapters = append(tmc.DefaultTypeAdapters, tmcAdapters...) + var err error - tcodec, err = tmc.New() + tcodec, err = tmc.New(tmc.WithTypeAdapters(tmcAdapters)) if err != nil { panic(err) } diff --git a/resources/images/exif/exif_test.go b/resources/images/exif/exif_test.go index 64c5a39e3..278bc761a 100644 --- a/resources/images/exif/exif_test.go +++ b/resources/images/exif/exif_test.go @@ -15,13 +15,12 @@ package exif import ( "encoding/json" - "math/big" "os" "path/filepath" "testing" "time" - "github.com/gohugoio/hugo/htesting/hqt" + "github.com/bep/imagemeta" "github.com/google/go-cmp/cmp" qt "github.com/frankban/quicktest" @@ -35,11 +34,12 @@ func TestExif(t *testing.T) { d, err := NewDecoder(IncludeFields("Lens|Date")) c.Assert(err, qt.IsNil) - x, err := d.Decode(f) + x, err := d.Decode("", imagemeta.JPEG, f) c.Assert(err, qt.IsNil) c.Assert(x.Date.Format("2006-01-02"), qt.Equals, "2017-10-27") // Malaga: https://goo.gl/taazZy + c.Assert(x.Lat, qt.Equals, float64(36.59744166666667)) c.Assert(x.Long, qt.Equals, float64(-4.50846)) @@ -49,9 +49,9 @@ func TestExif(t *testing.T) { c.Assert(ok, qt.Equals, true) c.Assert(lensModel, qt.Equals, "smc PENTAX-DA* 16-50mm F2.8 ED AL [IF] SDM") - v, found = x.Tags["DateTime"] + v, found = x.Tags["ModifyDate"] c.Assert(found, qt.Equals, true) - c.Assert(v, hqt.IsSameType, time.Time{}) + c.Assert(v, qt.Equals, "2017:11:23 09:56:54") // Verify that it survives a round-trip to JSON and back. data, err := json.Marshal(x) @@ -72,8 +72,8 @@ func TestExifPNG(t *testing.T) { d, err := NewDecoder() c.Assert(err, qt.IsNil) - _, err = d.Decode(f) - c.Assert(err, qt.Not(qt.IsNil)) + _, err = d.Decode("", imagemeta.PNG, f) + c.Assert(err, qt.IsNil) } func TestIssue8079(t *testing.T) { @@ -85,28 +85,11 @@ func TestIssue8079(t *testing.T) { d, err := NewDecoder() c.Assert(err, qt.IsNil) - x, err := d.Decode(f) + x, err := d.Decode("", imagemeta.JPEG, f) c.Assert(err, qt.IsNil) c.Assert(x.Tags["ImageDescription"], qt.Equals, "Città del Vaticano #nanoblock #vatican #vaticancity") } -func TestNullString(t *testing.T) { - c := qt.New(t) - - for _, test := range []struct { - in string - expect string - }{ - {"foo", "foo"}, - {"\x20", "\x20"}, - {"\xc4\x81", "\xc4\x81"}, // \u0101 - {"\u0160", "\u0160"}, // non-breaking space - } { - res := nullString([]byte(test.in)) - c.Assert(res, qt.Equals, test.expect) - } -} - func BenchmarkDecodeExif(b *testing.B) { c := qt.New(b) f, err := os.Open(filepath.FromSlash("../../testdata/sunset.jpg")) @@ -118,7 +101,7 @@ func BenchmarkDecodeExif(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { - _, err = d.Decode(f) + _, err = d.Decode("", imagemeta.JPEG, f) c.Assert(err, qt.IsNil) f.Seek(0, 0) } @@ -126,8 +109,13 @@ func BenchmarkDecodeExif(b *testing.B) { var eq = qt.CmpEquals( cmp.Comparer( - func(v1, v2 *big.Rat) bool { - return v1.RatString() == v2.RatString() + func(v1, v2 imagemeta.Rat[uint32]) bool { + return v1.String() == v2.String() + }, + ), + cmp.Comparer( + func(v1, v2 imagemeta.Rat[int32]) bool { + return v1.String() == v2.String() }, ), cmp.Comparer(func(v1, v2 time.Time) bool { @@ -138,14 +126,15 @@ var eq = qt.CmpEquals( func TestIssue10738(t *testing.T) { c := qt.New(t) - testFunc := func(path, include string) any { + testFunc := func(c *qt.C, path, include string) any { + c.Helper() f, err := os.Open(filepath.FromSlash(path)) c.Assert(err, qt.IsNil) defer f.Close() d, err := NewDecoder(IncludeFields(include)) c.Assert(err, qt.IsNil) - x, err := d.Decode(f) + x, err := d.Decode("", imagemeta.JPEG, f) c.Assert(err, qt.IsNil) // Verify that it survives a round-trip to JSON and back. @@ -194,7 +183,7 @@ func TestIssue10738(t *testing.T) { include: "Lens|Date|ExposureTime", }, want{ 10, - 0, + 1, }, }, { @@ -221,7 +210,7 @@ func TestIssue10738(t *testing.T) { include: "Lens|Date|ExposureTime", }, want{ 1, - 0, + 1, }, }, { @@ -266,7 +255,7 @@ func TestIssue10738(t *testing.T) { include: "Lens|Date|ExposureTime", }, want{ 30, - 0, + 1, }, }, { @@ -293,19 +282,21 @@ func TestIssue10738(t *testing.T) { include: "Lens|Date|ExposureTime", }, want{ 4, - 0, + 1, }, }, } for _, tt := range tests { c.Run(tt.name, func(c *qt.C) { - got := testFunc(tt.args.path, tt.args.include) + got := testFunc(c, tt.args.path, tt.args.include) switch v := got.(type) { case float64: c.Assert(v, qt.Equals, float64(tt.want.vN)) - case *big.Rat: - c.Assert(v, eq, big.NewRat(tt.want.vN, tt.want.vD)) + case imagemeta.Rat[uint32]: + r, err := imagemeta.NewRat[uint32](uint32(tt.want.vN), uint32(tt.want.vD)) + c.Assert(err, qt.IsNil) + c.Assert(v, eq, r) default: c.Fatalf("unexpected type: %T", got) } diff --git a/resources/images/image.go b/resources/images/image.go index 1637d0cf8..4d5285acd 100644 --- a/resources/images/image.go +++ b/resources/images/image.go @@ -26,6 +26,8 @@ import ( "sync" "github.com/bep/gowebp/libwebp/webpoptions" + "github.com/bep/imagemeta" + "github.com/bep/logg" "github.com/gohugoio/hugo/config" "github.com/gohugoio/hugo/resources/images/webp" @@ -174,13 +176,14 @@ func (i *Image) initConfig() error { return nil } -func NewImageProcessor(cfg *config.ConfigNamespace[ImagingConfig, ImagingConfigInternal]) (*ImageProcessor, error) { +func NewImageProcessor(warnl logg.LevelLogger, cfg *config.ConfigNamespace[ImagingConfig, ImagingConfigInternal]) (*ImageProcessor, error) { e := cfg.Config.Imaging.Exif exifDecoder, err := exif.NewDecoder( exif.WithDateDisabled(e.DisableDate), exif.WithLatLongDisabled(e.DisableLatLong), exif.ExcludeFields(e.ExcludeFields), exif.IncludeFields(e.IncludeFields), + exif.WithWarnLogger(warnl), ) if err != nil { return nil, err @@ -197,8 +200,9 @@ type ImageProcessor struct { exifDecoder *exif.Decoder } -func (p *ImageProcessor) DecodeExif(r io.Reader) (*exif.ExifInfo, error) { - return p.exifDecoder.Decode(r) +// Filename is only used for logging. +func (p *ImageProcessor) DecodeExif(filename string, format imagemeta.ImageFormat, r io.Reader) (*exif.ExifInfo, error) { + return p.exifDecoder.Decode(filename, format, r) } func (p *ImageProcessor) FiltersFromConfig(src image.Image, conf ImageConfig) ([]gift.Filter, error) { @@ -353,6 +357,21 @@ const ( WEBP ) +func (f Format) ToImageMetaImageFormatFormat() imagemeta.ImageFormat { + switch f { + case JPEG: + return imagemeta.JPEG + case PNG: + return imagemeta.PNG + case TIFF: + return imagemeta.TIFF + case WEBP: + return imagemeta.WebP + default: + return -1 + } +} + // RequiresDefaultQuality returns if the default quality needs to be applied to // images of this format. func (f Format) RequiresDefaultQuality() bool { diff --git a/resources/resource_spec.go b/resources/resource_spec.go index ef76daa1a..d50edeb73 100644 --- a/resources/resource_spec.go +++ b/resources/resource_spec.go @@ -60,7 +60,9 @@ func NewSpec( conf := s.Cfg.GetConfig().(*allconfig.Config) imgConfig := conf.Imaging - imaging, err := images.NewImageProcessor(imgConfig) + imagesWarnl := logger.WarnCommand("images") + + imaging, err := images.NewImageProcessor(imagesWarnl, imgConfig) if err != nil { return nil, err } diff --git a/resources/resource_transformers/cssjs/tailwindcss.go b/resources/resource_transformers/cssjs/tailwindcss.go index f3195c596..beda7a646 100644 --- a/resources/resource_transformers/cssjs/tailwindcss.go +++ b/resources/resource_transformers/cssjs/tailwindcss.go @@ -99,11 +99,6 @@ func (t *tailwindcssTransformation) Transform(ctx *resources.ResourceTransformat cmdArgs = append(cmdArgs, options.toArgs()...) - // TODO1 - // npm i tailwindcss @tailwindcss/cli - // npm i tailwindcss@next @tailwindcss/cli@next - // npx tailwindcss -h - var errBuf bytes.Buffer stderr := io.MultiWriter(infow, &errBuf) @@ -134,7 +129,6 @@ func (t *tailwindcssTransformation) Transform(ctx *resources.ResourceTransformat t.rs.Assets.Fs, t.rs.Logger, ctx.DependencyManager, ) - // TODO1 option { src, err = imp.resolve() if err != nil { return err diff --git a/resources/testdata/sunrise.webp b/resources/testdata/sunrise.webp new file mode 100644 index 0000000000000000000000000000000000000000..25ea7b046bb967285ea862e37c90efd11fa02a61 GIT binary patch literal 95652 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