diff --git a/examples/get_video_thumbnail.py b/examples/get_video_thumbnail.py index b905642f..860965a2 100755 --- a/examples/get_video_thumbnail.py +++ b/examples/get_video_thumbnail.py @@ -26,7 +26,7 @@ def generate_thumbnail(in_filename, out_filename, time, width): .run(capture_stdout=True, capture_stderr=True) ) except ffmpeg.Error as e: - print(e.stderr.decode(), file=sys.stderr) + print(f"$ {e.cmdline}\n{e.stderr.decode()}", file=sys.stderr) sys.exit(1) diff --git a/examples/show_progress.py b/examples/show_progress.py index dd0253a1..81d24f54 100755 --- a/examples/show_progress.py +++ b/examples/show_progress.py @@ -125,6 +125,6 @@ def handler(key, value): .run(capture_stdout=True, capture_stderr=True) ) except ffmpeg.Error as e: - print(e.stderr, file=sys.stderr) + print(f"$ {e.cmdline}\n{e.stderr.decode()}", file=sys.stderr) sys.exit(1) diff --git a/examples/transcribe.py b/examples/transcribe.py index 0b7200c4..eb03ec9d 100755 --- a/examples/transcribe.py +++ b/examples/transcribe.py @@ -27,7 +27,7 @@ def decode_audio(in_filename, **input_kwargs): .run(capture_stdout=True, capture_stderr=True) ) except ffmpeg.Error as e: - print(e.stderr, file=sys.stderr) + print(f"$ {e.cmdline}\n{e.stderr.decode()}", file=sys.stderr) sys.exit(1) return out diff --git a/examples/video_info.py b/examples/video_info.py index df9c992e..525b22d1 100755 --- a/examples/video_info.py +++ b/examples/video_info.py @@ -15,7 +15,7 @@ try: probe = ffmpeg.probe(args.in_filename) except ffmpeg.Error as e: - print(e.stderr, file=sys.stderr) + print(f"$ {e.cmdline}\n{e.stderr.decode()}", file=sys.stderr) sys.exit(1) video_stream = next((stream for stream in probe['streams'] if stream['codec_type'] == 'video'), None) diff --git a/ffmpeg/_probe.py b/ffmpeg/_probe.py index 090d7abf..2c11217a 100644 --- a/ffmpeg/_probe.py +++ b/ffmpeg/_probe.py @@ -1,7 +1,7 @@ import json import subprocess from ._run import Error -from ._utils import convert_kwargs_to_cmd_line_args +from ._utils import convert_kwargs_to_cmd_line_args, convert_cmd_line_args_to_cmd_line_str def probe(filename, cmd='ffprobe', timeout=None, **kwargs): @@ -23,7 +23,8 @@ def probe(filename, cmd='ffprobe', timeout=None, **kwargs): communicate_kwargs['timeout'] = timeout out, err = p.communicate(**communicate_kwargs) if p.returncode != 0: - raise Error('ffprobe', out, err) + cmdline = convert_cmd_line_args_to_cmd_line_str(args) + raise Error('ffprobe', out, err, cmdline) return json.loads(out.decode('utf-8')) diff --git a/ffmpeg/_run.py b/ffmpeg/_run.py index f42d1d73..febff5ca 100644 --- a/ffmpeg/_run.py +++ b/ffmpeg/_run.py @@ -1,6 +1,6 @@ from __future__ import unicode_literals from .dag import get_outgoing_edges, topo_sort -from ._utils import basestring, convert_kwargs_to_cmd_line_args +from ._utils import basestring, convert_kwargs_to_cmd_line_args, convert_cmd_line_args_to_cmd_line_str from builtins import str from functools import reduce import copy @@ -24,12 +24,13 @@ class Error(Exception): - def __init__(self, cmd, stdout, stderr): + def __init__(self, cmd, stdout, stderr, cmdline): super(Error, self).__init__( '{} error (see stderr output for detail)'.format(cmd) ) self.stdout = stdout self.stderr = stderr + self.cmdline = cmdline def _get_input_args(input_node): @@ -334,7 +335,9 @@ def run( out, err = process.communicate(input) retcode = process.poll() if retcode: - raise Error('ffmpeg', out, err) + args = compile(stream_spec, cmd, overwrite_output=overwrite_output) + cmdline = convert_cmd_line_args_to_cmd_line_str(args) + raise Error('ffmpeg', out, err, cmdline) return out, err diff --git a/ffmpeg/_utils.py b/ffmpeg/_utils.py index 9baa2c78..772b6779 100644 --- a/ffmpeg/_utils.py +++ b/ffmpeg/_utils.py @@ -2,8 +2,9 @@ from builtins import str from past.builtins import basestring import hashlib -import sys - +import sys, os +import subprocess +import shlex if sys.version_info.major == 2: # noinspection PyUnresolvedReferences,PyShadowingBuiltins @@ -106,3 +107,11 @@ def convert_kwargs_to_cmd_line_args(kwargs): if v is not None: args.append('{}'.format(v)) return args + + +def convert_cmd_line_args_to_cmd_line_str(args): + """Helper function to build command line string from command line args.""" + if os.name == "nt": # Windows system + return subprocess.list2cmdline(args) + # Non-windows systems + return shlex.join(args)