Move progress reporting to its own goroutine

This commit is contained in:
Xpl0itU 2024-04-01 12:50:52 +02:00
parent 6b8713a09b
commit 99ea73d98d

View file

@ -51,7 +51,7 @@ func downloadFile(ctx context.Context, progressReporter ProgressReporter, client
req.Header.Set("User-Agent", "WiiUDownloader")
req.Header.Set("Connection", "Keep-Alive")
req.Header.Set("Accept-Encoding", "gzip")
req.Header.Set("Accept-Encoding", "")
resp, err := client.Do(req)
if err != nil {
@ -79,35 +79,44 @@ func downloadFile(ctx context.Context, progressReporter ProgressReporter, client
ticker := time.NewTicker(250 * time.Millisecond)
defer ticker.Stop()
go func() {
for range ticker.C {
if progressReporter.Cancelled() {
break
}
progressReporter.UpdateDownloadProgress(downloaded, calculateDownloadSpeed(downloaded, startTime, time.Now()), filePath)
}
}()
Loop:
for {
n, err := resp.Body.Read(buffer)
if err != nil && err != io.EOF {
if doRetries && attempt < maxRetries {
time.Sleep(retryDelay)
break
}
return fmt.Errorf("download error after %d attempts: %+v", attempt, err)
}
if n == 0 {
break
}
_, err = file.Write(buffer[:n])
if err != nil {
if doRetries && attempt < maxRetries {
time.Sleep(retryDelay)
break
}
return fmt.Errorf("write error after %d attempts: %+v", attempt, err)
}
downloaded += int64(n)
select {
case <-ctx.Done():
return ctx.Err()
case <-ticker.C:
progressReporter.UpdateDownloadProgress(downloaded, calculateDownloadSpeed(downloaded, startTime, time.Now()), filePath)
default:
n, err := resp.Body.Read(buffer)
if err != nil && err != io.EOF {
if doRetries && attempt < maxRetries {
time.Sleep(retryDelay)
break
}
return fmt.Errorf("download error after %d attempts: %+v", attempt, err)
}
if n == 0 {
break Loop
}
_, err = file.Write(buffer[:n])
if err != nil {
if doRetries && attempt < maxRetries {
time.Sleep(retryDelay)
break
}
return fmt.Errorf("write error after %d attempts: %+v", attempt, err)
}
downloaded += int64(n)
}
}
break