Skip to content

Commit

Permalink
Merge pull request #12 from iluvcapra/feat-adobe
Browse files Browse the repository at this point in the history
Added support for Adobe Premiere EDLs > 999 events
  • Loading branch information
iluvcapra authored Jan 7, 2025
2 parents b6379ec + 5e4dde5 commit 89b6cde
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 5 deletions.
9 changes: 4 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -83,5 +84,3 @@ Audio channel 7 is present
>>> events[2].edits[0].channels.video
False
```


6 changes: 6 additions & 0 deletions pycmx/parse_cmx_statements.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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"):
Expand Down
7 changes: 7 additions & 0 deletions tests/test_parse.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

0 comments on commit 89b6cde

Please sign in to comment.