From f6f0ace33caba1a3699ad14acab0115a785a116d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=88=9A=28noham=29=C2=B2?= <100566912+NohamR@users.noreply.github.com> Date: Mon, 23 Dec 2024 18:48:12 +0100 Subject: [PATCH] multi torrents --- code/process_torrent.py | 71 +++++++++++++++++------------------- code/torrentclientfactory.py | 2 +- config.json | 4 +- ratio.py | 31 ++++++++++------ 4 files changed, 56 insertions(+), 52 deletions(-) diff --git a/code/process_torrent.py b/code/process_torrent.py index 361c086..6a3cf32 100644 --- a/code/process_torrent.py +++ b/code/process_torrent.py @@ -11,14 +11,15 @@ from tqdm import tqdm from time import sleep from struct import unpack +import os -logging.basicConfig(level=logging.DEBUG) +logging.basicConfig(level=logging.INFO) class process_torrent(): - def __init__(self, configuration): self.configuration = configuration self.open_torrent() + self.timer = 0 self.torrentclient = Transmission406(self.tracker_info_hash()) def open_torrent(self): @@ -28,11 +29,14 @@ class process_torrent(): self.b_enc = bencoding() self.metainfo = self.b_enc.bdecode(data) self.info = self.metainfo['info'] + self.files = [] if 'length' not in self.info: self.info['length'] = 0 for file in self.info['files']: self.info['length'] += file['length'] - print(pretty_data(self.info['files'])) + self.files.append(file['path']) + # print(pretty_data(self.info['files'])) + # print(self.files) def tracker_info_hash(self): raw_info = self.b_enc.get_dict('info') @@ -60,16 +64,12 @@ class process_torrent(): params = tc.get_query(uploaded=0, downloaded=0, event='started') - - print('----------- First Command to Tracker --------') content = self.send_request(params, headers) self.tracker_response_parser(content) def tracker_response_parser(self, tr_response): b_enc = bencoding() response = b_enc.bdecode(tr_response) - print('----------- Received Tracker Response --------') - print(pretty_data(response)) raw_peers = b_enc.get_dict('peers') i = 0 peers = [] @@ -83,38 +83,33 @@ class process_torrent(): peers.append((ip, port)) self.interval = response['interval'] - def wait(self): - random_badtime = random.randint(10,15)*60 # interval to send request betwen 10min and 15min - self.interval = random_badtime - pbar = tqdm(total=self.interval) - print('sleep: {}'.format(self.interval)) - t = 0 - while t < (self.interval): - t += 1 - pbar.update(1) - sleep(1) - pbar.close() +def seedqueue(queue): + while True: + waitingqueue = "" + for torrent in queue: + if torrent.timer <= 0: + torrent.tracker_start_request() - def tracker_process(self): - while True: - self.tracker_start_request() + min_up = torrent.interval-(torrent.interval*0.1) + max_up = torrent.interval + randomize_upload = random.randint(min_up, max_up) + uploaded = int(torrent.configuration['upload'])*1000*randomize_upload - print('----------- Sending Command to Tracker --------') + downloaded = 0 - # get upload - min_up = self.interval-(self.interval*0.1) - max_up = self.interval - randomize_upload = random.randint(min_up, max_up) - uploaded = int(self.configuration['upload'])*1000*randomize_upload + tc = torrent.torrentclient + headers = tc.get_headers() + params = tc.get_query(uploaded=uploaded, + downloaded=downloaded, + event='stopped') + content = torrent.send_request(params, headers) + torrent.tracker_response_parser(content) - # get download - downloaded = 0 - - tc = self.torrentclient - headers = tc.get_headers() - params = tc.get_query(uploaded=uploaded, - downloaded=downloaded, - event='stopped') - content = self.send_request(params, headers) - self.tracker_response_parser(content) - self.wait() + torrent.timer = random.randint(10,15)*60 # interval to send request betwen 10min and 15min + torrent.interval = torrent.timer + else: + torrent.timer -= 1 + waitingqueue += f"Waiting {torrent.timer} seconds for {torrent.configuration['torrent']}" + "\n" + os.system('cls' if os.name == 'nt' else 'clear') + print(waitingqueue) + sleep(1) \ No newline at end of file diff --git a/code/torrentclientfactory.py b/code/torrentclientfactory.py index 878212c..965796b 100644 --- a/code/torrentclientfactory.py +++ b/code/torrentclientfactory.py @@ -57,4 +57,4 @@ class Transmission406(): def generate_key(self): chars = 'ABCDEF' + string.digits key = self.id_generator(chars, 8) - return key + return key \ No newline at end of file diff --git a/config.json b/config.json index 54fca46..0ee5972 100644 --- a/config.json +++ b/config.json @@ -1,4 +1,4 @@ { - "torrent": "./file.torrent", - "upload":"350" + "torrents": "torrentsfolder", + "upload": "350" } diff --git a/ratio.py b/ratio.py index 68e44d3..0dd3a7a 100644 --- a/ratio.py +++ b/ratio.py @@ -1,34 +1,43 @@ -from code.process_torrent import process_torrent +from code.process_torrent import process_torrent, seedqueue import argparse import json import sys +import os def parse_args(): """Create the arguments""" - parser = argparse.ArgumentParser('\nratio.py -c ') + parser = argparse.ArgumentParser(description="Fake ratio") parser.add_argument("-c", "--configuration", help="Configuration file") return parser.parse_args() def load_configuration(configuration_file): with open(configuration_file) as f: configuration = json.load(f) - - if 'torrent' not in configuration: + if 'torrents' not in configuration: return None - return configuration - if __name__ == "__main__": + queue = [] args = parse_args() if args.configuration: configuration = load_configuration(args.configuration) else: sys.exit() - if not configuration: sys.exit() - - to = process_torrent(configuration) - to.tracker_process() - + folder_path = configuration['torrents'] + torrents_path = [] + for root, dirs, files in os.walk(folder_path): + for file in files: + if file.endswith(".torrent"): + torrents_path.append(os.path.join(root, file)) + for torrent_file in torrents_path: + config = { + "torrent": torrent_file, + "upload": configuration['upload'] + } + torrent = process_torrent(config) + queue.append(torrent) + print(f'Got {len(queue)} torrents') + seedqueue(queue) \ No newline at end of file