From 2ae28147b07df9d0c70466af50dac39d6d9db893 Mon Sep 17 00:00:00 2001 From: Lesmiscore Date: Wed, 27 Apr 2022 16:05:05 +0900 Subject: [PATCH 1/3] [YoutubeDL] extend wide format selector --- yt_dlp/YoutubeDL.py | 71 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 57 insertions(+), 14 deletions(-) diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index 9acd88171..b0f88ba86 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -2146,21 +2146,64 @@ class YoutubeDL: elif selector.type == SINGLE: # atom format_spec = selector.selector or 'best' + mobj = re.match( + r'(?Pmerge)?all(?Pvideo|audio)?(?Plang)?', format_spec) + if mobj: + mg, tp, la = mobj.groups() + def selector_function(ctx): + formats = ctx['formats'][::-1] - # TODO: Add allvideo, allaudio etc by generalizing the code with best/worst selector - if format_spec == 'all': - def selector_function(ctx): - yield from _check_formats(ctx['formats'][::-1]) - elif format_spec == 'mergeall': - def selector_function(ctx): - formats = list(_check_formats( - f for f in ctx['formats'] if f.get('vcodec') != 'none' or f.get('acodec') != 'none')) - if not formats: - return - merged_format = formats[-1] - for f in formats[-2::-1]: - merged_format = _merge((merged_format, f)) - yield merged_format + if tp == 'video': + formats = (f for f in formats if f.get('vcodec') != 'none') + elif tp == 'audio': + formats = (f for f in formats if f.get('acodec') != 'none') + elif mg: + # exclude storyboards + formats = ( + f for f in formats if f.get('vcodec') != 'none' or f.get('acodec') != 'none') + + if la: + all_fmts = formats if isinstance(formats, list) else list(formats) + langs = set(filter(None, traverse_obj(all_fmts, (..., 'language'), default=[]))) + formats = [] + if not langs: + self.report_warning('This video has no track with language tag') + formats = all_fmts + elif tp: + # only audio or video + for f in all_fmts: + if not langs: + break + lang = f.get('language') + if not lang or lang not in langs: + continue + langs.remove(lang) + formats.append(f) + else: + # no video/audio specified + # vcodec, acodec, language + langs = set(itertools.product((True, False), (True, False), langs)) + for f in all_fmts: + if not langs: + break + lang = f.get('language') + tu = (f.get('vcodec') != 'none', f.get('acodec') != 'none', lang) + if not lang or tu not in langs: + continue + langs.remove(tu) + formats.append(f) + + formats = _check_formats(formats) + if mg: + formats = iter(formats) + merged_format = next(formats, None) + if merged_format is None: + return + for f in formats: + merged_format = _merge((merged_format, f)) + yield merged_format + else: + yield from formats else: format_fallback, seperate_fallback, format_reverse, format_idx = False, None, True, 1 From 94aade999d04c49166ed79a2056be8e4731029d5 Mon Sep 17 00:00:00 2001 From: Lesmiscore Date: Wed, 27 Apr 2022 16:33:56 +0900 Subject: [PATCH 2/3] use groups --- yt_dlp/YoutubeDL.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index b0f88ba86..d2c83c346 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -2149,7 +2149,7 @@ class YoutubeDL: mobj = re.match( r'(?Pmerge)?all(?Pvideo|audio)?(?Plang)?', format_spec) if mobj: - mg, tp, la = mobj.groups() + mg, tp, la = mobj.group('m', 't', 'l') def selector_function(ctx): formats = ctx['formats'][::-1] From 44cf483fd40526dbe878a86e865260be7c6d2a4c Mon Sep 17 00:00:00 2001 From: Lesmiscore Date: Wed, 27 Apr 2022 16:56:49 +0900 Subject: [PATCH 3/3] linter --- yt_dlp/YoutubeDL.py | 1 + 1 file changed, 1 insertion(+) diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index d2c83c346..2cef3acfc 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -2150,6 +2150,7 @@ class YoutubeDL: r'(?Pmerge)?all(?Pvideo|audio)?(?Plang)?', format_spec) if mobj: mg, tp, la = mobj.group('m', 't', 'l') + def selector_function(ctx): formats = ctx['formats'][::-1]