voidwalker/compression/compression.go
2023-05-30 18:17:46 +02:00

55 lines
1.4 KiB
Go

package compression
import (
"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 := os.ReadFile(path)
if err != nil {
return "", "", errors.Err(err)
}
switch mimeType {
case "image/gif":
converter := giftowebp.NewConverter()
converter.LoopCompatibility = false
if len(file) > 500*1024 {
converter.WebPConfig.SetTargetSize(500 * 1024)
} else {
converter.WebPConfig.SetTargetSize(len(file))
}
converter.WebPConfig.SetMethod(4)
webpBin, err := converter.Convert(file)
if err != nil {
return "", "", errors.Err(err)
}
compressedPath := filepath.Join(storePath, fileName+".webp")
err = os.WriteFile(compressedPath, webpBin, 0600)
if err != nil {
return "", "", errors.Err(err)
}
//err = os.Remove(path)
return fileName + ".webp", mime.TypeByExtension(".webp"), nil
case mime.TypeByExtension("png"):
case mime.TypeByExtension("jpeg"):
case mime.TypeByExtension("jpg"):
}
return "", "", UnsupportedErr
}