From 5b6211b9e33ea87341079b3e6c937e7443144d68 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 7 Jun 2024 14:21:21 +0200 Subject: [PATCH] enhancing metadata info processing to include framerate - Create "framerate" key from "r_frame_rate" or "framespersecond" - Evaluate string expression value into float value - Log a warning if evaluation fails. --- client/ayon_core/lib/transcoding.py | 24 ++++++++++++++++++- .../ayon_core/tests/lib/test_transcoding.py | 6 ++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/lib/transcoding.py b/client/ayon_core/lib/transcoding.py index 0f220f1093..df00c0e6dd 100644 --- a/client/ayon_core/lib/transcoding.py +++ b/client/ayon_core/lib/transcoding.py @@ -849,7 +849,10 @@ def get_image_info_metadata( Args: path_to_file (str): Path to image file. keys (list[str]): List of keys that should be returned. If None then - all keys are returned. + all keys are returned. Keys are expected all lowercase. + Additional keys are: + - "framerate" - will be created from "r_frame_rate" or + "framespersecond" and evaluated to float value. logger (logging.Logger): Logger used for logging. """ if logger is None: @@ -906,6 +909,25 @@ def get_image_info_metadata( if keys is None: return metadata_stream + # create framerate key from available ffmpeg:r_frame_rate + # or oiiotool:framespersecond and evaluate its string expression + # value into flaot value + if ( + "r_frame_rate" in metadata_stream + or "framespersecond" in metadata_stream + ): + rate_info = metadata_stream.get("r_frame_rate") + if rate_info is None: + rate_info = metadata_stream.get("framespersecond") + + try: + metadata_stream["framerate"] = eval(str(rate_info)) + except Exception as e: + logger.warning( + "Failed to evaluate '{}' value to framerate. Error: {}".format( + rate_info, e) + ) + output = {} for key in keys: for k, v in metadata_stream.items(): diff --git a/client/ayon_core/tests/lib/test_transcoding.py b/client/ayon_core/tests/lib/test_transcoding.py index 47d9fc70d3..4fe694631f 100644 --- a/client/ayon_core/tests/lib/test_transcoding.py +++ b/client/ayon_core/tests/lib/test_transcoding.py @@ -15,8 +15,8 @@ logger = logging.getLogger('test_transcoding') / "lib" / "transcoding" / "a01vfxd_sh010_plateP01_v002.1013.exr", - ["timecode"], - {"timecode": "01:00:06:03"}, + ["timecode", "framerate"], + {"timecode": "01:00:06:03", "framerate": 23.976023976023978}, "test_01", ), ( @@ -47,6 +47,6 @@ def test_get_image_info_metadata_happy_path( path_to_file = resources_path_factory.as_posix() returned_data = get_image_info_metadata(path_to_file, metadata, logger) - logger.debug(f"Returned data: {returned_data}") + logger.info(f"Returned data: {returned_data}") assert returned_data == expected