diff --git a/client.go b/client.go index d4b97cfb..75556199 100644 --- a/client.go +++ b/client.go @@ -402,13 +402,13 @@ func (c *Client) downloadChunked(ctx context.Context, req *http.Request, w *io.P currentChunk := atomic.Uint32{} for i := 0; i < maxRoutines; i++ { go func() { - i := int(currentChunk.Add(1)) - 1 - if i > len(chunks) { + chunkNumber := int(currentChunk.Add(1)) + if chunkNumber > len(chunks) { // no more chunks return } - chunk := &chunks[i] + chunk := &chunks[chunkNumber-1] err := c.downloadChunk(req.Clone(cancelCtx), chunk) close(chunk.data) diff --git a/client_test.go b/client_test.go index 1ab0518f..ce216c47 100644 --- a/client_test.go +++ b/client_test.go @@ -129,6 +129,15 @@ func TestGetVideoWithManifestURL(t *testing.T) { func TestGetStream(t *testing.T) { assert, require := assert.New(t), require.New(t) + expectedSize := 988479 + + // Create testclient to enforce re-using of routines + testClient := Client{ + Debug: true, + MaxRoutines: 10, + ChunkSize: int64(expectedSize) / 11, + } + // Download should not last longer than a minute. // Otherwise we assume Youtube is throtteling us. ctx, cancel := context.WithTimeout(context.Background(), time.Minute) @@ -141,7 +150,7 @@ func TestGetStream(t *testing.T) { reader, size, err := testClient.GetStreamContext(ctx, video, &video.Formats[0]) require.NoError(err) - assert.EqualValues(988479, size) + assert.EqualValues(expectedSize, size) data, err := io.ReadAll(reader) require.NoError(err)