From 5f096e52a4d84550cb08004908b718b6725de3f2 Mon Sep 17 00:00:00 2001 From: mappu Date: Fri, 18 Nov 2016 20:02:22 +1300 Subject: [PATCH] rewrite extension handling, initial video support --- Thumbnailer.go | 36 ++++++++++++++++++++++++------------ video.go | 25 ++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 13 deletions(-) diff --git a/Thumbnailer.go b/Thumbnailer.go index d649a3b..475ab63 100644 --- a/Thumbnailer.go +++ b/Thumbnailer.go @@ -60,22 +60,34 @@ func (this *Thumbnailer) RenderFile_NoCache(absPath string) ([]byte, error) { defer fh.Close() - var src image.Image - err = fmt.Errorf("No thumbnailer for file type") + if len(absPath) < 4 { + return nil, fmt.Errorf("No extension on filename") + } + extension := strings.ToLower(absPath[len(absPath)-4:]) - comparePath := strings.ToLower(absPath) + switch extension { + case ".jpg", "jpeg": + src, err := jpeg.Decode(fh) + if err != nil { + return nil, err + } - if strings.HasSuffix(comparePath, "jpg") { - src, err = jpeg.Decode(fh) + return this.RenderScaledImage(src) - } else if strings.HasSuffix(comparePath, "png") { - src, err = png.Decode(fh) + case ".png": + src, err := png.Decode(fh) + if err != nil { + return nil, err + } + + return this.RenderScaledImage(src) + + case ".avi", ".mkv", ".mp4", ".ogm", ".wmv": + return this.RenderScaledFfmpeg(absPath) + + default: + return nil, fmt.Errorf("No thumbnailer for file type") } - if err != nil { - return nil, err - } - - return this.RenderScaledImage(src) } diff --git a/video.go b/video.go index e75b457..8ed2fc3 100644 --- a/video.go +++ b/video.go @@ -1,6 +1,8 @@ package thumbnail import ( + "bytes" + "io" "os/exec" ) @@ -18,5 +20,26 @@ func (this *Thumbnailer) RenderScaledFfmpeg(absPath string) ([]byte, error) { "-", ) - cmd.StdoutPipe() + stdout, err := cmd.StdoutPipe() + if err != nil { + return nil, err + } + + err = cmd.Start() + if err != nil { + return nil, err + } + + out := bytes.Buffer{} + _, err = io.Copy(&out, stdout) + if err != nil { + return nil, err + } + + err = cmd.Wait() + if err != nil { + return nil, err + } + + return out.Bytes(), nil }