From a84f0e143613b81acade6505a05a41b4368c8686 Mon Sep 17 00:00:00 2001 From: Thomas von Dein Date: Sat, 27 Jan 2024 17:23:09 +0100 Subject: [PATCH] get rid of duplicate bytes.Buffer, use bytes.Reader instead, #39 --- ad.go | 2 +- config.go | 2 +- image.go | 8 +++++--- scrape.go | 10 ++++++---- store.go | 4 ++-- store_test.go | 5 +++-- util.go | 2 +- 7 files changed, 19 insertions(+), 14 deletions(-) diff --git a/ad.go b/ad.go index 8c8a09b..d6b1c86 100644 --- a/ad.go +++ b/ad.go @@ -1,5 +1,5 @@ /* -Copyright © 2023 Thomas von Dein +Copyright © 2023-2024 Thomas von Dein This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/config.go b/config.go index ee09d6d..14c67dc 100644 --- a/config.go +++ b/config.go @@ -34,7 +34,7 @@ import ( ) const ( - VERSION string = "0.3.2" + VERSION string = "0.3.3" Baseuri string = "https://www.kleinanzeigen.de" Listuri string = "/s-bestandsliste.html" Defaultdir string = "." diff --git a/image.go b/image.go index dd4ae6e..74fae87 100644 --- a/image.go +++ b/image.go @@ -33,7 +33,7 @@ const MaxDistance = 3 type Image struct { Filename string Hash *goimagehash.ImageHash - Data *bytes.Buffer + Data *bytes.Reader URI string } @@ -49,7 +49,7 @@ func (img *Image) LogValue() slog.Value { // holds all images of an ad type Cache []*goimagehash.ImageHash -func NewImage(buf *bytes.Buffer, filename string, uri string) *Image { +func NewImage(buf *bytes.Reader, filename string, uri string) *Image { img := &Image{ Filename: filename, URI: uri, @@ -131,7 +131,9 @@ func ReadImages(addir string, dont bool) (Cache, error) { return nil, err } - img := NewImage(data, filename, "") + reader := bytes.NewReader(data.Bytes()) + + img := NewImage(reader, filename, "") if err = img.CalcHash(); err != nil { return nil, err } diff --git a/scrape.go b/scrape.go index 1f91e42..6073d5e 100644 --- a/scrape.go +++ b/scrape.go @@ -168,14 +168,15 @@ func ScrapeImages(fetch *Fetcher, advertisement *Ad, addir string) error { } buf := new(bytes.Buffer) + _, err = buf.ReadFrom(body) if err != nil { return fmt.Errorf("failed to read from image buffer: %w", err) } - buf2 := buf.Bytes() // needed for image writing + reader := bytes.NewReader(buf.Bytes()) - image := NewImage(buf, file, imguri) + image := NewImage(reader, file, imguri) err = image.CalcHash() if err != nil { return err @@ -189,12 +190,13 @@ func ScrapeImages(fetch *Fetcher, advertisement *Ad, addir string) error { } } - err = WriteImage(file, buf2) + reader.Seek(0, 0) + err = WriteImage(file, reader) if err != nil { return err } - slog.Debug("wrote image", "image", image, "size", len(buf2), "throttle", throttle) + slog.Debug("wrote image", "image", image, "size", buf.Len(), "throttle", throttle) return nil }) diff --git a/store.go b/store.go index 66e6e7d..e3d4e76 100644 --- a/store.go +++ b/store.go @@ -89,14 +89,14 @@ func WriteAd(conf *Config, advertisement *Ad) (string, error) { return addir, nil } -func WriteImage(filename string, buf []byte) error { +func WriteImage(filename string, reader *bytes.Reader) error { file, err := os.Create(filename) if err != nil { return fmt.Errorf("failed to open image file: %w", err) } defer file.Close() - _, err = file.Write(buf) + _, err = reader.WriteTo(file) if err != nil { return fmt.Errorf("failed to write to image file: %w", err) diff --git a/store_test.go b/store_test.go index d870578..50f185a 100644 --- a/store_test.go +++ b/store_test.go @@ -18,6 +18,7 @@ along with this program. If not, see . package main import ( + "bytes" "testing" ) @@ -28,10 +29,10 @@ import ( func TestWriteImage(t *testing.T) { t.Parallel() - buf := []byte{1, 2, 3, 4, 5, 6, 7, 8} + reader := bytes.NewReader([]byte{1, 2, 3, 4, 5, 6, 7, 8}) file := "t/out/t.jpg" - err := WriteImage(file, buf) + err := WriteImage(file, reader) if err != nil { t.Errorf("Could not write mock image to %s: %s", file, err.Error()) } diff --git a/util.go b/util.go index d730f27..a416be2 100644 --- a/util.go +++ b/util.go @@ -1,5 +1,5 @@ /* -Copyright © 2023 Thomas von Dein +Copyright © 2023-2024 Thomas von Dein This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by