func downloadSegments()

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

}