@@ -3,61 +3,63 @@ package config
33import (
44 "errors"
55 "fmt"
6- "log/slog"
76 "os"
87 "strings"
98 "time"
9+ "log/slog"
1010
1111 "github.com/ilyakaznacheev/cleanenv"
1212 "golang.org/x/text/cases"
1313 "golang.org/x/text/language"
1414)
1515
1616type Config struct {
17- DownloadCfg DownloadConfig
17+ DownloadCfg DownloadConfig
1818 DiscoveryCfg DiscoveryConfig
19- ClientCfg ClientConfig
20- Flags Flags
21- PersistENV bool `env:"PERSIST" env-default:"true"`
22- Persist bool
23- System string `env:"EXPLO_SYSTEM"`
24- Debug bool `env:"DEBUG" env-default:"false"`
25- LogLevel string `env:"LOG_LEVEL" env-default:"INFO"`
19+ ClientCfg ClientConfig
20+ Flags Flags
21+ PersistENV bool `env:"PERSIST" env-default:"true"`
22+ Persist bool
23+ System string `env:"EXPLO_SYSTEM"`
24+ Debug bool `env:"DEBUG" env-default:"false"`
25+ LogLevel string `env:"LOG_LEVEL" env-default:"INFO"`
2626}
2727
2828type Flags struct {
29- CfgPath string
30- Playlist string
29+ CfgPath string
30+ Playlist string
3131 DownloadMode string
3232 ExcludeLocal bool
33- Persist bool
34- PersistSet bool
33+ Persist bool
34+ PersistSet bool
3535}
3636
3737type ClientConfig struct {
38- ClientID string `env:"CLIENT_ID" env-default:"explo"`
39- LibraryName string `env:"LIBRARY_NAME" env-default:"Explo"`
40- URL string `env:"SYSTEM_URL"`
41- DownloadDir string `env:"DOWNLOAD_DIR" env-default:"/data/"`
42- PlaylistDir string `env:"PLAYLIST_DIR"`
43- PlaylistName string
38+ ClientID string `env:"CLIENT_ID" env-default:"explo"`
39+ LibraryName string `env:"LIBRARY_NAME" env-default:"Explo"`
40+ URL string `env:"SYSTEM_URL"`
41+ DownloadDir string `env:"DOWNLOAD_DIR" env-default:"/data/"`
42+ PlaylistDir string `env:"PLAYLIST_DIR"`
43+ PlaylistName string
4444 PlaylistDescr string
45- PlaylistID string
46- Sleep int `env:"SLEEP" env-default:"2"`
47- HTTPTimeout int `env:"CLIENT_HTTP_TIMEOUT" env-default:"10"`
48- Creds Credentials
49- Subsonic SubsonicConfig
45+ PlaylistID string
46+ Sleep int `env:"SLEEP" env-default:"2"`
47+ HTTPTimeout int `env:"CLIENT_HTTP_TIMEOUT" env-default:"10"`
48+ Creds Credentials
49+ Subsonic SubsonicConfig
5050}
5151
5252type Credentials struct {
53- APIKey string `env:"API_KEY"`
54- User string `env:"SYSTEM_USERNAME"`
53+ APIKey string `env:"API_KEY"`
54+ User string `env:"SYSTEM_USERNAME"`
5555 Password string `env:"SYSTEM_PASSWORD"`
56- Headers map [string ]string
57- Token string
58- Salt string
56+ Headers map [string ]string
57+ Token string
58+ Salt string
5959}
6060
61+
62+
6163type Lidarr struct {
6264 APIKey string `env:"LIDARR_API_KEY"`
6365 Retry int `env:"LIDARR_RETRY" env-default:"5"` // Number of times to check search status before skipping the track
@@ -77,56 +79,56 @@ type LidarrMon struct {
7779}
7880
7981type SubsonicConfig struct {
80- Version string `env:"SUBSONIC_VERSION" env-default:"1.16.1"`
81- ID string `env:"CLIENT" env-default:"explo"`
82- PublicPlaylist bool `env:"PUBLIC_PLAYLIST" env-default:"false"`
82+ Version string `env:"SUBSONIC_VERSION" env-default:"1.16.1"`
83+ ID string `env:"CLIENT" env-default:"explo"`
84+ PublicPlaylist bool `env:"PUBLIC_PLAYLIST" env-default:"false"`
8385}
8486
8587type DownloadConfig struct {
86- DownloadDir string `env:"DOWNLOAD_DIR" env-default:"/data/"`
87- Youtube Youtube
88- YoutubeMusic YoutubeMusic
89- Slskd Slskd
90- Lidarr Lidarr
91- ExcludeLocal bool
92- KeepPermissions bool `env:"KEEP_PERMISSIONS" env-default:"true"` // keep original file permissions when migrating download
93- RenameTrack bool `env:"RENAME_TRACK" env-default:"false"` // Rename track in {title}-{artist} format
94- UseSubDir bool `env:"USE_SUBDIRECTORY" env-default:"true"`
95- Discovery string `env:"LISTENBRAINZ_DISCOVERY" env-default:"playlist"`
96- Services []string `env:"DOWNLOAD_SERVICES" env-default:"youtube"`
88+ DownloadDir string `env:"DOWNLOAD_DIR" env-default:"/data/"`
89+ Youtube Youtube
90+ YoutubeMusic YoutubeMusic
91+ Slskd Slskd
92+ Lidarr Lidarr
93+ ExcludeLocal bool
94+ KeepPermissions bool `env:"KEEP_PERMISSIONS" env-default:"true"` // keep original file permissions when migrating download
95+ RenameTrack bool `env:"RENAME_TRACK" env-default:"false"` // Rename track in {title}-{artist} format
96+ UseSubDir bool `env:"USE_SUBDIRECTORY" env-default:"true"`
97+ Discovery string `env:"LISTENBRAINZ_DISCOVERY" env-default:"playlist"`
98+ Services []string `env:"DOWNLOAD_SERVICES" env-default:"youtube"`
9799}
98100
99101type Filters struct {
100- Extensions []string `env:"EXTENSIONS" env-default:"flac,mp3"`
101- MinBitDepth int `env:"MIN_BIT_DEPTH" env-default:"8"`
102- MinBitRate int `env:"MIN_BITRATE" env-default:"256"`
103- FilterList []string `env:"FILTER_LIST" env-default:"live,remix,instrumental,extended,clean,acapella"`
102+ Extensions []string `env:"EXTENSIONS" env-default:"flac,mp3"`
103+ MinBitDepth int `env:"MIN_BIT_DEPTH" env-default:"8"`
104+ MinBitRate int `env:"MIN_BITRATE" env-default:"256"`
105+ FilterList []string `env:"FILTER_LIST" env-default:"live,remix,instrumental,extended,clean,acapella"`
104106}
105107
106108type Youtube struct {
107- APIKey string `env:"YOUTUBE_API_KEY"`
108- FfmpegPath string `env:"FFMPEG_PATH"`
109- YtdlpPath string `env:"YTDLP_PATH"`
109+ APIKey string `env:"YOUTUBE_API_KEY"`
110+ FfmpegPath string `env:"FFMPEG_PATH"`
111+ YtdlpPath string `env:"YTDLP_PATH"`
110112 CookiesPath string `env:"COOKIES_PATH" env-default:"./cookies.txt"`
111- Filters Filters
113+ Filters Filters
112114}
113115
114116type YoutubeMusic struct {
115117 FfmpegPath string `env:"FFMPEG_PATH"`
116- YtdlpPath string `env:"YTDLP_PATH"`
117- Filters Filters
118+ YtdlpPath string `env:"YTDLP_PATH"`
119+ Filters Filters
118120}
119121
120122type Slskd struct {
121- APIKey string `env:"SLSKD_API_KEY"`
122- URL string `env:"SLSKD_URL"`
123- Retry int `env:"SLSKD_RETRY" env-default:"5"` // Number of times to check search status before skipping the track
124- DownloadAttempts int `env:"SLSKD_DL_ATTEMPTS" env-default:"3"` // Max number of files to attempt downloading per track
125- SlskdDir string `env:"SLSKD_DIR" env-default:"/slskd/"`
126- MigrateDL bool `env:"MIGRATE_DOWNLOADS" env-default:"false"` // Move downloads from SlskdDir to DownloadDir
127- Timeout int `env:"SLSKD_TIMEOUT" env-default:"20"`
128- Filters Filters
129- MonitorConfig SlskdMon
123+ APIKey string `env:"SLSKD_API_KEY"`
124+ URL string `env:"SLSKD_URL"`
125+ Retry int `env:"SLSKD_RETRY" env-default:"5"` // Number of times to check search status before skipping the track
126+ DownloadAttempts int `env:"SLSKD_DL_ATTEMPTS" env-default:"3"` // Max number of files to attempt downloading per track
127+ SlskdDir string `env:"SLSKD_DIR" env-default:"/slskd/"`
128+ MigrateDL bool `env:"MIGRATE_DOWNLOADS" env-default:"false"` // Move downloads from SlskdDir to DownloadDir
129+ Timeout int `env:"SLSKD_TIMEOUT" env-default:"20"`
130+ Filters Filters
131+ MonitorConfig SlskdMon
130132}
131133
132134type SlskdMon struct {
@@ -135,15 +137,14 @@ type SlskdMon struct {
135137}
136138
137139type DiscoveryConfig struct {
138- Discovery string `env:"DISCOVERY_SERVICE" env-default:"listenbrainz"`
140+ Discovery string `env:"DISCOVERY_SERVICE" env-default:"listenbrainz"`
139141 Listenbrainz Listenbrainz
140142}
141-
142143type Listenbrainz struct {
143- Discovery string `env:"LISTENBRAINZ_DISCOVERY" env-default:"playlist"`
144- User string `env:"LISTENBRAINZ_USER"`
144+ Discovery string `env:"LISTENBRAINZ_DISCOVERY" env-default:"playlist"`
145+ User string `env:"LISTENBRAINZ_USER"`
145146 ImportPlaylist string
146- SingleArtist bool `env:"SINGLE_ARTIST" env-default:"true"`
147+ SingleArtist bool `env:"SINGLE_ARTIST" env-default:"true"`
147148}
148149
149150func (cfg * Config ) ReadEnv () {
@@ -181,7 +182,7 @@ func fixDir(dir string) string {
181182 return dir
182183}
183184
184- func (cfg * Config ) HandleDeprecation () { //
185+ func (cfg * Config ) HandleDeprecation () { //
185186 if cfg .Debug {
186187 slog .Warn ("'DEBUG' variable is deprecated, please use LOG_LEVEL=DEBUG instead" )
187188 cfg .LogLevel = "DEBUG"
@@ -198,7 +199,7 @@ func (cfg *Config) HandleDeprecation() { //
198199func (cfg * Config ) GetPlaylistName () { // Generate playlist name and description
199200
200201 toTitle := cases .Title (language .Und )
201-
202+
202203 playlistName := toTitle .String (cfg .Flags .Playlist )
203204 if cfg .Persist {
204205 year , week := time .Now ().ISOWeek ()
@@ -213,7 +214,7 @@ func (cfg *Config) GetPlaylistName() { // Generate playlist name and description
213214 cfg .ClientCfg .PlaylistName = playlistName
214215
215216 if cfg .DownloadCfg .UseSubDir {
216- // add playlist name to downloadDir so all songs get downloaded to a single sub directory.
217+ // add playlist name to downloadDir so all songs get downloaded to a single sub directory.
217218 cfg .DownloadCfg .DownloadDir = fmt .Sprintf ("%s%s/" , cfg .DownloadCfg .DownloadDir , playlistName )
218219 }
219220}
0 commit comments