diff --git a/yt_dlp/downloader/dash.py b/yt_dlp/downloader/dash.py index 32e510d38..2f29ff8f2 100644 --- a/yt_dlp/downloader/dash.py +++ b/yt_dlp/downloader/dash.py @@ -63,6 +63,8 @@ class DashSegmentsFD(FragmentFD): }) if real_downloader: + self.to_screen( + '[%s] Fragment downloads will be delegated to %s' % (self.FD_NAME, real_downloader.get_basename())) info_copy = info_dict.copy() info_copy['fragments'] = fragments_to_download fd = real_downloader(self.ydl, self.params) @@ -110,7 +112,7 @@ class DashSegmentsFD(FragmentFD): if count > fragment_retries: if not fatal: return False, frag_index - self.report_error('giving up after %s fragment retries' % fragment_retries) + self.report_error('Giving up after %s fragment retries' % fragment_retries) return False, frag_index return frag_content, frag_index diff --git a/yt_dlp/downloader/hls.py b/yt_dlp/downloader/hls.py index 8b7d51de3..d09bfa3aa 100644 --- a/yt_dlp/downloader/hls.py +++ b/yt_dlp/downloader/hls.py @@ -83,14 +83,13 @@ class HlsFD(FragmentFD): if not self.can_download(s, info_dict, self.params.get('allow_unplayable_formats')): if info_dict.get('extra_param_to_segment_url') or info_dict.get('_decryption_key_url'): - self.report_error('pycryptodome not found. Please install it.') + self.report_error('pycryptodome not found. Please install') return False if self.can_download(s, info_dict, with_crypto=True): - self.report_warning('pycryptodome is needed to download this file with hlsnative') - self.report_warning( - 'hlsnative has detected features it does not support, ' - 'extraction will be delegated to ffmpeg') + self.report_warning('pycryptodome is needed to download this file natively') fd = FFmpegFD(self.ydl, self.params) + self.report_warning( + '%s detected unsupported features; extraction will be delegated to %s' % (self.FD_NAME, fd.get_basename())) # TODO: Make progress updates work without hooking twice # for ph in self._progress_hooks: # fd.add_progress_hook(ph) @@ -99,6 +98,9 @@ class HlsFD(FragmentFD): real_downloader = _get_real_downloader(info_dict, 'frag_urls', self.params, None) if real_downloader and not real_downloader.supports_manifest(s): real_downloader = None + if real_downloader: + self.to_screen( + '[%s] Fragment downloads will be delegated to %s' % (self.FD_NAME, real_downloader.get_basename())) def is_ad_fragment_start(s): return (s.startswith('#ANVATO-SEGMENT-INFO') and 'type=ad' in s @@ -186,7 +188,7 @@ class HlsFD(FragmentFD): continue if frag_index > 0: self.report_error( - 'initialization fragment found after media fragments, unable to download') + 'Initialization fragment found after media fragments, unable to download') return False frag_index += 1 map_info = parse_m3u8_attributes(line[11:]) @@ -289,6 +291,7 @@ class HlsFD(FragmentFD): if count <= fragment_retries: self.report_retry_fragment(err, frag_index, count, fragment_retries) if count > fragment_retries: + self.report_error('Giving up after %s fragment retries' % fragment_retries) return False, frag_index if decrypt_info['METHOD'] == 'AES-128': diff --git a/yt_dlp/downloader/rtmp.py b/yt_dlp/downloader/rtmp.py index 8a25dbc8d..99158e621 100644 --- a/yt_dlp/downloader/rtmp.py +++ b/yt_dlp/downloader/rtmp.py @@ -117,7 +117,7 @@ class RtmpFD(FileDownloader): # Check for rtmpdump first if not check_executable('rtmpdump', ['-h']): - self.report_error('RTMP download detected but "rtmpdump" could not be run. Please install it.') + self.report_error('RTMP download detected but "rtmpdump" could not be run. Please install') return False # Download using rtmpdump. rtmpdump returns exit code 2 when diff --git a/yt_dlp/downloader/rtsp.py b/yt_dlp/downloader/rtsp.py index 939358b2a..4ce2fafff 100644 --- a/yt_dlp/downloader/rtsp.py +++ b/yt_dlp/downloader/rtsp.py @@ -24,7 +24,7 @@ class RtspFD(FileDownloader): args = [ 'mpv', '-really-quiet', '--vo=null', '--stream-dump=' + tmpfilename, url] else: - self.report_error('MMS or RTSP download detected but neither "mplayer" nor "mpv" could be run. Please install any.') + self.report_error('MMS or RTSP download detected but neither "mplayer" nor "mpv" could be run. Please install one') return False self._debug_cmd(args) diff --git a/yt_dlp/extractor/ivi.py b/yt_dlp/extractor/ivi.py index 69711f877..064279663 100644 --- a/yt_dlp/extractor/ivi.py +++ b/yt_dlp/extractor/ivi.py @@ -146,7 +146,7 @@ class IviIE(InfoExtractor): expected=True) elif not pycryptodomex_found: raise ExtractorError( - 'pycryptodomex not found. Please install it.', + 'pycryptodomex not found. Please install', expected=True) elif message: extractor_msg += ': ' + message diff --git a/yt_dlp/postprocessor/embedthumbnail.py b/yt_dlp/postprocessor/embedthumbnail.py index 7f759cc30..905fbeb31 100644 --- a/yt_dlp/postprocessor/embedthumbnail.py +++ b/yt_dlp/postprocessor/embedthumbnail.py @@ -135,7 +135,7 @@ class EmbedThumbnailPP(FFmpegPostProcessor): x for x in ['AtomicParsley', 'atomicparsley'] if check_executable(x, ['-v'])), None) if atomicparsley is None: - raise EmbedThumbnailPPError('AtomicParsley was not found. Please install.') + raise EmbedThumbnailPPError('AtomicParsley was not found. Please install') cmd = [encodeFilename(atomicparsley, True), encodeFilename(filename, True), diff --git a/yt_dlp/postprocessor/ffmpeg.py b/yt_dlp/postprocessor/ffmpeg.py index ff06a5c31..ffce98cd5 100644 --- a/yt_dlp/postprocessor/ffmpeg.py +++ b/yt_dlp/postprocessor/ffmpeg.py @@ -61,7 +61,7 @@ class FFmpegPostProcessor(PostProcessor): def check_version(self): if not self.available: - raise FFmpegPostProcessorError('ffmpeg not found. Please install') + raise FFmpegPostProcessorError('ffmpeg not found. Please install or provide the path using --ffmpeg-location') required_version = '10-0' if self.basename == 'avconv' else '1.0' if is_outdated_version( @@ -165,7 +165,7 @@ class FFmpegPostProcessor(PostProcessor): def get_audio_codec(self, path): if not self.probe_available and not self.available: - raise PostProcessingError('ffprobe and ffmpeg not found. Please install') + raise PostProcessingError('ffprobe and ffmpeg not found. Please install or provide the path using --ffmpeg-location') try: if self.probe_available: cmd = [ @@ -207,7 +207,7 @@ class FFmpegPostProcessor(PostProcessor): if self.probe_basename != 'ffprobe': if self.probe_available: self.report_warning('Only ffprobe is supported for metadata extraction') - raise PostProcessingError('ffprobe not found. Please install.') + raise PostProcessingError('ffprobe not found. Please install or provide the path using --ffmpeg-location') self.check_version() cmd = [ @@ -802,7 +802,7 @@ class FFmpegSplitChaptersPP(FFmpegPostProcessor): def run(self, info): chapters = info.get('chapters') or [] if not chapters: - self.report_warning('There are no tracks to extract') + self.report_warning('Chapter information is unavailable') return [], info self.to_screen('Splitting video by chapters; %d chapters found' % len(chapters)) diff --git a/yt_dlp/postprocessor/sponskrub.py b/yt_dlp/postprocessor/sponskrub.py index a55f4150b..51f841ac4 100644 --- a/yt_dlp/postprocessor/sponskrub.py +++ b/yt_dlp/postprocessor/sponskrub.py @@ -32,7 +32,7 @@ class SponSkrubPP(PostProcessor): if path: raise PostProcessingError('sponskrub not found in "%s"' % path) else: - raise PostProcessingError('sponskrub not found. Please install or provide the path using --sponskrub-path.') + raise PostProcessingError('sponskrub not found. Please install or provide the path using --sponskrub-path') def get_exe(self, path=''): if not path or not check_executable(path, ['-h']):