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.
totalwebcasting
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 View File

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


+ 8
- 1
youtube_dl/YoutubeDL.py View File

@ -915,7 +915,14 @@ class YoutubeDL(object):
return 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':
audiovideo_formats = [
f for f in available_formats


Loading…
Cancel
Save