diff options
| author | Sergey M․ <dstftw@gmail.com> | 2016-03-26 01:46:57 +0600 | 
|---|---|---|
| committer | Sergey M․ <dstftw@gmail.com> | 2016-03-26 01:46:57 +0600 | 
| commit | 15707c7e024f1f29e7abd8ddaa362196ef2d4af6 (patch) | |
| tree | 25f149d9df1cf58a171ecf765dd3cd5d0a20f87b /youtube_dl/compat.py | |
| parent | 2156f16ca7babde4c5fa813dbe4e7ac1a2f758d1 (diff) | |
[compat] Add compat_urllib_parse_urlencode and eliminate encode_dict
encode_dict functionality has been improved and moved directly into compat_urllib_parse_urlencode
All occurrences of compat_urllib_parse.urlencode throughout the codebase have been replaced by compat_urllib_parse_urlencode
Closes #8974
Diffstat (limited to 'youtube_dl/compat.py')
| -rw-r--r-- | youtube_dl/compat.py | 26 | 
1 files changed, 26 insertions, 0 deletions
| diff --git a/youtube_dl/compat.py b/youtube_dl/compat.py index dbb91a6ef..76b6b0e38 100644 --- a/youtube_dl/compat.py +++ b/youtube_dl/compat.py @@ -170,6 +170,31 @@ except ImportError:  # Python 2          return compat_urllib_parse_unquote(string, encoding, errors)  try: +    from urllib.parse import urlencode as compat_urllib_parse_urlencode +except ImportError:  # Python 2 +    # Python 2 will choke in urlencode on mixture of byte and unicode strings. +    # Possible solutions are to either port it from python 3 with all +    # the friends or manually ensure input query contains only byte strings. +    # We will stick with latter thus recursively encoding the whole query. +    def compat_urllib_parse_urlencode(query, doseq=0, encoding='utf-8'): +        def encode_elem(e): +            if isinstance(e, dict): +                e = encode_dict(e) +            elif isinstance(e, (list, tuple,)): +                e = encode_list(e) +            elif isinstance(e, compat_str): +                e = e.encode(encoding) +            return e + +        def encode_dict(d): +            return dict((encode_elem(k), encode_elem(v)) for k, v in d.items()) + +        def encode_list(l): +            return [encode_elem(e) for e in l] + +        return compat_urllib_parse.urlencode(encode_elem(query), doseq=doseq) + +try:      from urllib.request import DataHandler as compat_urllib_request_DataHandler  except ImportError:  # Python < 3.4      # Ported from CPython 98774:1733b3bd46db, Lib/urllib/request.py @@ -588,6 +613,7 @@ __all__ = [      'compat_urllib_parse_unquote',      'compat_urllib_parse_unquote_plus',      'compat_urllib_parse_unquote_to_bytes', +    'compat_urllib_parse_urlencode',      'compat_urllib_parse_urlparse',      'compat_urllib_request',      'compat_urllib_request_DataHandler', | 
