Files
CBZOptimizer/converter/webp/webp_provider.go
2024-08-26 22:48:54 -04:00

84 lines
2.0 KiB
Go

package webp
import (
"github.com/nickalie/go-binwrapper"
"github.com/nickalie/go-webpbin"
"image"
"io"
"os"
"path/filepath"
"runtime"
)
const libwebpVersion = "1.4.0"
// NewCWebP creates new CWebP instance.
func newCWebP(folder string) *webpbin.CWebP {
bin := &webpbin.CWebP{
BinWrapper: createBinWrapper(folder),
}
bin.ExecPath("cwebp")
return bin
}
func PrepareEncoder() error {
container := newCWebP(DefaultWebPDir)
return container.BinWrapper.Run()
}
// DefaultWebPDir for downloaded browser. For unix is "$HOME/.cache/webp/bin",
// for Windows it's "%APPDATA%\webp\bin"
var DefaultWebPDir = filepath.Join(map[string]string{
"windows": filepath.Join(os.Getenv("APPDATA")),
"darwin": filepath.Join(os.Getenv("HOME"), ".cache"),
"linux": filepath.Join(os.Getenv("HOME"), ".cache"),
}[runtime.GOOS], "webp", libwebpVersion, "bin")
func Encode(w io.Writer, m image.Image, quality uint) error {
return newCWebP(DefaultWebPDir).
Quality(quality).
InputImage(m).
Output(w).
Run()
}
func createBinWrapper(dest string) *binwrapper.BinWrapper {
base := "https://storage.googleapis.com/downloads.webmproject.org/releases/webp/"
b := binwrapper.NewBinWrapper().AutoExe()
b.Src(
binwrapper.NewSrc().
URL(base + "libwebp-" + libwebpVersion + "-mac-arm64.tar.gz").
Os("darwin").
Arch("arm64")).
Src(
binwrapper.NewSrc().
URL(base + "libwebp-" + libwebpVersion + "-mac-x86-64.tar.gz").
Os("darwin").
Arch("x64")).
Src(
binwrapper.NewSrc().
URL(base + "libwebp-" + libwebpVersion + "-linux-x86-32.tar.gz").
Os("linux").
Arch("x86")).
Src(
binwrapper.NewSrc().
URL(base + "libwebp-" + libwebpVersion + "-linux-x86-64.tar.gz").
Os("linux").
Arch("x64")).
Src(
binwrapper.NewSrc().
URL(base + "libwebp-" + libwebpVersion + "-windows-x64.zip").
Os("win32").
Arch("x64")).
Src(
binwrapper.NewSrc().
URL(base + "libwebp-" + libwebpVersion + "-windows-x86.zip").
Os("win32").
Arch("x86"))
return b.Strip(2).Dest(dest)
}