upgrade go-mpris-server; gracefully handle no dbus connection
This commit is contained in:
+22
-7
@@ -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,20 +43,26 @@ 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() {
|
||||
if m.connErr == nil {
|
||||
pos := secondsToMicroseconds(m.p.GetStatus().TimePos)
|
||||
m.evt.Player.OnSeek(pos)
|
||||
}
|
||||
})
|
||||
m.pm.OnSongChange(func(_, _ *mediaprovider.Track) {
|
||||
if m.connErr == nil {
|
||||
m.evt.Player.OnTitle()
|
||||
}
|
||||
})
|
||||
emitPlayStatus := func() {
|
||||
if m.connErr == nil {
|
||||
m.evt.Player.OnPlayPause()
|
||||
}
|
||||
}
|
||||
m.p.OnStopped(emitPlayStatus)
|
||||
m.p.OnPlaying(emitPlayStatus)
|
||||
m.p.OnPaused(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() {
|
||||
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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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=
|
||||
|
||||
Reference in New Issue
Block a user