ytdl-web/config/config.go

127 lines
2.7 KiB
Go
Raw Permalink Normal View History

2023-05-23 18:44:05 -04:00
package config
import (
2023-07-12 19:16:28 -04:00
"os"
"path"
2023-05-23 21:52:00 -04:00
"strings"
2023-05-23 18:44:05 -04:00
"time"
2023-07-12 19:16:28 -04:00
"github.com/adrg/xdg"
2023-05-23 18:44:05 -04:00
"github.com/spf13/viper"
)
type Config struct {
Env string `mapstructure:"env"`
Ytdlp ConfigYtdlp `mapstructure:"ytdlp"`
HTTP ConfigHTTP `mapstructure:"http"`
Cache ConfigCache `mapstructure:"cache"`
Cookies ConfigCookies `mapstructure:"cookies"`
2023-05-23 18:44:05 -04:00
}
func (c *Config) IsProduction() bool {
return c.Env == "Production"
}
func (c *Config) IsDevelopment() bool {
return c.Env == "Development"
}
func (c *Config) IsStaging() bool {
return c.Env == "Staging"
}
type ConfigYtdlp struct {
BinaryPath string `mapstructure:"binaryPath"`
}
2023-05-23 18:44:05 -04:00
type ConfigHTTP struct {
Port int `mapstructure:"port"`
Listen string `mapstructure:"listen"`
BasePath string `mapstructure:"basePath"`
TrustedProxies []string `mapstructure:"trustedProxies"`
}
type ConfigCache struct {
TTL time.Duration `mapstructure:"ttl"`
DirPath string `mapstructure:"dirPath"`
2023-05-23 18:44:05 -04:00
}
type ConfigCookies struct {
2023-05-23 21:52:00 -04:00
Enabled bool `mapstructure:"enabled"`
FilePath string `mapstructure:"filePath"`
FromBrowser ConfigCookiesFromBrowser `mapstructure:"fromBrowser"`
2023-05-23 18:44:05 -04:00
}
type ConfigCookiesFromBrowser struct {
Browser string `mapstructure:"browser"`
Keyring string `mapstructure:"keyring"`
Profile string `mapstructure:"profile"`
Container string `mapstructure:"container"`
}
func DefaultConfig() *Config {
return &Config{
Env: "Production",
Ytdlp: ConfigYtdlp{BinaryPath: "yt-dlp"},
2023-05-23 18:44:05 -04:00
HTTP: ConfigHTTP{
Port: 8080,
Listen: "127.0.0.1",
BasePath: "/",
},
Cache: ConfigCache{
TTL: time.Hour,
DirPath: "/tmp/ytdl-web",
2023-05-23 18:44:05 -04:00
},
Cookies: ConfigCookies{
Enabled: false,
FilePath: "./cookies.txt",
2023-05-23 21:52:00 -04:00
FromBrowser: ConfigCookiesFromBrowser{},
2023-05-23 18:44:05 -04:00
},
}
}
func LoadConfig(paths ...string) (*Config, error) {
viper.SetEnvPrefix("YTDL")
viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
viper.AutomaticEnv()
2023-05-23 18:44:05 -04:00
viper.SetConfigName("config")
viper.SetConfigType("yaml")
2023-05-23 18:44:05 -04:00
if len(paths) > 0 {
for _, p := range paths {
viper.AddConfigPath(path.Dir(p))
2023-05-23 18:44:05 -04:00
}
} else {
2023-07-12 19:16:28 -04:00
envDir := os.Getenv("YTDL_CONFIGDIR")
if envDir != "" {
viper.AddConfigPath(envDir)
2023-07-12 19:16:28 -04:00
}
viper.AddConfigPath(".")
2023-07-12 19:16:28 -04:00
homeDir, err := os.UserHomeDir()
if err == nil {
viper.AddConfigPath(homeDir + "/.config/ytdl-web")
2023-07-12 19:16:28 -04:00
}
viper.AddConfigPath(xdg.ConfigHome + "/ytdl-web")
2023-07-12 19:16:28 -04:00
for _, dir := range xdg.ConfigDirs {
viper.AddConfigPath(dir + "/ytdl-web")
2023-07-12 19:16:28 -04:00
}
2023-05-23 18:44:05 -04:00
}
if err := viper.ReadInConfig(); err != nil {
2023-05-23 21:52:00 -04:00
if _, ok := err.(viper.ConfigFileNotFoundError); !ok {
return nil, err
}
2023-05-23 18:44:05 -04:00
}
config := DefaultConfig()
if err := viper.Unmarshal(config); err != nil {
2023-05-23 18:44:05 -04:00
return nil, err
}
return config, nil
}