From 1d78f11b11e6f7fd17dfc760c2710d1e0964293e Mon Sep 17 00:00:00 2001 From: Jamie Hardt Date: Tue, 16 Dec 2025 16:22:30 -0800 Subject: [PATCH] retyping some CDL items --- pycmx/edit.py | 15 +++------------ pycmx/parse_cmx_statements.py | 31 +++++++++++++++++++++++-------- pycmx/statements.py | 14 ++++---------- tests/test_parse.py | 6 +++--- 4 files changed, 33 insertions(+), 33 deletions(-) diff --git a/pycmx/edit.py b/pycmx/edit.py index 2afa682..ba06369 100644 --- a/pycmx/edit.py +++ b/pycmx/edit.py @@ -139,26 +139,17 @@ class Edit: return self._clip_name_statement.name @property - def asc_sop(self) -> Optional[AscSopComponents[str]]: + def asc_sop(self) -> Optional[AscSopComponents[float]]: """ Get ASC CDL Slope-Offset-Power transfer function for clip, if present """ if self._asc_sop_statement is None: return None - s = self._asc_sop_statement - - return AscSopComponents( - slope=Rgb(red=s.slope_r, green=s.slope_g, - blue=s.slope_b), - offset=Rgb(red=s.offset_r, green=s.offset_g, - blue=s.offset_g), - power=Rgb(red=s.power_r, green=s.power_g, - blue=s.power_b) - ) + return self._asc_sop_statement.cdl_sop @property - def asc_sat(self) -> Optional[str]: + def asc_sat(self) -> Optional[float]: """ Get ASC CDL saturation value for clip, if present """ diff --git a/pycmx/parse_cmx_statements.py b/pycmx/parse_cmx_statements.py index 991aa28..ec1e8f8 100644 --- a/pycmx/parse_cmx_statements.py +++ b/pycmx/parse_cmx_statements.py @@ -4,6 +4,8 @@ import re from typing import TextIO, List +from pycmx.cdl import AscSopComponents, Rgb + from .statements import (StmtCdlSat, StmtCdlSop, StmtFrmc, StmtRemark, StmtTitle, StmtUnrecognized, StmtFCM, StmtAudioExt, StmtClipName, StmtEffectsName, StmtEvent, @@ -117,11 +119,19 @@ def _parse_remark(line, line_number) -> object: return StmtRemark(line, line_number) else: - return StmtCdlSop(slope_r=v[0][0], slope_g=v[0][1], - slope_b=v[0][2], offset_r=v[1][0], - offset_g=v[1][1], offset_b=v[1][2], - power_r=v[2][0], power_g=v[2][1], - power_b=v[2][2], line_number=line_number) + try: + return StmtCdlSop(cdl_sop=AscSopComponents( + slope=Rgb(red=float(v[0][0]), green=float(v[0][1]), + blue=float(v[0][2])), + offset=Rgb(red=float(v[1][0]), green=float(v[1][1]), + blue=float(v[1][2])), + power=Rgb(red=float(v[2][0]), green=float(v[2][1]), + blue=float(v[2][2])) + ), + line_number=line_number) + + except ValueError: + return StmtRemark(line, line_number) elif line.startswith("ASC_SAT"): value = re.findall(r'(-?\d+(\.\d+)?)', line) @@ -130,7 +140,12 @@ def _parse_remark(line, line_number) -> object: return StmtRemark(line, line_number) else: - return StmtCdlSat(value=value[0][0], line_number=line_number) + try: + return StmtCdlSat(value=float(value[0][0]), + line_number=line_number) + + except ValueError: + return StmtRemark(line, line_number) elif line.startswith("FRMC"): match = re.match( @@ -142,9 +157,9 @@ def _parse_remark(line, line_number) -> object: else: try: - return StmtFrmc(start=int(match.group(1)), + return StmtFrmc(start=int(match.group(1)), end=int(match.group(2)), - duration=int(match.group(3)), + duration=int(match.group(3)), line_number=line_number) except ValueError: return StmtRemark(line, line_number) diff --git a/pycmx/statements.py b/pycmx/statements.py index 5043056..f9036ce 100644 --- a/pycmx/statements.py +++ b/pycmx/statements.py @@ -5,6 +5,8 @@ from collections import namedtuple from typing import NamedTuple +from pycmx.cdl import AscSopComponents + class StmtTitle(NamedTuple): title: str @@ -48,20 +50,12 @@ class StmtSourceFile(NamedTuple): class StmtCdlSop(NamedTuple): - slope_r: str - slope_g: str - slope_b: str - offset_r: str - offset_g: str - offset_b: str - power_r: str - power_g: str - power_b: str + cdl_sop: AscSopComponents[float] line_number: int class StmtCdlSat(NamedTuple): - value: str + value: float line_number: int diff --git a/tests/test_parse.py b/tests/test_parse.py index a4e20b0..f193ff8 100644 --- a/tests/test_parse.py +++ b/tests/test_parse.py @@ -146,13 +146,13 @@ class TestParse(TestCase): sop = event.edits[0].asc_sop self.assertIsNotNone(sop) assert sop - self.assertEqual(sop.slope.red, "0.9405") - self.assertEqual(sop.offset.green, "-0.0276") + self.assertEqual(sop.slope.red, float("0.9405")) + self.assertEqual(sop.offset.green, float("-0.0276")) sat = event.edits[0].asc_sat self.assertIsNotNone(sat) assert sat - self.assertEqual(sat, '0.9640') + self.assertEqual(sat, float('0.9640')) def test_frmc(self): with open("tests/edls/cdl_frmc_example01.edl", "r") as f: