diff options
author | Yen Chi Hsuan <yan12125@gmail.com> | 2015-03-06 12:43:49 +0800 |
---|---|---|
committer | Yen Chi Hsuan <yan12125@gmail.com> | 2015-03-06 12:43:49 +0800 |
commit | 55969016e96fded28b97b2ef3bbf66efa83d6afb (patch) | |
tree | d0579cbb7a8fbd375899e1bee14cf2b8275dd20b | |
parent | 5c7495a19429e3b27c003a4bd5bb96ed1e3a4932 (diff) |
[utils] Add a function to sanitize consecutive slashes in URLs
-rw-r--r-- | test/test_utils.py | 16 | ||||
-rw-r--r-- | youtube_dl/extractor/sohu.py | 8 | ||||
-rw-r--r-- | youtube_dl/utils.py | 15 |
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) |