create UpdateChecker background task + constants refactoring

This commit is contained in:
Drew Weymouth
2023-03-30 19:19:00 -07:00
parent 2d7e633690
commit cca12d7327
6 changed files with 121 additions and 58 deletions
+28 -23
View File
@@ -10,15 +10,14 @@ import (
"supersonic/backend/util"
"supersonic/player"
"supersonic/sharedutil"
"time"
"github.com/20after4/configdir"
"github.com/zalando/go-keyring"
)
const (
AppName = "supersonic"
configFile = "config.toml"
LatestReleaseURL = "https://github.com/dweymouth/supersonic/releases/latest"
configFile = "config.toml"
)
var (
@@ -32,21 +31,27 @@ type App struct {
LibraryManager *LibraryManager
PlaybackManager *PlaybackManager
Player *player.Player
UpdateChecker UpdateChecker
bgrndCtx context.Context
cancel context.CancelFunc
appName string
appVersionTag string
bgrndCtx context.Context
cancel context.CancelFunc
}
func StartupApp() (*App, error) {
a := &App{}
func StartupApp(appName, appVersionTag, latestReleaseURL string) (*App, error) {
a := &App{appName: appName, appVersionTag: appVersionTag}
a.bgrndCtx, a.cancel = context.WithCancel(context.Background())
log.Printf("Starting %s...", AppName)
log.Printf("Using config dir: %s", configdir.LocalConfig(AppName))
log.Printf("Using cache dir: %s", configdir.LocalCache(AppName))
log.Printf("Starting %s...", appName)
log.Printf("Using config dir: %s", configdir.LocalConfig(appName))
log.Printf("Using cache dir: %s", configdir.LocalCache(appName))
a.readConfig()
a.UpdateChecker = NewUpdateChecker(appVersionTag, latestReleaseURL, &a.Config.Application.LastCheckedVersion)
a.UpdateChecker.Start(a.bgrndCtx, 24*time.Hour)
if err := a.initMPV(); err != nil {
return nil, err
}
@@ -63,10 +68,10 @@ func StartupApp() (*App, error) {
PreampGain: a.Config.ReplayGain.PreampGainDB,
})
a.ServerManager = NewServerManager()
a.ServerManager = NewServerManager(appName)
a.PlaybackManager = NewPlaybackManager(a.bgrndCtx, a.ServerManager, a.Player, &a.Config.Scrobbling)
a.LibraryManager = NewLibraryManager(a.ServerManager)
a.ImageManager = NewImageManager(a.bgrndCtx, a.ServerManager, configdir.LocalCache(AppName))
a.ImageManager = NewImageManager(a.bgrndCtx, a.ServerManager, configdir.LocalCache(a.appName))
a.LibraryManager.PreCacheCoverFn = func(coverID string) {
_, _ = a.ImageManager.GetAlbumThumbnail(coverID)
}
@@ -75,23 +80,23 @@ func StartupApp() (*App, error) {
}
func (a *App) readConfig() {
configdir.MakePath(configdir.LocalConfig(AppName))
cfgPath := configPath()
cfg, err := ReadConfigFile(cfgPath)
configdir.MakePath(configdir.LocalConfig(a.appName))
cfgPath := a.configPath()
cfg, err := ReadConfigFile(cfgPath, a.appVersionTag)
if err != nil {
log.Printf("Error reading app config file: %v", err)
cfg = DefaultConfig()
cfg = DefaultConfig(a.appVersionTag)
if _, err := os.Stat(cfgPath); err == nil {
backupCfgName := fmt.Sprintf("%s.bak", configFile)
log.Printf("Config file may be malformed: copying to %s", backupCfgName)
_ = util.CopyFile(cfgPath, path.Join(configdir.LocalConfig(AppName), backupCfgName))
_ = util.CopyFile(cfgPath, path.Join(configdir.LocalConfig(a.appName), backupCfgName))
}
}
a.Config = cfg
}
func (a *App) initMPV() error {
p := player.NewWithClientName(AppName)
p := player.NewWithClientName(a.appName)
c := a.Config.LocalPlayback
c.InMemoryCacheSizeMB = clamp(c.InMemoryCacheSizeMB, 10, 500)
if err := p.Init(c.AudioExclusive, c.InMemoryCacheSizeMB); err != nil {
@@ -101,12 +106,12 @@ func (a *App) initMPV() error {
return nil
}
func (a *App) LoginToDefaultServer() error {
func (a *App) LoginToDefaultServer(string) error {
serverCfg := a.Config.GetDefaultServer()
if serverCfg == nil {
return ErrNoServers
}
pass, err := keyring.Get(AppName, serverCfg.ID.String())
pass, err := keyring.Get(a.appName, serverCfg.ID.String())
if err != nil {
return fmt.Errorf("error reading keyring credentials: %v", err)
}
@@ -118,11 +123,11 @@ func (a *App) Shutdown() {
a.Config.LocalPlayback.Volume = a.Player.GetVolume()
a.cancel()
a.Player.Destroy()
a.Config.WriteConfigFile(configPath())
a.Config.WriteConfigFile(a.configPath())
}
func configPath() string {
return path.Join(configdir.LocalConfig(AppName), configFile)
func (a *App) configPath() string {
return path.Join(configdir.LocalConfig(a.appName), configFile)
}
func clamp(i, min, max int) int {