voidwalker/compression/compression.go
Niko Storni 2dc0db7210 add compression for gifs
add database backend
2020-06-16 05:37:51 +02:00

53 lines
1.4 KiB
Go

package compression
import (
"io/ioutil"
"mime"
"os"
"path/filepath"
"github.com/lbryio/lbry.go/v2/extras/errors"
giftowebp "github.com/sizeofint/gif-to-webp"
"go.uber.org/atomic"
)
var inUse atomic.Bool
var AlreadyInUseErr = errors.Base("already busy compressing")
var UnsupportedErr = errors.Base("unsupported compression")
// returns a compressedPath, a mimeType or an error
func Compress(path, fileName, mimeType, storePath string) (string, string, error) {
swapped := inUse.CAS(false, true)
if !swapped {
return "", "", AlreadyInUseErr
}
defer inUse.Store(false)
file, err := ioutil.ReadFile(path)
if err != nil {
return "", "", errors.Err(err)
}
switch mimeType {
case "image/gif":
converter := giftowebp.NewConverter()
converter.LoopCompatibility = false
converter.WebPConfig.SetTargetSize(500 * 1024)
converter.WebPConfig.SetMethod(2)
webpBin, err := converter.Convert(file)
if err != nil {
return "", "", errors.Err(err)
}
compressedPath := filepath.Join(storePath, fileName+".webp")
err = ioutil.WriteFile(compressedPath, webpBin, 0600)
if err != nil {
return "", "", errors.Err(err)
}
err = os.Remove(path)
return fileName + ".webp", mime.TypeByExtension(".webp"), errors.Err(err)
case mime.TypeByExtension("png"):
case mime.TypeByExtension("jpeg"):
case mime.TypeByExtension("jpg"):
}
return "", "", UnsupportedErr
}