From b537cc0d31f8667b7be6c71b2b341cf289da2eb4 Mon Sep 17 00:00:00 2001 From: Knut Ahlers Date: Sat, 6 Jun 2020 18:25:16 +0200 Subject: [PATCH] Add URL-support for images Signed-off-by: Knut Ahlers --- cmd/streamdeck/display_image.go | 50 ++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/cmd/streamdeck/display_image.go b/cmd/streamdeck/display_image.go index 44011c8..4249678 100644 --- a/cmd/streamdeck/display_image.go +++ b/cmd/streamdeck/display_image.go @@ -2,10 +2,15 @@ package main import ( "context" + "crypto/sha256" + "fmt" "image" _ "image/jpeg" _ "image/png" + "io" + "net/http" "os" + "path" "github.com/pkg/errors" ) @@ -19,7 +24,36 @@ type displayElementImage struct{} func (d displayElementImage) Display(ctx context.Context, idx int, attributes map[string]interface{}) error { filename, ok := attributes["path"].(string) if !ok { - return errors.New("No path attribute specified") + url, ok := attributes["url"].(string) + if !ok { + return errors.New("No path or url attribute specified") + } + + var err error + filename, err = d.getCacheFileName(url) + if err != nil { + return errors.Wrap(err, "Unable to get cache filename for image url") + } + + if _, err := os.Stat(filename); os.IsNotExist(err) { + resp, err := http.Get(url) + if err != nil { + return errors.Wrap(err, "Unable to request image url") + } + defer resp.Body.Close() + + imgFile, err := os.Create(filename) + if err != nil { + return errors.Wrap(err, "Unable to create cache file") + } + + if _, err = io.Copy(imgFile, resp.Body); err != nil { + imgFile.Close() + return errors.Wrap(err, "Unable to download file") + } + + imgFile.Close() + } } f, err := os.Open(filename) @@ -42,3 +76,17 @@ func (d displayElementImage) Display(ctx context.Context, idx int, attributes ma return errors.Wrap(sd.FillImage(idx, img), "Unable to set image") } + +func (d displayElementImage) getCacheFileName(url string) (string, error) { + ucd, err := os.UserCacheDir() + if err != nil { + return "", errors.Wrap(err, "Unable to get user cache dir") + } + + cacheDir := path.Join(ucd, "io.luzifer.streamdeck") + if err = os.MkdirAll(cacheDir, 0750); err != nil { + return "", errors.Wrap(err, "Unable to create cache dir") + } + + return path.Join(cacheDir, fmt.Sprintf("%x", sha256.Sum256([]byte(url)))), nil +}