config.go
⎇
Raw
1package config
2
3import (
4 "fmt"
5 "os"
6 "path/filepath"
7 "strconv"
8 "strings"
9)
10
11type Config struct {
12 Port int
13 DataDir string
14 DBPath string
15 LibraryDir string
16 TempDir string
17 YTDLPPath string
18 FFmpegPath string
19 FFprobePath string
20 BaseURL string
21 Workers int
22 SchedulerInterval int
23}
24
25func New() *Config {
26 dataDir := getEnv("VIDARCHIVE_DATA_DIR", "./data")
27
28 return &Config{
29 Port: getEnvInt("VIDARCHIVE_PORT", 8080),
30 DataDir: dataDir,
31 DBPath: getEnv("VIDARCHIVE_DB_PATH", filepath.Join(dataDir, "vidarchive.db")),
32 LibraryDir: getEnv("VIDARCHIVE_LIBRARY_DIR", filepath.Join(dataDir, "library")),
33 TempDir: getEnv("VIDARCHIVE_TEMP_DIR", filepath.Join(dataDir, "temp")),
34 YTDLPPath: getEnv("VIDARCHIVE_YTDLP_PATH", "yt-dlp"),
35 FFmpegPath: getEnv("VIDARCHIVE_FFMPEG_PATH", "ffmpeg"),
36 FFprobePath: getEnv("VIDARCHIVE_FFPROBE_PATH", "ffprobe"),
37 BaseURL: getEnv("VIDARCHIVE_BASE_URL", ""),
38 Workers: getEnvIntMin("VIDARCHIVE_WORKERS", 2, 1),
39 SchedulerInterval: getEnvIntMin("VIDARCHIVE_SCHEDULER_INTERVAL", 60, 1),
40 }
41}
42
43func (c *Config) IsHTTPS() bool {
44 return strings.HasPrefix(c.BaseURL, "https://")
45}
46
47func getEnv(key, defaultVal string) string {
48 if v := os.Getenv(key); v != "" {
49 return v
50 }
51 return defaultVal
52}
53
54func getEnvInt(key string, defaultVal int) int {
55 v := os.Getenv(key)
56 if v == "" {
57 return defaultVal
58 }
59 i, err := strconv.Atoi(v)
60 if err != nil {
61 fmt.Fprintf(os.Stderr, "invalid %s: %v, using default %d\n", key, err, defaultVal)
62 return defaultVal
63 }
64 return i
65}
66
67// getEnvIntMin is getEnvInt with a lower bound. A value below min is rejected in
68// favour of the default: a zero or negative worker count or tick interval would
69// otherwise stall downloads or spin the scheduler.
70func getEnvIntMin(key string, defaultVal, min int) int {
71 i := getEnvInt(key, defaultVal)
72 if i < min {
73 fmt.Fprintf(os.Stderr, "invalid %s: %d is below the minimum %d, using default %d\n", key, i, min, defaultVal)
74 return defaultVal
75 }
76 return i
77}
78