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)
Ejemplo n.º 2
0
        # 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()