From 264b9b191b8e0b0924503fc8427849e8041adc8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Ferrachat?= Date: Thu, 21 Sep 2023 11:36:43 +0200 Subject: [PATCH] Using r_frame_rate if avg_frame_rate not set --- ffprobe/ffprobe.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/ffprobe/ffprobe.py b/ffprobe/ffprobe.py index a68ae14..87a9ca4 100644 --- a/ffprobe/ffprobe.py +++ b/ffprobe/ffprobe.py @@ -8,6 +8,7 @@ import platform import re import subprocess +from typing import Optional from ffprobe.exceptions import FFProbeError @@ -126,17 +127,11 @@ def __init__(self, data_lines): for line in data_lines: self.__dict__.update({key: value for key, value, *_ in [line.strip().split('=')]}) - try: - self.__dict__['framerate'] = round( - functools.reduce( - operator.truediv, map(int, self.__dict__.get('avg_frame_rate', '').split('/')) - ), 2 - ) + frame_rate = self._frame_rate_from('avg_frame_rate') + if frame_rate is None or frame_rate == 0: + frame_rate = self._frame_rate_from('r_frame_rate') - except ValueError: - self.__dict__['framerate'] = None - except ZeroDivisionError: - self.__dict__['framerate'] = 0 + self.__dict__['framerate'] = frame_rate def __repr__(self): if self.is_video(): @@ -154,6 +149,17 @@ def __repr__(self): return template.format(**self.__dict__) + def _frame_rate_from(self, metadata: str) -> Optional[float]: + try: + return round( + functools.reduce(operator.truediv, map(int, self.__dict__.get(metadata, '').split('/'))), + 2 + ) + except ValueError: + return None + except ZeroDivisionError: + return 0 + def is_audio(self): """ Is this stream labelled as an audio stream?