From 1bcc80b5f45a0d8619df64edbd2fec797fd70cd9 Mon Sep 17 00:00:00 2001 From: Andrey Dyakov Date: Tue, 2 Jun 2026 00:55:28 +0400 Subject: [PATCH] fix(previews): ffprobe hangs Signed-off-by: Andrey Dyakov --- AUTHORS | 1 + lib/private/Preview/Movie.php | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/AUTHORS b/AUTHORS index fe478401fddb4..fa5776e3ef575 100644 --- a/AUTHORS +++ b/AUTHORS @@ -32,6 +32,7 @@ - Andreas Pflug - Andrew Brown - Andrey Borysenko + - Andrey Dyakov - André Gaul - Andy Xheli - Anna Larch diff --git a/lib/private/Preview/Movie.php b/lib/private/Preview/Movie.php index f34bf60c14773..a876b1e120314 100644 --- a/lib/private/Preview/Movie.php +++ b/lib/private/Preview/Movie.php @@ -289,9 +289,39 @@ private function useHdr(string $absPath): bool { if ($test_hdr_proc === false) { return false; } - $test_hdr_stdout = trim(stream_get_contents($test_hdr_pipes[1])); - $test_hdr_stderr = trim(stream_get_contents($test_hdr_pipes[2])); + + stream_set_blocking($test_hdr_pipes[1], false); + stream_set_blocking($test_hdr_pipes[2], false); + + $test_hdr_stdout = ''; + $test_hdr_stderr = ''; + + while (!feof($test_hdr_pipes[1]) || !feof($test_hdr_pipes[2])) { + $read = array_filter([ + !feof($test_hdr_pipes[1]) ? $test_hdr_pipes[1] : null, + !feof($test_hdr_pipes[2]) ? $test_hdr_pipes[2] : null, + ]); + $write = $except = []; + if (stream_select($read, $write, $except, 5) === false) { + break; + } + foreach ($read as $pipe) { + $chunk = fread($pipe, 8192); + if ($chunk === false) continue; + if ($pipe === $test_hdr_pipes[1]) { + $test_hdr_stdout .= $chunk; + } else { + $test_hdr_stderr .= $chunk; + } + } + } + + fclose($test_hdr_pipes[1]); + fclose($test_hdr_pipes[2]); proc_close($test_hdr_proc); + + $test_hdr_stdout = trim($test_hdr_stdout); + $test_hdr_stderr = trim($test_hdr_stderr); // search build options for libzimg (provides zscale filter) $ffmpeg_libzimg_installed = strpos($test_hdr_stderr, '--enable-libzimg'); // Only values of "smpte2084" and "arib-std-b67" indicate an HDR video.