fix issue #1
parent
94e8cd7974
commit
3e076f65cd
18
test.py
18
test.py
|
@ -26,24 +26,18 @@ class Test(unittest.TestCase):
|
||||||
|
|
||||||
def test_parse_correctness(self):
|
def test_parse_correctness(self):
|
||||||
data = parse_torrent_file(self.TEST_FILENAME)
|
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'])
|
data['announce-list'])
|
||||||
self.assertEqual(data['comment'],
|
self.assertEqual(data['creation date'], 1409254242)
|
||||||
'Torrent downloaded from https://rarbg.to')
|
|
||||||
self.assertEqual(data['creation date'], 1472762993)
|
|
||||||
|
|
||||||
def test_parse_two_times(self):
|
def test_parse_two_times(self):
|
||||||
with open(self.TEST_FILENAME, 'rb') as fp:
|
with open(self.TEST_FILENAME, 'rb') as fp:
|
||||||
parser = TorrentFileParser(fp)
|
parser = TorrentFileParser(fp)
|
||||||
data = parser.parse()
|
data = parser.parse()
|
||||||
self.assertIn(['udp://p4p.arenabg.ch:1337/announce'],
|
self.assertIn(['udp://tracker.publicbt.com:80/announce'],
|
||||||
data['announce-list'])
|
data['announce-list'])
|
||||||
self.assertEqual(data['comment'],
|
self.assertEqual(data['creation date'], 1409254242)
|
||||||
'Torrent downloaded from https://rarbg.to')
|
|
||||||
self.assertEqual(data['creation date'], 1472762993)
|
|
||||||
data = parser.parse()
|
data = parser.parse()
|
||||||
self.assertIn(['udp://p4p.arenabg.ch:1337/announce'],
|
self.assertIn(['udp://tracker.publicbt.com:80/announce'],
|
||||||
data['announce-list'])
|
data['announce-list'])
|
||||||
self.assertEqual(data['comment'],
|
self.assertEqual(data['creation date'], 1409254242)
|
||||||
'Torrent downloaded from https://rarbg.to')
|
|
||||||
self.assertEqual(data['creation date'], 1472762993)
|
|
||||||
|
|
BIN
test.torrent
BIN
test.torrent
Binary file not shown.
|
@ -126,7 +126,11 @@ class TorrentFileParser(object):
|
||||||
except InvalidTorrentFileException:
|
except InvalidTorrentFileException:
|
||||||
return
|
return
|
||||||
if k == 'pieces':
|
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:
|
else:
|
||||||
v = self._next_element()
|
v = self._next_element()
|
||||||
if k == 'encoding':
|
if k == 'encoding':
|
||||||
|
@ -173,14 +177,19 @@ class TorrentFileParser(object):
|
||||||
def __to_hex(v):
|
def __to_hex(v):
|
||||||
return hex(ord(v) if isinstance(v, str) else v)[2:].rjust(2, str(0))
|
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)
|
raw = self._next_string(decode=False)
|
||||||
if len(raw) % 20 != 0:
|
if len(raw) % p_len != 0:
|
||||||
raise InvalidTorrentFileException(self._pos)
|
raise InvalidTorrentFileException(self._pos)
|
||||||
return [
|
res = [
|
||||||
''.join([self.__to_hex(c) for c in h])
|
''.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):
|
def _next_end(self):
|
||||||
raise InvalidTorrentFileException(self._pos)
|
raise InvalidTorrentFileException(self._pos)
|
||||||
|
|
Loading…
Reference in New Issue