A fork of https://github.com/teal-fm/piper
1package config
2
3import (
4 "log"
5 "strings"
6
7 "github.com/joho/godotenv"
8 "github.com/spf13/viper"
9)
10
11// Load initializes the configuration with viper
12func Load() {
13 if err := godotenv.Load(); err != nil {
14 log.Println("No .env file found or error loading it. Using default values and environment variables.")
15 }
16
17 viper.SetDefault("server.port", "8080")
18 viper.SetDefault("server.host", "localhost")
19 viper.SetDefault("callback.spotify", "http://localhost:8080/callback/spotify")
20 viper.SetDefault("spotify.auth_url", "https://accounts.spotify.com/authorize")
21 viper.SetDefault("spotify.token_url", "https://accounts.spotify.com/api/token")
22 viper.SetDefault("spotify.scopes", "user-read-currently-playing user-read-email")
23 viper.SetDefault("tracker.interval", 30)
24 viper.SetDefault("db.path", "./data/piper.db")
25
26 // Apple Music defaults
27 viper.SetDefault("applemusic.team_id", "")
28 viper.SetDefault("applemusic.key_id", "")
29 viper.SetDefault("applemusic.private_key_path", "./AM_AUTHKEY.p8")
30
31 // server metadata
32 viper.SetDefault("server.root_url", "http://localhost:8080")
33 viper.SetDefault("atproto.metadata_url", "http://localhost:8080/metadata")
34 viper.SetDefault("atproto.callback_url", "/metadata")
35
36 viper.AutomaticEnv()
37
38 // Support APPLE_MUSIC_* env var aliases
39 _ = viper.BindEnv("applemusic.team_id", "APPLE_MUSIC_TEAM_ID")
40 _ = viper.BindEnv("applemusic.key_id", "APPLE_MUSIC_KEY_ID")
41 _ = viper.BindEnv("applemusic.private_key_path", "APPLE_MUSIC_PRIVATE_KEY_PATH")
42
43 viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
44
45 viper.SetConfigName("config")
46 viper.SetConfigType("yaml")
47 viper.AddConfigPath("./config")
48 viper.AddConfigPath(".")
49
50 if err := viper.ReadInConfig(); err != nil {
51 if _, ok := err.(viper.ConfigFileNotFoundError); !ok {
52 log.Fatalf("Error reading config file: %v", err)
53 }
54 log.Println("Config file not found, using default values and environment variables")
55 } else {
56 log.Println("Using config file:", viper.ConfigFileUsed())
57 }
58
59 // check for required settings
60 requiredVars := []string{"spotify.client_id", "spotify.client_secret"}
61 missingVars := []string{}
62
63 for _, v := range requiredVars {
64 if !viper.IsSet(v) {
65 missingVars = append(missingVars, v)
66 }
67 }
68
69 if len(missingVars) > 0 {
70 log.Fatalf("Required configuration variables not set: %s", strings.Join(missingVars, ", "))
71 }
72}