79 lines
1.5 KiB
Go

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()
}