100 lines
2.4 KiB
Go
100 lines
2.4 KiB
Go
|
|
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)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|