diff --git a/pycmx/edit_list.py b/pycmx/edit_list.py index d73a857..0d1577d 100644 --- a/pycmx/edit_list.py +++ b/pycmx/edit_list.py @@ -1,7 +1,7 @@ # pycmx # (c) 2018 Jamie Hardt -from .parse_cmx_statements import (StmtUnrecognized, StmtFCM, StmtEvent) +from .parse_cmx_statements import (StmtUnrecognized, StmtFCM, StmtEvent, StmtSourceUMID) from .event import Event class EditList: @@ -13,6 +13,28 @@ class EditList: self.title_statement = statements[0] self.event_statements = statements[1:] + + @property + def format(self): + """ + The detected format of the EDL. Possible values are: `3600`,`File32`, + `File128`, and `unknown` + """ + first_event = next( (s for s in self.event_statements if type(s) is StmtEvent), None) + + if first_event: + if first_event.format == 8: + return '3600' + elif first_event.format == 32: + return 'File32' + elif first_event.format == 128: + return 'File128' + else: + return 'unknown' + else: + return 'unknown' + + @property def title(self): """ @@ -54,8 +76,21 @@ class EditList: else: event_statements.append(stmt) + elif type(stmt) is StmtSourceUMID: + break else: event_statements.append(stmt) yield Event(statements=event_statements) + @property + def sources(self): + """ + A generator for all of the sources in the list + """ + + for stmt in self.event_statements: + if type(stmt) is StmtSourceUMID: + yield stmt + + diff --git a/pycmx/parse_cmx_statements.py b/pycmx/parse_cmx_statements.py index ee4386d..d391698 100644 --- a/pycmx/parse_cmx_statements.py +++ b/pycmx/parse_cmx_statements.py @@ -11,13 +11,13 @@ from .util import collimate StmtTitle = namedtuple("Title",["title","line_number"]) StmtFCM = namedtuple("FCM",["drop","line_number"]) StmtEvent = namedtuple("Event",["event","source","channels","trans",\ - "trans_op","source_in","source_out","record_in","record_out","line_number"]) + "trans_op","source_in","source_out","record_in","record_out","format","line_number"]) StmtAudioExt = namedtuple("AudioExt",["audio3","audio4","line_number"]) StmtClipName = namedtuple("ClipName",["name","affect","line_number"]) StmtSourceFile = namedtuple("SourceFile",["filename","line_number"]) StmtRemark = namedtuple("Remark",["text","line_number"]) StmtEffectsName = namedtuple("EffectsName",["name","line_number"]) -StmtTrailer = namedtuple("Trailer",["text","line_number"]) +StmtSourceUMID = namedtuple("Source",["name","umid","line_number"]) StmtSplitEdit = namedtuple("SplitEdit",["video","magnitue", "line_number"]) StmtMotionMemory = namedtuple("MotionMemory",["source","fps"]) # FIXME needs more fields StmtUnrecognized = namedtuple("Unrecognized",["content","line_number"]) @@ -69,8 +69,8 @@ def _parse_cmx3600_line(line, line_number): return _parse_extended_audio_channels(line,line_number) elif line.startswith("*"): return _parse_remark( line[1:].strip(), line_number) - elif line.startswith(">>>"): - return _parse_trailer_statement(line, line_number) + elif line.startswith(">>> SOURCE"): + return _parse_source_umid_statement(line, line_number) elif line.startswith("EFFECTS NAME IS"): return _parse_effects_name(line, line_number) elif line.startswith("SPLIT:"): @@ -157,10 +157,11 @@ def _parse_columns_for_standard_form(line, event_field_length, source_field_leng source_out=column_strings[12].strip(), record_in=column_strings[14].strip(), record_out=column_strings[16].strip(), - line_number=line_number) + line_number=line_number, + format=source_field_length) -def _parse_trailer_statement(line, line_number): +def _parse_source_umid_statement(line, line_number): trimmed = line[3:].strip() - return StmtTrailer(trimmed, line_number=line_number) + return StmtSourceUMID(name=None, umid=None, line_number=line_number) diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..5f90f9c --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1 @@ +from . import test_parse