From 0f2ac430ceebeaa9ed9ca46de9c8ce069d81ee00 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Else Date: Tue, 21 Jul 2020 21:40:39 +0200 Subject: [PATCH] Simplify image compression --- go.mod | 1 - go.sum | 2 - imagecompression.go | 93 ++++++++++++++++++++++++++++++++++++++------- 3 files changed, 79 insertions(+), 17 deletions(-) diff --git a/go.mod b/go.mod index 429e5ae..949edeb 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,6 @@ module git.jlel.se/jlelse/hugo-micropub go 1.14 require ( - codeberg.org/jlelse/tinify v0.0.0-20200123222407-7fc9c21822b0 github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect github.com/gliderlabs/ssh v0.3.0 // indirect github.com/go-git/go-git/v5 v5.1.0 diff --git a/go.sum b/go.sum index 47fb773..8433bcf 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,3 @@ -codeberg.org/jlelse/tinify v0.0.0-20200123222407-7fc9c21822b0 h1:pJX79kTd01NtxEnzhfd4OU2SY9fquKVoO47DUeNKe+8= -codeberg.org/jlelse/tinify v0.0.0-20200123222407-7fc9c21822b0/go.mod h1:X6cM4Sn0aL/4VQ/ku11yxmiV0WIk5XAaYEPHQLQjFFM= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= diff --git a/imagecompression.go b/imagecompression.go index 3471bca..e0539a0 100644 --- a/imagecompression.go +++ b/imagecompression.go @@ -1,13 +1,15 @@ package main import ( + "bytes" + "encoding/json" "errors" + "io" "io/ioutil" + "net/http" "os" "sort" "strings" - - tfgo "codeberg.org/jlelse/tinify" ) type ImageCompression interface { @@ -32,32 +34,27 @@ func (t *Tinify) Compress(url string) (location string, err error) { err = errors.New("file not supported") return } - tfgo.SetKey(t.key) - s, e := tfgo.FromUrl(url) + // Shrink + shrinkedUrl, e := t.shrink(url) if e != nil { err = errors.New("failed to compress file") return } - e = s.Resize(&tfgo.ResizeOption{ - Method: tfgo.ResizeMethodScale, - Width: 2000, - }) - if e != nil { - err = errors.New("failed to resize file") - return - } + // Create temp file file, e := ioutil.TempFile("", "tiny-*."+fileExtension) if e != nil { err = errors.New("failed to create temporary file") return } defer func() { + // Cleanup _ = file.Close() _ = os.Remove(file.Name()) }() - e = s.ToFile(file.Name()) + // Resize and download image + e = t.resize(shrinkedUrl, file) if e != nil { - err = errors.New("failed to save compressed file") + err = errors.New("failed to resize file or save compressed file") return } hashFile, e := os.Open(file.Name()) @@ -73,3 +70,71 @@ func (t *Tinify) Compress(url string) (location string, err error) { location, err = SelectedMediaStorage.Upload(fileName+"."+fileExtension, file) return } + +func (t *Tinify) shrink(source string) (string, error) { + type Source struct { + Url string `json:"url"` + } + data := struct { + Source Source `json:"source"` + }{ + Source: Source{ + Url: source, + }, + } + body := new(bytes.Buffer) + err := json.NewEncoder(body).Encode(data) + if err != nil { + return "", err + } + req, err := http.NewRequest("POST", "https://api.tinify.com/shrink", body) + if err != nil { + return "", err + } + req.SetBasicAuth("api", t.key) + req.Header.Set("Content-Type", "application/json") + resp, err := http.DefaultClient.Do(req) + if err != nil { + return "", err + } + if resp.StatusCode != 201 { + return "", errors.New("not 201 response code") + } + return resp.Header.Get("Location"), nil +} + +func (t *Tinify) resize(output string, file *os.File) error { + type Resize struct { + Method string `json:"method"` + Width int `json:"width"` + } + data := struct { + Resize Resize `json:"resize"` + }{ + Resize: Resize{ + Method: "scale", + Width: 2000, + }, + } + body := new(bytes.Buffer) + err := json.NewEncoder(body).Encode(data) + if err != nil { + return err + } + req, err := http.NewRequest("POST", output, body) + if err != nil { + return err + } + req.SetBasicAuth("api", t.key) + req.Header.Set("Content-Type", "application/json") + resp, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + if resp.StatusCode != 200 { + return errors.New("not 201 response code") + } + defer resp.Body.Close() + _, err = io.Copy(file, resp.Body) + return err +}