Merge pull request #680 from pypeclub/hotfix/ffmpeg_executable_with_spaces

Fix ffmpeg executable path with spaces
This commit is contained in:
Milan Kolar 2020-11-03 12:51:24 +01:00 committed by GitHub
commit 0cf0b8f4a2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 41 additions and 27 deletions

View file

@ -1391,13 +1391,15 @@ class BuildWorkfile:
return output return output
def ffprobe_streams(path_to_file): def ffprobe_streams(path_to_file, logger=None):
"""Load streams from entered filepath via ffprobe.""" """Load streams from entered filepath via ffprobe."""
log.info( if not logger:
logger = log
logger.info(
"Getting information about input \"{}\".".format(path_to_file) "Getting information about input \"{}\".".format(path_to_file)
) )
args = [ args = [
get_ffmpeg_tool_path("ffprobe"), "\"{}\"".format(get_ffmpeg_tool_path("ffprobe")),
"-v quiet", "-v quiet",
"-print_format json", "-print_format json",
"-show_format", "-show_format",
@ -1405,12 +1407,21 @@ def ffprobe_streams(path_to_file):
"\"{}\"".format(path_to_file) "\"{}\"".format(path_to_file)
] ]
command = " ".join(args) command = " ".join(args)
log.debug("FFprobe command: \"{}\"".format(command)) logger.debug("FFprobe command: \"{}\"".format(command))
popen = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) popen = subprocess.Popen(
command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
popen_output = popen.communicate()[0] popen_stdout, popen_stderr = popen.communicate()
log.debug("FFprobe output: {}".format(popen_output)) if popen_stdout:
return json.loads(popen_output)["streams"] logger.debug("ffprobe stdout: {}".format(popen_stdout))
if popen_stderr:
logger.debug("ffprobe stderr: {}".format(popen_stderr))
return json.loads(popen_stdout)["streams"]
def source_hash(filepath, *args): def source_hash(filepath, *args):

View file

@ -72,7 +72,7 @@ class ExtractJpegEXR(pyblish.api.InstancePlugin):
ffmpeg_args = self.ffmpeg_args or {} ffmpeg_args = self.ffmpeg_args or {}
jpeg_items = [] jpeg_items = []
jpeg_items.append(ffmpeg_path) jpeg_items.append("\"{}\"".format(ffmpeg_path))
# override file if already exists # override file if already exists
jpeg_items.append("-y") jpeg_items.append("-y")
# use same input args like with mov # use same input args like with mov

View file

@ -449,7 +449,7 @@ class ExtractReview(pyblish.api.InstancePlugin):
audio_filters.append(arg) audio_filters.append(arg)
all_args = [] all_args = []
all_args.append(self.ffmpeg_path) all_args.append("\"{}\"".format(self.ffmpeg_path))
all_args.extend(input_args) all_args.extend(input_args)
if video_filters: if video_filters:
all_args.append("-filter:v {}".format(",".join(video_filters))) all_args.append("-filter:v {}".format(",".join(video_filters)))
@ -633,7 +633,9 @@ class ExtractReview(pyblish.api.InstancePlugin):
# NOTE Skipped using instance's resolution # NOTE Skipped using instance's resolution
full_input_path_single_file = temp_data["full_input_path_single_file"] full_input_path_single_file = temp_data["full_input_path_single_file"]
input_data = pype.lib.ffprobe_streams(full_input_path_single_file)[0] input_data = pype.lib.ffprobe_streams(
full_input_path_single_file, self.log
)[0]
input_width = int(input_data["width"]) input_width = int(input_data["width"])
input_height = int(input_data["height"]) input_height = int(input_data["height"])
@ -1526,7 +1528,7 @@ class ExtractReview(pyblish.api.InstancePlugin):
os.mkdir(stg_dir) os.mkdir(stg_dir)
mov_args = [ mov_args = [
ffmpeg_path, "\"{}\"".format(ffmpeg_path),
" ".join(input_args), " ".join(input_args),
" ".join(output_args) " ".join(output_args)
] ]

View file

@ -26,7 +26,7 @@ class ExtractReviewSlate(pype.api.Extractor):
slate_path = inst_data.get("slateFrame") slate_path = inst_data.get("slateFrame")
ffmpeg_path = pype.lib.get_ffmpeg_tool_path("ffmpeg") ffmpeg_path = pype.lib.get_ffmpeg_tool_path("ffmpeg")
slate_stream = pype.lib.ffprobe_streams(slate_path)[0] slate_stream = pype.lib.ffprobe_streams(slate_path, self.log)[0]
slate_width = slate_stream["width"] slate_width = slate_stream["width"]
slate_height = slate_stream["height"] slate_height = slate_stream["height"]
@ -178,7 +178,7 @@ class ExtractReviewSlate(pype.api.Extractor):
_remove_at_end.append(slate_v_path) _remove_at_end.append(slate_v_path)
slate_args = [ slate_args = [
ffmpeg_path, "\"{}\"".format(ffmpeg_path),
" ".join(input_args), " ".join(input_args),
" ".join(output_args) " ".join(output_args)
] ]
@ -299,7 +299,7 @@ class ExtractReviewSlate(pype.api.Extractor):
try: try:
# Get information about input file via ffprobe tool # Get information about input file via ffprobe tool
streams = pype.lib.ffprobe_streams(full_input_path) streams = pype.lib.ffprobe_streams(full_input_path, self.log)
except Exception: except Exception:
self.log.warning( self.log.warning(
"Could not get codec data from input.", "Could not get codec data from input.",

View file

@ -29,6 +29,6 @@ class ValidateFFmpegInstalled(pyblish.api.ContextPlugin):
def process(self, context): def process(self, context):
ffmpeg_path = pype.lib.get_ffmpeg_tool_path("ffmpeg") ffmpeg_path = pype.lib.get_ffmpeg_tool_path("ffmpeg")
self.log.info("ffmpeg path: `{}`".format(ffmpeg_path)) self.log.info("ffmpeg path: `{}`".format(ffmpeg_path))
if self.is_tool(ffmpeg_path) is False: if self.is_tool("\"{}\"".format(ffmpeg_path)) is False:
self.log.error("ffmpeg not found in PATH") self.log.error("ffmpeg not found in PATH")
raise RuntimeError('ffmpeg not installed.') raise RuntimeError('ffmpeg not installed.')

View file

@ -90,7 +90,7 @@ class ExtractRender(pyblish.api.InstancePlugin):
thumbnail_path = os.path.join(path, "thumbnail.png") thumbnail_path = os.path.join(path, "thumbnail.png")
ffmpeg_path = pype.lib.get_ffmpeg_tool_path("ffmpeg") ffmpeg_path = pype.lib.get_ffmpeg_tool_path("ffmpeg")
args = [ args = [
ffmpeg_path, "-y", "\"{}\"".format(ffmpeg_path), "-y",
"-i", os.path.join(path, list(collections[0])[0]), "-i", os.path.join(path, list(collections[0])[0]),
"-vf", "scale=300:-1", "-vf", "scale=300:-1",
"-vframes", "1", "-vframes", "1",

View file

@ -130,8 +130,8 @@ class ExtractReviewCutUp(pype.api.Extractor):
# check if audio stream is in input video file # check if audio stream is in input video file
ffprob_cmd = ( ffprob_cmd = (
"{ffprobe_path} -i \"{full_input_path}\" -show_streams " "\"{ffprobe_path}\" -i \"{full_input_path}\" -show_streams"
"-select_streams a -loglevel error" " -select_streams a -loglevel error"
).format(**locals()) ).format(**locals())
self.log.debug("ffprob_cmd: {}".format(ffprob_cmd)) self.log.debug("ffprob_cmd: {}".format(ffprob_cmd))
@ -171,7 +171,8 @@ class ExtractReviewCutUp(pype.api.Extractor):
# try to get video native resolution data # try to get video native resolution data
try: try:
resolution_output = pype.api.subprocess(( resolution_output = pype.api.subprocess((
"{ffprobe_path} -i \"{full_input_path}\" -v error " "\"{ffprobe_path}\" -i \"{full_input_path}\""
" -v error "
"-select_streams v:0 -show_entries " "-select_streams v:0 -show_entries "
"stream=width,height -of csv=s=x:p=0" "stream=width,height -of csv=s=x:p=0"
).format(**locals())) ).format(**locals()))
@ -274,7 +275,7 @@ class ExtractReviewCutUp(pype.api.Extractor):
output_args.append("-y \"{}\"".format(full_output_path)) output_args.append("-y \"{}\"".format(full_output_path))
mov_args = [ mov_args = [
ffmpeg_path, "\"{}\"".format(ffmpeg_path),
" ".join(input_args), " ".join(input_args),
" ".join(output_args) " ".join(output_args)
] ]

View file

@ -56,7 +56,7 @@ class ExtractReview(pype.api.Extractor):
# Generate thumbnail. # Generate thumbnail.
thumbnail_path = os.path.join(staging_dir, "thumbnail.jpg") thumbnail_path = os.path.join(staging_dir, "thumbnail.jpg")
args = [ args = [
ffmpeg_path, "-y", "\"{}\"".format(ffmpeg_path), "-y",
"-i", output_image_path, "-i", output_image_path,
"-vf", "scale=300:-1", "-vf", "scale=300:-1",
"-vframes", "1", "-vframes", "1",

View file

@ -47,7 +47,7 @@ class ExtractShotData(pype.api.Extractor):
start += 0.5 start += 0.5
args = [ args = [
ffmpeg_path, "\"{}\"".format(ffmpeg_path),
"-ss", str(start / fps), "-ss", str(start / fps),
"-i", f"\"{video_file_path}\"", "-i", f"\"{video_file_path}\"",
"-t", str(dur / fps) "-t", str(dur / fps)

View file

@ -75,7 +75,7 @@ class ExtractThumbnailSP(pyblish.api.InstancePlugin):
ffmpeg_args = self.ffmpeg_args or {} ffmpeg_args = self.ffmpeg_args or {}
jpeg_items = [] jpeg_items = []
jpeg_items.append(ffmpeg_path) jpeg_items.append("\"{}\"".format(ffmpeg_path))
# override file if already exists # override file if already exists
jpeg_items.append("-y") jpeg_items.append("-y")
# add input filters from peresets # add input filters from peresets

View file

@ -13,11 +13,11 @@ ffprobe_path = pype.lib.get_ffmpeg_tool_path("ffprobe")
FFMPEG = ( FFMPEG = (
'{} -i "%(input)s" %(filters)s %(args)s%(output)s' '"{}" -i "%(input)s" %(filters)s %(args)s%(output)s'
).format(ffmpeg_path) ).format(ffmpeg_path)
FFPROBE = ( FFPROBE = (
'{} -v quiet -print_format json -show_format -show_streams "%(source)s"' '"{}" -v quiet -print_format json -show_format -show_streams "%(source)s"'
).format(ffprobe_path) ).format(ffprobe_path)
DRAWTEXT = ( DRAWTEXT = (

View file

@ -266,7 +266,7 @@ class DropDataFrame(QtWidgets.QFrame):
def load_data_with_probe(self, filepath): def load_data_with_probe(self, filepath):
ffprobe_path = pype.lib.get_ffmpeg_tool_path("ffprobe") ffprobe_path = pype.lib.get_ffmpeg_tool_path("ffprobe")
args = [ args = [
ffprobe_path, "\"{}\"".format(ffprobe_path),
'-v', 'quiet', '-v', 'quiet',
'-print_format json', '-print_format json',
'-show_format', '-show_format',