aboutsummaryrefslogtreecommitdiffstats
path: root/yt_dlp/postprocessor/ffmpeg.py
diff options
context:
space:
mode:
authorJesús <heckyel@hyperbola.info>2022-03-30 01:24:15 +0800
committerJesús <heckyel@hyperbola.info>2022-03-30 01:24:15 +0800
commit950cc067b8c41ac246deb4725177a372c95d8341 (patch)
tree66d5284ff86faec8c3000be1e7d0bd856b4c4dbe /yt_dlp/postprocessor/ffmpeg.py
parent7a74bc5d1e54299e51b73492e09c70da994f4b35 (diff)
parente7870111e83033e0ac728d5a2d565d1eb146c335 (diff)
downloadhypervideo-pre-950cc067b8c41ac246deb4725177a372c95d8341.tar.lz
hypervideo-pre-950cc067b8c41ac246deb4725177a372c95d8341.tar.xz
hypervideo-pre-950cc067b8c41ac246deb4725177a372c95d8341.zip
updated from upstream | 30/03/2022 at 01:24
Diffstat (limited to 'yt_dlp/postprocessor/ffmpeg.py')
-rw-r--r--yt_dlp/postprocessor/ffmpeg.py46
1 files changed, 21 insertions, 25 deletions
diff --git a/yt_dlp/postprocessor/ffmpeg.py b/yt_dlp/postprocessor/ffmpeg.py
index 234ddeff0..0b18e8774 100644
--- a/yt_dlp/postprocessor/ffmpeg.py
+++ b/yt_dlp/postprocessor/ffmpeg.py
@@ -86,13 +86,18 @@ class FFmpegPostProcessor(PostProcessor):
@staticmethod
def get_versions(downloader=None):
- return FFmpegPostProcessor.get_version_and_features(downloader)[0]
+ return FFmpegPostProcessor.get_versions_and_features(downloader)[0]
+
+ _version_cache, _features_cache = {}, {}
def _determine_executables(self):
programs = ['avprobe', 'avconv', 'ffmpeg', 'ffprobe']
def get_ffmpeg_version(path, prog):
- out = _get_exe_version_output(path, ['-bsfs'])
+ if path in self._version_cache:
+ self._versions[path], self._features = self._version_cache[path], self._features_cache.get(path, {})
+ return
+ out = _get_exe_version_output(path, ['-bsfs'], to_screen=self.write_debug)
ver = detect_exe_version(out) if out else False
if ver:
regexs = [
@@ -104,13 +109,13 @@ class FFmpegPostProcessor(PostProcessor):
mobj = re.match(regex, ver)
if mobj:
ver = mobj.group(1)
- self._versions[prog] = ver
+ self._versions[prog] = self._version_cache[path] = ver
if prog != 'ffmpeg' or not out:
return
mobj = re.search(r'(?m)^\s+libavformat\s+(?:[0-9. ]+)\s+/\s+(?P<runtime>[0-9. ]+)', out)
lavf_runtime_version = mobj.group('runtime').replace(' ', '') if mobj else None
- self._features = {
+ self._features = self._features_cache[path] = {
'fdk': '--enable-libfdk-aac' in out,
'setts': 'setts' in out.splitlines(),
'needs_adtstoasc': is_outdated_version(lavf_runtime_version, '57.56.100', False),
@@ -148,26 +153,15 @@ class FFmpegPostProcessor(PostProcessor):
self._paths[basename] = location
self._versions = {}
- for p in programs:
- get_ffmpeg_version(self._paths[p], p)
-
+ executables = {'basename': ('ffmpeg', 'avconv'), 'probe_basename': ('ffprobe', 'avprobe')}
if prefer_ffmpeg is False:
- prefs = ('avconv', 'ffmpeg')
- else:
- prefs = ('ffmpeg', 'avconv')
- for p in prefs:
- if self._versions[p]:
- self.basename = p
- break
-
- if prefer_ffmpeg is False:
- prefs = ('avprobe', 'ffprobe')
- else:
- prefs = ('ffprobe', 'avprobe')
- for p in prefs:
- if self._versions[p]:
- self.probe_basename = p
- break
+ executables = {k: v[::-1] for k, v in executables.items()}
+ for var, prefs in executables.items():
+ for p in prefs:
+ get_ffmpeg_version(self._paths[p], p)
+ if self._versions[p]:
+ setattr(self, var, p)
+ break
if self.basename == 'avconv':
self.deprecation_warning(
@@ -553,9 +547,9 @@ class FFmpegVideoConvertorPP(FFmpegPostProcessor):
@staticmethod
def _options(target_ext):
+ yield from FFmpegPostProcessor.stream_copy_opts(False)
if target_ext == 'avi':
- return ['-c:v', 'libxvid', '-vtag', 'XVID']
- return []
+ yield from ('-c:v', 'libxvid', '-vtag', 'XVID')
@PostProcessor._restrict_to(images=False)
def run(self, info):
@@ -1129,6 +1123,8 @@ class FFmpegConcatPP(FFmpegPostProcessor):
super().__init__(downloader)
def concat_files(self, in_files, out_file):
+ if not self._downloader._ensure_dir_exists(out_file):
+ return
if len(in_files) == 1:
if os.path.realpath(in_files[0]) != os.path.realpath(out_file):
self.to_screen(f'Moving "{in_files[0]}" to "{out_file}"')