79 lines
1.5 KiB
Go
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()
|
|
}
|