package main import ( "m3u8-downloader/pkg/downloader" "m3u8-downloader/pkg/media" "sync" ) func main() { //Stream URL masterUrl := "https://d17cyqyz9yhmep.cloudfront.net/streams/234951/playlist_vo_1752978025523_1752978954944.m3u8" //Download Service service := downloader.GetDownloadService() //Parse Master Playlist -> Stream Set stream, err := service.ParseMasterPlaylist(masterUrl) if err != nil { panic(err) } //Select best quality streams video, audio := stream.Master.SelectBestQualityStreams() if !(audio == nil) { audio_segments, err := service.ParseSegmentPlaylist(stream.BuildSegmentURL(audio.URL)) if err != nil { panic(err) } audio.Segments = *audio_segments } //Populate Segment Lists video_segments, err := service.ParseSegmentPlaylist(stream.BuildSegmentURL(video.URL)) if err != nil { panic(err) } video.Segments = *video_segments audioChan := make(chan media.Segment, 10) videoChan := make(chan media.Segment, 10) var wg sync.WaitGroup if !(audio == nil) { for i := 1; i <= 2; i++ { wg.Add(1) go service.DownloadWorker(i, audioChan, &wg) } } for i := 1; i <= 4; i++ { wg.Add(1) go service.DownloadWorker(i, videoChan, &wg) } if !(audio == nil) { go func() { for _, segment := range audio.Segments.SegmentList { audioChan <- segment } close(audioChan) }() } go func() { for _, segment := range video.Segments.SegmentList { videoChan <- segment } close(videoChan) }() wg.Wait() }