diff --git a/README.md b/README.md
index aac359ab96..1593292774 100644
--- a/README.md
+++ b/README.md
@@ -1204,6 +1204,10 @@ # OUTPUT TEMPLATE
Additionally, you can set different output templates for the various metadata files separately from the general output template by specifying the type of file followed by the template separated by a colon `:`. The different file types supported are `subtitle`, `thumbnail`, `description`, `annotation` (deprecated), `infojson`, `link`, `pl_thumbnail`, `pl_description`, `pl_infojson`, `chapter`, `pl_video`. E.g. `-o "%(title)s.%(ext)s" -o "thumbnail:%(title)s\%(title)s.%(ext)s"` will put the thumbnails in a folder with the same name as the video. If any of the templates is empty, that type of file will not be written. E.g. `--write-thumbnail -o "thumbnail:"` will write thumbnails only for playlists and not for video.
+
+
+Note: Due to post-processing (i.e. merging etc.), the actual output filename might differ. Use `--print after_move:filepath` to get the name after all post-processing is complete.
+
The available fields are:
- `id` (string): Video identifier
@@ -1304,7 +1308,7 @@ # OUTPUT TEMPLATE
Available only when used in `--print`:
- `urls` (string): The URLs of all requested formats, one in each line
- - `filename` (string): Name of the video file. Note that the actual filename may be different due to post-processing. Use `--exec echo` to get the name after all postprocessing is complete
+ - `filename` (string): Name of the video file. Note that the [actual filename may differ](#outtmpl-postprocess-note)
- `formats_table` (table): The video format table as printed by `--list-formats`
- `thumbnails_table` (table): The thumbnail format table as printed by `--list-thumbnails`
- `subtitles_table` (table): The subtitle format table as printed by `--list-subs`
diff --git a/test/helper.py b/test/helper.py
index 139bdafc3b..0b90660ff6 100644
--- a/test/helper.py
+++ b/test/helper.py
@@ -254,14 +254,11 @@ def _repr(v):
return v.__name__
else:
return repr(v)
- info_dict_str = ''
- if len(missing_keys) != len(expected_dict):
- info_dict_str += ''.join(
- f' {_repr(k)}: {_repr(v)},\n'
- for k, v in test_info_dict.items() if k not in missing_keys)
-
- if info_dict_str:
- info_dict_str += '\n'
+ info_dict_str = ''.join(
+ f' {_repr(k)}: {_repr(v)},\n'
+ for k, v in test_info_dict.items() if k not in missing_keys)
+ if info_dict_str:
+ info_dict_str += '\n'
info_dict_str += ''.join(
f' {_repr(k)}: {_repr(test_info_dict[k])},\n'
for k in missing_keys)
diff --git a/yt_dlp/__main__.py b/yt_dlp/__main__.py
index ff5d71d3c9..78701df8d3 100644
--- a/yt_dlp/__main__.py
+++ b/yt_dlp/__main__.py
@@ -5,7 +5,7 @@
import sys
-if __package__ is None and not hasattr(sys, 'frozen'):
+if __package__ is None and not getattr(sys, 'frozen', False):
# direct call of __main__.py
import os.path
path = os.path.realpath(os.path.abspath(__file__))
diff --git a/yt_dlp/extractor/slideslive.py b/yt_dlp/extractor/slideslive.py
index 72ca560579..87d0fec320 100644
--- a/yt_dlp/extractor/slideslive.py
+++ b/yt_dlp/extractor/slideslive.py
@@ -9,6 +9,7 @@
class SlidesLiveIE(InfoExtractor):
_VALID_URL = r'https?://slideslive\.com/(?P[0-9]+)'
+ _WORKING = False
_TESTS = [{
# video_service_name = YOUTUBE
'url': 'https://slideslive.com/38902413/gcc-ia16-backend',
diff --git a/yt_dlp/extractor/testurl.py b/yt_dlp/extractor/testurl.py
index 2bce3b239a..dccca10046 100644
--- a/yt_dlp/extractor/testurl.py
+++ b/yt_dlp/extractor/testurl.py
@@ -21,7 +21,7 @@ def _real_extract(self, url):
matching_extractors = [e for e in gen_extractor_classes() if rex.search(e.IE_NAME)]
if len(matching_extractors) == 0:
- raise ExtractorError('No extractors matching {extractor_id!r} found', expected=True)
+ raise ExtractorError(f'No extractors matching {extractor_id!r} found', expected=True)
elif len(matching_extractors) > 1:
try: # Check for exact match
extractor = next(
diff --git a/yt_dlp/postprocessor/ffmpeg.py b/yt_dlp/postprocessor/ffmpeg.py
index 7d55373e18..67890fc310 100644
--- a/yt_dlp/postprocessor/ffmpeg.py
+++ b/yt_dlp/postprocessor/ffmpeg.py
@@ -137,7 +137,7 @@ def _get_ffmpeg_version(self, prog):
path = self._paths.get(prog)
if path in self._version_cache:
return self._version_cache[path], self._features_cache.get(path, {})
- out = _get_exe_version_output(path, ['-bsfs'], to_screen=self.write_debug)
+ out = _get_exe_version_output(path, ['-bsfs'])
ver = detect_exe_version(out) if out else False
if ver:
regexs = [
diff --git a/yt_dlp/update.py b/yt_dlp/update.py
index 6208aad8ad..ac3e28057d 100644
--- a/yt_dlp/update.py
+++ b/yt_dlp/update.py
@@ -30,13 +30,13 @@
@functools.cache
def _get_variant_and_executable_path():
"""@returns (variant, executable_path)"""
- if hasattr(sys, 'frozen'):
+ if getattr(sys, 'frozen', False):
path = sys.executable
if not hasattr(sys, '_MEIPASS'):
return 'py2exe', path
- if sys._MEIPASS == os.path.dirname(path):
+ elif sys._MEIPASS == os.path.dirname(path):
return f'{sys.platform}_dir', path
- if sys.platform == 'darwin':
+ elif sys.platform == 'darwin':
machine = '_legacy' if version_tuple(platform.mac_ver()[0]) < (10, 15) else ''
else:
machine = f'_{platform.machine().lower()}'
@@ -288,7 +288,7 @@ def cmd(self):
# There is no sys.orig_argv in py < 3.10. Also, it can be [] when frozen
if getattr(sys, 'orig_argv', None):
return sys.orig_argv
- elif hasattr(sys, 'frozen'):
+ elif getattr(sys, 'frozen', False):
return sys.argv
def restart(self):
diff --git a/yt_dlp/utils.py b/yt_dlp/utils.py
index 4c44f48450..04a0956c94 100644
--- a/yt_dlp/utils.py
+++ b/yt_dlp/utils.py
@@ -2698,9 +2698,7 @@ def check_executable(exe, args=[]):
return exe
-def _get_exe_version_output(exe, args, *, to_screen=None):
- if to_screen:
- to_screen(f'Checking exe version: {shell_quote([exe] + args)}')
+def _get_exe_version_output(exe, args):
try:
# STDIN should be redirected too. On UNIX-like systems, ffmpeg triggers
# SIGTTOU if yt-dlp is run in the background.