From c1f7407c4dece5f3b01420ac6ed61a7da7503b8d Mon Sep 17 00:00:00 2001 From: Jamie Hardt Date: Fri, 30 Nov 2018 11:31:47 -0800 Subject: [PATCH] Some implementation of the ChannelMap class --- pycmx/parse_cmx.py | 87 +++++++++++++++++------------------ pycmx/parse_cmx_statements.py | 7 +++ 2 files changed, 49 insertions(+), 45 deletions(-) diff --git a/pycmx/parse_cmx.py b/pycmx/parse_cmx.py index 5554bbf..7da7ecb 100644 --- a/pycmx/parse_cmx.py +++ b/pycmx/parse_cmx.py @@ -1,13 +1,5 @@ -#!/usr/bin/env python -# coding: utf-8 - -# # CMX3600 EDL Parsing -# -# ## String Helper -# -# We start with a `colliate` function, which will help us divide a string into fixed-width columns. - -# EDLs +# pycmx +# (c) 2018 Jamie Hardt from .parse_cmx_statements import parse_cmx3600_statements from collections import namedtuple @@ -42,43 +34,45 @@ class NamedTupleParser: class CmxChannelMap: - def __init__(self, cmx_string): - self.v = False - self.a1 = False - self.a2 = False - self.a3 = False - self.a4 = False - if cmx_string == "V": - self.v = True - elif cmx_string == "A": - self.a1 = True - elif cmx_string == "A2": - self.a2 = True - elif cmx_string == "AA": - self.a1 = True - self.a2 = True - elif cmx_string == "B": - self.v = True - self.a1 = True - elif cmx_string == "V/AA": - self.v = True - self.a1 = True - self.a2 = True - elif cmx_string == "V/A2": - self.v = True - self.a2 = True - + + chan_map = { "V" : (True, False, False), + "A" : (False, True, False), + "A2" : (False, False, True), + "AA" : (False, True, True), + "B" : (True, True, False), + "V/AA" : (True, True, True), + "V/A2" : (True, False, True) + } + + + def __init__(self, v=False, a1=False, a2=False, a3=False, a4=False): + self.v = v + self.a1 = a1 + self.a2 = a2 + self.a3 = a3 + self.a4 = a4 + + + def appendEvent(self, event_str): + if event_str in self.chan_map: + channels = self.chan_map[event_str] + self.v = channels[0] + self.a1 = channels[1] + self.a2 = channels[2] + + def appendExt(self, audio_ext): self.a3 = ext.audio3 self.a4 = ext.audio4 + + def __repr__(self): + return "CmxChannelMap(v="+ self.v.__repr__( ) + \ + ",a1=" + self.a1.__repr__() + \ + ",a2=" + self.a2.__repr__() + \ + ",a3=" + self.a3.__repr__() + \ + ",a4=" + self.a4.__repr__() +")" - -Cmx3600Event = namedtuple("Cmx3600Event",['title','number','clip_name', 'source_name','channels', - 'source_start','source_finish', - 'record_start','record_finish', - 'fcm_drop']) - def parse_cmx3600(file): """Accepts the path to a CMX EDL and returns a list of all events contained therein.""" statements = parse_cmx3600_statements(file) @@ -88,7 +82,6 @@ def parse_cmx3600(file): return event_list(title, parser) def event_list(title, parser): - print("Parsing event list") state = {"fcm_drop" : False} events_result = [] @@ -102,9 +95,12 @@ def event_list(title, parser): events_result.append(this_event) raw_event = parser.current_token + channels = CmxChannelMap() + channels.appendEvent(raw_event.channels) + this_event = {'title': title, 'number': raw_event.event, 'clip_name': None , 'source_name': raw_event.source, - 'channels': CmxChannelMap(raw_event.channels), + 'channels': channels, 'source_start': raw_event.source_in, 'source_finish': raw_event.source_out, 'record_start': raw_event.record_in, @@ -116,8 +112,9 @@ def event_list(title, parser): this_event['clip_name'] = parser.current_token.name elif parser.accept('SourceFile'): this_event['source_name'] = parser.current_token.filename + elif parser.accept('Trailer'): + break else: - events_result.append(parser.current_token) parser.next_token() if this_event != None: diff --git a/pycmx/parse_cmx_statements.py b/pycmx/parse_cmx_statements.py index b2cd6c1..a62f506 100644 --- a/pycmx/parse_cmx_statements.py +++ b/pycmx/parse_cmx_statements.py @@ -16,6 +16,7 @@ StmtAudioExt = namedtuple("AudioExt",["audio3","audio4"]) StmtClipName = namedtuple("ClipName",["name"]) StmtSourceFile = namedtuple("SourceFile",["filename"]) StmtRemark = namedtuple("Remark",["text"]) +StmtTrailer = namedtuple("Trailer",["text"]) StmtUnrecognized = namedtuple("Unrecognized",["content"]) @@ -55,6 +56,8 @@ def parse_cmx3600_line(line): return parse_extended_audio_channels(line) elif line.startswith("*"): return parse_remark( line[1:].strip()) + elif line.startswith(">>>"): + return parse_trailer_statement(line) else: return parse_unrecognized(line) @@ -117,3 +120,7 @@ def parse_columns_for_standard_form(line, event_field_length, source_field_lengt record_out=column_strings[16].strip()) +def parse_trailer_statement(line): + trimmed = line[3:].strip() + return StmtTrailer(trimmed) +