mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-11-04 08:35:12 +00:00 
			
		
		
		
	[YoutubeDL] format spec: add additional checks for invalid syntax
This commit is contained in:
		@@ -302,6 +302,16 @@ class TestFormatSelection(unittest.TestCase):
 | 
				
			|||||||
            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},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -953,6 +953,8 @@ class YoutubeDL(object):
 | 
				
			|||||||
                        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 @@ class YoutubeDL(object):
 | 
				
			|||||||
                    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)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user