GoGronkh/image/image.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.jpg", uname + "-big.jpg", nil
}
out = append(out, name + "-big.jpg")
out = append(out, name + "-small.jpg")
size = append(size, "240x240")
size = append(size, "64x64")
err := ResizeImage(url, out, size)
if err != nil {
<- isem
return "", "", err
}
<- isem
return uname + "-small.jpg", uname + "-big.jpg", 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.jpg", uname + "-big.jpg", nil
}
out = append(out, name + "-big.jpg")
out = append(out, name + "-small.jpg")
size = append(size, "1920x1080")
size = append(size, "265x149")
err := ResizeImage(url, out, size)
if err != nil {
<- isem
return "", "", err
}
<- isem
return uname + "-small.jpg", uname + "-big.jpg", 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.jpg", uname + "-big.jpg", nil
}
out = append(out, name + "-big.jpg")
out = append(out, name + "-small.jpg")
size = append(size, "648x960")
size = append(size, "178x265")
err := ResizeImage(url, out, size)
if err != nil {
<- isem
return "", "", err
}
<- isem
return uname + "-small.jpg", uname + "-big.jpg", 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.jpg", uname + "-big.jpg", nil
}
out = append(out, name + "-big.jpg")
out = append(out, name + "-small.jpg")
size = append(size, "1280x720")
size = append(size, "265x149")
err := ResizeImage(url, out, size)
if err != nil {
<- isem
return "", "", err
}
<- isem
return uname + "-small.jpg", uname + "-big.jpg", 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
}
defer f.Close()
tfile := f.Name()
defer os.Remove(tfile)
_, err = f.Write(blob)
if err != nil {
return err
}
for i := 0; i < len(out); i++ {
cmd := exec.Command("convert", tfile, "-resize", size[i] + "^", "-quality", "70", "-gravity", "center", "-crop", size[i] + "+0+0", "+repage", out[i])
err = cmd.Run()
if err != nil {
return err
}
}
return nil
}