|
|
@ -436,6 +436,47 @@ class InfoExtractor(object): |
|
|
|
} |
|
|
|
return RATING_TABLE.get(rating.lower(), None) |
|
|
|
|
|
|
|
def _sort_formats(self, formats): |
|
|
|
def _formats_key(f): |
|
|
|
preference = f.get('preference') |
|
|
|
if preference is None: |
|
|
|
preference = 0 if f.get('url', '').startswith('http') else -0.1 |
|
|
|
if f.get('ext') in ['f4f', 'f4m']: # Not yet supported |
|
|
|
preference -= 0.5 |
|
|
|
|
|
|
|
if f.get('vcodec') == 'none': # audio only |
|
|
|
if self._downloader.params.get('prefer_free_formats'): |
|
|
|
ORDER = [u'aac', u'mp3', u'm4a', u'webm', u'ogg', u'opus'] |
|
|
|
else: |
|
|
|
ORDER = [u'webm', u'opus', u'ogg', u'mp3', u'aac', u'm4a'] |
|
|
|
ext_preference = 0 |
|
|
|
try: |
|
|
|
audio_ext_preference = ORDER.index(f['ext']) |
|
|
|
except ValueError: |
|
|
|
audio_ext_preference = -1 |
|
|
|
else: |
|
|
|
if self._downloader.params.get('prefer_free_formats'): |
|
|
|
ORDER = [u'flv', u'mp4', u'webm'] |
|
|
|
else: |
|
|
|
ORDER = [u'webm', u'flv', u'mp4'] |
|
|
|
try: |
|
|
|
ext_preference = ORDER.index(f['ext']) |
|
|
|
except ValueError: |
|
|
|
ext_preference = -1 |
|
|
|
audio_ext_preference = 0 |
|
|
|
|
|
|
|
return ( |
|
|
|
preference, |
|
|
|
f.get('height') if f.get('height') is not None else -1, |
|
|
|
f.get('width') if f.get('width') is not None else -1, |
|
|
|
ext_preference, |
|
|
|
f.get('vbr') if f.get('vbr') is not None else -1, |
|
|
|
f.get('abr') if f.get('abr') is not None else -1, |
|
|
|
audio_ext_preference, |
|
|
|
f.get('filesize') if f.get('filesize') is not None else -1, |
|
|
|
f.get('format_id'), |
|
|
|
) |
|
|
|
formats.sort(key=_formats_key) |
|
|
|
|
|
|
|
|
|
|
|
class SearchInfoExtractor(InfoExtractor): |
|
|
|