Merge pull request #8739 from remitamine/update_url_params
[utils] add update_url_query function to create or update query string params
This commit is contained in:
		| @@ -61,6 +61,7 @@ from youtube_dl.utils import ( | |||||||
|     lowercase_escape, |     lowercase_escape, | ||||||
|     url_basename, |     url_basename, | ||||||
|     urlencode_postdata, |     urlencode_postdata, | ||||||
|  |     update_url_query, | ||||||
|     version_tuple, |     version_tuple, | ||||||
|     xpath_with_ns, |     xpath_with_ns, | ||||||
|     xpath_element, |     xpath_element, | ||||||
| @@ -76,6 +77,8 @@ from youtube_dl.utils import ( | |||||||
| ) | ) | ||||||
| from youtube_dl.compat import ( | from youtube_dl.compat import ( | ||||||
|     compat_etree_fromstring, |     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'}) |         data = urlencode_postdata({'username': 'foo@bar.com', 'password': '1234'}) | ||||||
|         self.assertTrue(isinstance(data, bytes)) |         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): |     def test_dict_get(self): | ||||||
|         FALSE_VALUES = { |         FALSE_VALUES = { | ||||||
|             'none': None, |             'none': None, | ||||||
|   | |||||||
| @@ -1739,6 +1739,14 @@ def urlencode_postdata(*args, **kargs): | |||||||
|     return compat_urllib_parse.urlencode(*args, **kargs).encode('ascii') |     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_dict(d, encoding='utf-8'): | ||||||
|     def encode(v): |     def encode(v): | ||||||
|         return v.encode(encoding) if isinstance(v, compat_basestring) else v |         return v.encode(encoding) if isinstance(v, compat_basestring) else v | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 remitamine
					remitamine