Bläddra i källkod

[ffmpeg] Correctly encode paths on Windows

On Python 2.x on Windows, if there are any unicode arguments in the command argument list, the whole list is converted to unicode internally.
Therefore, we need to call encodeArgument on every argument.

Fixes #4337 and #4668.
Philipp Hagemeister 10 år sedan
förälder
incheckning
b0e87c3110
1 ändrade filer med 5 tillägg och 4 borttagningar
  1. 5 4
      youtube_dl/postprocessor/ffmpeg.py

+ 5 - 4
youtube_dl/postprocessor/ffmpeg.py

@@ -80,8 +80,9 @@ class FFmpegPostProcessor(PostProcessor):
 
 
         files_cmd = []
         files_cmd = []
         for path in input_paths:
         for path in input_paths:
-            files_cmd.extend(['-i', encodeFilename(path, True)])
-        cmd = ([self._executable, '-y'] + files_cmd
+            files_cmd.extend([encodeArgument('-i'), encodeFilename(path, True)])
+        cmd = ([encodeFilename(self._executable, True), encodeArgument('-y')] +
+               files_cmd
                + [encodeArgument(o) for o in opts] +
                + [encodeArgument(o) for o in opts] +
                [encodeFilename(self._ffmpeg_filename_argument(out_path), True)])
                [encodeFilename(self._ffmpeg_filename_argument(out_path), True)])
 
 
@@ -122,8 +123,8 @@ class FFmpegExtractAudioPP(FFmpegPostProcessor):
             raise PostProcessingError('ffprobe or avprobe not found. Please install one.')
             raise PostProcessingError('ffprobe or avprobe not found. Please install one.')
         try:
         try:
             cmd = [
             cmd = [
-                self._probe_executable,
-                '-show_streams',
+                encodeFilename(self._probe_executable, True),
+                encodeArgument('-show_streams'),
                 encodeFilename(self._ffmpeg_filename_argument(path), True)]
                 encodeFilename(self._ffmpeg_filename_argument(path), True)]
             handle = subprocess.Popen(cmd, stderr=compat_subprocess_get_DEVNULL(), stdout=subprocess.PIPE)
             handle = subprocess.Popen(cmd, stderr=compat_subprocess_get_DEVNULL(), stdout=subprocess.PIPE)
             output = handle.communicate()[0]
             output = handle.communicate()[0]