Initial commit: read flac metadata.
parent
71f493c287
commit
25645f0ba9
|
@ -0,0 +1,63 @@
|
||||||
|
package flac
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"os/exec"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Metadata struct {
|
||||||
|
SampleRate int64
|
||||||
|
BPS int64
|
||||||
|
Channels int64
|
||||||
|
NumSamples int64 // Total length of file in samples (per channel).
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMetadata(path string) (md Metadata, err error) {
|
||||||
|
cmd := exec.Command(
|
||||||
|
"metaflac",
|
||||||
|
"--show-sample-rate",
|
||||||
|
"--show-bps",
|
||||||
|
"--show-channels",
|
||||||
|
"--show-total-samples",
|
||||||
|
path)
|
||||||
|
|
||||||
|
out, err := cmd.Output()
|
||||||
|
if err != nil {
|
||||||
|
return md, fmt.Errorf("Failed to open file: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
l := bytes.Split(out, []byte{'\n'})
|
||||||
|
if len(l) != 5 {
|
||||||
|
return md, fmt.Errorf("Output not understood:\n%s", out)
|
||||||
|
}
|
||||||
|
l = l[:4]
|
||||||
|
|
||||||
|
md.SampleRate, err = strconv.ParseInt(string(l[0]), 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return md, fmt.Errorf("Invalid sample rate: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
md.BPS, err = strconv.ParseInt(string(l[1]), 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return md, fmt.Errorf("Invalid bps: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
md.Channels, err = strconv.ParseInt(string(l[2]), 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return md, fmt.Errorf("Invalid channels: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
md.NumSamples, err = strconv.ParseInt(string(l[3]), 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return md, fmt.Errorf("Invalid length: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return md, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func Load(path string, nSamples int64) (L []float32, R []float32, err error) {
|
||||||
|
// TODO!
|
||||||
|
return
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package flac
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestGetMetadata(t *testing.T) {
|
||||||
|
md, err := GetMetadata("test_files/audio.flac")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
log.Printf("%v", md)
|
||||||
|
}
|
Binary file not shown.
Reference in New Issue