Implemented SOP form parsing

This commit is contained in:
2025-12-16 10:35:40 -08:00
parent 2ee94ca358
commit 6c7f7d2de1
3 changed files with 34 additions and 1 deletions

View File

@@ -3,7 +3,7 @@
import re
from collections import namedtuple
from typing import TextIO, List
from typing import Any, TextIO, List
from .statements import *
from .util import collimate
@@ -104,6 +104,26 @@ def _parse_remark(line, line_number) -> object:
elif line.startswith("SOURCE FILE:"):
return StmtSourceFile(filename=line[12:].strip(),
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]
if len(v) != 3 or any([len(a) != 3 for a in v]):
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)
elif line.startswith("ASC_SAT"):
...
elif line.startswith("FRMC"):
...
else:
return StmtRemark(text=line, line_number=line_number)

View File

@@ -9,6 +9,11 @@ StmtEvent = namedtuple("Event", ["event", "source", "channels", "trans",
StmtAudioExt = namedtuple("AudioExt", ["audio3", "audio4", "line_number"])
StmtClipName = namedtuple("ClipName", ["name", "affect", "line_number"])
StmtSourceFile = namedtuple("SourceFile", ["filename", "line_number"])
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'])
StmtRemark = namedtuple("Remark", ["text", "line_number"])
StmtEffectsName = namedtuple("EffectsName", ["name", "line_number"])
StmtSourceUMID = namedtuple("Source", ["name", "umid", "line_number"])

View File

@@ -137,3 +137,11 @@ class TestParse(TestCase):
pycmx.Transition.Cut)
self.assertEqual(event.edits[0].source_in,
"18:44:20:12")
def test_cdl(self):
with open("tests/edls/cdl_example01.edl", "r") as f:
edl = pycmx.parse_cmx3600(f)
for event in edl.events:
if event.number == 1:
...