76 lines
2.0 KiB
Go
76 lines
2.0 KiB
Go
package metadata
|
|
|
|
import (
|
|
"context"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestProbeRealFile(t *testing.T) {
|
|
ffmpegPath, err := exec.LookPath("ffmpeg")
|
|
if err != nil {
|
|
t.Skip("ffmpeg not installed, skipping integration test")
|
|
}
|
|
if _, err := exec.LookPath("ffprobe"); err != nil {
|
|
t.Skip("ffprobe not installed, skipping integration test")
|
|
}
|
|
|
|
dir := t.TempDir()
|
|
out := filepath.Join(dir, "test.mp3")
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
|
defer cancel()
|
|
|
|
cmd := exec.CommandContext(ctx, ffmpegPath,
|
|
"-f", "lavfi", "-i", "sine=frequency=440:duration=1",
|
|
"-metadata", "title=Integration Title",
|
|
"-metadata", "artist=Integration Artist",
|
|
"-metadata", "album=Integration Album",
|
|
"-metadata", "track=5/10",
|
|
"-codec:a", "libmp3lame", "-b:a", "64k",
|
|
out,
|
|
)
|
|
if combined, err := cmd.CombinedOutput(); err != nil {
|
|
t.Fatalf("ffmpeg failed: %v\n%s", err, combined)
|
|
}
|
|
|
|
p := &Prober{}
|
|
tags, err := p.Probe(ctx, out)
|
|
if err != nil {
|
|
t.Fatalf("Probe: %v", err)
|
|
}
|
|
if tags.Title != "Integration Title" {
|
|
t.Errorf("Title = %q, want %q", tags.Title, "Integration Title")
|
|
}
|
|
if len(tags.Artists) != 1 || tags.Artists[0] != "Integration Artist" {
|
|
t.Errorf("Artists = %v", tags.Artists)
|
|
}
|
|
if tags.Album != "Integration Album" {
|
|
t.Errorf("Album = %q", tags.Album)
|
|
}
|
|
if tags.TrackNumber != 5 || tags.TrackTotal != 10 {
|
|
t.Errorf("Track = %d/%d, want 5/10", tags.TrackNumber, tags.TrackTotal)
|
|
}
|
|
if tags.DurationSeconds < 0.9 || tags.DurationSeconds > 1.5 {
|
|
t.Errorf("DurationSeconds = %v, want ~1", tags.DurationSeconds)
|
|
}
|
|
if tags.SampleRateHz == 0 {
|
|
t.Error("SampleRateHz = 0, want > 0")
|
|
}
|
|
if tags.Kind != "song" {
|
|
t.Errorf("Kind = %q, want song", tags.Kind)
|
|
}
|
|
}
|
|
|
|
func TestProbeRejectsMissingFile(t *testing.T) {
|
|
if _, err := exec.LookPath("ffprobe"); err != nil {
|
|
t.Skip("ffprobe not installed, skipping integration test")
|
|
}
|
|
p := &Prober{}
|
|
if _, err := p.Probe(context.Background(), "/nonexistent/path/does-not-exist.mp3"); err == nil {
|
|
t.Fatal("expected error probing a nonexistent file")
|
|
}
|
|
}
|