75 lines
1.6 KiB
Go
75 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
tfgo "codeberg.org/jlelse/tinify"
|
|
"errors"
|
|
"io/ioutil"
|
|
"os"
|
|
"sort"
|
|
"strings"
|
|
)
|
|
|
|
type ImageCompression interface {
|
|
Compress(url string) (location string, err error)
|
|
}
|
|
|
|
// Tinify
|
|
type Tinify struct {
|
|
// API Key
|
|
key string
|
|
}
|
|
|
|
func (t *Tinify) Compress(url string) (location string, err error) {
|
|
fileExtension := func() string {
|
|
spliced := strings.Split(url, ".")
|
|
return spliced[len(spliced)-1]
|
|
}()
|
|
supportedTypes := []string{"jpg", "jpeg", "png"}
|
|
sort.Strings(supportedTypes)
|
|
i := sort.SearchStrings(supportedTypes, strings.ToLower(fileExtension))
|
|
if !(i < len(supportedTypes) && supportedTypes[i] == strings.ToLower(fileExtension)) {
|
|
err = errors.New("file not supported")
|
|
return
|
|
}
|
|
tfgo.SetKey(t.key)
|
|
s, e := tfgo.FromUrl(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
|
|
}
|
|
file, e := ioutil.TempFile("", "tiny-*."+fileExtension)
|
|
if e != nil {
|
|
err = errors.New("failed to create temporary file")
|
|
return
|
|
}
|
|
defer func() {
|
|
_ = file.Close()
|
|
_ = os.Remove(file.Name())
|
|
}()
|
|
e = s.ToFile(file.Name())
|
|
if e != nil {
|
|
err = errors.New("failed to save compressed file")
|
|
return
|
|
}
|
|
hashFile, e := os.Open(file.Name())
|
|
defer func() { _ = hashFile.Close() }()
|
|
if e != nil {
|
|
err = errors.New("failed to open temporary file")
|
|
return
|
|
}
|
|
fileName, err := getSHA256(hashFile)
|
|
if err != nil {
|
|
return
|
|
}
|
|
location, err = SelectedMediaStorage.Upload(fileName+"."+fileExtension, file)
|
|
return
|
|
}
|