diff options
| -rw-r--r-- | test/test_YoutubeDL.py | 49 | ||||
| -rw-r--r-- | youtube_dl/YoutubeDL.py | 9 | 
2 files changed, 58 insertions, 0 deletions
| diff --git a/test/test_YoutubeDL.py b/test/test_YoutubeDL.py new file mode 100644 index 000000000..2b9fb92ee --- /dev/null +++ b/test/test_YoutubeDL.py @@ -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() diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index 829a70ec9..e159aa336 100644 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -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 = [] | 
