diff --git a/README.md b/README.md
index aac359ab9..159329277 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 139bdafc3..0b90660ff 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 ff5d71d3c..78701df8d 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 72ca56057..87d0fec32 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 2bce3b239..dccca1004 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 7d55373e1..67890fc31 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 6208aad8a..ac3e28057 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 4c44f4845..04a0956c9 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.