From 92530fbd6a792bbcc64a5f207e9c044bedbbb4ed Mon Sep 17 00:00:00 2001 From: Travis Ralston <travpc@gmail.com> Date: Sun, 16 Aug 2020 11:27:27 -0600 Subject: [PATCH] Add artwork if available to audio thumbnail --- assets/default-artwork.png | Bin 0 -> 42839 bytes go.mod | 1 + go.sum | 2 + thumbnailing/i/flac.go | 3 +- thumbnailing/i/mp3.go | 86 ++++++++++++++++++++++++++++++++----- thumbnailing/i/ogg.go | 3 +- thumbnailing/i/wav.go | 3 +- thumbnailing/u/metadata.go | 12 ++++++ 8 files changed, 97 insertions(+), 13 deletions(-) create mode 100644 assets/default-artwork.png create mode 100644 thumbnailing/u/metadata.go diff --git a/assets/default-artwork.png b/assets/default-artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..8ea3ef740b13c7774fc2720b1535f46567668db8 GIT binary patch literal 42839 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 literal 0 HcmV?d00001 diff --git a/go.mod b/go.mod index 8e975d72..0ab2f08e 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,7 @@ require ( github.com/buckket/go-blurhash v1.0.3 github.com/cenk/backoff v2.2.1+incompatible // indirect github.com/cupcake/sigil v0.0.0-20131127230922-6bf9722f2ae8 + github.com/dhowden/tag v0.0.0-20200412032933-5d76b8eaae27 github.com/didip/tollbooth v4.0.2+incompatible github.com/disintegration/imaging v1.6.2 github.com/djherbis/stream v1.3.0 diff --git a/go.sum b/go.sum index bb8c70b1..9d3c1f2b 100644 --- a/go.sum +++ b/go.sum @@ -103,6 +103,8 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczC github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-rendezvous v0.0.0-20200624174652-8d2f3be8b2d9 h1:h2Ul3Ym2iVZWMQGYmulVUJ4LSkBm1erp9mUkPwtMoLg= github.com/dgryski/go-rendezvous v0.0.0-20200624174652-8d2f3be8b2d9/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/dhowden/tag v0.0.0-20200412032933-5d76b8eaae27 h1:Z6xaGRBbqfLR797upHuzQ6w4zg33BLKfAKtVCcmMDgg= +github.com/dhowden/tag v0.0.0-20200412032933-5d76b8eaae27/go.mod h1:SniNVYuaD1jmdEEvi+7ywb1QFR7agjeTdGKyFb0p7Rw= github.com/didip/tollbooth v4.0.2+incompatible h1:fVSa33JzSz0hoh2NxpwZtksAzAgd7zjmGO20HCZtF4M= github.com/didip/tollbooth v4.0.2+incompatible/go.mod h1:A9b0665CE6l1KmzpDws2++elm/CsuWBMa5Jv4WY0PEY= github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= diff --git a/thumbnailing/i/flac.go b/thumbnailing/i/flac.go index 213511cd..17e743b2 100644 --- a/thumbnailing/i/flac.go +++ b/thumbnailing/i/flac.go @@ -7,6 +7,7 @@ import ( "github.com/faiface/beep/flac" "github.com/turt2live/matrix-media-repo/common/rcontext" "github.com/turt2live/matrix-media-repo/thumbnailing/m" + "github.com/turt2live/matrix-media-repo/thumbnailing/u" "github.com/turt2live/matrix-media-repo/util" ) @@ -40,7 +41,7 @@ func (d flacGenerator) GenerateThumbnail(b []byte, contentType string, width int } defer audio.Close() - return mp3Generator{}.GenerateFromStream(audio, format, width, height) + return mp3Generator{}.GenerateFromStream(audio, format, u.GetID3Tags(b), width, height) } func (d flacGenerator) GetAudioData(b []byte, nKeys int, ctx rcontext.RequestContext) (*m.AudioInfo, error) { diff --git a/thumbnailing/i/mp3.go b/thumbnailing/i/mp3.go index 2a9c8eb9..8df89242 100644 --- a/thumbnailing/i/mp3.go +++ b/thumbnailing/i/mp3.go @@ -5,15 +5,21 @@ import ( "errors" "image" "image/color" + "image/draw" "io" "io/ioutil" "math" + "path" + "github.com/dhowden/tag" "github.com/disintegration/imaging" "github.com/faiface/beep" "github.com/faiface/beep/mp3" + "github.com/sirupsen/logrus" + "github.com/turt2live/matrix-media-repo/common/config" "github.com/turt2live/matrix-media-repo/common/rcontext" "github.com/turt2live/matrix-media-repo/thumbnailing/m" + "github.com/turt2live/matrix-media-repo/thumbnailing/u" "github.com/turt2live/matrix-media-repo/util" ) @@ -45,9 +51,9 @@ func (d mp3Generator) GenerateThumbnail(b []byte, contentType string, width int, if err != nil { return nil, err } - defer audio.Close() - return d.GenerateFromStream(audio, format, width, height) + + return d.GenerateFromStream(audio, format, u.GetID3Tags(b), width, height) } func (d mp3Generator) GetAudioData(b []byte, nKeys int, ctx rcontext.RequestContext) (*m.AudioInfo, error) { @@ -98,8 +104,60 @@ func (d mp3Generator) GetDataFromStream(audio beep.StreamSeekCloser, format beep }, nil } -func (d mp3Generator) GenerateFromStream(audio beep.StreamSeekCloser, format beep.Format, width int, height int) (*m.Thumbnail, error) { - info, err := d.GetDataFromStream(audio, format, width) +func (d mp3Generator) GenerateFromStream(audio beep.StreamSeekCloser, format beep.Format, meta tag.Metadata, width int, height int) (*m.Thumbnail, error) { + bgColor := color.RGBA{A: 255, R: 41, G: 57, B: 92} + fgColor := color.RGBA{A: 255, R: 240, G: 240, B: 240} + + img := image.NewRGBA(image.Rect(0, 0, width, height)) + padding := 16 + + sq := int(math.Round(float64(height) * 0.66)) + var artworkImg image.Image + if meta != nil && meta.Picture() != nil { + artwork, _, _ := image.Decode(bytes.NewBuffer(meta.Picture().Data)) + if artwork != nil { + artworkImg, _ = pngGenerator{}.GenerateThumbnailImageOf(artwork, sq, sq, "crop", rcontext.Initial()) + } + } + + ax := sq + ay := sq + + if artworkImg != nil { + ax = artworkImg.Bounds().Max.X + ay = artworkImg.Bounds().Max.Y + } + + dy := (height / 2) - (ay / 2) + dx := padding + ddy := ay + dy + ddx := ax + dx + r := image.Rect(dx, dy, ddx, ddy) + + if artworkImg == nil { + i, _ := ioutil.ReadFile(path.Join(config.Runtime.AssetsPath, "default-artwork.png")) + if i != nil { + tmp, _, _ := image.Decode(bytes.NewBuffer(i)) + if tmp != nil { + artworkImg, _ = pngGenerator{}.GenerateThumbnailImageOf(tmp, ax, ay, "crop", rcontext.Initial()) + } + } + if artworkImg == nil { + logrus.Warn("Falling back to black square for artwork") + tmp := image.NewRGBA(image.Rect(0, 0, ax, ay)) + for x := 0; x < tmp.Bounds().Max.X; x++ { + for y := 0; y < tmp.Bounds().Max.Y; y++ { + tmp.Set(x, y, color.Black) + } + } + artworkImg = tmp + } + } + + draw.Draw(img, r, artworkImg, image.Pt(0, 0), draw.Over) + + waveformX := padding + r.Max.X + info, err := d.GetDataFromStream(audio, format, width-waveformX-padding) if err != nil { return nil, errors.New("beep-visual: error sampling audio: " + err.Error()) } @@ -114,9 +172,7 @@ func (d mp3Generator) GenerateFromStream(audio beep.StreamSeekCloser, format bee averagedSamples = append(averagedSamples, avg) } - // Now that we have samples, generate a plot - img := image.NewRGBA(image.Rect(0, 0, width, height)) - padding := 16 + // Now that we have samples and artwork, generate a plot center := height / 2 for x, s := range averagedSamples { distance := int(math.Round(float64((height-padding)/2) * math.Abs(s))) @@ -127,15 +183,25 @@ func (d mp3Generator) GenerateFromStream(audio beep.StreamSeekCloser, format bee above = false } for y := 0; y < height; y++ { - col := color.RGBA{A: 255, R: 41, G: 57, B: 92} + col := bgColor isWithin := y <= center && y >= px if !above { isWithin = y >= center && y <= px } if isWithin { - col = color.RGBA{A: 255, R: 240, G: 240, B: 240} + col = fgColor + } + img.Set(x+waveformX, y, col) + } + } + + // Fill in the background + for x := 0; x < width; x++ { + for y := 0; y < height; y++ { + c := img.RGBAAt(x, y) + if c.A == 0 { + img.Set(x, y, bgColor) } - img.Set(x, y, col) } } diff --git a/thumbnailing/i/ogg.go b/thumbnailing/i/ogg.go index 18c29d0f..ef2eaba2 100644 --- a/thumbnailing/i/ogg.go +++ b/thumbnailing/i/ogg.go @@ -7,6 +7,7 @@ import ( "github.com/faiface/beep/vorbis" "github.com/turt2live/matrix-media-repo/common/rcontext" "github.com/turt2live/matrix-media-repo/thumbnailing/m" + "github.com/turt2live/matrix-media-repo/thumbnailing/u" "github.com/turt2live/matrix-media-repo/util" ) @@ -40,7 +41,7 @@ func (d oggGenerator) GenerateThumbnail(b []byte, contentType string, width int, } defer audio.Close() - return mp3Generator{}.GenerateFromStream(audio, format, width, height) + return mp3Generator{}.GenerateFromStream(audio, format, u.GetID3Tags(b), width, height) } func (d oggGenerator) GetAudioData(b []byte, nKeys int, ctx rcontext.RequestContext) (*m.AudioInfo, error) { diff --git a/thumbnailing/i/wav.go b/thumbnailing/i/wav.go index 677375fb..7d63b5ab 100644 --- a/thumbnailing/i/wav.go +++ b/thumbnailing/i/wav.go @@ -7,6 +7,7 @@ import ( "github.com/faiface/beep/wav" "github.com/turt2live/matrix-media-repo/common/rcontext" "github.com/turt2live/matrix-media-repo/thumbnailing/m" + "github.com/turt2live/matrix-media-repo/thumbnailing/u" "github.com/turt2live/matrix-media-repo/util" ) @@ -40,7 +41,7 @@ func (d wavGenerator) GenerateThumbnail(b []byte, contentType string, width int, } defer audio.Close() - return mp3Generator{}.GenerateFromStream(audio, format, width, height) + return mp3Generator{}.GenerateFromStream(audio, format, u.GetID3Tags(b), width, height) } func (d wavGenerator) GetAudioData(b []byte, nKeys int, ctx rcontext.RequestContext) (*m.AudioInfo, error) { diff --git a/thumbnailing/u/metadata.go b/thumbnailing/u/metadata.go new file mode 100644 index 00000000..e8245adc --- /dev/null +++ b/thumbnailing/u/metadata.go @@ -0,0 +1,12 @@ +package u + +import ( + "bytes" + + "github.com/dhowden/tag" +) + +func GetID3Tags(b []byte) tag.Metadata { + meta, _ := tag.ReadFrom(bytes.NewReader(b)) + return meta +} -- GitLab