mirror of
https://github.com/iluvcapra/ptulsconv.git
synced 2025-12-31 17:00:46 +00:00
FMP XML output implementation
This commit is contained in:
@@ -2,7 +2,86 @@ import ptulsconv
|
|||||||
import json
|
import json
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
def convert(input_file, output=sys.stdout):
|
def fmp_dump(data, output):
|
||||||
|
from xml.etree.ElementTree import TreeBuilder, ElementTree, tostring
|
||||||
|
doc = TreeBuilder(element_factory=None)
|
||||||
|
|
||||||
|
field_map = ((['Title', 'PT.Session.Name'], 'Title', str),
|
||||||
|
(['Supv'], 'Supervisor', str),
|
||||||
|
(['Client'], 'Client', str),
|
||||||
|
(['Sc'], 'Scene', str),
|
||||||
|
(['Ver'], 'Version', str),
|
||||||
|
(['Reel'], 'Reel', str),
|
||||||
|
(['P'], 'Priority', int),
|
||||||
|
(['QN'], 'Cue Number', str),
|
||||||
|
(['Char', 'PT.Track.Name'], 'Charater Name', str),
|
||||||
|
(['Actor'], 'Actor Name', str),
|
||||||
|
(['CN'], 'Character Number', str),
|
||||||
|
(['R'], 'Reason', str),
|
||||||
|
(['Rq'], 'Requested by', str),
|
||||||
|
(['Spot'], 'Spot', str),
|
||||||
|
(['event_name', 'Line'], 'Line', str),
|
||||||
|
(['Shot'], 'Shot', str),
|
||||||
|
(['Note'], 'Note', str),
|
||||||
|
(['Mins'], 'Time Budget Mins', float),
|
||||||
|
(['EFF'], 'Effort', str),
|
||||||
|
(['TV'], 'TV', str),
|
||||||
|
(['TBW'], 'To Be Written', str),
|
||||||
|
(['OMIT'], 'Omit', str),
|
||||||
|
(['ADLIB'], 'Adlib', str),
|
||||||
|
(['OPT'], 'Optional', str))
|
||||||
|
|
||||||
|
doc.start('FMPXMLRESULT', {'xmlns': 'http://www.filemaker.com/fmpxmlresult'})
|
||||||
|
|
||||||
|
doc.start('ERRORCODE')
|
||||||
|
doc.data('0')
|
||||||
|
doc.end('ERRORCODE')
|
||||||
|
|
||||||
|
doc.start('PRODUCT', {'NAME': 'ptulsconv', 'VERSION': '0.0.1'})
|
||||||
|
doc.end('PRODUCT')
|
||||||
|
|
||||||
|
doc.start('DATABASE', {'DATEFORMAT': 'MM/dd/yy', 'LAYOUT':'summary', 'TIMEFORMAT':'hh:mm:ss',
|
||||||
|
'RECORDS': str(len(data['events'])), 'NAME': 'OUTPUT'})
|
||||||
|
doc.end('DATABASE')
|
||||||
|
|
||||||
|
doc.start('METADATA')
|
||||||
|
for field in field_map:
|
||||||
|
tp = field[2]
|
||||||
|
ft = 'TEXT'
|
||||||
|
if tp is int or tp is float:
|
||||||
|
ft = 'NUMBER'
|
||||||
|
|
||||||
|
doc.start('FIELD', {'EMPTYOK': 'YES',
|
||||||
|
'MAXREPEAT': '1',
|
||||||
|
'NAME': field[1],
|
||||||
|
'TYPE': ft })
|
||||||
|
|
||||||
|
doc.end('FIELD')
|
||||||
|
doc.end('METADATA')
|
||||||
|
|
||||||
|
doc.start('RESULTSET', {'FOUND': str(len(data['events'])) })
|
||||||
|
for event in data['events']:
|
||||||
|
doc.start('ROW')
|
||||||
|
for field in field_map:
|
||||||
|
doc.start('COL')
|
||||||
|
doc.start('DATA')
|
||||||
|
for key_attempt in field[0]:
|
||||||
|
if key_attempt in event.keys():
|
||||||
|
doc.data(event[key_attempt])
|
||||||
|
break
|
||||||
|
doc.end('DATA')
|
||||||
|
doc.end('COL')
|
||||||
|
doc.end('ROW')
|
||||||
|
doc.end('RESULTSET')
|
||||||
|
|
||||||
|
doc.end('FMPXMLRESULT')
|
||||||
|
docelem = doc.close()
|
||||||
|
xmlstr = tostring(docelem, encoding='unicode', method='xml')
|
||||||
|
output.write(xmlstr)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def convert(input_file, format='fmp', output=sys.stdout):
|
||||||
with open(input_file, 'r') as file:
|
with open(input_file, 'r') as file:
|
||||||
ast = ptulsconv.protools_text_export_grammar.parse(file.read())
|
ast = ptulsconv.protools_text_export_grammar.parse(file.read())
|
||||||
dict_parser = ptulsconv.DictionaryParserVisitor()
|
dict_parser = ptulsconv.DictionaryParserVisitor()
|
||||||
@@ -12,5 +91,8 @@ def convert(input_file, output=sys.stdout):
|
|||||||
tagxform = ptulsconv.transformations.TagInterpreter()
|
tagxform = ptulsconv.transformations.TagInterpreter()
|
||||||
|
|
||||||
final = tagxform.transform( tcxform.transform(parsed) )
|
final = tagxform.transform( tcxform.transform(parsed) )
|
||||||
|
if format == 'json':
|
||||||
|
json.dump(final, output)
|
||||||
|
elif format == 'fmp':
|
||||||
|
fmp_dump(final, output)
|
||||||
|
|
||||||
json.dump(final, output)
|
|
||||||
|
|||||||
@@ -149,12 +149,12 @@ class TagInterpreter:
|
|||||||
|
|
||||||
event.update(clip_tags['tags'])
|
event.update(clip_tags['tags'])
|
||||||
|
|
||||||
event['track_name'] = track_tags['line']
|
event['PT.Track.Name'] = track_tags['line']
|
||||||
event['session_name'] = title_tags['line']
|
event['PT.Session.Name'] = title_tags['line']
|
||||||
event['event_number'] = clip['event']
|
event['PT.Clip.Number'] = clip['event']
|
||||||
event['event_name'] = clip_tags['line']
|
event['event_name'] = clip_tags['line']
|
||||||
event['event_start_time'] = clip_start
|
event['PT.Clip.Start_Frames'] = clip_start
|
||||||
event['event_end_time'] = clip['end_time_decoded']['frame_count']
|
event['PT.Clip.End_Frames'] = clip['end_time_decoded']['frame_count']
|
||||||
transformed.append(event)
|
transformed.append(event)
|
||||||
|
|
||||||
elif clip_tags['mode'] == 'Append':
|
elif clip_tags['mode'] == 'Append':
|
||||||
@@ -162,7 +162,7 @@ class TagInterpreter:
|
|||||||
|
|
||||||
transformed[-1].update(clip_tags['tags'])
|
transformed[-1].update(clip_tags['tags'])
|
||||||
transformed[-1]['event_name'] = transformed[-1]['event_name'] + " " + clip_tags['line']
|
transformed[-1]['event_name'] = transformed[-1]['event_name'] + " " + clip_tags['line']
|
||||||
transformed[-1]['event_end_time'] = clip['end_time_decoded']['frame_count']
|
transformed[-1]['PT.Clip.End_Frames'] = clip['end_time_decoded']['frame_count']
|
||||||
|
|
||||||
elif clip_tags['mode'] == 'Timespan':
|
elif clip_tags['mode'] == 'Timespan':
|
||||||
rule = dict(start_time=clip_start,
|
rule = dict(start_time=clip_start,
|
||||||
|
|||||||
Reference in New Issue
Block a user