package config import ( "encoding/base64" "fmt" "os" "path" "strings" "gopkg.in/yaml.v3" "github.com/creasty/defaults" ) var configPath string type _config struct { Username string `yaml:"username"` Password string `yaml:"password"` URL string `yaml:"url"` EnableScrobble bool `yaml:"enable_scrobble" default:"false"` MaxRadioSongs int `yaml:"max_radio_songs" default:"50"` ExperimentalRadioAlgo bool `yaml:"experimental_radio_algo" default:"false"` } var configStruct *_config func init() { userConfigDir, err := os.UserConfigDir() configDir := path.Join(userConfigDir, "subsonictui") configPath = path.Join(configDir, "config.yaml") if err != nil { fmt.Printf("[ERROR] Failed to fetch user config directory. %e\n", err) os.Exit(1) } if _, err := os.Stat(configDir); os.IsNotExist(err) { err := os.MkdirAll(configDir, 0700) if err != nil { panic(err) } } var configFile *os.File if _, err := os.Stat(configPath); os.IsNotExist(err) { configFile, err = os.Create(configPath) defer func() { err := configFile.Close() if err != nil { panic(err) } }() if err != nil { fmt.Printf("[ERROR] Failed to create config file @ %s. %e\n", configPath, err) os.Exit(1) } } configStruct, err = loadConfig() if err != nil { fmt.Printf("[ERROR] Failed to load config file @ %s. %e\n", configPath, err) os.Exit(1) } fmt.Printf("Init Config %s\n", configPath) } func URL() string { return configStruct.URL } func Username() string { return configStruct.Username } func Password() string { p, _ := base64.StdEncoding.DecodeString(configStruct.Password) return strings.TrimSpace(string(p)) } func ScrobbleEnabled() bool { return configStruct.EnableScrobble } func MaxRadioSongs() int { return configStruct.MaxRadioSongs } func ExperimentalRadioAlgo() bool { return configStruct.ExperimentalRadioAlgo } func SetPassword(p string) { configStruct.Password = base64.StdEncoding.EncodeToString([]byte(p)) } func SetUsername(u string) { configStruct.Username = u } func SetURL(u string) { configStruct.URL = u } func loadConfig() (*_config, error) { c := &_config{} err := defaults.Set(c) if err != nil { panic(err) } file, err := os.ReadFile(configPath) if err != nil { return nil, err } if err = yaml.Unmarshal(file, c); err != nil { return nil, err } return c, nil } func SaveConfig() { yml, err := yaml.Marshal(configStruct) if err != nil { fmt.Printf("[ERROR] Failed to convert config to yaml. %e\n", err) os.Exit(1) } err = os.WriteFile(configPath, yml, 0644) if err != nil { fmt.Printf("[ERROR] Failed to save config file @ %s. %e\n", configPath, err) os.Exit(1) } }