[YoutubeDL] format spec: add additional checks for invalid syntax

This commit is contained in:
Jaime Marquínez Ferrándiz 2015-07-10 22:46:25 +02:00
parent bb8e553662
commit 0a31a35098
2 changed files with 14 additions and 0 deletions

View File

@ -302,6 +302,16 @@ def format_info(f_id):
downloaded = ydl.downloaded_info_dicts[0] downloaded = ydl.downloaded_info_dicts[0]
self.assertEqual(downloaded['format_id'], f1['format_id']) self.assertEqual(downloaded['format_id'], f1['format_id'])
def test_invalid_format_specs(self):
def assert_syntax_error(format_spec):
ydl = YDL({'format': format_spec})
info_dict = _make_result([{'format_id': 'foo', 'url': TEST_URL}])
self.assertRaises(SyntaxError, ydl.process_ie_result, info_dict)
assert_syntax_error('bestvideo,,best')
assert_syntax_error('+bestaudio')
assert_syntax_error('bestvideo+')
def test_format_filtering(self): def test_format_filtering(self):
formats = [ formats = [
{'format_id': 'A', 'filesize': 500, 'width': 1000}, {'format_id': 'A', 'filesize': 500, 'width': 1000},

View File

@ -953,6 +953,8 @@ def _parse_format_selection(tokens, inside_merge=False, inside_choice=False, ins
tokens.restore_last_token() tokens.restore_last_token()
break break
elif string == ',': elif string == ',':
if not current_selector:
raise syntax_error('"," must follow a format selector', start)
selectors.append(current_selector) selectors.append(current_selector)
current_selector = None current_selector = None
elif string == '/': elif string == '/':
@ -972,6 +974,8 @@ def _parse_format_selection(tokens, inside_merge=False, inside_choice=False, ins
elif string == '+': elif string == '+':
video_selector = current_selector video_selector = current_selector
audio_selector = _parse_format_selection(tokens, inside_merge=True) audio_selector = _parse_format_selection(tokens, inside_merge=True)
if not video_selector or not audio_selector:
raise syntax_error('"+" must be between two format selectors', start)
current_selector = FormatSelector(MERGE, (video_selector, audio_selector), []) current_selector = FormatSelector(MERGE, (video_selector, audio_selector), [])
else: else:
raise syntax_error('Operator not recognized: "{0}"'.format(string), start) raise syntax_error('Operator not recognized: "{0}"'.format(string), start)