[utils] Introduce merge_dicts
This commit is contained in:
		
							parent
							
								
									0fe7783ece
								
							
						
					
					
						commit
						6cc622327f
					
				| @ -42,6 +42,7 @@ from youtube_dl.utils import ( | ||||
|     is_html, | ||||
|     js_to_json, | ||||
|     limit_length, | ||||
|     merge_dicts, | ||||
|     mimetype2ext, | ||||
|     month_by_name, | ||||
|     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, ), 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): | ||||
|         self.assertEqual(encode_compat_str(b'\xd1\x82\xd0\xb5\xd1\x81\xd1\x82', 'utf-8'), 'тест') | ||||
|         self.assertEqual(encode_compat_str('тест', 'utf-8'), 'тест') | ||||
|  | ||||
| @ -23,6 +23,7 @@ from ..utils import ( | ||||
|     is_html, | ||||
|     js_to_json, | ||||
|     KNOWN_EXTENSIONS, | ||||
|     merge_dicts, | ||||
|     mimetype2ext, | ||||
|     orderedSet, | ||||
|     sanitized_Request, | ||||
| @ -3002,21 +3003,6 @@ class GenericIE(InfoExtractor): | ||||
|             return self.playlist_from_matches( | ||||
|                 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 | ||||
|         entries = self._parse_html5_media_entries(url, webpage, video_id, m3u8_id='hls') | ||||
|         if entries: | ||||
|  | ||||
| @ -2225,6 +2225,20 @@ def try_get(src, getter, expected_type=None): | ||||
|                 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'): | ||||
|     return string if isinstance(string, compat_str) else compat_str(string, encoding, errors) | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user