From 33aae8c4e9d1b5b2f945d4c6973e456ab133b165 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Thu, 23 Oct 2025 08:13:15 -0500 Subject: [PATCH] improve ffprobe error reporting --- frigate/api/camera.py | 37 ++++++++++++++++++++++++------------- frigate/util/services.py | 2 +- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/frigate/api/camera.py b/frigate/api/camera.py index 01da847bc..9a91bd1a9 100644 --- a/frigate/api/camera.py +++ b/frigate/api/camera.py @@ -199,19 +199,30 @@ def ffprobe(request: Request, paths: str = "", detailed: bool = False): request.app.frigate_config.ffmpeg, path.strip(), detailed=detailed ) - result = { - "return_code": ffprobe.returncode, - "stderr": ( - ffprobe.stderr.decode("unicode_escape").strip() - if ffprobe.returncode != 0 - else "" - ), - "stdout": ( - json.loads(ffprobe.stdout.decode("unicode_escape").strip()) - if ffprobe.returncode == 0 - else "" - ), - } + if ffprobe.returncode != 0: + try: + stderr_decoded = ffprobe.stderr.decode("utf-8") + except UnicodeDecodeError: + try: + stderr_decoded = ffprobe.stderr.decode("unicode_escape") + except Exception: + stderr_decoded = str(ffprobe.stderr) + + stderr_lines = [ + line.strip() for line in stderr_decoded.split("\n") if line.strip() + ] + + result = { + "return_code": ffprobe.returncode, + "stderr": stderr_lines, + "stdout": "", + } + else: + result = { + "return_code": ffprobe.returncode, + "stderr": [], + "stdout": json.loads(ffprobe.stdout.decode("unicode_escape").strip()), + } # Add detailed metadata if requested and probe was successful if detailed and ffprobe.returncode == 0 and result["stdout"]: diff --git a/frigate/util/services.py b/frigate/util/services.py index 587794990..c51fe923a 100644 --- a/frigate/util/services.py +++ b/frigate/util/services.py @@ -577,7 +577,7 @@ def ffprobe_stream(ffmpeg, path: str, detailed: bool = False) -> sp.CompletedPro if detailed and format_entries: ffprobe_cmd.extend(["-show_entries", f"format={format_entries}"]) - ffprobe_cmd.extend(["-loglevel", "quiet", clean_path]) + ffprobe_cmd.extend(["-loglevel", "error", clean_path]) return sp.run(ffprobe_cmd, capture_output=True)