vodular/cmd/server/main.go

100 lines
2.4 KiB
Go
Raw Normal View History

2026-06-08 02:49:39 +01:00
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)
}
}
}