From 8069932efad6d044d8ad5e697652ad4cbe556c1c Mon Sep 17 00:00:00 2001 From: Jamie Hardt Date: Tue, 8 Oct 2019 20:43:17 -0700 Subject: [PATCH] FMP XML output implementation --- ptulsconv/commands.py | 86 +++++++++++++++++++++++++++++++++++- ptulsconv/transformations.py | 12 ++--- 2 files changed, 90 insertions(+), 8 deletions(-) diff --git a/ptulsconv/commands.py b/ptulsconv/commands.py index fb2c7b0..3725056 100644 --- a/ptulsconv/commands.py +++ b/ptulsconv/commands.py @@ -2,7 +2,86 @@ import ptulsconv import json 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: ast = ptulsconv.protools_text_export_grammar.parse(file.read()) dict_parser = ptulsconv.DictionaryParserVisitor() @@ -12,5 +91,8 @@ def convert(input_file, output=sys.stdout): tagxform = ptulsconv.transformations.TagInterpreter() final = tagxform.transform( tcxform.transform(parsed) ) + if format == 'json': + json.dump(final, output) + elif format == 'fmp': + fmp_dump(final, output) - json.dump(final, output) diff --git a/ptulsconv/transformations.py b/ptulsconv/transformations.py index 696471c..c317c4c 100644 --- a/ptulsconv/transformations.py +++ b/ptulsconv/transformations.py @@ -149,12 +149,12 @@ class TagInterpreter: event.update(clip_tags['tags']) - event['track_name'] = track_tags['line'] - event['session_name'] = title_tags['line'] - event['event_number'] = clip['event'] + event['PT.Track.Name'] = track_tags['line'] + event['PT.Session.Name'] = title_tags['line'] + event['PT.Clip.Number'] = clip['event'] event['event_name'] = clip_tags['line'] - event['event_start_time'] = clip_start - event['event_end_time'] = clip['end_time_decoded']['frame_count'] + event['PT.Clip.Start_Frames'] = clip_start + event['PT.Clip.End_Frames'] = clip['end_time_decoded']['frame_count'] transformed.append(event) elif clip_tags['mode'] == 'Append': @@ -162,7 +162,7 @@ class TagInterpreter: transformed[-1].update(clip_tags['tags']) 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': rule = dict(start_time=clip_start,