dev
7sDream 2017-06-20 15:41:54 +08:00
parent 94e8cd7974
commit 3e076f65cd
No known key found for this signature in database
GPG Key ID: 72A6D9FCEDDAB75D
3 changed files with 20 additions and 17 deletions

18
test.py
View File

@ -26,24 +26,18 @@ class Test(unittest.TestCase):
def test_parse_correctness(self):
data = parse_torrent_file(self.TEST_FILENAME)
self.assertIn(['udp://p4p.arenabg.ch:1337/announce'],
self.assertIn(['udp://tracker.publicbt.com:80/announce'],
data['announce-list'])
self.assertEqual(data['comment'],
'Torrent downloaded from https://rarbg.to')
self.assertEqual(data['creation date'], 1472762993)
self.assertEqual(data['creation date'], 1409254242)
def test_parse_two_times(self):
with open(self.TEST_FILENAME, 'rb') as fp:
parser = TorrentFileParser(fp)
data = parser.parse()
self.assertIn(['udp://p4p.arenabg.ch:1337/announce'],
self.assertIn(['udp://tracker.publicbt.com:80/announce'],
data['announce-list'])
self.assertEqual(data['comment'],
'Torrent downloaded from https://rarbg.to')
self.assertEqual(data['creation date'], 1472762993)
self.assertEqual(data['creation date'], 1409254242)
data = parser.parse()
self.assertIn(['udp://p4p.arenabg.ch:1337/announce'],
self.assertIn(['udp://tracker.publicbt.com:80/announce'],
data['announce-list'])
self.assertEqual(data['comment'],
'Torrent downloaded from https://rarbg.to')
self.assertEqual(data['creation date'], 1472762993)
self.assertEqual(data['creation date'], 1409254242)

Binary file not shown.

View File

@ -126,7 +126,11 @@ class TorrentFileParser(object):
except InvalidTorrentFileException:
return
if k == 'pieces':
v = self._pieces()
v = self._next_hash()
elif k == 'ed2k':
v = self._next_hash(16, False)
elif k == 'filehash':
v = self._next_hash(20, False)
else:
v = self._next_element()
if k == 'encoding':
@ -173,14 +177,19 @@ class TorrentFileParser(object):
def __to_hex(v):
return hex(ord(v) if isinstance(v, str) else v)[2:].rjust(2, str(0))
def _pieces(self):
def _next_hash(self, p_len=20, need_list=True):
raw = self._next_string(decode=False)
if len(raw) % 20 != 0:
if len(raw) % p_len != 0:
raise InvalidTorrentFileException(self._pos)
return [
res = [
''.join([self.__to_hex(c) for c in h])
for h in (raw[x:x+20] for x in range(0, len(raw), 20))
for h in (raw[x:x+p_len] for x in range(0, len(raw), p_len))
]
if len(res) == 0 and not need_list:
return ''
if len(res) == 1 and not need_list:
return res[0]
return res
def _next_end(self):
raise InvalidTorrentFileException(self._pos)