167 lines
4.4 KiB
Go
167 lines
4.4 KiB
Go
package image
|
|
|
|
import (
|
|
"crypto/md5"
|
|
"encoding/hex"
|
|
"errors"
|
|
"io/ioutil"
|
|
"log"
|
|
"os"
|
|
"os/exec"
|
|
|
|
"git.1750studios.com/gronkhDE/gogronkh/config"
|
|
)
|
|
|
|
var isem = make(chan byte, 5)
|
|
|
|
func ImageNameGenerator(url string) (string, string, bool) {
|
|
urlBytes := []byte(url)
|
|
md5Bytes := md5.Sum(urlBytes)
|
|
hash := hex.EncodeToString(md5Bytes[:])
|
|
folders := config.C.ImageDirectory + hash[0:2] + "/" + hash[0:4] + "/"
|
|
urls := config.C.ImageWebDirectory + hash[0:2] + "/" + hash[0:4] + "/"
|
|
if err := os.MkdirAll(folders, 0775); err != nil {
|
|
log.Fatalf("FAT Could not create ImageDirectory, error: %+v", err)
|
|
}
|
|
finalExists := true
|
|
if _, err := os.Stat(folders + hash); os.IsNotExist(err) {
|
|
finalExists = false
|
|
}
|
|
finalPath := folders + hash
|
|
finalUrl := urls + hash
|
|
return finalPath, finalUrl, finalExists
|
|
}
|
|
|
|
func ResizeAvatar(url string) (string, string, error) {
|
|
isem <- 1
|
|
var out []string
|
|
var size []string
|
|
var name string
|
|
var uname string
|
|
var exists bool
|
|
if name, uname, exists = ImageNameGenerator(url); exists == true {
|
|
<- isem
|
|
return uname + "-small.png", uname + "-big.png", nil
|
|
}
|
|
out = append(out, name + "-big.png")
|
|
out = append(out, name + "-small.png")
|
|
size = append(size, "240x240")
|
|
size = append(size, "64x64")
|
|
err := ResizeImage(url, out, size)
|
|
if err != nil {
|
|
<- isem
|
|
return "", "", err
|
|
}
|
|
<- isem
|
|
return uname + "-small.png", uname + "-big.png", err
|
|
}
|
|
|
|
func ResizeFanArt(url string) (string, string, error) {
|
|
isem <- 1
|
|
var out []string
|
|
var size []string
|
|
var name string
|
|
var uname string
|
|
var exists bool
|
|
if name, uname, exists = ImageNameGenerator(url); exists == true {
|
|
<- isem
|
|
return uname + "-small.png", uname + "-big.png", nil
|
|
}
|
|
out = append(out, name + "-big.png")
|
|
out = append(out, name + "-small.png")
|
|
size = append(size, "1920x1080")
|
|
size = append(size, "640x360")
|
|
err := ResizeImage(url, out, size)
|
|
if err != nil {
|
|
<- isem
|
|
return "", "", err
|
|
}
|
|
<- isem
|
|
return uname + "-small.png", uname + "-big.png", err
|
|
}
|
|
|
|
func ResizeCover(url string) (string, string, error) {
|
|
isem <- 1
|
|
var out []string
|
|
var size []string
|
|
var name string
|
|
var uname string
|
|
var exists bool
|
|
if name, uname, exists = ImageNameGenerator(url); exists == true {
|
|
<- isem
|
|
return uname + "-small.png", uname + "-big.png", nil
|
|
}
|
|
out = append(out, name + "-big.png")
|
|
out = append(out, name + "-small.png")
|
|
size = append(size, "600x846")
|
|
size = append(size, "260x366")
|
|
err := ResizeImage(url, out, size)
|
|
if err != nil {
|
|
<- isem
|
|
return "", "", err
|
|
}
|
|
<- isem
|
|
return uname + "-small.png", uname + "-big.png", err
|
|
}
|
|
|
|
func ResizeThumb(url string) (string, string, error) {
|
|
isem <- 1
|
|
var out []string
|
|
var size []string
|
|
var name string
|
|
var uname string
|
|
var exists bool
|
|
if name, uname, exists = ImageNameGenerator(url); exists == true {
|
|
<- isem
|
|
return uname + "-small.png", uname + "-big.png", nil
|
|
}
|
|
out = append(out, name + "-big.png")
|
|
out = append(out, name + "-small.png")
|
|
size = append(size, "1280x720")
|
|
size = append(size, "640x360")
|
|
err := ResizeImage(url, out, size)
|
|
if err != nil {
|
|
<- isem
|
|
return "", "", err
|
|
}
|
|
<- isem
|
|
return uname + "-small.png", uname + "-big.png", err
|
|
}
|
|
|
|
func ResizeImage(url string, out []string, size []string) (error) {
|
|
res, err := GetHTTPResource(url)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if res == nil {
|
|
return errors.New("404")
|
|
}
|
|
defer res.Body.Close()
|
|
blob, err := ioutil.ReadAll(res.Body)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if len(blob) == 0 {
|
|
return errors.New("Empty response")
|
|
}
|
|
f, erro := ioutil.TempFile("", "dl-")
|
|
if erro != nil {
|
|
return erro
|
|
}
|
|
tfile := f.Name()
|
|
_, err = f.Write(blob)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
f.Close()
|
|
for i := 0; i < len(out); i++ {
|
|
cmd := exec.Command("convert", tfile, "-resize", size[i] + "^", "-interlace", "PNG", "-colors", "255", "-gravity", "center", "-crop", size[i] + "+0+0", "+repage", "PNG8:" + out[i])
|
|
err = cmd.Run()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
os.Remove(tfile)
|
|
return nil
|
|
}
|