From 73853d215edbcdbaf7576149b7d68bb95a9df0c0 Mon Sep 17 00:00:00 2001 From: Jamie Hardt Date: Tue, 16 Dec 2025 11:24:42 -0800 Subject: [PATCH] FRMC statement form implementation --- pycmx/parse_cmx_statements.py | 24 +++++++++++++++++------- pycmx/statements.py | 3 ++- tests/test_parse.py | 8 ++++++++ 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/pycmx/parse_cmx_statements.py b/pycmx/parse_cmx_statements.py index e3d0b4b..14dd5f4 100644 --- a/pycmx/parse_cmx_statements.py +++ b/pycmx/parse_cmx_statements.py @@ -9,7 +9,6 @@ from .statements import * from .util import collimate - def parse_cmx3600_statements(file: TextIO) -> List[object]: """ Return a list of every statement in the file argument. @@ -106,9 +105,9 @@ def _parse_remark(line, line_number) -> object: line_number=line_number) elif line.startswith("ASC_SOP"): group_patterns: list[str] = re.findall(r'\((.*?)\)', line) - + v: list[list[str]] = [re.findall(r'-?\d+(\.\d+)?', a) for - a in group_patterns] + a in group_patterns] if len(v) != 3 or any([len(a) != 3 for a in v]): return StmtRemark(line, line_number) @@ -122,15 +121,26 @@ def _parse_remark(line, line_number) -> object: elif line.startswith("ASC_SAT"): value = re.findall(r'-?\d+(\.\d+)?', line) - + if len(value) != 1: return StmtRemark(line, line_number) - + else: - return StmtCdlSat(value=value[0]) + return StmtCdlSat(value=value[0], line_number=line_number) elif line.startswith("FRMC"): - ... + match = re.match( + r'^FRMC START:\s*(\d+)\s+FRMC END:\s*(\d+)' + r'\s+FRMC DURATION:\s*(\d+)', + line) + + if match is None: + return StmtRemark(line, line_number) + + else: + return StmtFrmc(start=match.group(1), end=match.group(2), + duration=match.group(3), line_number=line_number) + else: return StmtRemark(text=line, line_number=line_number) diff --git a/pycmx/statements.py b/pycmx/statements.py index e9b1ab0..687003f 100644 --- a/pycmx/statements.py +++ b/pycmx/statements.py @@ -13,7 +13,8 @@ StmtCdlSop = namedtuple("CdlSop", ['slope_r','slope_g','slope_b', 'offset_r', 'offset_g', 'offset_b', 'power_r', 'power_g', 'power_b', 'line_number']) -StmtCdlSat = namedtuple("SdlSat", ['value']) +StmtCdlSat = namedtuple("SdlSat", ['value', 'line_number']) +StmtFrmc = namedtuple("Frmc", ['start', 'end', 'duration', 'line_number']) StmtRemark = namedtuple("Remark", ["text", "line_number"]) StmtEffectsName = namedtuple("EffectsName", ["name", "line_number"]) StmtSourceUMID = namedtuple("Source", ["name", "umid", "line_number"]) diff --git a/tests/test_parse.py b/tests/test_parse.py index 2bbd3b4..f8e88d6 100644 --- a/tests/test_parse.py +++ b/tests/test_parse.py @@ -145,3 +145,11 @@ class TestParse(TestCase): for event in edl.events: if event.number == 1: ... + + def test_frmc(self): + with open("tests/edls/cdl_frmc_example01.edl", "r") as f: + edl = pycmx.parse_cmx3600(f) + for event in edl.events: + if event.number == 1: + ... +