package main import ( "context" "fmt" "log" "math" "os" "os/signal" "strconv" "syscall" "codeberg.org/arimelody/ari-stream-tools/learning" "codeberg.org/arimelody/ari-stream-tools/music" "github.com/gin-gonic/gin" ) var DEFAULT_HOST string = "0.0.0.0" var DEFAULT_PORT int16 = 8080 func main() { failed := make(chan error) ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer cancel() gin.SetMode(gin.ReleaseMode) host := DEFAULT_HOST port := DEFAULT_PORT if len(os.Args) > 1 { _port, err := strconv.Atoi(os.Args[1]) if _port > math.MaxUint16 { log.Fatalf("Port must be between 1 and 65535: %d", _port) } port = int16(_port) if err != nil { log.Fatalf("Failed to parse port: %v", err) } } learningService := learning.New(ctx, learning.ServiceConfig{ TitleFilePath: "learning-title.txt", }) musicService := music.New(ctx) srv := gin.Default() learningService.BindRoutes(srv.Group("/learning")) musicService.BindRoutes(srv.Group("/music")) go musicService.Run(ctx) go func() { log.Printf("Now serving at http://%s:%d\n", host, port) failed <- srv.Run(fmt.Sprintf("%s:%d", host, port)) }() select { case err := <-failed: log.Fatal(err) case <-ctx.Done(): log.Print("Shutting down...") } }