diff --git a/README.md b/README.md index c41dd81..6b7c3c1 100644 --- a/README.md +++ b/README.md @@ -5,12 +5,13 @@ # pycmx -The `pycmx` package provides a basic interface for parsing a CMX 3600 EDL and its most most common variations. +The `pycmx` package provides a basic interface for parsing a CMX 3600 EDL and +its most most common variations. ## Features -* The major variations of the CMX 3600: the standard, "File32" and "File128" - formats are automatically detected and properly read. +* The major variations of the CMX 3600: the standard, "File32", "File128" and + long Adobe Premiere formats are automatically detected and properly read. * Preserves relationship between events and individual edits/clips. * Remark or comment fields with common recognized forms are read and available to the client, including clip name and source file data. @@ -83,5 +84,3 @@ Audio channel 7 is present >>> events[2].edits[0].channels.video False ``` - - diff --git a/pycmx/parse_cmx_statements.py b/pycmx/parse_cmx_statements.py index 55a850c..3f9c414 100644 --- a/pycmx/parse_cmx_statements.py +++ b/pycmx/parse_cmx_statements.py @@ -60,6 +60,7 @@ def _parse_cmx3600_line(line: str, line_number: int) -> object: """ long_event_num_p = re.compile("^[0-9]{6} ") short_event_num_p = re.compile("^[0-9]{3} ") + x_event_form_p = re.compile("^([0-9]{4,5}) ") if line.startswith("TITLE:"): return _parse_title(line, line_number) @@ -71,6 +72,11 @@ def _parse_cmx3600_line(line: str, line_number: int) -> object: return _parse_long_standard_form(line, 32, line_number) else: return _parse_long_standard_form(line, 128, line_number) + elif (m := x_event_form_p.match(line)) is not None: + assert m is not None + event_field_length = len(m[1]) + return _parse_columns_for_standard_form(line, event_field_length, + 8, line_number) elif short_event_num_p.match(line) is not None: return _parse_standard_form(line, line_number) elif line.startswith("AUD"): diff --git a/tests/test_parse.py b/tests/test_parse.py index ae469a6..8d75512 100644 --- a/tests/test_parse.py +++ b/tests/test_parse.py @@ -113,3 +113,10 @@ def test_transition_name(self): events = list(edl.events) self.assertEqual( events[4].edits[1].transition.name, "CROSS DISSOLVE") + + def test_adobe_wide(self): + with open("tests/edls/adobe_dai109_test.txt", 'r', + encoding='ISO-8859-1') as f: + edl = pycmx.parse_cmx3600(f) + events = list(edl.events) + self.assertEqual(len(events), 2839)