[YoutubeDL] Output avconv/ffmpeg versions if -v is given

This commit is contained in:
Philipp Hagemeister 2014-10-26 16:31:52 +01:00
parent a7e97f6db1
commit d28b517154
3 changed files with 48 additions and 14 deletions

View file

@ -62,7 +62,7 @@ from .utils import (
from .cache import Cache from .cache import Cache
from .extractor import get_info_extractor, gen_extractors from .extractor import get_info_extractor, gen_extractors
from .downloader import get_suitable_downloader from .downloader import get_suitable_downloader
from .postprocessor import FFmpegMergerPP from .postprocessor import FFmpegMergerPP, FFmpegPostProcessor
from .version import __version__ from .version import __version__
@ -1311,8 +1311,18 @@ class YoutubeDL(object):
sys.exc_clear() sys.exc_clear()
except: except:
pass pass
self._write_string('[debug] Python version %s - %s' % self._write_string('[debug] Python version %s - %s\n' % (
(platform.python_version(), platform_name()) + '\n') platform.python_version(), platform_name()))
exe_versions = FFmpegPostProcessor.get_versions()
exe_str = ', '.join(
'%s %s' % (exe, v)
for exe, v in sorted(exe_versions.items())
if v
)
if not exe_str:
exe_str = 'none'
self._write_string('[debug] exe versions: %s\n' % exe_str)
proxy_map = {} proxy_map = {}
for handler in self._opener.handlers: for handler in self._opener.handlers:

View file

@ -1,24 +1,26 @@
from .atomicparsley import AtomicParsleyPP from .atomicparsley import AtomicParsleyPP
from .ffmpeg import ( from .ffmpeg import (
FFmpegPostProcessor,
FFmpegAudioFixPP, FFmpegAudioFixPP,
FFmpegEmbedSubtitlePP,
FFmpegExtractAudioPP,
FFmpegMergerPP, FFmpegMergerPP,
FFmpegMetadataPP, FFmpegMetadataPP,
FFmpegVideoConvertor, FFmpegVideoConvertor,
FFmpegExtractAudioPP,
FFmpegEmbedSubtitlePP,
) )
from .xattrpp import XAttrMetadataPP from .xattrpp import XAttrMetadataPP
from .execafterdownload import ExecAfterDownloadPP from .execafterdownload import ExecAfterDownloadPP
__all__ = [ __all__ = [
'AtomicParsleyPP', 'AtomicParsleyPP',
'ExecAfterDownloadPP',
'FFmpegAudioFixPP', 'FFmpegAudioFixPP',
'FFmpegEmbedSubtitlePP',
'FFmpegExtractAudioPP',
'FFmpegMergerPP', 'FFmpegMergerPP',
'FFmpegMetadataPP', 'FFmpegMetadataPP',
'FFmpegPostProcessor',
'FFmpegVideoConvertor', 'FFmpegVideoConvertor',
'FFmpegExtractAudioPP',
'FFmpegEmbedSubtitlePP',
'XAttrMetadataPP', 'XAttrMetadataPP',
'ExecAfterDownloadPP',
] ]

View file

@ -1,4 +1,5 @@
import os import os
import re
import subprocess import subprocess
import sys import sys
import time 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): class FFmpegPostProcessorError(PostProcessingError):
pass pass
@ -25,22 +43,26 @@ class FFmpegPostProcessorError(PostProcessingError):
class FFmpegPostProcessor(PostProcessor): class FFmpegPostProcessor(PostProcessor):
def __init__(self, downloader=None, deletetempfiles=False): def __init__(self, downloader=None, deletetempfiles=False):
PostProcessor.__init__(self, downloader) PostProcessor.__init__(self, downloader)
self._exes = self.detect_executables() self._versions = self.get_versions()
self._deletetempfiles = deletetempfiles self._deletetempfiles = deletetempfiles
@staticmethod @staticmethod
def detect_executables(): def get_versions():
programs = ['avprobe', 'avconv', 'ffmpeg', 'ffprobe'] 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): def _get_executable(self):
if self._downloader.params.get('prefer_ffmpeg', False): if self._downloader.params.get('prefer_ffmpeg', False):
return self._exes['ffmpeg'] or self._exes['avconv'] prefs = ('ffmpeg', 'avconv')
else: 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): 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): def run_ffmpeg_multiple_files(self, input_paths, out_path, opts):
if not self._get_executable(): if not self._get_executable():