diff --git a/backend/app.go b/backend/app.go index dca6bc9..274dc77 100644 --- a/backend/app.go +++ b/backend/app.go @@ -195,7 +195,7 @@ func StartupApp(appName, displayAppName, appVersion, appVersionTag, latestReleas if err == nil { a.ipcServer = ipc.NewServer( a.PlaybackManager, - &a.ServerManager.Server, + a.ServerManager, a.callOnReactivate, func() { _ = a.callOnExit() }) go a.ipcServer.Serve(listener) diff --git a/backend/ipc/server.go b/backend/ipc/server.go index f9d28c5..d5dc662 100644 --- a/backend/ipc/server.go +++ b/backend/ipc/server.go @@ -3,6 +3,7 @@ package ipc import ( "context" "encoding/json" + "errors" "net" "net/http" "strconv" @@ -11,6 +12,8 @@ import ( "github.com/dweymouth/supersonic/backend/mediaprovider" ) +var ErrNoServerConnection = errors.New("not connected to a server") + type PlaybackHandler interface { PlayPause() Stop() @@ -33,16 +36,20 @@ type IPCServer interface { Shutdown(context.Context) error } +type ServerManager interface { + GetServer() mediaprovider.MediaProvider +} + type serverImpl struct { server *http.Server pbHandler PlaybackHandler - mp *mediaprovider.MediaProvider + sm ServerManager showFn func() quitFn func() } -func NewServer(pbHandler PlaybackHandler, mp *mediaprovider.MediaProvider, showFn, quitFn func()) IPCServer { - s := &serverImpl{pbHandler: pbHandler, mp: mp, showFn: showFn, quitFn: quitFn} +func NewServer(pbHandler PlaybackHandler, sm ServerManager, showFn, quitFn func()) IPCServer { + s := &serverImpl{pbHandler: pbHandler, sm: sm, showFn: showFn, quitFn: quitFn} s.server = &http.Server{ Handler: s.createHandler(), } @@ -105,8 +112,13 @@ func (s *serverImpl) createHandler() http.Handler { s.writeOK(w) }) 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{}) - i := (*s.mp).SearchAlbums(search, filter) + i := mp.SearchAlbums(search, filter) album := i.Next() albums := make([]mediaprovider.Album, 0) @@ -118,7 +130,12 @@ func (s *serverImpl) createHandler() http.Handler { return albums, nil })) 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 { return nil, err } @@ -139,7 +156,12 @@ func (s *serverImpl) createHandler() http.Handler { return filtered, nil })) 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() tracks := make([]mediaprovider.Track, 0) diff --git a/backend/servermanager.go b/backend/servermanager.go index 3bba6ef..4cb23de 100644 --- a/backend/servermanager.go +++ b/backend/servermanager.go @@ -262,3 +262,7 @@ func (s *ServerManager) checkSetInsecureSkipVerify(cli *http.Client) { } } } + +func (a *ServerManager) GetServer() mediaprovider.MediaProvider { + return a.Server +}