|
@@ -1,4 +1,5 @@
|
|
|
import os
|
|
|
+import re
|
|
|
import subprocess
|
|
|
import sys
|
|
|
import time
|
|
@@ -18,6 +19,23 @@ from ..utils import (
|
|
|
)
|
|
|
|
|
|
|
|
|
+def get_version(executable):
|
|
|
+ """ Returns the version of the specified executable,
|
|
|
+ or False if the executable is not present """
|
|
|
+ try:
|
|
|
+ out, err = subprocess.Popen(
|
|
|
+ [executable, '-version'],
|
|
|
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
|
|
|
+ except OSError:
|
|
|
+ return False
|
|
|
+ firstline = out.partition(b'\n')[0].decode('ascii', 'ignore')
|
|
|
+ m = re.search(r'version\s+([0-9._-a-zA-Z]+)', firstline)
|
|
|
+ if not m:
|
|
|
+ return u'present'
|
|
|
+ else:
|
|
|
+ return m.group(1)
|
|
|
+
|
|
|
+
|
|
|
class FFmpegPostProcessorError(PostProcessingError):
|
|
|
pass
|
|
|
|
|
@@ -25,22 +43,26 @@ class FFmpegPostProcessorError(PostProcessingError):
|
|
|
class FFmpegPostProcessor(PostProcessor):
|
|
|
def __init__(self, downloader=None, deletetempfiles=False):
|
|
|
PostProcessor.__init__(self, downloader)
|
|
|
- self._exes = self.detect_executables()
|
|
|
+ self._versions = self.get_versions()
|
|
|
self._deletetempfiles = deletetempfiles
|
|
|
|
|
|
@staticmethod
|
|
|
- def detect_executables():
|
|
|
+ def get_versions():
|
|
|
programs = ['avprobe', 'avconv', 'ffmpeg', 'ffprobe']
|
|
|
- return dict((program, check_executable(program, ['-version'])) for program in programs)
|
|
|
+ return dict((program, get_version(program)) for program in programs)
|
|
|
|
|
|
def _get_executable(self):
|
|
|
if self._downloader.params.get('prefer_ffmpeg', False):
|
|
|
- return self._exes['ffmpeg'] or self._exes['avconv']
|
|
|
+ prefs = ('ffmpeg', 'avconv')
|
|
|
else:
|
|
|
- return self._exes['avconv'] or self._exes['ffmpeg']
|
|
|
+ prefs = ('avconv', 'ffmpeg')
|
|
|
+ for p in prefs:
|
|
|
+ if self._versions[p]:
|
|
|
+ return p
|
|
|
+ return None
|
|
|
|
|
|
def _uses_avconv(self):
|
|
|
- return self._get_executable() == self._exes['avconv']
|
|
|
+ return self._get_executable() == 'avconv'
|
|
|
|
|
|
def run_ffmpeg_multiple_files(self, input_paths, out_path, opts):
|
|
|
if not self._get_executable():
|