From 63be1aab2f6b6a99f289663ffd935e311aff5556 Mon Sep 17 00:00:00 2001 From: pukkandan Date: Thu, 21 Jan 2021 18:20:09 +0530 Subject: [PATCH] Deprecate unnecessary aliases in `formatSort` (I should never have made so many aliases in the first-place) The aliases remain functional for backward compatability, but will be left undocumented --- README.md | 46 +++++++++++++------------- youtube_dlc/YoutubeDL.py | 4 +-- youtube_dlc/extractor/common.py | 58 +++++++++++++++++++-------------- 3 files changed, 59 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index e7f3762bf..643b53349 100644 --- a/README.md +++ b/README.md @@ -916,35 +916,35 @@ Format selectors can also be grouped using parentheses, for example if you want You can change the criteria for being considered the `best` by using `-S` (`--format-sort`). The general format for this is `--format-sort field1,field2...`. The available fields are: - - `video`, `has_video`: Gives priority to formats that has a video stream - - `audio`, `has_audio`: Gives priority to formats that has a audio stream - - `extractor`, `preference`, `extractor_preference`: The format preference as given by the extractor - - `lang`, `language_preference`: Language preference as given by the extractor + - `hasvid`: Gives priority to formats that has a video stream + - `hasaud`: Gives priority to formats that has a audio stream + - `ie_pref`: The format preference as given by the extractor + - `lang`: Language preference as given by the extractor - `quality`: The quality of the format. This is a metadata field available in some websites - - `source`, `source_preference`: Preference of the source as given by the extractor - - `proto`, `protocol`: Protocol used for download (`https`/`ftps` > `http`/`ftp` > `m3u8-native` > `m3u8` > `http-dash-segments` > other > `mms`/`rtsp` > unknown > `f4f`/`f4m`) - - `vcodec`, `video_codec`: Video Codec (`vp9` > `h265` > `h264` > `vp8` > `h263` > `theora` > other > unknown) - - `acodec`, `audio_codec`: Audio Codec (`opus` > `vorbis` > `aac` > `mp4a` > `mp3` > `ac3` > `dts` > other > unknown) + - `source`: Preference of the source as given by the extractor + - `proto`: Protocol used for download (`https`/`ftps` > `http`/`ftp` > `m3u8-native` > `m3u8` > `http-dash-segments` > other > `mms`/`rtsp` > unknown > `f4f`/`f4m`) + - `vcodec`: Video Codec (`vp9` > `h265` > `h264` > `vp8` > `h263` > `theora` > other > unknown) + - `acodec`: Audio Codec (`opus` > `vorbis` > `aac` > `mp4a` > `mp3` > `ac3` > `dts` > other > unknown) - `codec`: Equivalent to `vcodec,acodec` - - `vext`, `video_ext`: Video Extension (`mp4` > `webm` > `flv` > other > unknown). If `--prefer-free-formats` is used, `webm` is prefered. - - `aext`, `audio_ext`: Audio Extension (`m4a` > `aac` > `mp3` > `ogg` > `opus` > `webm` > other > unknown). If `--prefer-free-formats` is used, the order changes to `opus` > `ogg` > `webm` > `m4a` > `mp3` > `aac`. - - `ext`, `extension`: Equivalent to `vext,aext` + - `vext`: Video Extension (`mp4` > `webm` > `flv` > other > unknown). If `--prefer-free-formats` is used, `webm` is prefered. + - `aext`: Audio Extension (`m4a` > `aac` > `mp3` > `ogg` > `opus` > `webm` > other > unknown). If `--prefer-free-formats` is used, the order changes to `opus` > `ogg` > `webm` > `m4a` > `mp3` > `aac`. + - `ext`: Equivalent to `vext,aext` - `filesize`: Exact filesize, if know in advance. This will be unavailable for mu38 and DASH formats. - - `filesize_approx`: Approximate filesize calculated from the manifests - - `size`, `filesize_estimate`: Exact filesize if available, otherwise approximate filesize + - `fs_approx`: Approximate filesize calculated from the manifests + - `size`: Exact filesize if available, otherwise approximate filesize - `height`: Height of video - `width`: Width of video - - `res`, `dimension`: Video resolution, calculated as the smallest dimension. - - `fps`, `framerate`: Framerate of video - - `tbr`, `total_bitrate`: Total average bitrate in KBit/s - - `vbr`, `video_bitrate`: Average video bitrate in KBit/s - - `abr`, `audio_bitrate`: Average audio bitrate in KBit/s - - `br`, `bitrate`: Equivalent to using `tbr,vbr,abr` - - `samplerate`, `asr`: Audio sample rate in Hz + - `res`: Video resolution, calculated as the smallest dimension. + - `fps`: Framerate of video + - `tbr`: Total average bitrate in KBit/s + - `vbr`: Average video bitrate in KBit/s + - `abr`: Average audio bitrate in KBit/s + - `br`: Equivalent to using `tbr,vbr,abr` + - `asr`: Audio sample rate in Hz Note that any other **numerical** field made available by the extractor can also be used. All fields, unless specified otherwise, are sorted in decending order. To reverse this, prefix the field with a `+`. Eg: `+res` prefers format with the smallest resolution. Additionally, you can suffix a prefered value for the fields, seperated by a `:`. Eg: `res:720` prefers larger videos, but no larger than 720p and the smallest video if there are no videos less than 720p. For `codec` and `ext`, you can provide two prefered values, the first for video and the second for audio. Eg: `+codec:avc:m4a` (equivalent to `+vcodec:avc,+acodec:m4a`) sets the video codec preference to `h264` > `h265` > `vp9` > `vp8` > `h263` > `theora` and audio codec preference to `mp4a` > `aac` > `vorbis` > `opus` > `mp3` > `ac3` > `dts`. You can also make the sorting prefer the nearest values to the provided by using `~` as the delimiter. Eg: `filesize~1G` prefers the format with filesize closest to 1 GiB. -The fields `has_video`, `extractor`, `lang`, `quality` are always given highest priority in sorting, irrespective of the user-defined order. This behaviour can be changed by using `--force-format-sort`. Apart from these, the default order used is: `res,fps,codec,size,br,asr,proto,ext,has_audio,source,format_id`. Note that the extractors may override this default order, but they cannot override the user-provided order. +The fields `hasvid`, `ie_pref`, `lang`, `quality` are always given highest priority in sorting, irrespective of the user-defined order. This behaviour can be changed by using `--force-format-sort`. Apart from these, the default order used is: `res,fps,codec,size,br,asr,proto,ext,hasaud,source,id`. Note that the extractors may override this default order, but they cannot override the user-provided order. If your format selector is `worst`, the last item is selected after sorting. This means it will select the format that is worst in all repects. Most of the time, what you actually want is the video with the smallest filesize instead. So it is generally better to use `-f best -S +size,+br,+res,+fps`. @@ -983,7 +983,7 @@ $ youtube-dlc -f 'wv*+wa/w' $ youtube-dlc -S '+res' # Download the smallest video available -$ youtube-dlc -S '+size,+bitrate' +$ youtube-dlc -S '+size,+br' @@ -1031,7 +1031,7 @@ $ youtube-dlc -f '(bv*+ba/b)[protocol^=http][protocol!*=dash] / (bv*+ba/b)' # Download best video available via the best protocol # (https/ftps > http/ftp > m3u8_native > m3u8 > http_dash_segments ...) -$ youtube-dlc -S 'protocol' +$ youtube-dlc -S 'proto' diff --git a/youtube_dlc/YoutubeDL.py b/youtube_dlc/YoutubeDL.py index 867f3a61a..41f436086 100644 --- a/youtube_dlc/YoutubeDL.py +++ b/youtube_dlc/YoutubeDL.py @@ -886,8 +886,8 @@ class YoutubeDL(object): try: temp_id = str_or_none( - ie.extract_id(url) if callable(getattr(ie, 'extract_id', None)) - else ie._match_id(url)) + ie.extract_id(url) if callable(getattr(ie, 'extract_id', None)) + else ie._match_id(url)) except (AssertionError, IndexError, AttributeError): temp_id = None if temp_id is not None and self.in_download_archive({'id': temp_id, 'ie_key': ie_key}): diff --git a/youtube_dlc/extractor/common.py b/youtube_dlc/extractor/common.py index d06043f5e..d14517b54 100644 --- a/youtube_dlc/extractor/common.py +++ b/youtube_dlc/extractor/common.py @@ -1375,8 +1375,8 @@ class InfoExtractor(object): 'order': ['vp9', '(h265|he?vc?)', '(h264|avc)', 'vp8', '(mp4v|h263)', 'theora', '', None, 'none']}, 'acodec': {'type': 'ordered', 'regex': True, 'order': ['opus', 'vorbis', 'aac', 'mp?4a?', 'mp3', 'e?a?c-?3', 'dts', '', None, 'none']}, - 'protocol': {'type': 'ordered', 'regex': True, - 'order': ['(ht|f)tps', '(ht|f)tp$', 'm3u8.+', 'm3u8', '.*dash', '', 'mms|rtsp', 'none', 'f4']}, + 'proto': {'type': 'ordered', 'regex': True, + 'order': ['(ht|f)tps', '(ht|f)tp$', 'm3u8.+', 'm3u8', '.*dash', '', 'mms|rtsp', 'none', 'f4']}, 'vext': {'type': 'ordered', 'field': 'video_ext', 'order': ('mp4', 'webm', 'flv', '', 'none'), 'order_free': ('webm', 'mp4', 'flv', '', 'none')}, @@ -1384,14 +1384,14 @@ class InfoExtractor(object): 'order': ('m4a', 'aac', 'mp3', 'ogg', 'opus', 'webm', '', 'none'), 'order_free': ('opus', 'ogg', 'webm', 'm4a', 'mp3', 'aac', '', 'none')}, 'hidden': {'visible': False, 'forced': True, 'type': 'extractor', 'max': -1000}, - 'extractor_preference': {'priority': True, 'type': 'extractor'}, - 'has_video': {'priority': True, 'field': 'vcodec', 'type': 'boolean', 'not_in_list': ('none',)}, - 'has_audio': {'field': 'acodec', 'type': 'boolean', 'not_in_list': ('none',)}, - 'language_preference': {'priority': True, 'convert': 'ignore'}, + 'ie_pref': {'priority': True, 'type': 'extractor'}, + 'hasvid': {'priority': True, 'field': 'vcodec', 'type': 'boolean', 'not_in_list': ('none',)}, + 'hasaud': {'field': 'acodec', 'type': 'boolean', 'not_in_list': ('none',)}, + 'lang': {'priority': True, 'convert': 'ignore'}, 'quality': {'priority': True, 'convert': 'float_none'}, 'filesize': {'convert': 'bytes'}, - 'filesize_approx': {'convert': 'bytes'}, - 'format_id': {'convert': 'string'}, + 'fs_approx': {'convert': 'bytes'}, + 'id': {'convert': 'string'}, 'height': {'convert': 'float_none'}, 'width': {'convert': 'float_none'}, 'fps': {'convert': 'float_none'}, @@ -1399,32 +1399,42 @@ class InfoExtractor(object): 'vbr': {'convert': 'float_none'}, 'abr': {'convert': 'float_none'}, 'asr': {'convert': 'float_none'}, - 'source_preference': {'convert': 'ignore'}, + 'source': {'convert': 'ignore'}, + 'codec': {'type': 'combined', 'field': ('vcodec', 'acodec')}, - 'bitrate': {'type': 'combined', 'field': ('tbr', 'vbr', 'abr'), 'same_limit': True}, - 'filesize_estimate': {'type': 'combined', 'same_limit': True, 'field': ('filesize', 'filesize_approx')}, - 'extension': {'type': 'combined', 'field': ('vext', 'aext')}, - 'dimension': {'type': 'multiple', 'field': ('height', 'width'), 'function': min}, # not named as 'resolution' because such a field exists - 'res': {'type': 'alias', 'field': 'dimension'}, - 'ext': {'type': 'alias', 'field': 'extension'}, - 'br': {'type': 'alias', 'field': 'bitrate'}, + 'br': {'type': 'combined', 'field': ('tbr', 'vbr', 'abr'), 'same_limit': True}, + 'size': {'type': 'combined', 'same_limit': True, 'field': ('filesize', 'fs_approx')}, + 'ext': {'type': 'combined', 'field': ('vext', 'aext')}, + 'res': {'type': 'multiple', 'field': ('height', 'width'), 'function': min}, + + # Most of these exist only for compatibility reasons + 'dimension': {'type': 'alias', 'field': 'res'}, + 'resolution': {'type': 'alias', 'field': 'res'}, + 'extension': {'type': 'alias', 'field': 'ext'}, + 'bitrate': {'type': 'alias', 'field': 'br'}, 'total_bitrate': {'type': 'alias', 'field': 'tbr'}, 'video_bitrate': {'type': 'alias', 'field': 'vbr'}, 'audio_bitrate': {'type': 'alias', 'field': 'abr'}, 'framerate': {'type': 'alias', 'field': 'fps'}, - 'lang': {'type': 'alias', 'field': 'language_preference'}, # not named as 'language' because such a field exists - 'proto': {'type': 'alias', 'field': 'protocol'}, - 'source': {'type': 'alias', 'field': 'source_preference'}, - 'size': {'type': 'alias', 'field': 'filesize_estimate'}, + 'language_preference': {'type': 'alias', 'field': 'lang'}, # not named as 'language' because such a field exists + 'protocol': {'type': 'alias', 'field': 'proto'}, + 'source_preference': {'type': 'alias', 'field': 'source'}, + 'filesize_approx': {'type': 'alias', 'field': 'fs_approx'}, + 'filesize_estimate': {'type': 'alias', 'field': 'size'}, 'samplerate': {'type': 'alias', 'field': 'asr'}, 'video_ext': {'type': 'alias', 'field': 'vext'}, 'audio_ext': {'type': 'alias', 'field': 'aext'}, 'video_codec': {'type': 'alias', 'field': 'vcodec'}, 'audio_codec': {'type': 'alias', 'field': 'acodec'}, - 'video': {'type': 'alias', 'field': 'has_video'}, - 'audio': {'type': 'alias', 'field': 'has_audio'}, - 'extractor': {'type': 'alias', 'field': 'extractor_preference'}, - 'preference': {'type': 'alias', 'field': 'extractor_preference'}} + 'video': {'type': 'alias', 'field': 'hasvid'}, + 'has_video': {'type': 'alias', 'field': 'hasvid'}, + 'audio': {'type': 'alias', 'field': 'hasaud'}, + 'has_audio': {'type': 'alias', 'field': 'hasaud'}, + 'extractor': {'type': 'alias', 'field': 'ie_pref'}, + 'preference': {'type': 'alias', 'field': 'ie_pref'}, + 'extractor_preference': {'type': 'alias', 'field': 'ie_pref'}, + 'format_id': {'type': 'alias', 'field': 'id'}, + } _order = []