def download(self, url, filepath, range_left, range_right, proxy=None): req = Request() resp = req.makeRequest( url, proxy=proxy, headers={'Range': 'bytes=%d-%d' % (range_left, range_right)}) chunk_size = 1024 * 256 #256KB with open(filepath, "wb") as fp: downloaded = 0 #in KBs while True: data = resp.read(chunk_size) if not data: print("\nDownload Finished.") break fp.write(data) downloaded += sys.getsizeof(data) print("\r{0:.2f} MB".format(downloaded / (1024 * 1024)), end="") req.closeConnection(resp)
# if servers doesn't exist, use simple download if client.numPeerServers() == 0: print("No peer servers! Using default download...") download_object = DistributedDownloaderAndMerger(url) download_object.download() else: print("Peer Servers found! Distributing download...") # get the filesize req = Request() response = req.makeRequest(url, proxy=peerClientConfig.getProxy()) filesize = int(response.headers['Content-Length']) req.closeConnection(response) print("peer-client filesize: {}".format(filesize)) # get the download ranges to be assigned to each parts = client.numPeerServers() range_list = Calculation().get_download_ranges_list( 0, filesize - 1, parts) # connect with each server and send them the download details client.connectWithPeerServers(range_list, temp_dir) # wait for download to complete at each server # except main_thread, calling join() for each thread # it ensures that merging of parts occur only after each thread has completed downloading # print ("Threads: ", len(threading.enumerate())) main_thread = threading.current_thread()