diff options
| author | remitamine <remitamine@gmail.com> | 2016-03-03 19:24:04 +0100 | 
|---|---|---|
| committer | remitamine <remitamine@gmail.com> | 2016-03-03 19:24:04 +0100 | 
| commit | 12557339453e25dbb18dfc51dc1e88ca5325d8e9 (patch) | |
| tree | 037c493326e3967c16fb69746853e181ac7f8a44 | |
| parent | d0ff690d68016f24d8cc90e69fac20847e7afa8e (diff) | |
| parent | 3201a67f618f3bb7b13b4df2a9c7f68f481940a4 (diff) | |
Merge pull request #8739 from remitamine/update_url_params
[utils] add update_url_query function to create or update query string params
| -rw-r--r-- | test/test_utils.py | 37 | ||||
| -rw-r--r-- | youtube_dl/utils.py | 8 | 
2 files changed, 45 insertions, 0 deletions
| diff --git a/test/test_utils.py b/test/test_utils.py index 97587ad2f..2bcf8ecf0 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -61,6 +61,7 @@ from youtube_dl.utils import (      lowercase_escape,      url_basename,      urlencode_postdata, +    update_url_query,      version_tuple,      xpath_with_ns,      xpath_element, @@ -76,6 +77,8 @@ from youtube_dl.utils import (  )  from youtube_dl.compat import (      compat_etree_fromstring, +    compat_urlparse, +    compat_parse_qs,  ) @@ -454,6 +457,40 @@ class TestUtil(unittest.TestCase):          data = urlencode_postdata({'username': 'foo@bar.com', 'password': '1234'})          self.assertTrue(isinstance(data, bytes)) +    def test_update_url_query(self): +        def query_dict(url): +            return compat_parse_qs(compat_urlparse.urlparse(url).query) +        self.assertEqual(query_dict(update_url_query( +            'http://example.com/path', {'quality': ['HD'], 'format': ['mp4']})), +            query_dict('http://example.com/path?quality=HD&format=mp4')) +        self.assertEqual(query_dict(update_url_query( +            'http://example.com/path', {'system': ['LINUX', 'WINDOWS']})), +            query_dict('http://example.com/path?system=LINUX&system=WINDOWS')) +        self.assertEqual(query_dict(update_url_query( +            'http://example.com/path', {'fields': 'id,formats,subtitles'})), +            query_dict('http://example.com/path?fields=id,formats,subtitles')) +        self.assertEqual(query_dict(update_url_query( +            'http://example.com/path', {'fields': ('id,formats,subtitles', 'thumbnails')})), +            query_dict('http://example.com/path?fields=id,formats,subtitles&fields=thumbnails')) +        self.assertEqual(query_dict(update_url_query( +            'http://example.com/path?manifest=f4m', {'manifest': []})), +            query_dict('http://example.com/path')) +        self.assertEqual(query_dict(update_url_query( +            'http://example.com/path?system=LINUX&system=WINDOWS', {'system': 'LINUX'})), +            query_dict('http://example.com/path?system=LINUX')) +        self.assertEqual(query_dict(update_url_query( +            'http://example.com/path', {'fields': b'id,formats,subtitles'})), +            query_dict('http://example.com/path?fields=id,formats,subtitles')) +        self.assertEqual(query_dict(update_url_query( +            'http://example.com/path', {'width': 1080, 'height': 720})), +            query_dict('http://example.com/path?width=1080&height=720')) +        self.assertEqual(query_dict(update_url_query( +            'http://example.com/path', {'bitrate': 5020.43})), +            query_dict('http://example.com/path?bitrate=5020.43')) +        self.assertEqual(query_dict(update_url_query( +            'http://example.com/path', {'test': '第二行тест'})), +            query_dict('http://example.com/path?test=%E7%AC%AC%E4%BA%8C%E8%A1%8C%D1%82%D0%B5%D1%81%D1%82')) +      def test_dict_get(self):          FALSE_VALUES = {              'none': None, diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index 91c9d8200..d431aa6b7 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -1739,6 +1739,14 @@ def urlencode_postdata(*args, **kargs):      return compat_urllib_parse.urlencode(*args, **kargs).encode('ascii') +def update_url_query(url, query): +    parsed_url = compat_urlparse.urlparse(url) +    qs = compat_parse_qs(parsed_url.query) +    qs.update(query) +    return compat_urlparse.urlunparse(parsed_url._replace( +        query=compat_urllib_parse.urlencode(qs, True))) + +  def encode_dict(d, encoding='utf-8'):      def encode(v):          return v.encode(encoding) if isinstance(v, compat_basestring) else v | 
