Moved some code into different module files

This commit is contained in:
Jamie Hardt
2018-11-29 22:04:53 -08:00
parent ee12cdca0d
commit 284aea8422
5 changed files with 139 additions and 137 deletions

View File

@@ -1,3 +1,3 @@
# pycmx
# pycmx init
from .parse_cmx import parse_cmx3600

View File

@@ -9,142 +9,8 @@
# EDLs
def collimate(a_string, column_widths):
if len(column_widths) == 0:
return []
width = column_widths[0]
element = a_string[:width]
rest = a_string[width:]
return [element] + collimate(rest, column_widths[1:])
# In[36]:
import re
import sys
from .parse_cmx_statements import parse_cmx3600_statements
from collections import namedtuple
import pprint
#from itertools import repeat
#from functools import reduce
# ## Parsed Statement Data Structures
#
# These represent individual lines that have been typed and have undergone some light symbolic parsing.
StmtTitle = namedtuple("Title",["title"])
StmtFCM = namedtuple("FCM",["drop"])
StmtEvent = namedtuple("Event",["event","source","channels","trans","trans_op","source_in","source_out","record_in","record_out"])
StmtAudioExt = namedtuple("AudioExt",["audio3","audio4"])
StmtClipName = namedtuple("ClipName",["name"])
StmtSourceFile = namedtuple("SourceFile",["filename"])
StmtRemark = namedtuple("Remark",["text"])
StmtUnrecognized = namedtuple("Unrecognized",["content"])
def parse_cmx3600_statements(path):
with open(path,'rU') as file:
lines = file.readlines()
return [parse_cmx3600_line(line.strip()) for line in lines]
def edl_column_widths(event_field_length, source_field_length):
return [event_field_length,2, source_field_length,1,
4,2, # chans
4,1, # trans
3,1, # trans op
11,1,
11,1,
11,1,
11]
def parse_cmx3600_line(line):
long_event_num_p = re.compile("^[0-9]{6} ")
short_event_num_p = re.compile("^[0-9]{3} ")
if isinstance(line,str):
if line.startswith("TITLE:"):
return parse_title(line)
elif line.startswith("FCM:"):
return parse_fcm(line)
elif long_event_num_p.match(line) != None:
length_file_128 = sum(edl_column_widths(6,128))
if len(line) < length_file_128:
return parse_long_standard_form(line, 32)
else:
return parse_long_standard_form(line, 128)
elif short_event_num_p.match(line) != None:
return parse_standard_form(line)
elif line.startswith("AUD"):
return parse_extended_audio_channels(line)
elif line.startswith("*"):
return parse_remark( line[1:].strip())
else:
return parse_unrecognized(line)
def parse_title(line):
title = line[6:].strip()
return StmtTitle(title=title)
def parse_fcm(line):
val = line[4:].strip()
if val == "DROP FRAME":
return StmtFCM(drop= True)
else:
return StmtFCM(drop= False)
def parse_long_standard_form(line,source_field_length):
return parse_columns_for_standard_form(line, 6, source_field_length)
def parse_standard_form(line):
return parse_columns_for_standard_form(line, 3, 8)
def parse_extended_audio_channels(line):
content = line.strip()
if content == "AUD 3":
return StmtAudioExt(audio3=True, audio4=False)
elif content == "AUD 4":
return StmtAudioExt(audio3=False, audio4=True)
elif content == "AUD 3 4":
return StmtAudioExt(audio3=True, audio4=True)
else:
return StmtUnrecognized(content=line)
def parse_remark(line):
if line.startswith("FROM CLIP NAME:"):
return StmtClipName(name=line[15:].strip() )
elif line.startswith("SOURCE FILE:"):
return StmtSourceFile(filename=line[12:].strip() )
else:
return StmtRemark(text=line)
def parse_unrecognized(line):
return StmtUnrecognized(content=line)
def parse_columns_for_standard_form(line, event_field_length, source_field_length):
col_widths = edl_column_widths(event_field_length, source_field_length)
if sum(col_widths) > len(line):
return StmtUnrecognized(content=line)
column_strings = collimate(line,col_widths)
return StmtEvent(event=column_strings[0],
source=column_strings[2].strip(),
channels=column_strings[4].strip(),
trans=column_strings[6].strip(),
trans_op=column_strings[8].strip(),
source_in=column_strings[10].strip(),
source_out=column_strings[12].strip(),
record_in=column_strings[14].strip(),
record_out=column_strings[16].strip())
class NamedTupleParser:

View File

@@ -0,0 +1,119 @@
# Parsed Statement Data Structures
#
# These represent individual lines that have been typed and have undergone some light symbolic parsing.
from .util import collimate
import re
import sys
from collections import namedtuple
StmtTitle = namedtuple("Title",["title"])
StmtFCM = namedtuple("FCM",["drop"])
StmtEvent = namedtuple("Event",["event","source","channels","trans","trans_op","source_in","source_out","record_in","record_out"])
StmtAudioExt = namedtuple("AudioExt",["audio3","audio4"])
StmtClipName = namedtuple("ClipName",["name"])
StmtSourceFile = namedtuple("SourceFile",["filename"])
StmtRemark = namedtuple("Remark",["text"])
StmtUnrecognized = namedtuple("Unrecognized",["content"])
def parse_cmx3600_statements(path):
with open(path,'rU') as file:
lines = file.readlines()
return [parse_cmx3600_line(line.strip()) for line in lines]
def edl_column_widths(event_field_length, source_field_length):
return [event_field_length,2, source_field_length,1,
4,2, # chans
4,1, # trans
3,1, # trans op
11,1,
11,1,
11,1,
11]
def parse_cmx3600_line(line):
long_event_num_p = re.compile("^[0-9]{6} ")
short_event_num_p = re.compile("^[0-9]{3} ")
if isinstance(line,str):
if line.startswith("TITLE:"):
return parse_title(line)
elif line.startswith("FCM:"):
return parse_fcm(line)
elif long_event_num_p.match(line) != None:
length_file_128 = sum(edl_column_widths(6,128))
if len(line) < length_file_128:
return parse_long_standard_form(line, 32)
else:
return parse_long_standard_form(line, 128)
elif short_event_num_p.match(line) != None:
return parse_standard_form(line)
elif line.startswith("AUD"):
return parse_extended_audio_channels(line)
elif line.startswith("*"):
return parse_remark( line[1:].strip())
else:
return parse_unrecognized(line)
def parse_title(line):
title = line[6:].strip()
return StmtTitle(title=title)
def parse_fcm(line):
val = line[4:].strip()
if val == "DROP FRAME":
return StmtFCM(drop= True)
else:
return StmtFCM(drop= False)
def parse_long_standard_form(line,source_field_length):
return parse_columns_for_standard_form(line, 6, source_field_length)
def parse_standard_form(line):
return parse_columns_for_standard_form(line, 3, 8)
def parse_extended_audio_channels(line):
content = line.strip()
if content == "AUD 3":
return StmtAudioExt(audio3=True, audio4=False)
elif content == "AUD 4":
return StmtAudioExt(audio3=False, audio4=True)
elif content == "AUD 3 4":
return StmtAudioExt(audio3=True, audio4=True)
else:
return StmtUnrecognized(content=line)
def parse_remark(line):
if line.startswith("FROM CLIP NAME:"):
return StmtClipName(name=line[15:].strip() )
elif line.startswith("SOURCE FILE:"):
return StmtSourceFile(filename=line[12:].strip() )
else:
return StmtRemark(text=line)
def parse_unrecognized(line):
return StmtUnrecognized(content=line)
def parse_columns_for_standard_form(line, event_field_length, source_field_length):
col_widths = edl_column_widths(event_field_length, source_field_length)
if sum(col_widths) > len(line):
return StmtUnrecognized(content=line)
column_strings = collimate(line,col_widths)
return StmtEvent(event=column_strings[0],
source=column_strings[2].strip(),
channels=column_strings[4].strip(),
trans=column_strings[6].strip(),
trans_op=column_strings[8].strip(),
source_in=column_strings[10].strip(),
source_out=column_strings[12].strip(),
record_in=column_strings[14].strip(),
record_out=column_strings[16].strip())

17
pycmx/util.py Normal file
View File

@@ -0,0 +1,17 @@
# pycmx
# (c) 2018 Jamie Hardt
# Utility functions
def collimate(a_string, column_widths):
'Splits a string into substrings that are column_widths length.'
if len(column_widths) == 0:
return []
width = column_widths[0]
element = a_string[:width]
rest = a_string[width:]
return [element] + collimate(rest, column_widths[1:])

View File

@@ -4,7 +4,7 @@ with open("README.md", "r") as fh:
long_description = fh.read()
setup(name='pycmx',
version='0.1',
version='0.2',
author='Jamie Hardt',
author_email='jamiehardt@me.com',
description='CMX3600 Edit Decision List Parser',