summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunwox <me@unwox.com>2025-09-04 19:53:35 +0600
committerunwox <me@unwox.com>2025-09-04 19:53:48 +0600
commit828043e05bff1871f31d9786dbf67c1fc9819f48 (patch)
tree55f9637ccfd7f569aa911011473d8c37c0571a60
parent491b557ea67674a9181f013319354e5cf037533a (diff)
add image api module
-rw-r--r--go.mod10
-rw-r--r--go.sum4
-rw-r--r--main.go44
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