From 41053a22a87905057f1de8a382f0795183fa8d59 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Thu, 13 Jul 2023 12:51:19 -0700 Subject: [PATCH] upgrade go-mpris-server; gracefully handle no dbus connection --- backend/mpris.go | 39 +++++++++++++++++++++++++++------------ go.mod | 4 ++-- go.sum | 4 ++-- 3 files changed, 31 insertions(+), 16 deletions(-) diff --git a/backend/mpris.go b/backend/mpris.go index 252b5ec..edd9e40 100644 --- a/backend/mpris.go +++ b/backend/mpris.go @@ -18,8 +18,9 @@ var ( _ types.OrgMprisMediaPlayer2Adapter = (*MPRISHandler)(nil) _ types.OrgMprisMediaPlayer2PlayerAdapter = (*MPRISHandler)(nil) ) + var ( - notImplemented = errors.New("not implemented") + errNotImplemented = errors.New("not implemented") ) type MPRISHandler struct { @@ -33,6 +34,7 @@ type MPRISHandler struct { // Function to look up the artwork URL for a given track ID ArtURLLookup func(trackID string) (string, error) + connErr error playerName string p *player.Player pm *PlaybackManager @@ -41,19 +43,25 @@ type MPRISHandler struct { } func NewMPRISHandler(playerName string, p *player.Player, pm *PlaybackManager) *MPRISHandler { - m := &MPRISHandler{playerName: playerName, p: p, pm: pm} + m := &MPRISHandler{playerName: playerName, p: p, pm: pm, connErr: errors.New("not started")} m.s = server.NewServer(playerName, m, m) m.evt = events.NewEventHandler(m.s) m.p.OnSeek(func() { - pos := secondsToMicroseconds(m.p.GetStatus().TimePos) - m.evt.Player.OnSeek(pos) + if m.connErr == nil { + pos := secondsToMicroseconds(m.p.GetStatus().TimePos) + m.evt.Player.OnSeek(pos) + } }) m.pm.OnSongChange(func(_, _ *mediaprovider.Track) { - m.evt.Player.OnTitle() + if m.connErr == nil { + m.evt.Player.OnTitle() + } }) emitPlayStatus := func() { - m.evt.Player.OnPlayPause() + if m.connErr == nil { + m.evt.Player.OnPlayPause() + } } m.p.OnStopped(emitPlayStatus) m.p.OnPlaying(emitPlayStatus) @@ -64,12 +72,19 @@ func NewMPRISHandler(playerName string, p *player.Player, pm *PlaybackManager) * // Starts listening for MPRIS events. func (m *MPRISHandler) Start() { - go m.s.Listen() + m.connErr = nil + go func() { + // exits early with err if unable to establish D-Bus connection + m.connErr = m.s.Listen() + }() } // Stops listening for MPRIS events and releases any D-Bus resources. func (m *MPRISHandler) Shutdown() { - m.s.Stop() + if m.connErr == nil { + m.s.Stop() + m.connErr = errors.New("stopped") + } } // OrgMprisMediaPlayer2Adapter implementation @@ -152,11 +167,11 @@ func (m *MPRISHandler) Seek(offset types.Microseconds) error { } func (m *MPRISHandler) SetPosition(trackId string, position types.Microseconds) error { - return notImplemented + return errNotImplemented } func (m *MPRISHandler) OpenUri(uri string) error { - return notImplemented + return errNotImplemented } func (m *MPRISHandler) PlaybackStatus() (types.PlaybackStatus, error) { @@ -176,7 +191,7 @@ func (m *MPRISHandler) Rate() (float64, error) { } func (m *MPRISHandler) SetRate(float64) error { - return notImplemented + return errNotImplemented } func (m *MPRISHandler) Metadata() (types.Metadata, error) { @@ -214,7 +229,7 @@ func (m *MPRISHandler) Volume() (float64, error) { } func (m *MPRISHandler) SetVolume(float64) error { - return notImplemented + return errNotImplemented } func (m *MPRISHandler) Position() (int64, error) { diff --git a/go.mod b/go.mod index 58c4d55..3c532d7 100644 --- a/go.mod +++ b/go.mod @@ -9,8 +9,10 @@ require ( github.com/dweymouth/go-mpv v0.0.0-20230406003141-7f1858e503ee github.com/dweymouth/go-subsonic v0.0.0-20230614154319-792d18c75fb4 github.com/fsnotify/fsnotify v1.6.0 + github.com/godbus/dbus/v5 v5.1.0 github.com/google/uuid v1.3.0 github.com/pelletier/go-toml/v2 v2.0.8 + github.com/quarckster/go-mpris-server v1.0.1 github.com/zalando/go-keyring v0.2.1 golang.org/x/net v0.0.0-20220722155237-a158d28d115b ) @@ -27,13 +29,11 @@ require ( github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect github.com/go-gl/glfw/v3.3/glfw v0.0.0-20221017161538-93cebf72946b // indirect github.com/go-text/typesetting v0.0.0-20230405155246-bf9c697c6e16 // indirect - github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/goki/freetype v0.0.0-20220119013949-7a161fd3728c // indirect github.com/gopherjs/gopherjs v1.17.2 // indirect github.com/jsummers/gobmp v0.0.0-20151104160322-e2ba15ffa76e // indirect github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/quarckster/go-mpris-server v1.0.0 // indirect github.com/srwiley/oksvg v0.0.0-20220731023508-a61f04f16b76 // indirect github.com/srwiley/rasterx v0.0.0-20210519020934-456a8d69b780 // indirect github.com/stretchr/testify v1.8.3 // indirect diff --git a/go.sum b/go.sum index 0087109..c23e519 100644 --- a/go.sum +++ b/go.sum @@ -265,8 +265,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/quarckster/go-mpris-server v1.0.0 h1:9EKh8Ink7d3OigBLXGlRJ0jDJi+O6T/XMroA5Gl4c5Q= -github.com/quarckster/go-mpris-server v1.0.0/go.mod h1:2b4IdrpnEoEfU+6fQKjYhAgdvsiz4JxmTpDAUrMJVO4= +github.com/quarckster/go-mpris-server v1.0.1 h1:JAbVBJK1ijjwEH4gfaOtwfElDVuaBPnWyi8rZJEHOxc= +github.com/quarckster/go-mpris-server v1.0.1/go.mod h1:2b4IdrpnEoEfU+6fQKjYhAgdvsiz4JxmTpDAUrMJVO4= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=