aboutsummaryrefslogtreecommitdiffstats
path: root/yt_dlp/postprocessor
diff options
context:
space:
mode:
authorpukkandan <pukkandan.ytdlp@gmail.com>2021-03-09 07:47:21 +0530
committerpukkandan <pukkandan.ytdlp@gmail.com>2021-03-14 20:02:55 +0530
commite92caff5d50e60bfd33563d631f0c49ce176dc70 (patch)
treea215d99d7b70983d1b5e20338ddc7b46adddd935 /yt_dlp/postprocessor
parentea3a012d2aa6f71945f934ab8426852c8abdbf35 (diff)
downloadhypervideo-pre-e92caff5d50e60bfd33563d631f0c49ce176dc70.tar.lz
hypervideo-pre-e92caff5d50e60bfd33563d631f0c49ce176dc70.tar.xz
hypervideo-pre-e92caff5d50e60bfd33563d631f0c49ce176dc70.zip
Refactor (See desc)
* Create `FFmpegPostProcessor.real_run_ffmpeg` that can accept multiple input/output files along with switches for each * Rewrite `cli_configuration_args` and related functions * Create `YoutubeDL._ensure_dir_exists` - this was previously defined in multiple places
Diffstat (limited to 'yt_dlp/postprocessor')
-rw-r--r--yt_dlp/postprocessor/common.py12
-rw-r--r--yt_dlp/postprocessor/embedthumbnail.py2
-rw-r--r--yt_dlp/postprocessor/ffmpeg.py27
-rw-r--r--yt_dlp/postprocessor/sponskrub.py2
4 files changed, 31 insertions, 12 deletions
diff --git a/yt_dlp/postprocessor/common.py b/yt_dlp/postprocessor/common.py
index f8f4e7693..3c316b349 100644
--- a/yt_dlp/postprocessor/common.py
+++ b/yt_dlp/postprocessor/common.py
@@ -91,10 +91,18 @@ class PostProcessor(object):
except Exception:
self.report_warning(errnote)
- def _configuration_args(self, *args, **kwargs):
+ def _configuration_args(self, exe, keys=None, default=[], use_compat=True):
+ pp_key = self.pp_key().lower()
+ exe = exe.lower()
+ root_key = exe if pp_key == exe else '%s+%s' % (pp_key, exe)
+ keys = ['%s%s' % (root_key, k) for k in (keys or [''])]
+ if root_key in keys:
+ keys += [root_key] + ([] if pp_key == exe else [(self.pp_key(), exe)]) + ['default']
+ else:
+ use_compat = False
return cli_configuration_args(
self._downloader.params.get('postprocessor_args'),
- self.pp_key().lower(), *args, **kwargs)
+ keys, default, use_compat)
class AudioConversionError(PostProcessingError):
diff --git a/yt_dlp/postprocessor/embedthumbnail.py b/yt_dlp/postprocessor/embedthumbnail.py
index cc6cd1c8e..3c68e0298 100644
--- a/yt_dlp/postprocessor/embedthumbnail.py
+++ b/yt_dlp/postprocessor/embedthumbnail.py
@@ -139,7 +139,7 @@ class EmbedThumbnailPP(FFmpegPostProcessor):
encodeFilename(thumbnail_filename, True),
encodeArgument('-o'),
encodeFilename(temp_filename, True)]
- cmd += [encodeArgument(o) for o in self._configuration_args(exe='AtomicParsley')]
+ cmd += [encodeArgument(o) for o in self._configuration_args('AtomicParsley')]
self.to_screen('Adding thumbnail to "%s"' % filename)
self.write_debug('AtomicParsley command line: %s' % shell_quote(cmd))
diff --git a/yt_dlp/postprocessor/ffmpeg.py b/yt_dlp/postprocessor/ffmpeg.py
index 944a4bc17..a8635c1d1 100644
--- a/yt_dlp/postprocessor/ffmpeg.py
+++ b/yt_dlp/postprocessor/ffmpeg.py
@@ -234,25 +234,35 @@ class FFmpegPostProcessor(PostProcessor):
return num, len(streams)
def run_ffmpeg_multiple_files(self, input_paths, out_path, opts):
+ return self.real_run_ffmpeg(
+ [(path, []) for path in input_paths],
+ [(out_path, opts)])
+
+ def real_run_ffmpeg(self, input_path_opts, output_path_opts):
self.check_version()
oldest_mtime = min(
- os.stat(encodeFilename(path)).st_mtime for path in input_paths)
+ os.stat(encodeFilename(path)).st_mtime for path, _ in input_path_opts)
cmd = [encodeFilename(self.executable, True), encodeArgument('-y')]
# avconv does not have repeat option
if self.basename == 'ffmpeg':
cmd += [encodeArgument('-loglevel'), encodeArgument('repeat+info')]
- def make_args(file, pre=[], post=[], *args, **kwargs):
- args = pre + self._configuration_args(*args, **kwargs) + post
+ def make_args(file, args, name, number):
+ keys = ['_%s%d' % (name, number), '_%s' % name]
+ if name == 'o' and number == 1:
+ keys.append('')
+ args += self._configuration_args(self.basename, keys)
+ if name == 'i':
+ args.append('-i')
return (
- [encodeArgument(o) for o in args]
+ [encodeArgument(arg) for arg in args]
+ [encodeFilename(self._ffmpeg_filename_argument(file), True)])
- for i, path in enumerate(input_paths):
- cmd += make_args(path, post=['-i'], exe='%s_i%d' % (self.basename, i + 1), use_default_arg=False)
- cmd += make_args(out_path, pre=opts, exe=self.basename)
+ for arg_type, path_opts in (('i', input_path_opts), ('o', output_path_opts)):
+ cmd += [arg for i, o in enumerate(path_opts)
+ for arg in make_args(o[0], o[1], arg_type, i + 1)]
self.write_debug('ffmpeg command line: %s' % shell_quote(cmd))
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
@@ -262,7 +272,8 @@ class FFmpegPostProcessor(PostProcessor):
if self.get_param('verbose', False):
self.report_error(stderr)
raise FFmpegPostProcessorError(stderr.split('\n')[-1])
- self.try_utime(out_path, oldest_mtime, oldest_mtime)
+ for out_path, _ in output_path_opts:
+ self.try_utime(out_path, oldest_mtime, oldest_mtime)
return stderr.decode('utf-8', 'replace')
def run_ffmpeg(self, path, out_path, opts):
diff --git a/yt_dlp/postprocessor/sponskrub.py b/yt_dlp/postprocessor/sponskrub.py
index 2f30acc8e..4ba33398e 100644
--- a/yt_dlp/postprocessor/sponskrub.py
+++ b/yt_dlp/postprocessor/sponskrub.py
@@ -71,7 +71,7 @@ class SponSkrubPP(PostProcessor):
if not self.cutout:
cmd += ['-chapter']
cmd += compat_shlex_split(self.args) # For backward compatibility
- cmd += self._configuration_args(exe=self._exe_name, use_default_arg='no_compat')
+ cmd += self._configuration_args(self._exe_name, use_compat=False)
cmd += ['--', information['id'], filename, temp_filename]
cmd = [encodeArgument(i) for i in cmd]