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.
This commit is contained in:
Jakub Jezek 2024-06-07 14:21:21 +02:00
parent c76eed6476
commit 5b6211b9e3
No known key found for this signature in database
GPG key ID: 06DBD609ADF27FD9
2 changed files with 26 additions and 4 deletions

View file

@ -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():

View file

@ -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