added format-sort-force and allow to sort in reverse

This commit is contained in:
pukkandan 2020-07-15 15:13:57 +05:30
parent 0b7c7771d6
commit a9dc62af6f
3 changed files with 43 additions and 16 deletions

View File

@ -339,6 +339,7 @@ def _real_main(argv=None):
'skip_download': opts.skip_download, 'skip_download': opts.skip_download,
'format': opts.format, 'format': opts.format,
'format_sort': opts.format_sort, 'format_sort': opts.format_sort,
'format_sort_force': opts.format_sort_force,
'listformats': opts.listformats, 'listformats': opts.listformats,
'outtmpl': outtmpl, 'outtmpl': outtmpl,
'autonumber_size': opts.autonumber_size, 'autonumber_size': opts.autonumber_size,

View File

@ -1358,19 +1358,35 @@ class InfoExtractor(object):
if not formats: if not formats:
raise ExtractorError('No video formats found') raise ExtractorError('No video formats found')
sort = self._downloader.params.get('format_sort', '') def _get_sort_list():
sort = sort.split(',') if isinstance(sort, str) else [] sort = self._downloader.params.get('format_sort', '')
if isinstance(field_preference, (list, tuple)): sort = sort.split(',') if isinstance(sort, str) else []
sort += [f for f in field_preference if f not in sort] if self._downloader.params.get('verbose', False):
sort += [f for f in self._downloader.to_screen('[debug] Sort order diven by user: %s' % sort)
['preference', 'language_preference', 'quality', 'tbr', # default order self._downloader.to_screen('[debug] Sort order diven by extractor: %s' % field_preference)
return (tuple()
if self._downloader.params.get('format_sort_force')
else ('preference', 'language_preference')) + \
tuple(sort) + \
(tuple(field_preference)
if isinstance(field_preference, (list, tuple))
else tuple()) + \
('preference', 'language_preference', 'quality', 'tbr', # default order
'filesize', 'vbr', 'height', 'width', 'filesize', 'vbr', 'height', 'width',
'proto_preference', 'ext_preference', 'proto_preference', 'ext_preference',
'abr', 'audio_ext_preference', 'fps', 'abr', 'audio_ext_preference', 'fps',
'filesize_approx', 'source_preference', 'format_id'] 'filesize_approx', 'source_preference', 'format_id')
if f not in sort]
sort = {}
for item in _get_sort_list():
if item[:1] == "+":
sort.setdefault(item[1:], True) # Value = reverse?
else:
sort.setdefault(item, False)
if self._downloader.params.get('verbose', False): if self._downloader.params.get('verbose', False):
self._downloader.to_screen('[debug] Formats sorted by: %s' % sort) self._downloader.to_screen('[debug] Formats sorted by: %s'
% [("+" + i) if sort[i] else i for i in sort])
for f in formats: for f in formats:
# Automatically determine tbr when missing based on abr and vbr (improves # Automatically determine tbr when missing based on abr and vbr (improves
@ -1423,10 +1439,11 @@ class InfoExtractor(object):
'audio_ext_preference': audio_ext_preference} 'audio_ext_preference': audio_ext_preference}
return tuple( return tuple(
prefVars.get(field) (-1 if field != 'format_id' and sort[field] else 1)*(
if prefVars.get(field) is not None prefVars.get(field)
else (f.get(field) if f.get(field) is not None if prefVars.get(field) is not None
else ('' if field == 'format_id' else -1)) else (f.get(field) if f.get(field) is not None
else ('' if field == 'format_id' else -1)))
for field in sort) for field in sort)
formats.sort(key=_formats_key) formats.sort(key=_formats_key)

View File

@ -398,10 +398,19 @@ def parseOpts(overrideArguments=None):
'--format-sort', '--format-sort',
action='store', dest='format_sort', metavar='FORMAT', default=None, action='store', dest='format_sort', metavar='FORMAT', default=None,
help=( help=(
'Specify the fields used to sort the formats (e.g. height,width,tbr). ' 'Sort the formats by the fields given (e.g. height,width,-filesize,tbr). '
'Available fields: language_preference, quality, height, width, fps, ' 'Available fields: language_preference, quality, height, width, fps, '
'filesize, filesize_approx, tbr, vbr, abr, format_id, ' 'filesize, filesize_approx, tbr, vbr, abr, format_id, preference'
'proto_preference, ext_preference, audio_ext_preference, source_preference')) 'proto_preference, ext_preference, audio_ext_preference, source_preference. '
'Prefix the field (except format_id) by a + to sort it in reverse. '
'preference and language_preference will always have the highest priority '
'unless --format-sort-force is given'))
video_format.add_option(
'--format-sort-force',
action='store_true', dest='format_sort_force', metavar='FORMAT', default=False,
help=(
'User specified sort order takes priority even over '
'preference and language_preference'))
video_format.add_option( video_format.add_option(
'--all-formats', '--all-formats',
action='store_const', dest='format', const='all', action='store_const', dest='format', const='all',