mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-11-04 08:35:12 +00:00 
			
		
		
		
	Implement the prefer_free_formats in YoutubeDL
This commit is contained in:
		
							
								
								
									
										49
									
								
								test/test_YoutubeDL.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								test/test_YoutubeDL.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,49 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env python
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
 | 
					import unittest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Allow direct execution
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
 | 
					sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from helper import FakeYDL, parameters
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class YDL(FakeYDL):
 | 
				
			||||||
 | 
					    def __init__(self):
 | 
				
			||||||
 | 
					        super(YDL, self).__init__()
 | 
				
			||||||
 | 
					        self.downloaded_info_dicts = []
 | 
				
			||||||
 | 
					    def process_info(self, info_dict):
 | 
				
			||||||
 | 
					        self.downloaded_info_dicts.append(info_dict)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TestFormatSelection(unittest.TestCase):
 | 
				
			||||||
 | 
					    def test_prefer_free_formats(self):
 | 
				
			||||||
 | 
					        # Same resolution => download webm
 | 
				
			||||||
 | 
					        ydl = YDL()
 | 
				
			||||||
 | 
					        ydl.params['prefer_free_formats'] = True
 | 
				
			||||||
 | 
					        formats = [{u'ext': u'webm', u'height': 460},{u'ext': u'mp4',  u'height': 460}]
 | 
				
			||||||
 | 
					        info_dict = {u'formats': formats, u'extractor': u'test'}
 | 
				
			||||||
 | 
					        ydl.process_ie_result(info_dict)
 | 
				
			||||||
 | 
					        downloaded = ydl.downloaded_info_dicts[0]
 | 
				
			||||||
 | 
					        self.assertEqual(downloaded[u'ext'], u'webm')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Different resolution => download best quality (mp4)
 | 
				
			||||||
 | 
					        ydl = YDL()
 | 
				
			||||||
 | 
					        ydl.params['prefer_free_formats'] = True
 | 
				
			||||||
 | 
					        formats = [{u'ext': u'webm', u'height': 720},{u'ext': u'mp4',u'height': 1080}]
 | 
				
			||||||
 | 
					        info_dict[u'formats'] = formats
 | 
				
			||||||
 | 
					        ydl.process_ie_result(info_dict)
 | 
				
			||||||
 | 
					        downloaded = ydl.downloaded_info_dicts[0]
 | 
				
			||||||
 | 
					        self.assertEqual(downloaded[u'ext'], u'mp4')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # No prefer_free_formats => keep original formats order
 | 
				
			||||||
 | 
					        ydl = YDL()
 | 
				
			||||||
 | 
					        ydl.params['prefer_free_formats'] = False
 | 
				
			||||||
 | 
					        formats = [{u'ext': u'webm', u'height': 720},{u'ext': u'flv',u'height': 720}]
 | 
				
			||||||
 | 
					        info_dict[u'formats'] = formats
 | 
				
			||||||
 | 
					        ydl.process_ie_result(info_dict)
 | 
				
			||||||
 | 
					        downloaded = ydl.downloaded_info_dicts[0]
 | 
				
			||||||
 | 
					        self.assertEqual(downloaded[u'ext'], u'flv')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == '__main__':
 | 
				
			||||||
 | 
					    unittest.main()
 | 
				
			||||||
@@ -484,6 +484,15 @@ class YoutubeDL(object):
 | 
				
			|||||||
        format_limit = self.params.get('format_limit', None)
 | 
					        format_limit = self.params.get('format_limit', None)
 | 
				
			||||||
        if format_limit:
 | 
					        if format_limit:
 | 
				
			||||||
            formats = [f for f in formats if f['format_id'] <= format_limit]
 | 
					            formats = [f for f in formats if f['format_id'] <= format_limit]
 | 
				
			||||||
 | 
					        if self.params.get('prefer_free_formats'):
 | 
				
			||||||
 | 
					            def _free_formats_key(f):
 | 
				
			||||||
 | 
					                try:
 | 
				
			||||||
 | 
					                    ext_ord = [u'flv', u'mp4', u'webm'].index(f['ext'])
 | 
				
			||||||
 | 
					                except ValueError:
 | 
				
			||||||
 | 
					                    ext_ord = -1
 | 
				
			||||||
 | 
					                # We only compare the extension if they have the same height and width
 | 
				
			||||||
 | 
					                return (f.get('height'), f.get('width'), ext_ord)
 | 
				
			||||||
 | 
					            formats = sorted(formats, key=_free_formats_key)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        req_format = self.params.get('format', 'best')
 | 
					        req_format = self.params.get('format', 'best')
 | 
				
			||||||
        formats_to_download = []
 | 
					        formats_to_download = []
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user