From 44800e964d27af44ed94d4365df5fa04525b405f Mon Sep 17 00:00:00 2001 From: sentriz Date: Wed, 16 Nov 2022 19:36:14 +0000 Subject: [PATCH] add check for mpv version --- jukebox/jukebox.go | 25 +++++++++++++++++++++++++ jukebox/jukebox_test.go | 4 ++++ 2 files changed, 29 insertions(+) diff --git a/jukebox/jukebox.go b/jukebox/jukebox.go index b1ec23a..356d6a4 100644 --- a/jukebox/jukebox.go +++ b/jukebox/jukebox.go @@ -9,6 +9,8 @@ import ( "os" "os/exec" "path/filepath" + "regexp" + "strconv" "sync" "time" @@ -20,6 +22,7 @@ import ( var ( ErrMPVTimeout = fmt.Errorf("mpv not responding") ErrMPVNeverStarted = fmt.Errorf("mpv never started") + ErrMPVTooOld = fmt.Errorf("mpv too old") ) func MPVArg(k string, v any) string { @@ -72,6 +75,15 @@ func (j *Jukebox) Start(sockPath string, mpvExtraArgs []string) error { if err := j.conn.Open(); err != nil { return fmt.Errorf("open connection: %w", err) } + + var mpvVersionStr string + if err := j.getDecode(&mpvVersionStr, "mpv-version"); err != nil { + return fmt.Errorf("get mpv version: %w", err) + } + if major, minor, patch := parseMPVVersion(mpvVersionStr); major == 0 && minor < 34 { + return fmt.Errorf("%w: v0.34.0+ required, found v%d.%d.%d", ErrMPVTooOld, major, minor, patch) + } + if _, err := j.conn.Call("observe_property", 0, "seekable"); err != nil { return fmt.Errorf("observe property: %w", err) } @@ -404,3 +416,16 @@ func lock(mu *sync.Mutex) func() { mu.Lock() return mu.Unlock } + +var mpvVersionExpr = regexp.MustCompile(`mpv\s(\d+)\.(\d+)\.(\d+)`) + +func parseMPVVersion(version string) (major, minor, patch int) { + m := mpvVersionExpr.FindStringSubmatch(version) + if len(m) != 4 { + return + } + major, _ = strconv.Atoi(m[1]) + minor, _ = strconv.Atoi(m[2]) + patch, _ = strconv.Atoi(m[3]) + return +} diff --git a/jukebox/jukebox_test.go b/jukebox/jukebox_test.go index 4cb781e..575927d 100644 --- a/jukebox/jukebox_test.go +++ b/jukebox/jukebox_test.go @@ -1,6 +1,7 @@ package jukebox_test import ( + "errors" "os" "path/filepath" "sort" @@ -18,6 +19,9 @@ func newJukebox(t *testing.T) *jukebox.Jukebox { sockPath, []string{jukebox.MPVArg("--ao", "null")}, ) + if errors.Is(err, jukebox.ErrMPVTooOld) { + t.Skip("old mpv found, skipping") + } if err != nil { t.Fatalf("start jukebox: %v", err) }