package main import ( "context" "log" "m3u8-downloader/pkg/constants" "m3u8-downloader/pkg/media" "os" "os/signal" "sync" "syscall" ) func main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) go func() { <-sigChan log.Println("Shutting down...") cancel() }() variants, err := media.GetAllVariants(constants.MasterURL) if err != nil { log.Fatalf("Failed to get variants: %v", err) } log.Printf("Found %d variants", len(variants)) var wg sync.WaitGroup sem := make(chan struct{}, constants.WorkerCount*len(variants)) for _, variant := range variants { wg.Add(1) go func(v *media.StreamVariant) { defer wg.Done() media.VariantDownloader(ctx, v, sem) }(variant) } wg.Wait() log.Println("All variant downloaders finished.") }