From b69cc94f0ed11ac8108a39ff0b821f833c7989a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Wed, 14 Mar 2018 13:17:34 +0100 Subject: [PATCH] [util] implement bencode() --- gallery_dl/util.py | 10 ++++++++++ test/test_util.py | 15 +++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/gallery_dl/util.py b/gallery_dl/util.py index 3a5a7ab3..5489f767 100644 --- a/gallery_dl/util.py +++ b/gallery_dl/util.py @@ -75,6 +75,16 @@ def optimize_range(ranges): return result +def bencode(num, alphabet="0123456789"): + """Encode an integer into a base-N encoded string""" + data = "" + base = len(alphabet) + while num: + num, remainder = divmod(num, base) + data = alphabet[remainder] + data + return data + + def bdecode(data, alphabet="0123456789"): """Decode a base-N encoded string ( N = len(alphabet) )""" num = 0 diff --git a/test/test_util.py b/test/test_util.py index 5ec21de2..219d30d0 100644 --- a/test/test_util.py +++ b/test/test_util.py @@ -11,6 +11,8 @@ import unittest import gallery_dl.util as util import gallery_dl.exception as exception import sys +import random +import string class TestRange(unittest.TestCase): @@ -206,12 +208,25 @@ class TestFormatter(unittest.TestCase): class TestOther(unittest.TestCase): + def test_bencode(self): + self.assertEqual(util.bencode(0), "") + self.assertEqual(util.bencode(123), "123") + self.assertEqual(util.bencode(123, "01"), "1111011") + self.assertEqual(util.bencode(123, "BA"), "AAAABAA") + def test_bdecode(self): self.assertEqual(util.bdecode(""), 0) self.assertEqual(util.bdecode("123"), 123) self.assertEqual(util.bdecode("1111011", "01"), 123) self.assertEqual(util.bdecode("AAAABAA", "BA"), 123) + def test_bencode_bdecode(self): + for _ in range(100): + value = random.randint(0, 1000000) + for alphabet in ("01", "0123456789", string.ascii_letters): + result = util.bdecode(util.bencode(value, alphabet), alphabet) + self.assertEqual(result, value) + def test_parse_bytes(self): self.assertEqual(util.parse_bytes("50"), 50) self.assertEqual(util.parse_bytes("50k"), 50 * 1024**1)