aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYen Chi Hsuan <yan12125@gmail.com>2015-03-06 12:43:49 +0800
committerYen Chi Hsuan <yan12125@gmail.com>2015-03-06 12:43:49 +0800
commit55969016e96fded28b97b2ef3bbf66efa83d6afb (patch)
treed0579cbb7a8fbd375899e1bee14cf2b8275dd20b
parent5c7495a19429e3b27c003a4bd5bb96ed1e3a4932 (diff)
[utils] Add a function to sanitize consecutive slashes in URLs
-rw-r--r--test/test_utils.py16
-rw-r--r--youtube_dl/extractor/sohu.py8
-rw-r--r--youtube_dl/utils.py15
3 files changed, 34 insertions, 5 deletions
diff --git a/test/test_utils.py b/test/test_utils.py
index 64fad58ad..e02069c4d 100644
--- a/test/test_utils.py
+++ b/test/test_utils.py
@@ -54,6 +54,7 @@ from youtube_dl.utils import (
xpath_with_ns,
render_table,
match_str,
+ url_sanitize_consecutive_slashes,
)
@@ -501,6 +502,21 @@ ffmpeg version 2.4.4 Copyright (c) 2000-2014 the FFmpeg ...'''), '2.4.4')
'like_count > 100 & dislike_count <? 50 & description',
{'like_count': 190, 'dislike_count': 10}))
+ def test_url_sanitize_consecutive_slashes(self):
+ self.assertEqual(url_sanitize_consecutive_slashes(
+ 'http://hostname/foo//bar/filename.html'),
+ 'http://hostname/foo/bar/filename.html')
+ self.assertEqual(url_sanitize_consecutive_slashes(
+ 'http://hostname//foo/bar/filename.html'),
+ 'http://hostname/foo/bar/filename.html')
+ self.assertEqual(url_sanitize_consecutive_slashes(
+ 'http://hostname//'), 'http://hostname/')
+ self.assertEqual(url_sanitize_consecutive_slashes(
+ 'http://hostname/foo/bar/filename.html'),
+ 'http://hostname/foo/bar/filename.html')
+ self.assertEqual(url_sanitize_consecutive_slashes(
+ 'http://hostname/'), 'http://hostname/')
+
if __name__ == '__main__':
unittest.main()
diff --git a/youtube_dl/extractor/sohu.py b/youtube_dl/extractor/sohu.py
index 335e84fab..5adc734d9 100644
--- a/youtube_dl/extractor/sohu.py
+++ b/youtube_dl/extractor/sohu.py
@@ -8,6 +8,7 @@ from ..compat import (
compat_str,
compat_urllib_request
)
+from ..utils import url_sanitize_consecutive_slashes
class SohuIE(InfoExtractor):
@@ -105,11 +106,8 @@ class SohuIE(InfoExtractor):
part_info = part_str.split('|')
- # Sanitize URL to prevent download failure
- if part_info[0][-1] == '/' and su[i][0] == '/':
- su[i] = su[i][1:]
-
- video_url = '%s%s?key=%s' % (part_info[0], su[i], part_info[3])
+ video_url = url_sanitize_consecutive_slashes(
+ '%s%s?key=%s' % (part_info[0], su[i], part_info[3]))
formats.append({
'url': video_url,
diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py
index 7426e2a1f..ef14f9a36 100644
--- a/youtube_dl/utils.py
+++ b/youtube_dl/utils.py
@@ -1789,3 +1789,18 @@ class PerRequestProxyHandler(compat_urllib_request.ProxyHandler):
return None # No Proxy
return compat_urllib_request.ProxyHandler.proxy_open(
self, req, proxy, type)
+
+
+def url_sanitize_consecutive_slashes(url):
+ """Sanitize URLs with consecutive slashes
+
+ For example, transform both
+ http://hostname/foo//bar/filename.html
+ and
+ http://hostname//foo/bar/filename.html
+ into
+ http://hostname/foo/bar/filename.html
+ """
+ parsed_url = list(compat_urlparse.urlparse(url))
+ parsed_url[2] = re.sub(r'/{2,}', '/', parsed_url[2])
+ return compat_urlparse.urlunparse(parsed_url)