mirror of
https://github.com/iluvcapra/ptulsconv.git
synced 2025-12-31 08:50:48 +00:00
Transformations and commands
This commit is contained in:
@@ -1,2 +1,3 @@
|
|||||||
from .ptuls_grammar import protools_text_export_grammar
|
from .ptuls_grammar import protools_text_export_grammar
|
||||||
from .ptuls_parser_visitor import DictionaryParserVisitor
|
from .ptuls_parser_visitor import DictionaryParserVisitor
|
||||||
|
from .transformations import TimecodeInterpreter
|
||||||
21
ptulsconv/commands.py
Normal file
21
ptulsconv/commands.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
import ptulsconv
|
||||||
|
import json
|
||||||
|
import sys
|
||||||
|
|
||||||
|
def convert(input_file, convert_times, apply_session_start, output=sys.stdout):
|
||||||
|
parsed = dict()
|
||||||
|
with open(input_file, 'r') as file:
|
||||||
|
ast = ptulsconv.protools_text_export_grammar.parse(file.read())
|
||||||
|
dict_parser = ptulsconv.DictionaryParserVisitor()
|
||||||
|
parsed = dict_parser.visit(ast)
|
||||||
|
|
||||||
|
if convert_times:
|
||||||
|
xform = ptulsconv.transformations.TimecodeInterpreter()
|
||||||
|
xform.apply_session_start = apply_session_start
|
||||||
|
parsed = xform.transform(parsed)
|
||||||
|
|
||||||
|
json.dump(parsed, output)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -83,7 +83,6 @@ class DictionaryParserVisitor(NodeVisitor):
|
|||||||
states = []
|
states = []
|
||||||
for next_state in visited_children:
|
for next_state in visited_children:
|
||||||
states.append(next_state[0][0].text)
|
states.append(next_state[0][0].text)
|
||||||
|
|
||||||
return states
|
return states
|
||||||
|
|
||||||
def visit_track_clip_state(self, node, visited_children):
|
def visit_track_clip_state(self, node, visited_children):
|
||||||
|
|||||||
66
ptulsconv/transformations.py
Normal file
66
ptulsconv/transformations.py
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
from timecode import Timecode, TimecodeError
|
||||||
|
|
||||||
|
class Transformation:
|
||||||
|
def transform(self, input_dict) -> dict:
|
||||||
|
return input_dict
|
||||||
|
|
||||||
|
|
||||||
|
class TimecodeInterpreter(Transformation):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.apply_session_start = False
|
||||||
|
|
||||||
|
def transform(self, input_dict: dict) -> dict:
|
||||||
|
retval = super().transform(input_dict)
|
||||||
|
rate = input_dict['header']['timecode_format']
|
||||||
|
start_tc = self.convert_time(input_dict['header']['start_timecode'],
|
||||||
|
rate, offset=None)
|
||||||
|
|
||||||
|
retval['header']['start_timecode_decoded'] = start_tc
|
||||||
|
convert_start_tc = None
|
||||||
|
if self.apply_session_start is True:
|
||||||
|
convert_start_tc = Timecode(framerate=input_dict['header']['timecode_format'],
|
||||||
|
start_timecode=input_dict['header']['start_timecode'])
|
||||||
|
|
||||||
|
retval['tracks'] = self.convert_tracks(input_dict['tracks'], timecode_rate=rate,
|
||||||
|
session_start=convert_start_tc)
|
||||||
|
|
||||||
|
|
||||||
|
for marker in retval['markers']:
|
||||||
|
marker['location_decoded'] = self.convert_time(marker['location'], rate,
|
||||||
|
convert_start_tc)
|
||||||
|
return retval
|
||||||
|
|
||||||
|
def convert_tracks(self, tracks, timecode_rate, session_start):
|
||||||
|
for track in tracks:
|
||||||
|
new_clips = []
|
||||||
|
for clip in track['clips']:
|
||||||
|
new_clips.append( self.convert_clip( clip ,
|
||||||
|
timecode_rate= timecode_rate,
|
||||||
|
session_start=session_start ))
|
||||||
|
|
||||||
|
track['clips'] = new_clips
|
||||||
|
return tracks
|
||||||
|
|
||||||
|
def convert_clip(self, clip, timecode_rate, session_start):
|
||||||
|
time_fields = ['start_time', 'end_time', 'duration', 'timestamp']
|
||||||
|
|
||||||
|
for time_field in time_fields:
|
||||||
|
if clip[time_field] is not None:
|
||||||
|
if time_field == 'duration':
|
||||||
|
clip[time_field + "_decoded"] = self.convert_time(clip[time_field],
|
||||||
|
framerate=timecode_rate, offset=None)
|
||||||
|
else:
|
||||||
|
clip[time_field + "_decoded"] = self.convert_time(clip[time_field],
|
||||||
|
framerate=timecode_rate, offset=session_start)
|
||||||
|
|
||||||
|
return clip
|
||||||
|
|
||||||
|
def convert_time(self, time_string, framerate, offset= None):
|
||||||
|
tc = Timecode(framerate=framerate, start_timecode=time_string)
|
||||||
|
if offset is not None:
|
||||||
|
tc = tc - offset
|
||||||
|
|
||||||
|
return dict(frames=tc.frames, framrate= framerate, seconds= (float(tc.frames) / float(tc.framerate)))
|
||||||
|
|
||||||
|
|
||||||
@@ -90,6 +90,21 @@ class TestRobinHood1(unittest.TestCase):
|
|||||||
self.assertEqual(parsed['markers'][0]['time_reference'], 0)
|
self.assertEqual(parsed['markers'][0]['time_reference'], 0)
|
||||||
self.assertEqual(parsed['markers'][0]['units'], "Samples")
|
self.assertEqual(parsed['markers'][0]['units'], "Samples")
|
||||||
|
|
||||||
|
def test_transform_timecode(self):
|
||||||
|
parsed = dict()
|
||||||
|
with open(self.path, 'r') as f:
|
||||||
|
visitor = ptulsconv.DictionaryParserVisitor()
|
||||||
|
result = ptulsconv.protools_text_export_grammar.parse(f.read())
|
||||||
|
parsed = visitor.visit(result)
|
||||||
|
|
||||||
|
xformer = ptulsconv.TimecodeInterpreter()
|
||||||
|
xformer.apply_session_start = True
|
||||||
|
|
||||||
|
xformed = xformer.transform(parsed)
|
||||||
|
|
||||||
|
pprint.pprint(xformed)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|||||||
Reference in New Issue
Block a user