Browse Source

Make 'best' format only match non-DASH formats (closes #5554)

Otherwise it's impossible to only download non-DASH formats, for example `best[height=?480]/best` would download a DASH video if it's the only one with height=480, instead for falling back to the second format specifier.
For audio only urls (soundcloud, bandcamp ...), the best audio will be downloaded as before.
Jaime Marquínez Ferrándiz 10 years ago
parent
commit
8dd5418803
2 changed files with 10 additions and 3 deletions
  1. 2 2
      test/test_YoutubeDL.py
  2. 8 1
      youtube_dl/YoutubeDL.py

+ 2 - 2
test/test_YoutubeDL.py

@@ -237,7 +237,7 @@ class TestFormatSelection(unittest.TestCase):
             f2['url'] = 'url:' + f2id
             f2['url'] = 'url:' + f2id
 
 
             info_dict = _make_result([f1, f2], extractor='youtube')
             info_dict = _make_result([f1, f2], extractor='youtube')
-            ydl = YDL()
+            ydl = YDL({'format': 'best/bestvideo'})
             yie = YoutubeIE(ydl)
             yie = YoutubeIE(ydl)
             yie._sort_formats(info_dict['formats'])
             yie._sort_formats(info_dict['formats'])
             ydl.process_ie_result(info_dict)
             ydl.process_ie_result(info_dict)
@@ -245,7 +245,7 @@ class TestFormatSelection(unittest.TestCase):
             self.assertEqual(downloaded['format_id'], f1id)
             self.assertEqual(downloaded['format_id'], f1id)
 
 
             info_dict = _make_result([f2, f1], extractor='youtube')
             info_dict = _make_result([f2, f1], extractor='youtube')
-            ydl = YDL()
+            ydl = YDL({'format': 'best/bestvideo'})
             yie = YoutubeIE(ydl)
             yie = YoutubeIE(ydl)
             yie._sort_formats(info_dict['formats'])
             yie._sort_formats(info_dict['formats'])
             ydl.process_ie_result(info_dict)
             ydl.process_ie_result(info_dict)

+ 8 - 1
youtube_dl/YoutubeDL.py

@@ -915,7 +915,14 @@ class YoutubeDL(object):
             return None
             return None
 
 
         if format_spec == 'best' or format_spec is None:
         if format_spec == 'best' or format_spec is None:
-            return available_formats[-1]
+            audiovideo_formats = [
+                f for f in available_formats
+                if f.get('vcodec') != 'none' and f.get('acodec') != 'none']
+            if audiovideo_formats:
+                return audiovideo_formats[-1]
+            # for audio only urls, 'best' selects the best audio format
+            elif all(f.get('acodec') != 'none' for f in available_formats):
+                return available_formats[-1]
         elif format_spec == 'worst':
         elif format_spec == 'worst':
             audiovideo_formats = [
             audiovideo_formats = [
                 f for f in available_formats
                 f for f in available_formats