diff options
| -rw-r--r-- | test/test_utils.py | 16 | ||||
| -rw-r--r-- | youtube_dl/utils.py | 13 | 
2 files changed, 29 insertions, 0 deletions
| diff --git a/test/test_utils.py b/test/test_utils.py index 0db37d9d8..e83c8ea11 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -19,6 +19,7 @@ from youtube_dl.utils import (      age_restricted,      args_to_str,      encode_base_n, +    caesar,      clean_html,      date_from_str,      DateRange, @@ -69,6 +70,7 @@ from youtube_dl.utils import (      remove_start,      remove_end,      remove_quotes, +    rot47,      shell_quote,      smuggle_url,      str_to_int, @@ -1369,6 +1371,20 @@ Line 1          self.assertRaises(ValueError, encode_base_n, 0, 70)          self.assertRaises(ValueError, encode_base_n, 0, 60, custom_table) +    def test_caesar(self): +        self.assertEqual(caesar('ace', 'abcdef', 2), 'cea') +        self.assertEqual(caesar('cea', 'abcdef', -2), 'ace') +        self.assertEqual(caesar('ace', 'abcdef', -2), 'eac') +        self.assertEqual(caesar('eac', 'abcdef', 2), 'ace') +        self.assertEqual(caesar('ace', 'abcdef', 0), 'ace') +        self.assertEqual(caesar('xyz', 'abcdef', 2), 'xyz') +        self.assertEqual(caesar('abc', 'acegik', 2), 'ebg') +        self.assertEqual(caesar('ebg', 'acegik', -2), 'abc') + +    def test_rot47(self): +        self.assertEqual(rot47('youtube-dl'), r'J@FEF36\5=') +        self.assertEqual(rot47('YOUTUBE-DL'), r'*~&%&qt\s{') +      def test_urshift(self):          self.assertEqual(urshift(3, 1), 1)          self.assertEqual(urshift(-3, 1), 2147483646) diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index 0d30075aa..b14603d8a 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -5383,6 +5383,19 @@ def decode_packed_codes(code):          obfucasted_code) +def caesar(s, alphabet, shift): +    if shift == 0: +        return s +    l = len(alphabet) +    return ''.join( +        alphabet[(alphabet.index(c) + shift) % l] if c in alphabet else c +        for c in s) + + +def rot47(s): +    return caesar(s, r'''!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~''', 47) + +  def parse_m3u8_attributes(attrib):      info = {}      for (key, val) in re.findall(r'(?P<key>[A-Z0-9-]+)=(?P<val>"[^"]+"|[^",]+)(?:,|$)', attrib): | 
