from .common import AudioConversionError, PostProcessor
from ..utils import (
- check_executable,
compat_subprocess_get_DEVNULL,
encodeArgument,
encodeFilename,
try:
out, err = subprocess.Popen(
[executable, '-version'],
- stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
+ stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate()
except OSError:
return False
firstline = out.partition(b'\n')[0].decode('ascii', 'ignore')
class FFmpegPostProcessor(PostProcessor):
- def __init__(self, downloader, deletetempfiles=False):
+ def __init__(self, downloader=None, deletetempfiles=False):
PostProcessor.__init__(self, downloader)
self._versions = self.get_versions()
self._deletetempfiles = deletetempfiles
self._versions[self._executable], REQUIRED_VERSION):
warning = u'Your copy of %s is outdated, update %s to version %s or newer if you encounter any errors.' % (
self._executable, self._executable, REQUIRED_VERSION)
- self._downloader.report_warning(warning)
+ if self._downloader:
+ self._downloader.report_warning(warning)
@staticmethod
def get_versions():
return p
return None
+ @property
+ def _probe_executable(self):
+ if self._downloader.params.get('prefer_ffmpeg', False):
+ prefs = ('ffprobe', 'avprobe')
+ else:
+ prefs = ('avprobe', 'ffprobe')
+ for p in prefs:
+ if self._versions[p]:
+ return p
+ return None
+
def _uses_avconv(self):
return self._executable == 'avconv'
self._nopostoverwrites = nopostoverwrites
def get_audio_codec(self, path):
- if not self._exes['ffprobe'] and not self._exes['avprobe']:
+
+ if not self._probe_executable:
raise PostProcessingError(u'ffprobe or avprobe not found. Please install one.')
try:
cmd = [
- self._exes['avprobe'] or self._exes['ffprobe'],
+ self._probe_executable,
'-show_streams',
encodeFilename(self._ffmpeg_filename_argument(path), True)]
handle = subprocess.Popen(cmd, stderr=compat_subprocess_get_DEVNULL(), stdout=subprocess.PIPE)