Пример #1
0
async def download(torrent_file: str, download_location: str):
    """
    Download coroutine to start a download by accepting a torrent file and download location
    :param torrent_file: torrent file to be downloaded
    :param download_location: location to download it to
    """
    torrent = Torrent(torrent_file)

    torrent_writer = FileSaver(download_location, torrent)
    session = DownloadSession(
        torrent, torrent_writer.get_received_pieces_queue())  # FILESAVER

    done_pieces = 0

    while done_pieces < torrent.number_of_pieces:
        await torrent.get_peers()
        peers_info = list(set(torrent.peers))

        seen_peers = set()
        peers = [Peer(session, host, port) for host, port in peers_info]
        seen_peers.update([str(p) for p in peers])

        print('[Peers]: {} {}'.format(len(seen_peers), seen_peers))
        for peer in peers:
            peer.inflight_requests = 0

        print("STARTING")
        await (asyncio.gather(*[peer.download() for peer in peers]))

        print("received", len(session.received_pieces))

        print("progress", len(session.pieces_in_progress))
        pprint(session.pieces_in_progress)

        print("resetting session.pieces_in_progress")
        session.pieces_in_progress = {}

        print("alive peers")
        peers = [peer for peer in peers if peer.have_pieces is not None]

        print("bitfields")
        pprint([(peer, peer.have_pieces) for peer in peers])

        done_pieces = len(session.received_pieces)
        print("Done pieces:", done_pieces)
        print("RESTARTING")

    return True