-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
135 lines (112 loc) · 3.65 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package main
import (
"context"
"flag"
"fmt"
"log/slog"
"os"
"github.com/lmittmann/tint"
"github.com/mattn/go-isatty"
"github.com/robfig/cron/v3"
"github.com/stone/timelapser/internal/camera"
"github.com/stone/timelapser/internal/config"
"github.com/stone/timelapser/internal/snapshot"
"github.com/stone/timelapser/internal/timelapse"
)
// Build information. Populated at build-time using -ldflags
var (
Version string
GitCommit string
)
var logger *slog.Logger
func main() {
flagConfigPath := flag.String("config", "config.yaml", "path to config file")
flagSnapshot := flag.Bool("snapshot", false, "Do a single snapshot of all configured cameras")
flagTimelapse := flag.Bool("timelapse", false, "Create timelapse for all configured cameras and quit, (images not deleted)")
flagLogLevel := flag.String("log", "INFO", "Log level (DEBUG, INFO)")
flagListCameras := flag.Bool("list", false, "List configured cameras")
flagGetConfig := flag.Bool("example-config", false, "Print example configuration to stdout")
flagGetVersion := flag.Bool("version", false, "Print version and exit")
flag.Parse()
if *flagGetVersion {
fmt.Printf("timelapser %s (%s)\n", Version, GitCommit)
os.Exit(0)
}
if *flagGetConfig {
fmt.Println(config.NewExampleConfig())
os.Exit(0)
}
crn := cron.New()
var loglevel slog.Level
switch *flagLogLevel {
case "DEBUG":
loglevel = slog.LevelDebug
case "INFO":
loglevel = slog.LevelInfo
}
logger = slog.New(
tint.NewHandler(os.Stderr, &tint.Options{
Level: loglevel,
NoColor: !isatty.IsTerminal(os.Stderr.Fd()),
}),
)
logger.Debug("Opening configuration file", "config", *flagConfigPath)
config, err := config.LoadConfig(*flagConfigPath, logger)
if err != nil {
logger.Error("Error loading config", "config", *flagConfigPath, "error", err)
os.Exit(1)
}
if logger.Handler().Enabled(context.TODO(), slog.LevelDebug) {
for _, camConfig := range config.Cameras {
logger.Debug("Camera configuration", "camera", camConfig.Name, "url", camConfig.SnapshotURL, "delete", camConfig.Delete)
}
}
if *flagListCameras {
camera.ListCameras(config)
os.Exit(0)
}
logger.Info("Starting timelapser", "version", Version, "git", GitCommit)
// Take snapshot of cameras and quit
if *flagSnapshot {
if err := snapshot.TakeSnapshot(config); err != nil {
logger.Error("Error taking snapshot", "error", err)
os.Exit(1)
}
os.Exit(0)
}
if *flagTimelapse {
if err := timelapse.CreateAllTimelapse(config, logger); err != nil {
logger.Error("Error creating timelapse", "error", err)
os.Exit(1)
}
os.Exit(0)
}
// Schedule snapshots
for _, camConfig := range config.Cameras {
// Simple way of picking up default inteval or use camera specific interval
timelapseInterval := config.TimelapseInterval
if camConfig.TimelapseInterval != "" {
timelapseInterval = camConfig.TimelapseInterval
}
interval := config.Interval
if camConfig.Interval != "" {
interval = camConfig.Interval
}
logger.Info("Scheduling camera snapshot", "name", camConfig.Name, "interval", interval)
crn.AddFunc(interval, func() {
if err := snapshot.TakeCameraSnapshot(&camConfig, config.OutputDir, logger); err != nil {
logger.Error("Error taking snapshot", "name", camConfig.Name, "error", err)
}
})
logger.Info("Scheduling timelapse generation", "name", camConfig.Name, "timelapseInterval", timelapseInterval)
crn.AddFunc(timelapseInterval, func() {
if err := timelapse.CreateTimelapse(&camConfig, config.OutputDir, logger); err != nil {
logger.Error("Error generating timelapse", "name", camConfig.Name, "error", err)
}
})
}
// Start the scheduler
crn.Start()
// Keep the program running
select {}
}