diff options
| author | Sergey M․ <dstftw@gmail.com> | 2014-09-12 23:20:17 +0700 | 
|---|---|---|
| committer | Sergey M․ <dstftw@gmail.com> | 2014-09-12 23:20:17 +0700 | 
| commit | 37419b4f9937f11ed3ca3545a32ed3451eb734ee (patch) | |
| tree | b8f034004e7eeb0fb50924ed5501385e6ca87500 | |
| parent | 64a450131bef2759f8393e165659ad77238384aa (diff) | |
[YoutubeDL] Escape non-ASCII characters in URLs
urllib chokes on URLs with non-ASCII characters (see http://bugs.python.org/issue3991)
Working around by replacing request's original URL with escaped one
| -rwxr-xr-x | youtube_dl/YoutubeDL.py | 26 | 
1 files changed, 26 insertions, 0 deletions
| diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index 553bf559b..99cd05e65 100755 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -28,6 +28,7 @@ from .utils import (      compat_str,      compat_urllib_error,      compat_urllib_request, +    compat_urllib_parse_urlparse,      ContentTooShortError,      date_from_str,      DateRange, @@ -1241,6 +1242,31 @@ class YoutubeDL(object):      def urlopen(self, req):          """ Start an HTTP download """ + +        # urllib chokes on URLs with non-ASCII characters (see http://bugs.python.org/issue3991) +        # Working around by replacing request's original URL with escaped one + +        url = req if isinstance(req, compat_str) else req.get_full_url() + +        def escape(component): +            return compat_cookiejar.escape_path(component.encode('utf-8')) + +        url_parsed = compat_urllib_parse_urlparse(url) +        url_escaped = url_parsed._replace( +            path=escape(url_parsed.path), +            query=escape(url_parsed.query), +            fragment=escape(url_parsed.fragment) +        ).geturl() + +        # Substitute URL if any change after escaping +        if url != url_escaped: +            if isinstance(req, compat_str): +                req = url_escaped +            else: +                req = compat_urllib_request.Request( +                    url_escaped, data=req.data, headers=req.headers, +                    origin_req_host=req.origin_req_host, unverifiable=req.unverifiable) +          return self._opener.open(req, timeout=self._socket_timeout)      def print_debug_header(self): | 
