parent
a16ff13970
commit
50f50ac0ab
|
@ -0,0 +1,173 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"git.tuxpa.in/a/nori/renderer"
|
||||||
|
"gitlab.com/gfxlabs/gfximg/apng"
|
||||||
|
"golang.org/x/sync/errgroup"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"git.tuxpa.in/a/nori"
|
||||||
|
"git.tuxpa.in/a/nori/utils"
|
||||||
|
"git.tuxpa.in/a/zlog/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
dumpPtr = flag.Bool("d", false, "dump nri file to zip")
|
||||||
|
silentPtr = flag.Bool("s", false, "silent")
|
||||||
|
bulkDumpPtr = flag.Bool("b", false, "bulk dump nris from a folder")
|
||||||
|
jsonDumpPtr = flag.Bool("j", false, "bulk dump nri animation names from a folder")
|
||||||
|
directoryPtr = flag.String("dir", "nri", "directory to bulk dump from")
|
||||||
|
destinationPtr = flag.String("dest", "", "directory to bulk dump to")
|
||||||
|
filePtr = flag.String("f", "example.nri", "file to load")
|
||||||
|
outputPtr = flag.String("o", "output.zip", "output zip file")
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
flag.Parse()
|
||||||
|
if *dumpPtr {
|
||||||
|
filename := *filePtr
|
||||||
|
output := *outputPtr
|
||||||
|
if _, err := os.Stat(filename); err != nil {
|
||||||
|
printIf("could not find file %s\n", filename)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
dump(filename, output)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
dir := *directoryPtr
|
||||||
|
dest := *destinationPtr
|
||||||
|
if dest == "" {
|
||||||
|
dest = dir
|
||||||
|
}
|
||||||
|
printIf("output: %s\n", dest)
|
||||||
|
if *bulkDumpPtr || *jsonDumpPtr {
|
||||||
|
files, err := ioutil.ReadDir(dir)
|
||||||
|
if err != nil {
|
||||||
|
printIf("%s: %s\n", dir, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
egg := errgroup.Group{}
|
||||||
|
egg.SetLimit(12)
|
||||||
|
for _, ff := range files {
|
||||||
|
f := ff
|
||||||
|
if strings.HasSuffix(f.Name(), ".nri") {
|
||||||
|
egg.Go(func() error {
|
||||||
|
if *bulkDumpPtr {
|
||||||
|
dump_nozip(dir+"/"+f.Name(), dest)
|
||||||
|
}
|
||||||
|
if *jsonDumpPtr {
|
||||||
|
dump_anim_json(dir+"/"+f.Name(), dest)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err := egg.Wait(); err != nil {
|
||||||
|
log.Panicf("oh fuck: %s\n", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
flag.PrintDefaults()
|
||||||
|
}
|
||||||
|
|
||||||
|
func printIf(s string, args ...interface{}) {
|
||||||
|
if !*silentPtr {
|
||||||
|
fmt.Printf(s, args...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func dump_anim_json(filename string, destination string) {
|
||||||
|
start := time.Now()
|
||||||
|
printIf("reading file '%s'\n", filename)
|
||||||
|
n, err := nori.FromFile(filename)
|
||||||
|
if err != nil {
|
||||||
|
log.Panicln("decode: %s", err)
|
||||||
|
}
|
||||||
|
names, err := nori.GetAnimationNames(n)
|
||||||
|
if err != nil {
|
||||||
|
log.Panicln("animation: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
json, err := json.Marshal(names)
|
||||||
|
if err != nil {
|
||||||
|
log.Panicln("could not marshal json: %s\n", err)
|
||||||
|
}
|
||||||
|
baseName := filepath.Base(strings.TrimSuffix(filename, filepath.Ext(filename)))
|
||||||
|
output := fmt.Sprintf("%s/%s.json", destination, baseName)
|
||||||
|
f, fErr := os.OpenFile(output, os.O_CREATE, 0740)
|
||||||
|
if fErr != nil {
|
||||||
|
panic(fErr)
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
if _, err := f.Write(json); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
printIf("done in %v \n", time.Now().Sub(start))
|
||||||
|
}
|
||||||
|
|
||||||
|
func dump_nozip(filename string, destination string) {
|
||||||
|
start := time.Now()
|
||||||
|
printIf("reading file '%s'\n", filename)
|
||||||
|
n, err := nori.FromFile(filename)
|
||||||
|
if err != nil {
|
||||||
|
log.Panicln("decode: %s", err)
|
||||||
|
}
|
||||||
|
// printIf("rendering %d animation(s)\n", n.AnimationCount)
|
||||||
|
animations, err := renderer.RenderAnimationsApng(n)
|
||||||
|
if err != nil {
|
||||||
|
log.Panicln("animation: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
baseName := filepath.Base(strings.TrimSuffix(filename, filepath.Ext(filename)))
|
||||||
|
for i, v := range animations {
|
||||||
|
output := fmt.Sprintf(destination+"/%s_%d.png", baseName, i)
|
||||||
|
// printIf("saving to %s \n", output)
|
||||||
|
f, fErr := os.OpenFile(output, os.O_CREATE, 0740)
|
||||||
|
if fErr != nil {
|
||||||
|
panic(fErr)
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
if err := apng.Encode(f, *v); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
//if err := utils.ZipApngs(out, animations); err != nil {
|
||||||
|
// log.Panicln("zipping: %s", err)
|
||||||
|
//}
|
||||||
|
printIf("done in %v \n", time.Now().Sub(start))
|
||||||
|
//os.WriteFile(output, out.Bytes(), 0740)
|
||||||
|
}
|
||||||
|
|
||||||
|
func dump(filename string, output string) {
|
||||||
|
start := time.Now()
|
||||||
|
printIf("reading file '%s'\n", filename)
|
||||||
|
n, err := nori.FromFile(filename)
|
||||||
|
if err != nil {
|
||||||
|
log.Panicln("decode: %s", err)
|
||||||
|
}
|
||||||
|
out := new(bytes.Buffer)
|
||||||
|
printIf("rendering %d animation(s)\n", n.AnimationCount)
|
||||||
|
animations, err := renderer.RenderAnimationsApng(n)
|
||||||
|
if err != nil {
|
||||||
|
log.Panicln("animation: %s", err)
|
||||||
|
}
|
||||||
|
printIf("saving to %s \n", output)
|
||||||
|
if err := utils.ZipApngs(out, animations); err != nil {
|
||||||
|
log.Panicln("zipping: %s", err)
|
||||||
|
}
|
||||||
|
printIf("done in %v \n", time.Now().Sub(start))
|
||||||
|
os.WriteFile(output, out.Bytes(), 0740)
|
||||||
|
}
|
17
decode.go
17
decode.go
|
@ -1,6 +1,9 @@
|
||||||
package nori
|
package nori
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"github.com/suapapa/go_hangul/encoding/cp949"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
@ -23,3 +26,17 @@ func Decode(r io.Reader) (*Nori, error) {
|
||||||
err := nori.Decode(r)
|
err := nori.Decode(r)
|
||||||
return nori, err
|
return nori, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetAnimationNames(n *Nori) (map[string]int, error) {
|
||||||
|
names := make(map[string]int, n.AnimationCount)
|
||||||
|
for i := range n.Animations {
|
||||||
|
anim := n.Animations[i]
|
||||||
|
title, codepageError := cp949.From(anim.Title[:])
|
||||||
|
if codepageError != nil {
|
||||||
|
return nil, fmt.Errorf("couldn't convert title of animation %d", i)
|
||||||
|
}
|
||||||
|
cleanTitle := string(bytes.SplitN(title[:], []byte{0}, 2)[0])
|
||||||
|
names[cleanTitle] = i
|
||||||
|
}
|
||||||
|
return names, nil
|
||||||
|
}
|
||||||
|
|
2
go.mod
2
go.mod
|
@ -7,6 +7,7 @@ require (
|
||||||
github.com/disintegration/imaging v1.6.2
|
github.com/disintegration/imaging v1.6.2
|
||||||
github.com/go-chi/chi/v5 v5.0.7
|
github.com/go-chi/chi/v5 v5.0.7
|
||||||
github.com/phrozen/blend v0.0.0-20210220204729-f26b6cf7a28e
|
github.com/phrozen/blend v0.0.0-20210220204729-f26b6cf7a28e
|
||||||
|
github.com/suapapa/go_hangul v1.2.1
|
||||||
gitlab.com/gfxlabs/gfximg v0.0.5
|
gitlab.com/gfxlabs/gfximg v0.0.5
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -14,5 +15,6 @@ require (
|
||||||
github.com/mattn/go-colorable v0.1.12 // indirect
|
github.com/mattn/go-colorable v0.1.12 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.14 // indirect
|
github.com/mattn/go-isatty v0.0.14 // indirect
|
||||||
golang.org/x/image v0.0.0-20211028202545-6944b10bf410 // indirect
|
golang.org/x/image v0.0.0-20211028202545-6944b10bf410 // indirect
|
||||||
|
golang.org/x/sync v0.1.0 // indirect
|
||||||
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 // indirect
|
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 // indirect
|
||||||
)
|
)
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -14,11 +14,15 @@ github.com/phrozen/blend v0.0.0-20210220204729-f26b6cf7a28e h1:r8tWFp1HMiodzOwFt
|
||||||
github.com/phrozen/blend v0.0.0-20210220204729-f26b6cf7a28e/go.mod h1:8LjAsvtcQgvNmMQZ/iSuduOKYgRA37KcsgPg8ZC6Krc=
|
github.com/phrozen/blend v0.0.0-20210220204729-f26b6cf7a28e/go.mod h1:8LjAsvtcQgvNmMQZ/iSuduOKYgRA37KcsgPg8ZC6Krc=
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
|
github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
|
||||||
|
github.com/suapapa/go_hangul v1.2.1 h1:HJjhwHM2F2G0zq7uIxDWB7tFtoEq3lbjTJLJ8dH4WRE=
|
||||||
|
github.com/suapapa/go_hangul v1.2.1/go.mod h1:o5XMYtsygfiqzOViFb1W5ax+nROPYeUdh5cDGMkMDxo=
|
||||||
gitlab.com/gfxlabs/gfximg v0.0.5 h1:jtHE6In6axz0zGPy7YnLIZV9RFdcFEZzpdqoXb52K9s=
|
gitlab.com/gfxlabs/gfximg v0.0.5 h1:jtHE6In6axz0zGPy7YnLIZV9RFdcFEZzpdqoXb52K9s=
|
||||||
gitlab.com/gfxlabs/gfximg v0.0.5/go.mod h1:IAYZwCoqy3JFKwkKafragpfecp5Up6FFIzI7VvK2Zzo=
|
gitlab.com/gfxlabs/gfximg v0.0.5/go.mod h1:IAYZwCoqy3JFKwkKafragpfecp5Up6FFIzI7VvK2Zzo=
|
||||||
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
golang.org/x/image v0.0.0-20211028202545-6944b10bf410 h1:hTftEOvwiOq2+O8k2D5/Q7COC7k5Qcrgc2TFURJYnvQ=
|
golang.org/x/image v0.0.0-20211028202545-6944b10bf410 h1:hTftEOvwiOq2+O8k2D5/Q7COC7k5Qcrgc2TFURJYnvQ=
|
||||||
golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
|
golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
|
||||||
|
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
|
||||||
|
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 h1:foEbQz/B0Oz6YIqu/69kfXPYeFQAuuMYFkjaqXzl5Wo=
|
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 h1:foEbQz/B0Oz6YIqu/69kfXPYeFQAuuMYFkjaqXzl5Wo=
|
||||||
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
|
Loading…
Reference in New Issue