diff options
Diffstat (limited to 'cmd/midipak/main.go')
-rw-r--r-- | cmd/midipak/main.go | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/cmd/midipak/main.go b/cmd/midipak/main.go new file mode 100644 index 0000000..3db1e7e --- /dev/null +++ b/cmd/midipak/main.go @@ -0,0 +1,68 @@ +// Command midipak creates a compressed pack from +// input MIDI files. +// +// midipak OUTPUT INPUTS... +package main + +import ( + "context" + "database/sql" + "fmt" + "io/ioutil" + "log" + "os" + "path" + + "github.com/klauspost/compress/zstd" + _ "github.com/mattn/go-sqlite3" + "go.terinstock.com/midifi/pkg/midipak" +) + +func pack(ctx context.Context, output string, files []string) error { + fa := make([]midipak.File, 0, len(files)) + for _, file := range files { + name := path.Base(file) + p, err := ioutil.ReadFile(file) + if err != nil { + return err + } + + fa = append(fa, midipak.File{Name: name, Data: p}) + } + + enc, err := zstd.NewWriter(nil, zstd.WithEncoderLevel(zstd.SpeedBestCompression)) + if err != nil { + return err + } + defer enc.Close() + + db, err := sql.Open("sqlite3", fmt.Sprintf("%s", output)) + if err != nil { + return err + } + defer db.Close() + + if err := midipak.Create(ctx, db); err != nil { + return err + } + + if err := midipak.Pack(ctx, db, enc, fa); err != nil { + return err + } + + if _, err = db.Exec("VACUUM"); err != nil { + return err + } + + return nil +} + +func main() { + ctx := context.Background() + output := os.Args[1] + files := os.Args[2:] + + if err := pack(ctx, output, files); err != nil { + log.Print(err) + } +} |