From 75bd36a33290aa4a10c30aabc8ce7787c555cb6b Mon Sep 17 00:00:00 2001 From: ari melody Date: Fri, 24 Jul 2026 09:54:54 +0100 Subject: [PATCH] improve fault tolerance and OS compat beyond linux --- main.go | 37 +++++++++++++++++++++---------------- music/music.go | 9 +++++++-- twitch/twitch.go | 4 ++-- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/main.go b/main.go index 257bcb1..db92817 100644 --- a/main.go +++ b/main.go @@ -40,17 +40,6 @@ func main() { } } - learningService := learning.New(ctx, learning.ServiceConfig{ - TitleFilePath: "learning-title.txt", - }) - musicService := music.New(ctx) - twitchService, err := twitch.New(ctx, twitch.ServiceOptions{ - Port: port, - }) - if err != nil { - log.Fatalf("Failed to create Twitch service: %v", err) - } - srv := gin.Default() srv.Use(gin.LoggerWithConfig(gin.LoggerConfig{ SkipPaths: []string{ @@ -59,12 +48,28 @@ func main() { "/learning/public", }, })) - learningService.BindRoutes(srv.Group("/learning")) - musicService.BindRoutes(srv.Group("/music")) - twitchService.BindRoutes(srv.Group("/twitch")) - go musicService.Run(ctx) - go twitchService.Run(ctx) + learningService := learning.New(ctx, learning.ServiceConfig{ + TitleFilePath: "learning-title.txt", + }) + learningService.BindRoutes(srv.Group("/learning")) + + musicService, err := music.New(ctx) + if err != nil { + log.Printf("Failed to create music service: %v", err) + } else { + musicService.BindRoutes(srv.Group("/music")) + go musicService.Run(ctx) + } + + twitchService, err := twitch.New(ctx, twitch.ServiceOptions{ Port: port }) + if err != nil { + log.Printf("Failed to create Twitch service: %v", err) + } else { + twitchService.BindRoutes(srv.Group("/twitch")) + go twitchService.Run(ctx) + } + go func() { log.Printf("Now serving at http://%s:%d\n", host, port) failed <- srv.Run(fmt.Sprintf("%s:%d", host, port)) diff --git a/music/music.go b/music/music.go index 0a0edb0..bab21b8 100644 --- a/music/music.go +++ b/music/music.go @@ -7,6 +7,7 @@ import ( "io" "log" "net/http" + "runtime" "strings" "time" @@ -50,7 +51,11 @@ type ( } ) -func New(ctx context.Context) *Service { +func New(ctx context.Context) (*Service, error) { + if runtime.GOOS != "linux" { + return nil, fmt.Errorf("Platform %s is unsupported", runtime.GOOS) + } + nextTrack := make(chan *trackMetadata) nextPlaying := make(chan bool) @@ -63,7 +68,7 @@ func New(ctx context.Context) *Service { playingBroadcast: broadcast.NewBroadcastChannel(ctx, nextPlaying), } - return srv + return srv, nil } func (srv *Service) BindRoutes(group *gin.RouterGroup) { diff --git a/twitch/twitch.go b/twitch/twitch.go index 6bbb478..1ffb806 100644 --- a/twitch/twitch.go +++ b/twitch/twitch.go @@ -85,12 +85,12 @@ func New(ctx context.Context, opts ServiceOptions) (*Service, error) { var config serviceConfig if configFile, err := os.OpenFile(path.Join(DATA_PATH, "twitch-config.json"), os.O_CREATE | os.O_RDWR, 0600); err != nil { - log.Fatalf("Failed to open twitch-config.json: %v", err) + return nil, fmt.Errorf("Failed to open twitch-config.json: %v", err) } else { defer configFile.Close() // TODO: write template file if empty if err := json.NewDecoder(configFile).Decode(&config); err != nil { - log.Fatalf("Failed to read twitch-config.json: %v", err) + return nil, fmt.Errorf("Failed to read twitch-config.json: %v", err) } }