From d100cebfbe9930b7c736cf90b1be336578df7069 Mon Sep 17 00:00:00 2001 From: Stephen Searles Date: Sat, 24 Jun 2017 00:55:35 -0700 Subject: [PATCH] cleaning up a little bit --- media.go | 153 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 105 insertions(+), 48 deletions(-) diff --git a/media.go b/media.go index d52e902..b8a2de9 100644 --- a/media.go +++ b/media.go @@ -11,6 +11,7 @@ import ( "os" "path" "path/filepath" + "regexp" "strconv" "strings" @@ -26,6 +27,27 @@ func (ms *MediaSource) LocationOrig(m Media) string { return path.Join(ms.StorageDir, m.Name) } +func (ms *MediaSource) ThumbPath(m Media, size image.Rectangle) string { + w := size.Dx() + h := size.Dy() + + var ws, hs string + + if w != 0 { + ws = fmt.Sprint(w) + } + if h != 0 { + hs = fmt.Sprint(h) + } + + thumbSlug := filepath.Join(fmt.Sprintf("%sx%s", ws, hs), m.Name) + return path.Join("/media", thumbSlug) +} + +func (ms *MediaSource) ThumbFilename(m Media, size image.Rectangle) string { + return filepath.Join(ms.ThumbDir, ms.ThumbPath(m, size)) +} + func (ms *MediaSource) receiveNewMedia(name string, r io.Reader) error { dest := path.Join(ms.StorageDir, name) f, err := os.OpenFile(dest, os.O_WRONLY|os.O_CREATE, 0644) @@ -46,21 +68,20 @@ type Media struct { Name string } -func (ms *MediaSource) ThumbMax(m Media, maxDim int) (string, int, int, error) { +func (ms *MediaSource) ThumbMax(m Media, maxDim int) (string, image.Rectangle, error) { f, err := os.Open(ms.LocationOrig(m)) if err != nil { - return "", 0, 0, err + return "", image.ZR, err } defer f.Close() - img, _, err := image.Decode(f) + cfg, _, err := image.DecodeConfig(f) if err != nil { - return "", 0, 0, err + return "", image.ZR, err } - rect := img.Bounds() - width := rect.Dx() - height := rect.Dy() + width := cfg.Width + height := cfg.Height if width > height { height = height * maxDim / width @@ -70,8 +91,28 @@ func (ms *MediaSource) ThumbMax(m Media, maxDim int) (string, int, int, error) { height = maxDim } - src, err := ms.ThumbImage(img, m, width, height) - return src, width, height, err + size := image.Rect(0, 0, width, height) + if ms.HasThumb(m, size) { + return ms.ThumbPath(m, size), size, nil + } + + _, err = f.Seek(0, io.SeekStart) + if err != nil { + return "", image.ZR, err + } + + img, _, err := image.Decode(f) + if err != nil { + return "", image.ZR, err + } + + src, err := ms.ThumbImage(img, m, size) + return src, size, err +} + +func (ms *MediaSource) HasThumb(m Media, size image.Rectangle) bool { + _, err := os.Stat(ms.ThumbFilename(m, size)) + return err == nil } func (ms *MediaSource) ByName(name string) *Media { @@ -81,7 +122,11 @@ func (ms *MediaSource) ByName(name string) *Media { } } -func (ms *MediaSource) Thumb(m Media, width, height int) (string, error) { +func (ms *MediaSource) Thumb(m Media, size image.Rectangle) (string, error) { + if ms.HasThumb(m, size) { + return ms.ThumbPath(m, size), nil + } + f, err := os.Open(ms.LocationOrig(m)) if err != nil { return "", err @@ -93,21 +138,19 @@ func (ms *MediaSource) Thumb(m Media, width, height int) (string, error) { return "", err } - return ms.ThumbImage(img, m, width, height) + return ms.ThumbImage(img, m, size) } -func (ms *MediaSource) ThumbImage(img image.Image, m Media, width, height int) (string, error) { - - thumbSlug := filepath.Join(m.Name, fmt.Sprintf("%d/%d.jpg", width, height)) - thumbLoc := filepath.Join(ms.ThumbDir, thumbSlug) +func (ms *MediaSource) ThumbImage(img image.Image, m Media, size image.Rectangle) (string, error) { + thumbLoc := ms.ThumbFilename(m, size) os.MkdirAll(path.Dir(thumbLoc), 0755) fthumb, err := os.OpenFile(thumbLoc, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0655) if err != nil { return "", err } - img = resize.Resize(uint(width), uint(height), img, resize.Bilinear) + img = resize.Resize(uint(size.Dx()), uint(size.Dy()), img, resize.Bilinear) err = jpeg.Encode(fthumb, img, nil) if err != nil { @@ -119,7 +162,7 @@ func (ms *MediaSource) ThumbImage(img image.Image, m Media, width, height int) ( return "", err } - return path.Join("/media", thumbSlug), nil + return ms.ThumbPath(m, size), nil } func (ms *MediaSource) Walk() ([]*Media, error) { @@ -197,12 +240,12 @@ func (ch *CaddyHugo) serveMediaPage(w http.ResponseWriter, r *http.Request) (int for _, m := range media { - src, width, height, err := ch.Media.ThumbMax(*m, 100) + src, size, err := ch.Media.ThumbMax(*m, 100) if err != nil { fmt.Fprintf(w, `
error rendering %q: %v
`, m.Name, err) continue } - fmt.Fprintf(w, `

📋
`, width, height, src, src) + fmt.Fprintf(w, `

📋
`, size.Dx(), size.Dy(), src, src) } } io.WriteString(w, `