diff options
| author | Sergey M․ <dstftw@gmail.com> | 2015-07-17 22:58:13 +0600 | 
|---|---|---|
| committer | Sergey M․ <dstftw@gmail.com> | 2015-07-17 22:58:13 +0600 | 
| commit | 55139679261f8c2409ca150906a2693731452a13 (patch) | |
| tree | b5ce027ee96edd8910b607519b73d6587e126125 | |
| parent | 89f691e14126d4e188c094a24c5cbcb693f26479 (diff) | |
[compat] Simplify and use latest cpython 3 code
| -rw-r--r-- | youtube_dl/compat.py | 41 | 
1 files changed, 13 insertions, 28 deletions
diff --git a/youtube_dl/compat.py b/youtube_dl/compat.py index 9e506352f..54ccf1d28 100644 --- a/youtube_dl/compat.py +++ b/youtube_dl/compat.py @@ -75,8 +75,13 @@ except ImportError:      import BaseHTTPServer as compat_http_server  try: +    from urllib.parse import unquote_to_bytes as compat_urllib_parse_unquote_to_bytes      from urllib.parse import unquote as compat_urllib_parse_unquote -except ImportError: +except ImportError:  # Python 2 +    # HACK: The following are the correct unquote_to_bytes and unquote +    # implementations from cpython 3.4.3's stdlib. Python 2's version +    # is apparently broken (see https://github.com/rg3/youtube-dl/pull/6244) +      def compat_urllib_parse_unquote_to_bytes(string):          """unquote_to_bytes('abc%20def') -> b'abc def'."""          # Note: strings are encoded as UTF-8. This is only an issue if it contains @@ -85,32 +90,22 @@ except ImportError:              # Is it a string-like object?              string.split              return b'' -        if isinstance(string, str): +        if isinstance(string, unicode):              string = string.encode('utf-8') -            # string = encode('utf-8') - -        # python3 -> 2: must implicitly convert to bits -        bits = bytes(string).split(b'%') - +        bits = string.split(b'%')          if len(bits) == 1:              return string          res = [bits[0]]          append = res.append -          for item in bits[1:]: -            if item == '': -                append(b'%') -                continue              try: -                append(item[:2].decode('hex')) +                append(compat_urllib_parse._hextochr[item[:2]])                  append(item[2:]) -            except: +            except KeyError:                  append(b'%')                  append(item)          return b''.join(res) -    compat_urllib_parse_asciire = re.compile('([\x00-\x7f]+)') -      def compat_urllib_parse_unquote(string, encoding='utf-8', errors='replace'):          """Replace %xx escapes by their single-character equivalent. The optional          encoding and errors parameters specify how to decode percent-encoded @@ -121,7 +116,6 @@ except ImportError:          unquote('abc%20def') -> 'abc def'.          """ -          if '%' not in string:              string.split              return string @@ -129,20 +123,12 @@ except ImportError:              encoding = 'utf-8'          if errors is None:              errors = 'replace' - -        bits = compat_urllib_parse_asciire.split(string) +        bits = compat_urllib_parse._asciire.split(string)          res = [bits[0]]          append = res.append          for i in range(1, len(bits), 2): -            foo = compat_urllib_parse_unquote_to_bytes(bits[i]) -            foo = foo.decode(encoding, errors) -            append(foo) - -            if bits[i + 1]: -                bar = bits[i + 1] -                if not isinstance(bar, unicode): -                    bar = bar.decode('utf-8') -                append(bar) +            append(compat_urllib_parse_unquote_to_bytes(bits[i]).decode(encoding, errors)) +            append(bits[i + 1])          return ''.join(res)  try: @@ -454,7 +440,6 @@ __all__ = [      'compat_subprocess_get_DEVNULL',      'compat_urllib_error',      'compat_urllib_parse', -    'compat_urllib_parse_asciire',      'compat_urllib_parse_unquote',      'compat_urllib_parse_unquote_to_bytes',      'compat_urllib_parse_urlparse',  | 
