From b5fcddd6a68b7e18d1e5521e7363046ca0e68667 Mon Sep 17 00:00:00 2001 From: jvoisin Date: Sun, 8 Jul 2018 13:47:00 +0200 Subject: Simplify how torrent files are handled - Rework the testsuite wrt. torrent - fail at parser's instantiation on corrupted torrent, instead of during `get_meta` or `remove_all` call --- libmat2/torrent.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'libmat2') diff --git a/libmat2/torrent.py b/libmat2/torrent.py index ad49f47..d614136 100644 --- a/libmat2/torrent.py +++ b/libmat2/torrent.py @@ -8,13 +8,16 @@ class TorrentParser(abstract.AbstractParser): mimetypes = {'application/x-bittorrent', } whitelist = {b'announce', b'announce-list', b'info'} + def __init__(self, filename): + super().__init__(filename) + with open(self.filename, 'rb') as f: + self.dict_repr = _BencodeHandler().bdecode(f.read()) + if self.dict_repr is None: + raise ValueError + def get_meta(self) -> Dict[str, str]: metadata = {} - with open(self.filename, 'rb') as f: - d = _BencodeHandler().bdecode(f.read()) - if d is None: - return {'Unknown meta': 'Unable to parse torrent file "%s".' % self.filename} - for k, v in d.items(): + for k, v in self.dict_repr.items(): if k not in self.whitelist: metadata[k.decode('utf-8')] = v return metadata @@ -22,15 +25,12 @@ class TorrentParser(abstract.AbstractParser): def remove_all(self) -> bool: cleaned = dict() - with open(self.filename, 'rb') as f: - d = _BencodeHandler().bdecode(f.read()) - if d is None: - return False - for k, v in d.items(): + for k, v in self.dict_repr.items(): if k in self.whitelist: cleaned[k] = v with open(self.output_filename, 'wb') as f: f.write(_BencodeHandler().bencode(cleaned)) + self.dict_repr = cleaned # since we're stateful return True -- cgit v1.3