summaryrefslogtreecommitdiff
path: root/cmd/midipak/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/midipak/main.go')
-rw-r--r--cmd/midipak/main.go68
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)
+ }
+}