Set the extra_info inside YoutubeDL.process_ie_result and set only if the keys are missing

This commit is contained in:
Jaime Marquínez Ferrándiz 2013-11-03 11:56:45 +01:00
parent 3e56add7c9
commit b6c45014ae
2 changed files with 25 additions and 13 deletions

View File

@ -128,6 +128,18 @@ def test_format_selection(self):
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()

View File

@ -318,6 +318,12 @@ def _match_entry(self, info_dict):
% 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 @@ def extract_info(self, url, download=True, ie_key=None, extra_info={}):
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 @@ def process_ie_result(self, ie_result, download=True, extra_info={}):
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 @@ def process_ie_result(self, ie_result, download=True, extra_info={}):
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 @@ def process_ie_result(self, ie_result, download=True, extra_info={}):
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 @@ def process_ie_result(self, ie_result, download=True, extra_info={}):
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