From 828043e05bff1871f31d9786dbf67c1fc9819f48 Mon Sep 17 00:00:00 2001 From: unwox Date: Thu, 4 Sep 2025 19:53:35 +0600 Subject: add image api module --- go.mod | 10 ++++++++-- go.sum | 4 ++++ main.go | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 6d81a5a..ce95343 100644 --- a/go.mod +++ b/go.mod @@ -1,5 +1,11 @@ module luna -go 1.22.2 +go 1.23.0 -require github.com/mattn/go-sqlite3 v1.14.23 +toolchain go1.24.3 + +require ( + github.com/mattn/go-sqlite3 v1.14.23 + github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 + golang.org/x/crypto v0.41.0 +) diff --git a/go.sum b/go.sum index 32531fa..d468e7b 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,6 @@ github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= +golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= +golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= diff --git a/main.go b/main.go index d8614ae..35ed343 100644 --- a/main.go +++ b/main.go @@ -8,6 +8,9 @@ import ( "errors" "flag" "fmt" + "image" + "image/jpeg" + "image/png" "io" "log" "net/http" @@ -21,6 +24,7 @@ import ( "time" _ "github.com/mattn/go-sqlite3" + "github.com/nfnt/resize" ) var debug bool @@ -478,6 +482,45 @@ func main() { return luaOk(l, res) } + imageModule := make(map[string]any) + imageModule["create-thumbnail"] = func (l *Lua) int { + var in, out string + var width int + err := l.Scan(&in, &out, &width) + if err != nil { + return luaErr(l, err) + } + file, err := os.Open(in) + if err != nil { + return luaErr(l, err) + } + defer file.Close() + mimetype, err := mimetype(file) + if err != nil { + return luaErr(l, err) + } + var img image.Image + if mimetype == "image/jpeg" { + img, err = jpeg.Decode(file) + } else if mimetype == "image/png" { + img, err = png.Decode(file) + } else { + return luaErr(l, errors.New("unknown image type: only jpeg and png are supported")) + } + if err != nil { + return luaErr(l, err) + } + resizedImg := resize.Resize(uint(width), 0, img, resize.Lanczos3) + outFile, err := os.Create(out) + if err != nil { + return luaErr(l, err) + } + defer outFile.Close() + jpeg.Encode(outFile, resizedImg, nil) + return luaOk(l, nil) + } + imageModule["createThumbnail"] = imageModule["create-thumbnail"] + cryptoModule := make(map[string]any) cryptoModule["sha1"] = func (l *Lua) int { var str string @@ -496,6 +539,7 @@ func main() { module["db"] = dbModule module["utf8"] = utf8Module module["fs"] = fsModule + module["image"] = imageModule module["crypto"] = cryptoModule module["on-eval"] = func (l *Lua) int { var evalFn LuaRef -- cgit v1.2.3