1
0
mirror of https://github.com/l1ving/youtube-dl synced 2024-11-25 02:02:55 +08:00

Add temporary _sort_formats helper function

This commit is contained in:
Philipp Hagemeister 2013-12-24 12:25:22 +01:00
parent f49d89ee04
commit 4bcc7bd1f2
3 changed files with 44 additions and 21 deletions

View File

@ -676,17 +676,8 @@ class YoutubeDL(object):
formats = list(takewhile_inclusive( formats = list(takewhile_inclusive(
lambda f: f['format_id'] != format_limit, formats lambda f: f['format_id'] != format_limit, formats
)) ))
if self.params.get('prefer_free_formats'):
def _free_formats_key(f): # TODO Central sorting goes here
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') if f.get('height') is not None else -1,
f.get('width') if f.get('width') is not None else -1,
ext_ord)
formats = sorted(formats, key=_free_formats_key)
if formats[0] is not info_dict: if formats[0] is not info_dict:
# only set the 'formats' fields if the original info_dict list them # only set the 'formats' fields if the original info_dict list them

View File

@ -436,6 +436,47 @@ class InfoExtractor(object):
} }
return RATING_TABLE.get(rating.lower(), None) 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): class SearchInfoExtractor(InfoExtractor):

View File

@ -1433,16 +1433,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor):
'format_note': note, 'format_note': note,
}) })
def _formats_key(f): self._sort_formats(formats)
note = f.get('format_note')
if note is None:
note = u''
is_dash = u'DASH' in note
return (
0 if is_dash else 1,
f.get('height') if f.get('height') is not None else -1,
f.get('width') if f.get('width') is not None else -1)
formats.sort(key=_formats_key)
return { return {
'id': video_id, 'id': video_id,