Handle server disconnections/changes
This commit is contained in:
+1
-1
@@ -195,7 +195,7 @@ func StartupApp(appName, displayAppName, appVersion, appVersionTag, latestReleas
|
|||||||
if err == nil {
|
if err == nil {
|
||||||
a.ipcServer = ipc.NewServer(
|
a.ipcServer = ipc.NewServer(
|
||||||
a.PlaybackManager,
|
a.PlaybackManager,
|
||||||
&a.ServerManager.Server,
|
a.ServerManager,
|
||||||
a.callOnReactivate,
|
a.callOnReactivate,
|
||||||
func() { _ = a.callOnExit() })
|
func() { _ = a.callOnExit() })
|
||||||
go a.ipcServer.Serve(listener)
|
go a.ipcServer.Serve(listener)
|
||||||
|
|||||||
+28
-6
@@ -3,6 +3,7 @@ package ipc
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
@@ -11,6 +12,8 @@ import (
|
|||||||
"github.com/dweymouth/supersonic/backend/mediaprovider"
|
"github.com/dweymouth/supersonic/backend/mediaprovider"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var ErrNoServerConnection = errors.New("not connected to a server")
|
||||||
|
|
||||||
type PlaybackHandler interface {
|
type PlaybackHandler interface {
|
||||||
PlayPause()
|
PlayPause()
|
||||||
Stop()
|
Stop()
|
||||||
@@ -33,16 +36,20 @@ type IPCServer interface {
|
|||||||
Shutdown(context.Context) error
|
Shutdown(context.Context) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ServerManager interface {
|
||||||
|
GetServer() mediaprovider.MediaProvider
|
||||||
|
}
|
||||||
|
|
||||||
type serverImpl struct {
|
type serverImpl struct {
|
||||||
server *http.Server
|
server *http.Server
|
||||||
pbHandler PlaybackHandler
|
pbHandler PlaybackHandler
|
||||||
mp *mediaprovider.MediaProvider
|
sm ServerManager
|
||||||
showFn func()
|
showFn func()
|
||||||
quitFn func()
|
quitFn func()
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewServer(pbHandler PlaybackHandler, mp *mediaprovider.MediaProvider, showFn, quitFn func()) IPCServer {
|
func NewServer(pbHandler PlaybackHandler, sm ServerManager, showFn, quitFn func()) IPCServer {
|
||||||
s := &serverImpl{pbHandler: pbHandler, mp: mp, showFn: showFn, quitFn: quitFn}
|
s := &serverImpl{pbHandler: pbHandler, sm: sm, showFn: showFn, quitFn: quitFn}
|
||||||
s.server = &http.Server{
|
s.server = &http.Server{
|
||||||
Handler: s.createHandler(),
|
Handler: s.createHandler(),
|
||||||
}
|
}
|
||||||
@@ -105,8 +112,13 @@ func (s *serverImpl) createHandler() http.Handler {
|
|||||||
s.writeOK(w)
|
s.writeOK(w)
|
||||||
})
|
})
|
||||||
m.HandleFunc(SearchAlbumPath, s.makeSearchEndpointHandler(func(search string) (any, error) {
|
m.HandleFunc(SearchAlbumPath, s.makeSearchEndpointHandler(func(search string) (any, error) {
|
||||||
|
mp := s.sm.GetServer()
|
||||||
|
if mp == nil {
|
||||||
|
return nil, ErrNoServerConnection
|
||||||
|
}
|
||||||
|
|
||||||
filter := mediaprovider.NewAlbumFilter(mediaprovider.AlbumFilterOptions{})
|
filter := mediaprovider.NewAlbumFilter(mediaprovider.AlbumFilterOptions{})
|
||||||
i := (*s.mp).SearchAlbums(search, filter)
|
i := mp.SearchAlbums(search, filter)
|
||||||
|
|
||||||
album := i.Next()
|
album := i.Next()
|
||||||
albums := make([]mediaprovider.Album, 0)
|
albums := make([]mediaprovider.Album, 0)
|
||||||
@@ -118,7 +130,12 @@ func (s *serverImpl) createHandler() http.Handler {
|
|||||||
return albums, nil
|
return albums, nil
|
||||||
}))
|
}))
|
||||||
m.HandleFunc(SearchPlaylistPath, s.makeSearchEndpointHandler(func(search string) (any, error) {
|
m.HandleFunc(SearchPlaylistPath, s.makeSearchEndpointHandler(func(search string) (any, error) {
|
||||||
all, err := (*s.mp).GetPlaylists()
|
mp := s.sm.GetServer()
|
||||||
|
if mp == nil {
|
||||||
|
return nil, ErrNoServerConnection
|
||||||
|
}
|
||||||
|
|
||||||
|
all, err := mp.GetPlaylists()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -139,7 +156,12 @@ func (s *serverImpl) createHandler() http.Handler {
|
|||||||
return filtered, nil
|
return filtered, nil
|
||||||
}))
|
}))
|
||||||
m.HandleFunc(SearchTrackPath, s.makeSearchEndpointHandler(func(search string) (any, error) {
|
m.HandleFunc(SearchTrackPath, s.makeSearchEndpointHandler(func(search string) (any, error) {
|
||||||
i := (*s.mp).IterateTracks(search)
|
mp := s.sm.GetServer()
|
||||||
|
if mp == nil {
|
||||||
|
return nil, ErrNoServerConnection
|
||||||
|
}
|
||||||
|
|
||||||
|
i := mp.IterateTracks(search)
|
||||||
|
|
||||||
track := i.Next()
|
track := i.Next()
|
||||||
tracks := make([]mediaprovider.Track, 0)
|
tracks := make([]mediaprovider.Track, 0)
|
||||||
|
|||||||
@@ -262,3 +262,7 @@ func (s *ServerManager) checkSetInsecureSkipVerify(cli *http.Client) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *ServerManager) GetServer() mediaprovider.MediaProvider {
|
||||||
|
return a.Server
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user