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, 1),
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: getEnvInt("VIDARCHIVE_WORKERS", 2, 1),
39 SchedulerInterval: getEnvInt("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
54// getEnvInt reads an int with a lower bound. A value below min is rejected in
55// favour of the default: a zero or negative worker count, tick interval or port
56// would otherwise stall downloads, spin the scheduler or fail to bind.
57func getEnvInt(key string, defaultVal, min int) int {
58 v := os.Getenv(key)
59 if v == "" {
60 return defaultVal
61 }
62 i, err := strconv.Atoi(v)
63 if err != nil {
64 fmt.Fprintf(os.Stderr, "invalid %s: %v, using default %d\n", key, err, defaultVal)
65 return defaultVal
66 }
67 if i < min {
68 fmt.Fprintf(os.Stderr, "invalid %s: %d is below the minimum %d, using default %d\n", key, i, min, defaultVal)
69 return defaultVal
70 }
71 return i
72}
73