aboutsummaryrefslogtreecommitdiff
path: root/youtube_dl/YoutubeDL.py
diff options
context:
space:
mode:
authorSergey M․ <dstftw@gmail.com>2014-09-12 23:20:17 +0700
committerSergey M․ <dstftw@gmail.com>2014-09-12 23:20:17 +0700
commit37419b4f9937f11ed3ca3545a32ed3451eb734ee (patch)
treeb8f034004e7eeb0fb50924ed5501385e6ca87500 /youtube_dl/YoutubeDL.py
parent64a450131bef2759f8393e165659ad77238384aa (diff)
downloadyoutube-dl-37419b4f9937f11ed3ca3545a32ed3451eb734ee.tar.xz
[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
Diffstat (limited to 'youtube_dl/YoutubeDL.py')
-rwxr-xr-xyoutube_dl/YoutubeDL.py26
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):