[utils] Introduce merge_dicts
This commit is contained in:
		
							parent
							
								
									0fe7783ece
								
							
						
					
					
						commit
						6cc622327f
					
				| @ -42,6 +42,7 @@ from youtube_dl.utils import ( | |||||||
|     is_html, |     is_html, | ||||||
|     js_to_json, |     js_to_json, | ||||||
|     limit_length, |     limit_length, | ||||||
|  |     merge_dicts, | ||||||
|     mimetype2ext, |     mimetype2ext, | ||||||
|     month_by_name, |     month_by_name, | ||||||
|     multipart_encode, |     multipart_encode, | ||||||
| @ -669,6 +670,17 @@ class TestUtil(unittest.TestCase): | |||||||
|             self.assertEqual(dict_get(d, ('b', 'c', key, )), None) |             self.assertEqual(dict_get(d, ('b', 'c', key, )), None) | ||||||
|             self.assertEqual(dict_get(d, ('b', 'c', key, ), skip_false_values=False), false_value) |             self.assertEqual(dict_get(d, ('b', 'c', key, ), skip_false_values=False), false_value) | ||||||
| 
 | 
 | ||||||
|  |     def test_merge_dicts(self): | ||||||
|  |         self.assertEqual(merge_dicts({'a': 1}, {'b': 2}), {'a': 1, 'b': 2}) | ||||||
|  |         self.assertEqual(merge_dicts({'a': 1}, {'a': 2}), {'a': 1}) | ||||||
|  |         self.assertEqual(merge_dicts({'a': 1}, {'a': None}), {'a': 1}) | ||||||
|  |         self.assertEqual(merge_dicts({'a': 1}, {'a': ''}), {'a': 1}) | ||||||
|  |         self.assertEqual(merge_dicts({'a': 1}, {}), {'a': 1}) | ||||||
|  |         self.assertEqual(merge_dicts({'a': None}, {'a': 1}), {'a': 1}) | ||||||
|  |         self.assertEqual(merge_dicts({'a': ''}, {'a': 1}), {'a': ''}) | ||||||
|  |         self.assertEqual(merge_dicts({'a': ''}, {'a': 'abc'}), {'a': 'abc'}) | ||||||
|  |         self.assertEqual(merge_dicts({'a': None}, {'a': ''}, {'a': 'abc'}), {'a': 'abc'}) | ||||||
|  | 
 | ||||||
|     def test_encode_compat_str(self): |     def test_encode_compat_str(self): | ||||||
|         self.assertEqual(encode_compat_str(b'\xd1\x82\xd0\xb5\xd1\x81\xd1\x82', 'utf-8'), 'тест') |         self.assertEqual(encode_compat_str(b'\xd1\x82\xd0\xb5\xd1\x81\xd1\x82', 'utf-8'), 'тест') | ||||||
|         self.assertEqual(encode_compat_str('тест', 'utf-8'), 'тест') |         self.assertEqual(encode_compat_str('тест', 'utf-8'), 'тест') | ||||||
|  | |||||||
| @ -23,6 +23,7 @@ from ..utils import ( | |||||||
|     is_html, |     is_html, | ||||||
|     js_to_json, |     js_to_json, | ||||||
|     KNOWN_EXTENSIONS, |     KNOWN_EXTENSIONS, | ||||||
|  |     merge_dicts, | ||||||
|     mimetype2ext, |     mimetype2ext, | ||||||
|     orderedSet, |     orderedSet, | ||||||
|     sanitized_Request, |     sanitized_Request, | ||||||
| @ -3002,21 +3003,6 @@ class GenericIE(InfoExtractor): | |||||||
|             return self.playlist_from_matches( |             return self.playlist_from_matches( | ||||||
|                 sharevideos_urls, video_id, video_title) |                 sharevideos_urls, video_id, video_title) | ||||||
| 
 | 
 | ||||||
|         def merge_dicts(dict1, dict2): |  | ||||||
|             merged = {} |  | ||||||
|             for k, v in dict1.items(): |  | ||||||
|                 if v is not None: |  | ||||||
|                     merged[k] = v |  | ||||||
|             for k, v in dict2.items(): |  | ||||||
|                 if v is None: |  | ||||||
|                     continue |  | ||||||
|                 if (k not in merged or |  | ||||||
|                         (isinstance(v, compat_str) and v and |  | ||||||
|                             isinstance(merged[k], compat_str) and |  | ||||||
|                             not merged[k])): |  | ||||||
|                     merged[k] = v |  | ||||||
|             return merged |  | ||||||
| 
 |  | ||||||
|         # Look for HTML5 media |         # Look for HTML5 media | ||||||
|         entries = self._parse_html5_media_entries(url, webpage, video_id, m3u8_id='hls') |         entries = self._parse_html5_media_entries(url, webpage, video_id, m3u8_id='hls') | ||||||
|         if entries: |         if entries: | ||||||
|  | |||||||
| @ -2225,6 +2225,20 @@ def try_get(src, getter, expected_type=None): | |||||||
|                 return v |                 return v | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | def merge_dicts(*dicts): | ||||||
|  |     merged = {} | ||||||
|  |     for a_dict in dicts: | ||||||
|  |         for k, v in a_dict.items(): | ||||||
|  |             if v is None: | ||||||
|  |                 continue | ||||||
|  |             if (k not in merged or | ||||||
|  |                     (isinstance(v, compat_str) and v and | ||||||
|  |                         isinstance(merged[k], compat_str) and | ||||||
|  |                         not merged[k])): | ||||||
|  |                 merged[k] = v | ||||||
|  |     return merged | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| def encode_compat_str(string, encoding=preferredencoding(), errors='strict'): | def encode_compat_str(string, encoding=preferredencoding(), errors='strict'): | ||||||
|     return string if isinstance(string, compat_str) else compat_str(string, encoding, errors) |     return string if isinstance(string, compat_str) else compat_str(string, encoding, errors) | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user