package main import ( "context" "errors" "log/slog" "os" "os/signal" "path" "syscall" "arimelody.space/melody-vod-manager/config" "arimelody.space/melody-vod-manager/logger" "arimelody.space/melody-vod-manager/server" "arimelody.space/melody-vod-manager/templates" "github.com/gin-gonic/gin" "github.com/mattn/go-isatty" ) func main() { var err error ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer cancel() gin.SetMode(gin.ReleaseMode) var handlers []slog.Handler slogger := slog.New(logger.NewSlogHandler(os.Stderr, logger.Options{ Handlers: handlers, IsTerminal: isatty.IsTerminal(os.Stderr.Fd()), Level: slog.LevelDebug, })) slog.SetDefault(slogger) cliLogger := slogger.WithGroup("CLI") cliLogger.Debug("Running with arguments:", "args", os.Args) userConfigDir, err := os.UserConfigDir() if err != nil { cliLogger.Error("Could not determine user configuration directory:", "err", err) os.Exit(1) } configLocations := []string{ "config.toml", path.Join(userConfigDir, "melody-vod-manager", "config.toml"), "/etc/melody-vod-manager/config.toml", } var cfg *config.Config for _, path := range configLocations { cliLogger.Debug("Checking config path:", "path", path) cfg, err = config.ReadConfig(path) if !os.IsNotExist(err) { break } } if cfg == nil { cliLogger.Error("Failed to load configuration!", "err", err) os.Exit(1) } var templateDir string templateLocations := []string{ path.Join(userConfigDir, "melody-vod-manager", "templates"), "/etc/melody-vod-manager/templates", } var textTemplates *templates.TextTemplates for _, dir := range templateLocations { cliLogger.Debug("Checking template directory:", "dir", dir) textTemplates, err = templates.FetchTemplates(ctx, dir) if err == nil { templateDir = dir } if !os.IsNotExist(err) { break } } if err != nil { cliLogger.Error("Failed to fetch templates:", "err", err) os.Exit(1) } srv, err := server.New( server.VODServerConfig{ Host: cfg.Host, Port: cfg.Port, VODDirectory: cfg.VODDirectory, TemplateDirectory: templateDir, }, server.VODGoogleConfig{ ApiKey: cfg.Google.ApiKey, ClientID: cfg.Google.ClientID, ClientSecret: cfg.Google.ClientSecret, }, textTemplates, ) if err != nil { panic(err) } if err = srv.Run(ctx); err != nil { if !errors.Is(err, context.Canceled) { cliLogger.Error("A fatal error has occurred:", "err", err) } } }