mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 14:45:14 +00:00 
			
		
		
		
	Set the extra_info inside YoutubeDL.process_ie_result and set only if the keys are missing
This commit is contained in:
		| @@ -128,6 +128,18 @@ class TestFormatSelection(unittest.TestCase): | |||||||
|         downloaded = ydl.downloaded_info_dicts[0] |         downloaded = ydl.downloaded_info_dicts[0] | ||||||
|         self.assertEqual(downloaded['format_id'], u'35') |         self.assertEqual(downloaded['format_id'], u'35') | ||||||
|  |  | ||||||
|  |     def test_add_extra_info(self): | ||||||
|  |         test_dict = { | ||||||
|  |             'extractor': 'Foo', | ||||||
|  |         } | ||||||
|  |         extra_info = { | ||||||
|  |             'extractor': 'Bar', | ||||||
|  |             'playlist': 'funny videos', | ||||||
|  |         } | ||||||
|  |         YDL.add_extra_info(test_dict, extra_info) | ||||||
|  |         self.assertEqual(test_dict['extractor'], 'Foo') | ||||||
|  |         self.assertEqual(test_dict['playlist'], 'funny videos') | ||||||
|  |  | ||||||
|  |  | ||||||
| if __name__ == '__main__': | if __name__ == '__main__': | ||||||
|     unittest.main() |     unittest.main() | ||||||
|   | |||||||
| @@ -318,6 +318,12 @@ class YoutubeDL(object): | |||||||
|                     % info_dict) |                     % info_dict) | ||||||
|         return None |         return None | ||||||
|  |  | ||||||
|  |     @staticmethod | ||||||
|  |     def add_extra_info(info_dict, extra_info): | ||||||
|  |         '''Set the keys from extra_info in info dict if they are missing''' | ||||||
|  |         for key, value in extra_info.items(): | ||||||
|  |             info_dict.setdefault(key, value) | ||||||
|  |  | ||||||
|     def extract_info(self, url, download=True, ie_key=None, extra_info={}): |     def extract_info(self, url, download=True, ie_key=None, extra_info={}): | ||||||
|         ''' |         ''' | ||||||
|         Returns a list with a dictionary for each video we find. |         Returns a list with a dictionary for each video we find. | ||||||
| @@ -344,17 +350,13 @@ class YoutubeDL(object): | |||||||
|                     break |                     break | ||||||
|                 if isinstance(ie_result, list): |                 if isinstance(ie_result, list): | ||||||
|                     # Backwards compatibility: old IE result format |                     # Backwards compatibility: old IE result format | ||||||
|                     for result in ie_result: |  | ||||||
|                         result.update(extra_info) |  | ||||||
|                     ie_result = { |                     ie_result = { | ||||||
|                         '_type': 'compat_list', |                         '_type': 'compat_list', | ||||||
|                         'entries': ie_result, |                         'entries': ie_result, | ||||||
|                     } |                     } | ||||||
|                 else: |  | ||||||
|                     ie_result.update(extra_info) |  | ||||||
|                 if 'extractor' not in ie_result: |                 if 'extractor' not in ie_result: | ||||||
|                     ie_result['extractor'] = ie.IE_NAME |                     ie_result['extractor'] = ie.IE_NAME | ||||||
|                 return self.process_ie_result(ie_result, download=download) |                 return self.process_ie_result(ie_result, download, extra_info) | ||||||
|             except ExtractorError as de: # An error we somewhat expected |             except ExtractorError as de: # An error we somewhat expected | ||||||
|                 self.report_error(compat_str(de), de.format_traceback()) |                 self.report_error(compat_str(de), de.format_traceback()) | ||||||
|                 break |                 break | ||||||
| @@ -378,7 +380,7 @@ class YoutubeDL(object): | |||||||
|  |  | ||||||
|         result_type = ie_result.get('_type', 'video') # If not given we suppose it's a video, support the default old system |         result_type = ie_result.get('_type', 'video') # If not given we suppose it's a video, support the default old system | ||||||
|         if result_type == 'video': |         if result_type == 'video': | ||||||
|             ie_result.update(extra_info) |             self.add_extra_info(ie_result, extra_info) | ||||||
|             return self.process_video_result(ie_result) |             return self.process_video_result(ie_result) | ||||||
|         elif result_type == 'url': |         elif result_type == 'url': | ||||||
|             # We have to add extra_info to the results because it may be |             # We have to add extra_info to the results because it may be | ||||||
| @@ -388,6 +390,7 @@ class YoutubeDL(object): | |||||||
|                                      ie_key=ie_result.get('ie_key'), |                                      ie_key=ie_result.get('ie_key'), | ||||||
|                                      extra_info=extra_info) |                                      extra_info=extra_info) | ||||||
|         elif result_type == 'playlist': |         elif result_type == 'playlist': | ||||||
|  |             self.add_extra_info(ie_result, extra_info) | ||||||
|             # We process each entry in the playlist |             # We process each entry in the playlist | ||||||
|             playlist = ie_result.get('title', None) or ie_result.get('id', None) |             playlist = ie_result.get('title', None) or ie_result.get('id', None) | ||||||
|             self.to_screen(u'[download] Downloading playlist: %s' % playlist) |             self.to_screen(u'[download] Downloading playlist: %s' % playlist) | ||||||
| @@ -413,12 +416,8 @@ class YoutubeDL(object): | |||||||
|                 extra = { |                 extra = { | ||||||
|                     'playlist': playlist, |                     'playlist': playlist, | ||||||
|                     'playlist_index': i + playliststart, |                     'playlist_index': i + playliststart, | ||||||
|  |                     'extractor': ie_result['extractor'], | ||||||
|                 } |                 } | ||||||
|                 if not 'extractor' in entry: |  | ||||||
|                     # We set the extractor, if it's an url it will be set then to |  | ||||||
|                     # the new extractor, but if it's already a video we must make |  | ||||||
|                     # sure it's present: see issue #877 |  | ||||||
|                     entry['extractor'] = ie_result['extractor'] |  | ||||||
|                 entry_result = self.process_ie_result(entry, |                 entry_result = self.process_ie_result(entry, | ||||||
|                                                       download=download, |                                                       download=download, | ||||||
|                                                       extra_info=extra) |                                                       extra_info=extra) | ||||||
| @@ -427,10 +426,11 @@ class YoutubeDL(object): | |||||||
|             return ie_result |             return ie_result | ||||||
|         elif result_type == 'compat_list': |         elif result_type == 'compat_list': | ||||||
|             def _fixup(r): |             def _fixup(r): | ||||||
|                 r.setdefault('extractor', ie_result['extractor']) |                 self.add_extra_info(r, | ||||||
|  |                     {'extractor': ie_result['extractor']}) | ||||||
|                 return r |                 return r | ||||||
|             ie_result['entries'] = [ |             ie_result['entries'] = [ | ||||||
|                 self.process_ie_result(_fixup(r), download=download) |                 self.process_ie_result(_fixup(r), download, extra_info) | ||||||
|                 for r in ie_result['entries'] |                 for r in ie_result['entries'] | ||||||
|             ] |             ] | ||||||
|             return ie_result |             return ie_result | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Jaime Marquínez Ferrándiz
					Jaime Marquínez Ferrándiz