mirror of
https://github.com/iluvcapra/pycmx.git
synced 2026-01-02 09:50:55 +00:00
Moved some code into different module files
This commit is contained in:
@@ -1,3 +1,3 @@
|
|||||||
# pycmx
|
# pycmx init
|
||||||
|
|
||||||
from .parse_cmx import parse_cmx3600
|
from .parse_cmx import parse_cmx3600
|
||||||
|
|||||||
@@ -9,142 +9,8 @@
|
|||||||
|
|
||||||
# EDLs
|
# EDLs
|
||||||
|
|
||||||
def collimate(a_string, column_widths):
|
from .parse_cmx_statements import parse_cmx3600_statements
|
||||||
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 collections import namedtuple
|
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:
|
class NamedTupleParser:
|
||||||
|
|
||||||
|
|||||||
119
pycmx/parse_cmx_statements.py
Normal file
119
pycmx/parse_cmx_statements.py
Normal 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
17
pycmx/util.py
Normal 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:])
|
||||||
|
|
||||||
|
|
||||||
2
setup.py
2
setup.py
@@ -4,7 +4,7 @@ with open("README.md", "r") as fh:
|
|||||||
long_description = fh.read()
|
long_description = fh.read()
|
||||||
|
|
||||||
setup(name='pycmx',
|
setup(name='pycmx',
|
||||||
version='0.1',
|
version='0.2',
|
||||||
author='Jamie Hardt',
|
author='Jamie Hardt',
|
||||||
author_email='jamiehardt@me.com',
|
author_email='jamiehardt@me.com',
|
||||||
description='CMX3600 Edit Decision List Parser',
|
description='CMX3600 Edit Decision List Parser',
|
||||||
|
|||||||
Reference in New Issue
Block a user