in clips/hls/hls.go [91:136]
func downloadSegments(segments []*m3u8.MediaSegment) ([]Segment, error) {
var buffer []Segment
numSegments := 0
for _, s := range segments {
if s != nil {
numSegments++
}
}
done := make(chan Segment, numSegments)
errorChan := make(chan error, numSegments)
for _, segment := range segments {
if segment != nil {
go func(URI string, seq uint64) {
s, err := downloadSegment(URI, seq)
if err != nil {
errorChan <- err
done <- s
return
}
done <- s
errorChan <- nil
}(segment.URI, segment.SeqId)
}
}
var errStr string
for i := 0; i < numSegments; i++ {
buffer = append(buffer, <-done)
if err := <-errorChan; err != nil {
errStr = errStr + " " + err.Error()
}
}
if errStr != "" {
return nil, errors.New(errStr)
}
sort.SliceStable(buffer, func(i, j int) bool {
return buffer[i].SequenceID < buffer[j].SequenceID
})
return buffer, nil
}