From c6ce81546105d81d5c3fd0e46fa301f8cc372e11 Mon Sep 17 00:00:00 2001 From: pukkandan Date: Fri, 16 Apr 2021 00:14:33 +0530 Subject: [PATCH] [Exec] Ensure backward compatibility when the command contains `%` --- yt_dlp/postprocessor/execafterdownload.py | 24 +++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/yt_dlp/postprocessor/execafterdownload.py b/yt_dlp/postprocessor/execafterdownload.py index 95159cbc2..4a0649680 100644 --- a/yt_dlp/postprocessor/execafterdownload.py +++ b/yt_dlp/postprocessor/execafterdownload.py @@ -1,11 +1,13 @@ from __future__ import unicode_literals +import re import subprocess from .common import PostProcessor from ..compat import compat_shlex_quote from ..utils import ( encodeArgument, + FORMAT_RE, PostProcessingError, ) @@ -20,18 +22,20 @@ class ExecAfterDownloadPP(PostProcessor): def pp_key(cls): return 'Exec' - def run(self, info): - tmpl, info_copy = self._downloader.prepare_outtmpl(self.exec_cmd, info) - cmd = tmpl % info_copy - if cmd == self.exec_cmd: # No replacements were made - if '{}' not in self.exec_cmd: - self.exec_cmd += ' {}' - cmd = self.exec_cmd.replace('{}', compat_shlex_quote(info['filepath'])) + def parse_cmd(self, cmd, info): + # If no %(key)s is found, replace {} for backard compatibility + if not re.search(FORMAT_RE.format(r'[-\w>.+]+'), cmd): + if '{}' not in cmd: + cmd += ' {}' + return cmd.replace('{}', compat_shlex_quote(info['filepath'])) + tmpl, info_copy = self._downloader.prepare_outtmpl(cmd, info) + return tmpl % info_copy + + def run(self, info): + cmd = self.parse_cmd(self.exec_cmd, info) self.to_screen('Executing command: %s' % cmd) retCode = subprocess.call(encodeArgument(cmd), shell=True) if retCode != 0: - raise PostProcessingError( - 'Command returned error code %d' % retCode) - + raise PostProcessingError('Command returned error code %d' % retCode) return [], info