Compare commits

..

5 Commits

Author SHA1 Message Date
bfcb4f5e43 check seek error 2024-01-27 17:26:17 +01:00
5728c1eab3 get rid of duplicate bytes.Buffer, use bytes.Reader instead, #39 2024-01-27 17:23:09 +01:00
e092ce7b8e fix #58: add missing dashes to self issue template 2024-01-27 16:58:58 +01:00
8950185307 correct #39 add --ignoreerrors flag 2024-01-27 16:57:17 +01:00
T.v.Dein
14f8c3fd43 Fix/linter (#66)
* added lint targets
* fix linter errors
* enhance error handling
* !!BREAKING!! rename Id to ID in tpls
2024-01-25 19:04:15 +01:00
8 changed files with 25 additions and 14 deletions

View File

@@ -5,3 +5,4 @@ title: "[bug-report]"
labels: bug labels: bug
assignees: TLINDEN assignees: TLINDEN
---

2
ad.go
View File

@@ -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 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 it under the terms of the GNU General Public License as published by

View File

@@ -34,7 +34,7 @@ import (
) )
const ( const (
VERSION string = "0.3.2" VERSION string = "0.3.3"
Baseuri string = "https://www.kleinanzeigen.de" Baseuri string = "https://www.kleinanzeigen.de"
Listuri string = "/s-bestandsliste.html" Listuri string = "/s-bestandsliste.html"
Defaultdir string = "." Defaultdir string = "."
@@ -153,6 +153,7 @@ func InitConfig(output io.Writer) (*Config, error) {
flagset.BoolP("help", "h", false, "show usage") flagset.BoolP("help", "h", false, "show usage")
flagset.BoolP("manual", "m", false, "show manual") flagset.BoolP("manual", "m", false, "show manual")
flagset.BoolP("force", "f", false, "force") flagset.BoolP("force", "f", false, "force")
flagset.BoolP("ignoreerrors", "", false, "ignore image download HTTP errors")
if err := flagset.Parse(os.Args[1:]); err != nil { if err := flagset.Parse(os.Args[1:]); err != nil {
return nil, fmt.Errorf("failed to parse program arguments: %w", err) return nil, fmt.Errorf("failed to parse program arguments: %w", err)

View File

@@ -33,7 +33,7 @@ const MaxDistance = 3
type Image struct { type Image struct {
Filename string Filename string
Hash *goimagehash.ImageHash Hash *goimagehash.ImageHash
Data *bytes.Buffer Data *bytes.Reader
URI string URI string
} }
@@ -49,7 +49,7 @@ func (img *Image) LogValue() slog.Value {
// holds all images of an ad // holds all images of an ad
type Cache []*goimagehash.ImageHash 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{ img := &Image{
Filename: filename, Filename: filename,
URI: uri, URI: uri,
@@ -131,7 +131,9 @@ func ReadImages(addir string, dont bool) (Cache, error) {
return nil, err return nil, err
} }
img := NewImage(data, filename, "") reader := bytes.NewReader(data.Bytes())
img := NewImage(reader, filename, "")
if err = img.CalcHash(); err != nil { if err = img.CalcHash(); err != nil {
return nil, err return nil, err
} }

View File

@@ -168,14 +168,15 @@ func ScrapeImages(fetch *Fetcher, advertisement *Ad, addir string) error {
} }
buf := new(bytes.Buffer) buf := new(bytes.Buffer)
_, err = buf.ReadFrom(body) _, err = buf.ReadFrom(body)
if err != nil { if err != nil {
return fmt.Errorf("failed to read from image buffer: %w", err) 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() err = image.CalcHash()
if err != nil { if err != nil {
return err return err
@@ -189,12 +190,17 @@ func ScrapeImages(fetch *Fetcher, advertisement *Ad, addir string) error {
} }
} }
err = WriteImage(file, buf2) _, err = reader.Seek(0, 0)
if err != nil {
return fmt.Errorf("failed to seek(0) on image reader: %w", err)
}
err = WriteImage(file, reader)
if err != nil { if err != nil {
return err 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 return nil
}) })

View File

@@ -89,14 +89,14 @@ func WriteAd(conf *Config, advertisement *Ad) (string, error) {
return addir, nil return addir, nil
} }
func WriteImage(filename string, buf []byte) error { func WriteImage(filename string, reader *bytes.Reader) error {
file, err := os.Create(filename) file, err := os.Create(filename)
if err != nil { if err != nil {
return fmt.Errorf("failed to open image file: %w", err) return fmt.Errorf("failed to open image file: %w", err)
} }
defer file.Close() defer file.Close()
_, err = file.Write(buf) _, err = reader.WriteTo(file)
if err != nil { if err != nil {
return fmt.Errorf("failed to write to image file: %w", err) return fmt.Errorf("failed to write to image file: %w", err)

View File

@@ -18,6 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package main package main
import ( import (
"bytes"
"testing" "testing"
) )
@@ -28,10 +29,10 @@ import (
func TestWriteImage(t *testing.T) { func TestWriteImage(t *testing.T) {
t.Parallel() 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" file := "t/out/t.jpg"
err := WriteImage(file, buf) err := WriteImage(file, reader)
if err != nil { if err != nil {
t.Errorf("Could not write mock image to %s: %s", file, err.Error()) t.Errorf("Could not write mock image to %s: %s", file, err.Error())
} }

View File

@@ -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 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 it under the terms of the GNU General Public License as published by