package cmd
import (
"encoding/json"
"flag"
"fmt"
"os"
"skraak/utils"
)
// RunMetadata handles the "metadata" subcommand
func RunMetadata(args []string) {
fs := flag.NewFlagSet("metadata", flag.ExitOnError)
filePath := fs.String("file", "", "Path to WAV file (required)")
fs.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage: skraak metadata --file <path>\n\n")
fmt.Fprintf(os.Stderr, "Extract metadata from a WAV file header.\n\n")
fmt.Fprintf(os.Stderr, "Options:\n")
fs.PrintDefaults()
fmt.Fprintf(os.Stderr, "\nExamples:\n")
fmt.Fprintf(os.Stderr, " skraak metadata --file recording.wav\n")
fmt.Fprintf(os.Stderr, " skraak metadata --file /path/to/audio.wav | jq '.duration_seconds'\n")
}
if err := fs.Parse(args); err != nil {
os.Exit(1)
}
if *filePath == "" {
fmt.Fprintf(os.Stderr, "Error: --file is required\n\n")
fs.Usage()
os.Exit(1)
}
// Parse WAV header
metadata, err := utils.ParseWAVHeader(*filePath)
if err != nil {
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
os.Exit(1)
}
// Output as JSON
output := map[string]any{
"file": *filePath,
"duration_seconds": metadata.Duration,
"sample_rate": metadata.SampleRate,
"channels": metadata.Channels,
"bits_per_sample": metadata.BitsPerSample,
}
// Add optional fields if present
if metadata.Comment != "" {
output["comment"] = metadata.Comment
}
if metadata.Artist != "" {
output["artist"] = metadata.Artist
}
if !metadata.FileModTime.IsZero() {
output["file_mod_time"] = metadata.FileModTime.Format("2006-01-02T15:04:05Z07:00")
}
enc := json.NewEncoder(os.Stdout)
enc.SetIndent("", " ")
enc.Encode(output)
}