From 50f50ac0aba95a7d0edf5bed646a91ab19a41891 Mon Sep 17 00:00:00 2001 From: Raymonf Date: Thu, 5 Jan 2023 01:41:21 -0500 Subject: [PATCH] I'm so sorry lol --- _cmd/bulk-bin/main.go | 173 ++++++++++++++++++++++++++++++++++++++++++ decode.go | 17 +++++ go.mod | 2 + go.sum | 4 + 4 files changed, 196 insertions(+) create mode 100644 _cmd/bulk-bin/main.go diff --git a/_cmd/bulk-bin/main.go b/_cmd/bulk-bin/main.go new file mode 100644 index 0000000..0310a2a --- /dev/null +++ b/_cmd/bulk-bin/main.go @@ -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) +} diff --git a/decode.go b/decode.go index 2fc1588..c2cb937 100644 --- a/decode.go +++ b/decode.go @@ -1,6 +1,9 @@ package nori import ( + "bytes" + "fmt" + "github.com/suapapa/go_hangul/encoding/cp949" "io" "os" ) @@ -23,3 +26,17 @@ func Decode(r io.Reader) (*Nori, error) { err := nori.Decode(r) 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 +} diff --git a/go.mod b/go.mod index effca3c..fde537d 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/disintegration/imaging v1.6.2 github.com/go-chi/chi/v5 v5.0.7 github.com/phrozen/blend v0.0.0-20210220204729-f26b6cf7a28e + github.com/suapapa/go_hangul v1.2.1 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-isatty v0.0.14 // 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 ) diff --git a/go.sum b/go.sum index 66f7973..b22bd21 100644 --- a/go.sum +++ b/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/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 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/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-20211028202545-6944b10bf410 h1:hTftEOvwiOq2+O8k2D5/Q7COC7k5Qcrgc2TFURJYnvQ= 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-20210927094055-39ccf1dd6fa6 h1:foEbQz/B0Oz6YIqu/69kfXPYeFQAuuMYFkjaqXzl5Wo= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=