mirror of
				https://gitlab.com/ytdl-org/youtube-dl.git
				synced 2025-11-04 02:07:07 -05: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)
 | 
			
		||||
        if 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')
 | 
			
		||||
        formats_to_download = []
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user