summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-04-29 22:26:04 +0300
committerPaul Buetow <paul@buetow.org>2026-04-29 22:26:04 +0300
commit9f0ceb6971c85f1fac8255bf420367b08f7e4acf (patch)
tree7ba1c10454792d205a6ae895ce6c0c12842d8b2c /cmd
parent5360e89457b057eb4faff03d995116ffaef4d543 (diff)
fix: start HTTP server in main.go
Diffstat (limited to 'cmd')
-rw-r--r--cmd/mediaplayer/main.go78
1 files changed, 78 insertions, 0 deletions
diff --git a/cmd/mediaplayer/main.go b/cmd/mediaplayer/main.go
new file mode 100644
index 0000000..d064274
--- /dev/null
+++ b/cmd/mediaplayer/main.go
@@ -0,0 +1,78 @@
+package main
+
+import (
+ "context"
+ "flag"
+ "fmt"
+ "log"
+ "net/http"
+ "os"
+ "os/signal"
+ "syscall"
+ "time"
+
+ "github.com/paul/kiss-media-player/internal"
+ "github.com/paul/kiss-media-player/internal/api"
+ "github.com/paul/kiss-media-player/internal/auth"
+ "github.com/paul/kiss-media-player/internal/clock"
+ "github.com/paul/kiss-media-player/internal/repository"
+ "github.com/paul/kiss-media-player/internal/service"
+)
+
+func main() {
+ versionFlag := flag.Bool("version", false, "print version and exit")
+ flag.Parse()
+
+ if *versionFlag {
+ fmt.Println(internal.Version)
+ os.Exit(0)
+ }
+
+ cfg, err := internal.LoadConfig()
+ if err != nil {
+ log.Fatalf("failed to load config: %v", err)
+ }
+
+ store, err := repository.Open(cfg.DBPath)
+ if err != nil {
+ log.Fatalf("failed to open database: %v", err)
+ }
+ defer func() {
+ if err := store.Close(); err != nil {
+ log.Printf("failed to close database: %v", err)
+ }
+ }()
+
+ clk := clock.RealClock{}
+ hasher := auth.NewBCryptHasher(12)
+ sm := auth.NewSessionManager(store, clk, time.Duration(cfg.SessionTimeoutHours)*time.Hour)
+
+ mediaSvc := service.NewMediaService(store, clk, cfg.MediaRoot)
+ adminSvc := service.NewAdminService(store, clk, hasher)
+ progressSvc := service.NewProgressService(store, clk)
+
+ staticFS := http.Dir("web")
+ server := api.NewServer(store, hasher, sm, cfg, mediaSvc, adminSvc, progressSvc, staticFS)
+
+ gs := api.NewGracefulServer(server, cfg)
+
+ log.Printf("kiss-media-player %s starting on %s", internal.Version, gs.Server.Addr)
+
+ go func() {
+ if err := gs.Server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
+ log.Fatalf("failed to start server: %v", err)
+ }
+ }()
+
+ quit := make(chan os.Signal, 1)
+ signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
+ <-quit
+
+ log.Println("shutting down server...")
+ shutdownCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
+ defer cancel()
+ if err := gs.Server.Shutdown(shutdownCtx); err != nil {
+ log.Fatalf("failed to shutdown server: %v", err)
+ }
+ log.Println("server stopped")
+}