// 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) } }