Add config, prompting for server connect on first run

This commit is contained in:
Drew Weymouth
2022-12-24 11:58:24 -08:00
parent 3b3927bfda
commit 99522a773f
5 changed files with 197 additions and 17 deletions
+56 -17
View File
@@ -5,16 +5,17 @@ import (
"fmt"
"log"
"net/http"
"path"
"supersonic/backend"
"supersonic/player"
"supersonic/ui"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/widget"
"github.com/20after4/configdir"
"github.com/dweymouth/go-subsonic"
"github.com/zalando/go-keyring"
)
const (
@@ -22,7 +23,13 @@ const (
configFile = "config.toml"
)
func configPath() string {
return path.Join(configdir.LocalConfig(appname), configFile)
}
func main() {
// TODO: organize this whole file better. Move some stuff to mainwindow?
ctx, cancel := context.WithCancel(context.Background())
p := player.NewWithClientName(appname)
@@ -30,33 +37,67 @@ func main() {
log.Fatalf("failed to initialize mpv player: %s", err.Error())
}
configdir.MakePath(configdir.LocalConfig(appname))
cfg, err := backend.ReadConfigFile(configPath())
if err != nil {
log.Printf("Error reading app config file: %v", err)
cfg = backend.DefaultConfig()
}
server := cfg.GetDefaultServer()
myApp := app.New()
myWindow := myApp.NewWindow(appname)
mainWindow := ui.NewMainWindow(myApp, appname, p)
b := ui.NewBottomPanel(p)
c := container.NewBorder(nil, b, nil, nil, &layout.Spacer{})
if server == nil {
d := ui.NewAddServerDialog("Connect to Server")
pop := widget.NewModalPopUp(d, mainWindow.Canvas())
d.OnSubmit = func() {
pop.Hide()
server = cfg.AddServer(d.Nickname, d.Host, d.Username)
err := keyring.Set(appname, server.ID.String(), d.Password)
if err != nil {
log.Printf("error setting keyring credentials: %v", err)
}
setupServer(ctx, mainWindow, p, server)
}
pop.Show()
} else {
setupServer(ctx, mainWindow, p, server)
}
myWindow.SetContent(c)
myWindow.Resize(fyne.NewSize(1000, 800))
myWindow.Show()
mainWindow.Show()
myApp.Run()
cfg.WriteConfigFile(configPath())
cancel()
p.Destroy()
}
func setupServer(ctx context.Context, myWindow ui.MainWindow, p *player.Player, server *backend.ServerConfig) {
pass, err := keyring.Get(appname, server.ID.String())
if err != nil {
log.Printf("error reading keyring credentials: %v", err)
}
s := &subsonic.Client{
Client: &http.Client{},
BaseUrl: "***REMOVED***",
User: "drew",
BaseUrl: server.Hostname,
User: server.Username,
ClientName: appname,
}
if err := s.Authenticate("***REMOVED***"); err != nil {
if err := s.Authenticate(pass); err != nil {
// TODO: error dialog
fmt.Printf("error authenticating: %v\n", err)
}
lm := backend.NewLibraryManager(s)
pm := backend.NewPlaybackManager(ctx, s, p)
im := backend.NewImageManager(s, configdir.LocalCache(appname, "covers"))
b.ImageManager = im
myWindow.BottomPanel.ImageManager = im
b.SetPlaybackManager(pm)
myWindow.BottomPanel.SetPlaybackManager(pm)
pm.OnSongChange(func(song *subsonic.Child) {
if song == nil {
myWindow.SetTitle("gomuse")
@@ -66,8 +107,6 @@ func main() {
})
ag := ui.NewAlbumGrid(lm.RecentlyAddedIter(), pm, im)
myWindow.SetContent(container.NewBorder(nil, b, nil, nil, ag))
myApp.Run()
cancel()
p.Destroy()
myWindow.SetContent(container.NewBorder(nil, myWindow.BottomPanel, nil, nil, ag))
}