package main import ( "context" "log" "os" "os/signal" "syscall" "time" "github.com/labstack/echo/v4" "github.com/user/ytdlp-navidrome/internal/bot" "github.com/user/ytdlp-navidrome/internal/config" "github.com/user/ytdlp-navidrome/internal/health" ) func main() { cfg := config.Load() // Setup logging log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) log.Printf("Starting ytdlp-navidrome service...") log.Printf("Log level: %s", cfg.LogLevel) log.Printf("Proxy enabled: %v, URL: %s", cfg.ProxyEnabled, cfg.ProxyURL) ctx, cancel := context.WithCancel(context.Background()) defer cancel() // Start health HTTP server e := echo.New() e.HideBanner = true e.HidePort = true startTime := time.Now() healthChecker := health.NewChecker(cfg.YtdlpPath, cfg.ProxyURL) e.GET("/healthz", healthChecker.Handler(startTime)) go func() { log.Printf("HTTP server listening on %s", cfg.ListenAddr) if err := e.Start(cfg.ListenAddr); err != nil { log.Printf("HTTP server stopped: %v", err) } }() // Start Matrix bot b := bot.New(cfg) go func() { log.Printf("Matrix bot connecting...") if err := b.Start(ctx); err != nil { log.Fatalf("Matrix bot error: %v", err) } }() log.Printf("Service started. PID: %d", os.Getpid()) // Wait for shutdown signal sigCh := make(chan os.Signal, 1) signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM) sig := <-sigCh log.Printf("Received signal %v, shutting down...", sig) // Graceful shutdown shutdownCtx, shutdownCancel := context.WithTimeout(context.Background(), 10*time.Second) defer shutdownCancel() if err := e.Shutdown(shutdownCtx); err != nil { log.Printf("HTTP server shutdown error: %v", err) } cancel() log.Printf("Service stopped.") }