1
0
mirror of https://github.com/vikstrous/pirate-get synced 2025-01-10 10:04:21 +01:00

test torrent command parser

This commit is contained in:
Viktor Stanchev 2015-09-03 23:00:40 -07:00
parent 0b8a27e64e
commit 383e5a101d
4 changed files with 57 additions and 38 deletions

View File

@ -66,6 +66,43 @@ def parse_cmd(cmd, url):
return ret_no_quotes return ret_no_quotes
def parse_torrent_command(l):
# Very permissive handling
# Check for any occurances or d, f, p, t, m, or q
cmd_code_match = re.search(r'([hdfpmtq])', l,
flags=re.IGNORECASE)
if cmd_code_match:
code = cmd_code_match.group(0).lower()
else:
code = None
# Clean up command codes
# Substitute multiple consecutive spaces/commas for single
# comma remove anything that isn't an integer or comma.
# Turn into list
l = re.sub(r'^[hdfp, ]*|[hdfp, ]*$', '', l)
l = re.sub('[ ,]+', ',', l)
l = re.sub('[^0-9,-]', '', l)
parsed_input = l.split(',')
# expand ranges
choices = []
# loop will generate a list of lists
for elem in parsed_input:
left, sep, right = elem.partition('-')
if right:
choices.append(list(range(int(left), int(right) + 1)))
elif left != '':
choices.append([int(left)])
# flatten list
choices = sum(choices, [])
# the current code stores the choices as strings
# instead of ints. not sure if necessary
choices = [elem for elem in choices]
return code, choices
def main(): def main():
config = load_config() config = load_config()
@ -235,40 +272,7 @@ def main():
return return
try: try:
# Very permissive handling code, choices = parse_torrent_command(l)
# Check for any occurances or d, f, p, t, m, or q
cmd_code_match = re.search(r'([hdfpmtq])', l,
flags=re.IGNORECASE)
if cmd_code_match:
code = cmd_code_match.group(0).lower()
else:
code = None
# Clean up command codes
# Substitute multiple consecutive spaces/commas for single
# comma remove anything that isn't an integer or comma.
# Turn into list
l = re.sub(r'^[hdfp, ]*|[hdfp, ]*$', '', l)
l = re.sub('[ ,]+', ',', l)
l = re.sub('[^0-9,-]', '', l)
parsed_input = l.split(',')
# expand ranges
choices = []
# loop will generate a list of lists
for elem in parsed_input:
left, sep, right = elem.partition('-')
if right:
choices.append(list(range(int(left), int(right) + 1)))
elif left != '':
choices.append([int(left)])
# flatten list
choices = sum(choices, [])
# the current code stores the choices as strings
# instead of ints. not sure if necessary
choices = [str(elem) for elem in choices]
# Act on option, if supplied # Act on option, if supplied
print('') print('')
if code == 'h': if code == 'h':

View File

@ -83,7 +83,6 @@ def search_results(results, local=None):
def descriptions(chosen_links, results, site): def descriptions(chosen_links, results, site):
for link in chosen_links: for link in chosen_links:
link = int(link)
path = '/torrent/%s/' % results[link]['id'] path = '/torrent/%s/' % results[link]['id']
req = request.Request(site + path, headers=pirate.data.default_headers) req = request.Request(site + path, headers=pirate.data.default_headers)
req.add_header('Accept-encoding', 'gzip') req.add_header('Accept-encoding', 'gzip')
@ -108,7 +107,6 @@ def descriptions(chosen_links, results, site):
def file_lists(chosen_links, results, site): def file_lists(chosen_links, results, site):
for link in chosen_links: for link in chosen_links:
link = int(link)
path = '/ajax_details_filelist.php' path = '/ajax_details_filelist.php'
query = '?id=' + results[link]['id'] query = '?id=' + results[link]['id']
req = request.Request(site + path + query, req = request.Request(site + path + query,

View File

@ -163,7 +163,6 @@ def get_torrent(info_hash):
def save_torrents(chosen_links, results, folder): def save_torrents(chosen_links, results, folder):
for link in chosen_links: for link in chosen_links:
link = int(link)
magnet = results[link]['magnet'] magnet = results[link]['magnet']
name = re.search(r'dn=([^\&]*)', magnet) name = re.search(r'dn=([^\&]*)', magnet)
torrent_name = parse.unquote(name.group(1)).replace('+', ' ') torrent_name = parse.unquote(name.group(1)).replace('+', ' ')
@ -181,7 +180,6 @@ def save_torrents(chosen_links, results, folder):
def save_magnets(chosen_links, mags, folder): def save_magnets(chosen_links, mags, folder):
for link in chosen_links: for link in chosen_links:
link = int(link)
magnet = results[link]['magnet'] magnet = results[link]['magnet']
name = re.search(r'dn=([^\&]*)', magnet) name = re.search(r'dn=([^\&]*)', magnet)
torrent_name = parse.unquote(name.group(1)).replace('+', ' ') torrent_name = parse.unquote(name.group(1)).replace('+', ' ')

View File

@ -17,5 +17,24 @@ class TestPirate(unittest.TestCase):
for test in tests: for test in tests:
self.assertEqual(pirate.pirate.parse_cmd(*test[0]), test[1]) self.assertEqual(pirate.pirate.parse_cmd(*test[0]), test[1])
def test_parse_torrent_command(self):
tests = [
[['h'], ('h', [])],
[['q'], ('q', [])],
[['d1'], ('d', [1])],
[['f1'], ('f', [1])],
[['p1'], ('p', [1])],
[['t1'], ('t', [1])],
[['m1'], ('m', [1])],
[['d 23'], ('d', [23])],
[['d 23,1'], ('d', [23, 1])],
[['d 23, 1'], ('d', [23, 1])],
[['1d'], ('d', [1])],
[['1 ... d'], ('d', [1])],
[['1-3 d'], ('d', [1,2,3])],
]
for test in tests:
self.assertEqual(pirate.pirate.parse_torrent_command(*test[0]), test[1])
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()