]> jfr.im git - yt-dlp.git/commitdiff
[Exec] Ensure backward compatibility when the command contains `%`
authorpukkandan <redacted>
Thu, 15 Apr 2021 18:44:33 +0000 (00:14 +0530)
committerpukkandan <redacted>
Thu, 15 Apr 2021 23:49:44 +0000 (05:19 +0530)
yt_dlp/postprocessor/execafterdownload.py

index 95159cbc2793fc8f9d044293ac31f56ea935bed2..4a0649680caf310d741d016891ad65ae1b7f7e2e 100644 (file)
@@ -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 @@ def __init__(self, downloader, exec_cmd):
     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