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