From ad4fd27bf1add2f8f94956d389a1ff52c173c132 Mon Sep 17 00:00:00 2001 From: sepro <4618135+seproDev@users.noreply.github.com> Date: Sat, 27 Apr 2024 20:31:52 +0200 Subject: [PATCH 1/6] [core] Warn user when ffmpeg is missing --- yt_dlp/YoutubeDL.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index 9f730d038..51c3ba8d0 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -2136,6 +2136,8 @@ class YoutubeDL: def _check_formats(self, formats): for f in formats: + if f.get('__working'): + yield f self.to_screen('[info] Testing format %s' % f['format_id']) path = self.get_output_path('temp') if not self._ensure_dir_exists(f'{path}/'): @@ -2153,6 +2155,7 @@ class YoutubeDL: except OSError: self.report_warning('Unable to delete temporary file "%s"' % temp_file.name) if success: + f['__working'] = True yield f else: self.to_screen('[info] Unable to download format %s. Skipping...' % f['format_id']) @@ -2163,6 +2166,18 @@ class YoutubeDL: merger = FFmpegMergerPP(self) return merger.available and merger.can_merge() + def evaluate_formats(format_spec): + formats = info_dict.get('formats') or [] + return list(self.build_format_selector(format_spec)({ + 'formats': formats, + 'has_merged_format': any('none' not in (f.get('acodec'), f.get('vcodec')) for f in formats), + 'incomplete_formats': (all(f.get('vcodec') == 'none' for f in formats) # No formats with video + or all(f.get('acodec') == 'none' for f in formats)), # OR, No formats with audio + })) + if not can_merge() and evaluate_formats('best/bestvideo+bestaudio') != evaluate_formats('bestvideo*+bestaudio/best'): + self.report_warning('ffmpeg not found. The downloaded format is not the highest available quality. ' + 'Installing ffmpeg is strongly recommended: https://github.com/yt-dlp/yt-dlp#dependencies') + prefer_best = ( not self.params.get('simulate') and download From 1b57e3bbb63b481d3d3a4d4933c920fd88b55ab6 Mon Sep 17 00:00:00 2001 From: sepro <4618135+seproDev@users.noreply.github.com> Date: Wed, 1 May 2024 23:26:56 +0200 Subject: [PATCH 2/6] Use `self._get_formats` Co-authored-by: pukkandan --- 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 51c3ba8d0..1c585d237 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -2167,7 +2167,7 @@ class YoutubeDL: return merger.available and merger.can_merge() def evaluate_formats(format_spec): - formats = info_dict.get('formats') or [] + formats = self._get_formats(info_dict) return list(self.build_format_selector(format_spec)({ 'formats': formats, 'has_merged_format': any('none' not in (f.get('acodec'), f.get('vcodec')) for f in formats), From 810f85fa118018570537e9ed59a3a61cc4581bc3 Mon Sep 17 00:00:00 2001 From: sepro <4618135+seproDev@users.noreply.github.com> Date: Wed, 1 May 2024 23:35:51 +0200 Subject: [PATCH 3/6] Pull format selection in to separate method --- yt_dlp/YoutubeDL.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index 1c585d237..39d17be5c 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -2160,6 +2160,14 @@ class YoutubeDL: else: self.to_screen('[info] Unable to download format %s. Skipping...' % f['format_id']) + def _select_formats(self, formats, selector): + return list(selector({ + 'formats': formats, + 'has_merged_format': any('none' not in (f.get('acodec'), f.get('vcodec')) for f in formats), + 'incomplete_formats': (all(f.get('vcodec') == 'none' for f in formats) # No formats with video + or all(f.get('acodec') == 'none' for f in formats)), # OR, No formats with audio + })) + def _default_format_spec(self, info_dict, download=True): def can_merge(): @@ -2168,12 +2176,7 @@ class YoutubeDL: def evaluate_formats(format_spec): formats = self._get_formats(info_dict) - return list(self.build_format_selector(format_spec)({ - 'formats': formats, - 'has_merged_format': any('none' not in (f.get('acodec'), f.get('vcodec')) for f in formats), - 'incomplete_formats': (all(f.get('vcodec') == 'none' for f in formats) # No formats with video - or all(f.get('acodec') == 'none' for f in formats)), # OR, No formats with audio - })) + return self._select_formats(formats, self.build_format_selector(format_spec)) if not can_merge() and evaluate_formats('best/bestvideo+bestaudio') != evaluate_formats('bestvideo*+bestaudio/best'): self.report_warning('ffmpeg not found. The downloaded format is not the highest available quality. ' 'Installing ffmpeg is strongly recommended: https://github.com/yt-dlp/yt-dlp#dependencies') @@ -2943,12 +2946,7 @@ class YoutubeDL: self.write_debug(f'Default format spec: {req_format}') format_selector = self.build_format_selector(req_format) - formats_to_download = list(format_selector({ - 'formats': formats, - 'has_merged_format': any('none' not in (f.get('acodec'), f.get('vcodec')) for f in formats), - 'incomplete_formats': (all(f.get('vcodec') == 'none' for f in formats) # No formats with video - or all(f.get('acodec') == 'none' for f in formats)), # OR, No formats with audio - })) + formats_to_download = self._select_formats(formats, format_selector) if interactive_format_selection and not formats_to_download: self.report_error('Requested format is not available', tb=False, is_error=False) continue From 6078a87f5ef5f3fe690587a3a49784036424fdb2 Mon Sep 17 00:00:00 2001 From: sepro <4618135+seproDev@users.noreply.github.com> Date: Thu, 2 May 2024 20:24:01 +0200 Subject: [PATCH 4/6] Fix warning when piping to stdout --- yt_dlp/YoutubeDL.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index 39d17be5c..682d84f3a 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -2177,7 +2177,10 @@ class YoutubeDL: def evaluate_formats(format_spec): formats = self._get_formats(info_dict) return self._select_formats(formats, self.build_format_selector(format_spec)) - if not can_merge() and evaluate_formats('best/bestvideo+bestaudio') != evaluate_formats('bestvideo*+bestaudio/best'): + + to_stdout = self.params['outtmpl']['default'] == '-' + + if not can_merge() and not to_stdout and evaluate_formats('b/bv+ba') != evaluate_formats('bv*+ba/b'): self.report_warning('ffmpeg not found. The downloaded format is not the highest available quality. ' 'Installing ffmpeg is strongly recommended: https://github.com/yt-dlp/yt-dlp#dependencies') @@ -2187,7 +2190,7 @@ class YoutubeDL: and ( not can_merge() or info_dict.get('is_live') and not self.params.get('live_from_start') - or self.params['outtmpl']['default'] == '-')) + or to_stdout)) compat = ( prefer_best or self.params.get('allow_multiple_audio_streams', False) From e9d01a953257ab890ed1b2677cb95a71982a3f92 Mon Sep 17 00:00:00 2001 From: sepro <4618135+seproDev@users.noreply.github.com> Date: Thu, 2 May 2024 21:43:54 +0200 Subject: [PATCH 5/6] Clean up `_default_format_spec` function Co-Authored-By: pukkandan --- yt_dlp/YoutubeDL.py | 42 +++++++++++++++++------------------------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index 682d84f3a..d1ecaef61 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -2169,37 +2169,29 @@ class YoutubeDL: })) def _default_format_spec(self, info_dict, download=True): + download = download and not self.params.get('simulate') + prefer_best = download and ( + self.params['outtmpl']['default'] == '-' + or info_dict.get('is_live') and not self.params.get('live_from_start')) def can_merge(): merger = FFmpegMergerPP(self) return merger.available and merger.can_merge() - def evaluate_formats(format_spec): + if not prefer_best and download and not can_merge(): + prefer_best = True formats = self._get_formats(info_dict) - return self._select_formats(formats, self.build_format_selector(format_spec)) - - to_stdout = self.params['outtmpl']['default'] == '-' - - if not can_merge() and not to_stdout and evaluate_formats('b/bv+ba') != evaluate_formats('bv*+ba/b'): - self.report_warning('ffmpeg not found. The downloaded format is not the highest available quality. ' - 'Installing ffmpeg is strongly recommended: https://github.com/yt-dlp/yt-dlp#dependencies') - - prefer_best = ( - not self.params.get('simulate') - and download - and ( - not can_merge() - or info_dict.get('is_live') and not self.params.get('live_from_start') - or to_stdout)) - compat = ( - prefer_best - or self.params.get('allow_multiple_audio_streams', False) - or 'format-spec' in self.params['compat_opts']) - - return ( - 'best/bestvideo+bestaudio' if prefer_best - else 'bestvideo*+bestaudio/best' if not compat - else 'bestvideo+bestaudio/best') + evaluate_formats = lambda spec: self._select_formats(formats, self.build_format_selector(spec)) + if evaluate_formats('b/bv+ba') != evaluate_formats('bv*+ba/b'): + self.report_warning('ffmpeg not found. The downloaded format is not the highest available quality. ' + 'Installing ffmpeg is strongly recommended: https://github.com/yt-dlp/yt-dlp#dependencies') + + compat = (self.params.get('allow_multiple_audio_streams') + or 'format-spec' in self.params['compat_opts']) + + return ('best/bestvideo+bestaudio' if prefer_best + else 'bestvideo+bestaudio/best' if compat + else 'bestvideo*+bestaudio/best') def build_format_selector(self, format_spec): def syntax_error(note, start): From 9e305e7d0382cc3f2908250b7abaf1504a19c153 Mon Sep 17 00:00:00 2001 From: sepro <4618135+seproDev@users.noreply.github.com> Date: Sat, 4 May 2024 00:51:48 +0200 Subject: [PATCH 6/6] Update wording Co-authored-by: bashonly <88596187+bashonly@users.noreply.github.com> --- 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 d1ecaef61..39593cb6c 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -2183,7 +2183,7 @@ class YoutubeDL: formats = self._get_formats(info_dict) evaluate_formats = lambda spec: self._select_formats(formats, self.build_format_selector(spec)) if evaluate_formats('b/bv+ba') != evaluate_formats('bv*+ba/b'): - self.report_warning('ffmpeg not found. The downloaded format is not the highest available quality. ' + self.report_warning('ffmpeg not found. The downloaded format may not be the best available. ' 'Installing ffmpeg is strongly recommended: https://github.com/yt-dlp/yt-dlp#dependencies') compat = (self.params.get('allow_multiple_audio_streams')