def test_print_file_lists(self): printer = Printer(False) printer.print = MagicMock() class MockRequest(): add_header = MagicMock() request_obj = MockRequest() class MockResponse(): read = MagicMock(return_value='<html><tr><td align="left">1.</td><td align="right">filename</tr></html>'.encode('utf8')) info = MagicMock() response_obj = MockResponse() with patch('urllib.request.Request', return_value=request_obj) as request: with patch('urllib.request.urlopen', return_value=response_obj) as urlopen: printer.file_lists([0], [{'id': '1', 'magnet': 'dn=name'}], 'example.com') printer.print.assert_has_calls([call('Files in "name":', color='zebra_1'),call(' 1. filename', color='zebra_0')])
def test_print_descriptions(self): printer = Printer(False) printer.print = MagicMock() class MockRequest(): add_header = MagicMock() request_obj = MockRequest() class MockResponse(): read = MagicMock(return_value='<html><div class="nfo"><pre>stuff <a href="href">link</a></pre></div></html>'.encode('utf8')) info = MagicMock() response_obj = MockResponse() with patch('urllib.request.Request', return_value=request_obj) as request: with patch('urllib.request.urlopen', return_value=response_obj) as urlopen: printer.descriptions([0], [{'id': '1', 'magnet': 'dn=name'}], 'example.com') printer.print.assert_has_calls([call('Description for "name":', color='zebra_1'),call('stuff [link](href)', color='zebra_0')])
def test_print_results_remote(self): class MockTable: add_row = MagicMock() align = {} mock = MockTable() printer = Printer(False) printer.print = MagicMock() with patch('veryprettytable.VeryPrettyTable', return_value=mock) as prettytable: results = [{ 'magnet': 'dn=name', 'seeds': 1, 'leechers': 2, 'size': ['3','MiB'], 'uploaded': 'never' }] printer.search_results(results) prettytable.assert_called_once_with(['LINK', 'SEED', 'LEECH', 'RATIO', 'SIZE', '', 'UPLOAD', 'NAME']) mock.add_row.assert_has_calls([call([0, 1, 2, '0.5', '3.0', 'MiB', 'never', 'name'])])
def test_print_results_local(self): class MockTable: add_row = MagicMock() align = {} mock = MockTable() printer = Printer(True) printer.print = MagicMock() with patch('veryprettytable.VeryPrettyTable', return_value=mock) as prettytable: results = [{ 'magnet': 'dn=name', 'Name': 'name', },{ 'magnet': 'dn=name2', 'Name': 'name2', }] printer.search_results(results, local=True) prettytable.assert_called_once_with(['LINK', 'NAME']) mock.add_row.assert_has_calls([call([0, 'name']), call([1, 'name2'], fore_color='blue')])
def test_print_color(self): printer = Printer(False) with patch('pirate.print.builtins.print') as mock_print: printer.print('abc', color='zebra_1') mock_print.assert_called_once_with('abc') printer = Printer(True) with patch('pirate.print.builtins.print') as mock_print: printer.print('abc', color='zebra_1') mock_print.assert_called_once_with('\x1b[34mabc', '\x1b[0m')
def pirate_main(args): printer = Printer(args.color) # check it transmission is running if args.transmission: ret = subprocess.call(args.transmission_command + ["-l"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) if ret != 0: printer.print("Transmission is not running.") sys.exit(1) # non-torrent fetching actions if args.action == "list_categories": cur_color = "zebra_0" for key, value in sorted(pirate.data.categories.items()): cur_color = "zebra_0" if cur_color == "zebra_1" else "zebra_1" printer.print(str(value), "\t", key, sep="", color=cur_color) return if args.action == "list_sorts": cur_color = "zebra_0" for key, value in sorted(pirate.data.sorts.items()): cur_color = "zebra_0" if cur_color == "zebra_1" else "zebra_1" printer.print(str(value), "\t", key, sep="", color=cur_color) return # fetch torrents if args.source == "local_tpb": results = pirate.local.search(args.database, args.search) elif args.source == "tpb": results, site = search_mirrors(printer, args.pages, args.category, args.sort, args.action, args.search) if len(results) == 0: printer.print("No results") return printer.search_results(results, local=args.source == "local_tpb") # number of results to pick if args.first: printer.print("Choosing first result") choices = [0] elif args.download_all: printer.print("Downloading all results") choices = range(len(results)) else: # interactive loop for per-torrent actions while True: printer.print("\nSelect links (Type 'h' for more options" ", 'q' to quit)", end="\b", color="alt") try: l = builtins.input(": ") except (KeyboardInterrupt, EOFError): printer.print("\nCancelled.") return try: code, choices = parse_torrent_command(l) # Act on option, if supplied printer.print("") if code == "h": printer.print( "Options:", "<links>: Download selected torrents", "[m<links>]: Save magnets as files", "[t<links>]: Save .torrent files", "[d<links>]: Get descriptions", "[f<links>]: Get files", "[p] Print search results", "[q] Quit", sep="\n", ) elif code == "q": printer.print("Bye.", color="alt") return elif code == "d": printer.descriptions(choices, results, site) elif code == "f": printer.file_lists(choices, results, site) elif code == "p": printer.search_results(results) elif code == "m": pirate.torrent.save_magnets(printer, choices, results, args.save_directory) elif code == "t": pirate.torrent.save_torrents(printer, choices, results, args.save_directory) elif not l: printer.print("No links entered!", color="WARN") else: break except Exception as e: printer.print("Exception:", e, color="ERROR") return # output if args.output == "save_magnet_files": printer.print("Saving selected magnets...") pirate.torrent.save_magnets(choices, results, args.save_directory) return if args.output == "save_torrent_files": printer.print("Saving selected torrents...") pirate.torrent.save_torrents(choices, results, args.save_directory) return for choice in choices: url = results[choice]["magnet"] if args.output == "transmission": subprocess.call(args.transmission_command + ["--add", url]) elif args.output == "open_command": cmd = parse_cmd(args.open_command, url) printer.print(" ".join(cmd)) subprocess.call(cmd) elif args.output == "browser_open": webbrowser.open(url) if args.output == "transmission": subprocess.call(args.transmission_command + ["-l"])
def pirate_main(args): printer = Printer(args.color) # check it transmission is running if args.transmission: ret = subprocess.call(args.transmission_command + ['-l'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) if ret != 0: printer.print('Transmission is not running.') sys.exit(1) # non-torrent fetching actions if args.action == 'list_categories': cur_color = 'zebra_0' for key, value in sorted(pirate.data.categories.items()): cur_color = 'zebra_0' if cur_color == 'zebra_1' else 'zebra_1' printer.print(str(value), '\t', key, sep='', color=cur_color) return if args.action == 'list_sorts': cur_color = 'zebra_0' for key, value in sorted(pirate.data.sorts.items()): cur_color = 'zebra_0' if cur_color == 'zebra_1' else 'zebra_1' printer.print(str(value), '\t', key, sep='', color=cur_color) return # fetch torrents if args.source == 'local_tpb': results = pirate.local.search(args.database, args.search) elif args.source == 'tpb': results, site = search_mirrors(printer, args.pages, args.category, args.sort, args.action, args.search) if len(results) == 0: printer.print('No results') return printer.search_results(results, local=args.source == 'local_tpb') # number of results to pick if args.first: printer.print('Choosing first result') choices = [0] elif args.download_all: printer.print('Downloading all results') choices = range(len(results)) else: # interactive loop for per-torrent actions while True: printer.print("\nSelect links (Type 'h' for more options" ", 'q' to quit)", end='\b', color='alt') try: l = builtins.input(': ') except (KeyboardInterrupt, EOFError): printer.print('\nCancelled.') return try: code, choices = parse_torrent_command(l) # Act on option, if supplied printer.print('') if code == 'h': printer.print('Options:', '<links>: Download selected torrents', '[m<links>]: Save magnets as files', '[t<links>]: Save .torrent files', '[d<links>]: Get descriptions', '[f<links>]: Get files', '[p] Print search results', '[q] Quit', sep='\n') elif code == 'q': printer.print('Bye.', color='alt') return elif code == 'd': printer.descriptions(choices, results, site) elif code == 'f': printer.file_lists(choices, results, site) elif code == 'p': printer.search_results(results) elif code == 'm': pirate.torrent.save_magnets(printer, choices, results, args.save_directory) elif code == 't': pirate.torrent.save_torrents(printer, choices, results, args.save_directory) elif not l: printer.print('No links entered!', color='WARN') else: break except Exception as e: printer.print('Exception:', e, color='ERROR') return # output if args.output == 'save_magnet_files': printer.print('Saving selected magnets...') pirate.torrent.save_magnets(choices, results, args.save_directory) return if args.output == 'save_torrent_files': printer.print('Saving selected torrents...') pirate.torrent.save_torrents(choices, results, args.save_directory) return for choice in choices: url = results[choice]['magnet'] if args.output == 'transmission': subprocess.call(args.transmission_command + ['--add', url]) elif args.output == 'open_command': cmd = parse_cmd(args.open_command, url) printer.print(" ".join(cmd)) subprocess.call(cmd) elif args.output == 'browser_open': webbrowser.open(url) if args.output == 'transmission': subprocess.call(args.transmission_command + ['-l'])
def pirate_main(args): printer = Printer(args.color) # browse mode needs a specific category if args.browse: if args.category == 'All' or args.category == 0: printer.print('You must select a specific category in browse mode.' ' ("All" is not valid)', color='ERROR') sys.exit(1) # print version if args.version: printer.print('pirate-get, version {}'.format(pirate.data.version)) sys.exit(0) # check it transmission is running if args.transmission: ret = subprocess.call(args.transmission_command + ['-l'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) if ret != 0: printer.print('Transmission is not running.') sys.exit(1) # non-torrent fetching actions if args.action == 'list_categories': cur_color = 'zebra_0' for key, value in sorted(pirate.data.categories.items()): cur_color = 'zebra_0' if cur_color == 'zebra_1' else 'zebra_1' printer.print(str(value), '\t', key, sep='', color=cur_color) return if args.action == 'list_sorts': cur_color = 'zebra_0' for key, value in sorted(pirate.data.sorts.items()): cur_color = 'zebra_0' if cur_color == 'zebra_1' else 'zebra_1' printer.print(str(value[0]), '\t', key, sep='', color=cur_color) return # fetch torrents if args.source == 'local_tpb': if os.path.isfile(args.database): results = pirate.local.search(args.database, args.search) else: printer.print("Local pirate bay database doesn't exist.", '(%s)' % args.database, color='ERROR') sys.exit(1) elif args.source == 'tpb': try: results, site = search_mirrors(printer, args) except IOError as e: printer.print(e.args[0] + ' :( ', color='ERROR') if len(e.args) > 1: printer.print(e.args[1]) sys.exit(1) if len(results) == 0: printer.print('No results') return if args.json: print(json.dumps(results)) return else: printer.search_results(results, local=args.source == 'local_tpb') # number of results to pick if args.first: printer.print('Choosing first result') choices = [0] elif args.download_all: printer.print('Downloading all results') choices = range(len(results)) else: # interactive loop for per-torrent actions while True: printer.print("\nSelect links (Type 'h' for more options" ", 'q' to quit)", end='\b', color='alt') try: cmd = builtins.input(': ') except (KeyboardInterrupt, EOFError): printer.print('\nCancelled.') return try: code, choices = parse_torrent_command(cmd) # Act on option, if supplied printer.print('') if code == 'h': printer.print('Options:', '<links>: Download selected torrents', '[m<links>]: Save magnets as files', '[c<links>]: Copy magnets to clipboard', '[t<links>]: Save .torrent files', '[d<links>]: Get descriptions', '[f<links>]: Get files', '[p] Print search results', '[q] Quit', sep='\n') elif code == 'q': printer.print('Bye.', color='alt') return elif code == 'd': printer.descriptions(choices, results, site, args.timeout) elif code == 'f': printer.file_lists(choices, results, site, args.timeout) elif code == 'p': printer.search_results(results) elif code == 'm': pirate.torrent.save_magnets(printer, choices, results, args.save_directory) elif code == 'c': pirate.torrent.copy_magnets(printer, choices, results) elif code == 't': pirate.torrent.save_torrents(printer, choices, results, args.save_directory, args.timeout) elif not cmd: printer.print('No links entered!', color='WARN') else: break except Exception as e: printer.print('Exception:', e, color='ERROR') return # output if args.output == 'save_magnet_files': printer.print('Saving selected magnets...') pirate.torrent.save_magnets(printer, choices, results, args.save_directory) return if args.output == 'save_torrent_files': printer.print('Saving selected torrents...') pirate.torrent.save_torrents(printer, choices, results, args.save_directory, args.timeout) return for choice in choices: url = results[choice]['magnet'] if args.output == 'transmission': subprocess.call(args.transmission_command + ['--add', url]) elif args.output == 'open_command': cmd = parse_cmd(args.open_command, url) printer.print(" ".join(cmd)) subprocess.call(cmd) elif args.output == 'browser_open': webbrowser.open(url) if args.output == 'transmission': subprocess.call(args.transmission_command + ['-l'])