diff --git a/util.go b/util.go index e148995..ddae90f 100644 --- a/util.go +++ b/util.go @@ -9,7 +9,6 @@ import ( "path/filepath" "slices" "strings" - "sync" "golang.org/x/net/proxy" ) @@ -17,7 +16,6 @@ import ( var Debug = false var Tor = false var Socks5Address = "127.0.0.1:9050" -var DownThreads = 8 func getHttpClient() (*http.Client, error) { if Tor { @@ -138,60 +136,21 @@ func Download(manifest Manifest, downloadDir string, filen string) ([]byte, erro ret := make([]byte, manifest.Size) totalMB := float32(manifest.Size) / 1024.0 / 1024.0 - // A channel to signal the main goroutine to check for errors - doneChan := make(chan bool) - - var wg sync.WaitGroup - wg.Add(DownThreads) - var mu sync.Mutex - - fragChan := make(chan Fragment, DownThreads) - errChan := make(chan error, DownThreads) - - // Start worker threads - for i := 0; i < DownThreads; i++ { - go func() { - defer wg.Done() - for fragment := range fragChan { - url := transformShaToURL(fragment.Sha512, fragment.Size) - content, err := getContent(url) - if err != nil { - errChan <- err - return - } - mu.Lock() - downloaded += len(*content) * len(fragment.Offsets) - for _, offset := range fragment.Offsets { - trackFrag = append(trackFrag, Frag{Offset: offset, Size: len(*content)}) - copy(ret[offset:offset+len(*content)], *content) - } - percent := float32(downloaded) / float32(manifest.Size) * 100.0 - downedMB := float32(downloaded) / 1024.0 / 1024.0 - fmt.Printf("\r\033[32mDownloaded\033[0m %fMB/%fMB (\033[36m%.2f%%\033[0m) of \033[33m%s\033[0m", downedMB, totalMB, percent, filen) - mu.Unlock() - } - }() - } - - // A separate goroutine to wait for all workers to finish and then close the error channel - go func() { - wg.Wait() - close(doneChan) - }() - - // Send fragments to workers + // Download all fragments serially to keep execution simple and deterministic. for _, fragment := range manifest.Fragments { - fragChan <- fragment - } - close(fragChan) - - // Wait for workers to finish or an error to occur - select { - case <-doneChan: - // All workers finished successfully - case err := <-errChan: - // An error occurred - return nil, err + url := transformShaToURL(fragment.Sha512, fragment.Size) + content, err := getContent(url) + if err != nil { + return nil, err + } + downloaded += len(*content) * len(fragment.Offsets) + for _, offset := range fragment.Offsets { + trackFrag = append(trackFrag, Frag{Offset: offset, Size: len(*content)}) + copy(ret[offset:offset+len(*content)], *content) + } + percent := float32(downloaded) / float32(manifest.Size) * 100.0 + downedMB := float32(downloaded) / 1024.0 / 1024.0 + fmt.Printf("\r\033[32mDownloaded\033[0m %fMB/%fMB (\033[36m%.2f%%\033[0m) of \033[33m%s\033[0m", downedMB, totalMB, percent, filen) } // sort trackFrag by Offset