mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-11-04 08:35:12 +00:00 
			
		
		
		
	[Exec] Ensure backward compatibility when the command contains %
				
					
				
			This commit is contained in:
		@@ -1,11 +1,13 @@
 | 
				
			|||||||
from __future__ import unicode_literals
 | 
					from __future__ import unicode_literals
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import re
 | 
				
			||||||
import subprocess
 | 
					import subprocess
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from .common import PostProcessor
 | 
					from .common import PostProcessor
 | 
				
			||||||
from ..compat import compat_shlex_quote
 | 
					from ..compat import compat_shlex_quote
 | 
				
			||||||
from ..utils import (
 | 
					from ..utils import (
 | 
				
			||||||
    encodeArgument,
 | 
					    encodeArgument,
 | 
				
			||||||
 | 
					    FORMAT_RE,
 | 
				
			||||||
    PostProcessingError,
 | 
					    PostProcessingError,
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -20,18 +22,20 @@ class ExecAfterDownloadPP(PostProcessor):
 | 
				
			|||||||
    def pp_key(cls):
 | 
					    def pp_key(cls):
 | 
				
			||||||
        return 'Exec'
 | 
					        return 'Exec'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def run(self, info):
 | 
					    def parse_cmd(self, cmd, info):
 | 
				
			||||||
        tmpl, info_copy = self._downloader.prepare_outtmpl(self.exec_cmd, info)
 | 
					        # If no %(key)s is found, replace {} for backard compatibility
 | 
				
			||||||
        cmd = tmpl % info_copy
 | 
					        if not re.search(FORMAT_RE.format(r'[-\w>.+]+'), cmd):
 | 
				
			||||||
        if cmd == self.exec_cmd:  # No replacements were made
 | 
					            if '{}' not in cmd:
 | 
				
			||||||
            if '{}' not in self.exec_cmd:
 | 
					                cmd += ' {}'
 | 
				
			||||||
                self.exec_cmd += ' {}'
 | 
					            return cmd.replace('{}', compat_shlex_quote(info['filepath']))
 | 
				
			||||||
            cmd = self.exec_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)
 | 
					        self.to_screen('Executing command: %s' % cmd)
 | 
				
			||||||
        retCode = subprocess.call(encodeArgument(cmd), shell=True)
 | 
					        retCode = subprocess.call(encodeArgument(cmd), shell=True)
 | 
				
			||||||
        if retCode != 0:
 | 
					        if retCode != 0:
 | 
				
			||||||
            raise PostProcessingError(
 | 
					            raise PostProcessingError('Command returned error code %d' % retCode)
 | 
				
			||||||
                'Command returned error code %d' % retCode)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return [], info
 | 
					        return [], info
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user