diff --git a/ptulsconv/transformations.py b/ptulsconv/transformations.py index 827aaac..e53e241 100644 --- a/ptulsconv/transformations.py +++ b/ptulsconv/transformations.py @@ -191,8 +191,11 @@ class TagInterpreter(Transformation): assert len(transformed) > 0, "First clip is in '&'-Append mode, fatal error." transformed[-1].update(clip_tags['tags']) - transformed[-1]['event_name'] = transformed[-1]['event_name'] + " " + clip_tags['line'] - transformed[-1]['PT.Clip.End_Frames'] = clip['end_time_decoded']['frame_count'] + transformed[-1]['PT.Clip.Name'] = transformed[-1]['PT.Clip.Name'] + " " + clip_tags['line'] + transformed[-1]['PT.Clip.Finish_Frames'] = clip['end_time_decoded']['frame_count'] + transformed[-1]['PT.Clip.Finish'] = clip['end_time'] + transformed[-1]['PT.Clip.Finish_Seconds'] = clip['end_time_decoded']['frame_count'] / input_dict['header'][ + 'timecode_format'] elif clip_tags['mode'] == 'Timespan': rule = dict(start_time=clip_start, diff --git a/tests/export_cases/Tag Tests/Tag Tests.ptx b/tests/export_cases/Tag Tests/Tag Tests.ptx new file mode 100644 index 0000000..2cccc17 Binary files /dev/null and b/tests/export_cases/Tag Tests/Tag Tests.ptx differ diff --git a/tests/export_cases/Tag Tests/Tag Tests.txt b/tests/export_cases/Tag Tests/Tag Tests.txt new file mode 100644 index 0000000..9d69c66 --- /dev/null +++ b/tests/export_cases/Tag Tests/Tag Tests.txt @@ -0,0 +1,100 @@ +SESSION NAME: Tag Tests +SAMPLE RATE: 48000.000000 +BIT DEPTH: 24-bit +SESSION START TIMECODE: 01:00:00:00 +TIMECODE FORMAT: 23.976 Frame +# OF AUDIO TRACKS: 8 +# OF AUDIO CLIPS: 0 +# OF AUDIO FILES: 0 + + +P L U G - I N S L I S T I N G +MANUFACTURER PLUG-IN NAME VERSION FORMAT STEMS NUMBER OF INSTANCES + + +T R A C K L I S T I N G +TRACK NAME: Audio 1 +COMMENTS: +USER DELAY: 0 Samples +STATE: +PLUG-INS: +CHANNEL EVENT CLIP NAME START TIME END TIME DURATION STATE +1 1 Clip Name {X=300} 01:00:00:00 01:00:05:03 00:00:05:03 Unmuted + + +TRACK NAME: Audio 2 $A=1 +COMMENTS: +USER DELAY: 0 Samples +STATE: +PLUG-INS: +CHANNEL EVENT CLIP NAME START TIME END TIME DURATION STATE +1 1 Lorem ipsum {X=301} 01:00:00:00 01:00:05:03 00:00:05:03 Unmuted +1 2 Dolor sic amet {X=302} 01:00:10:00 01:00:20:00 00:00:10:00 Unmuted +1 3 & the rain in spain [ABC] 01:00:20:00 01:00:25:00 00:00:05:00 Unmuted + + +TRACK NAME: Audio 3 $A=2 +COMMENTS: {B=100} +USER DELAY: 0 Samples +STATE: +PLUG-INS: +CHANNEL EVENT CLIP NAME START TIME END TIME DURATION STATE +1 1 A 01:00:15:00 01:00:25:00 00:00:10:00 Unmuted +1 2 & B 01:00:25:00 01:00:35:00 00:00:10:00 Unmuted +1 3 & C 01:00:35:00 01:00:45:00 00:00:10:00 Unmuted + + +TRACK NAME: Audio 4 $A=3 +COMMENTS: $A=4 +USER DELAY: 0 Samples +STATE: +PLUG-INS: +CHANNEL EVENT CLIP NAME START TIME END TIME DURATION STATE +1 1 Silver Bridge 01:00:00:00 01:00:05:00 00:00:05:00 Unmuted + + +TRACK NAME: Audio 5 +COMMENTS: +USER DELAY: 0 Samples +STATE: +PLUG-INS: +CHANNEL EVENT CLIP NAME START TIME END TIME DURATION STATE +1 1 @ {D=100} 01:00:00:00 01:00:10:00 00:00:10:00 Unmuted +1 2 @ {D=101} 01:00:10:00 01:00:20:00 00:00:10:00 Unmuted +1 3 @ {D=102} 01:00:20:00 01:00:30:00 00:00:10:00 Unmuted + + +TRACK NAME: Audio 6 +COMMENTS: +USER DELAY: 0 Samples +STATE: +PLUG-INS: +CHANNEL EVENT CLIP NAME START TIME END TIME DURATION STATE +1 1 Region 02 01:00:02:00 01:00:03:00 00:00:01:00 Unmuted +1 2 Region 12 01:00:12:00 01:00:13:00 00:00:01:00 Unmuted +1 3 Region 22 01:00:22:00 01:00:23:00 00:00:01:00 Unmuted + + +TRACK NAME: Audio 7 +COMMENTS: +USER DELAY: 0 Samples +STATE: +PLUG-INS: +CHANNEL EVENT CLIP NAME START TIME END TIME DURATION STATE +1 1 @ {D=200} {E=101} 01:00:00:00 01:00:10:00 00:00:10:00 Unmuted + + +TRACK NAME: Audio 8 +COMMENTS: +USER DELAY: 0 Samples +STATE: +PLUG-INS: +CHANNEL EVENT CLIP NAME START TIME END TIME DURATION STATE +1 1 Region 04 01:00:04:00 01:00:05:00 00:00:01:00 Unmuted + + +M A R K E R S L I S T I N G +# LOCATION TIME REFERENCE UNITS NAME COMMENTS +3 01:00:05:00 240240 Samples Marker $M=0 +1 01:00:10:00 480480 Samples $M=1 +2 01:00:22:00 1057056 Samples $M=2 diff --git a/tests/test_tagging.py b/tests/test_tagging.py new file mode 100644 index 0000000..02a4376 --- /dev/null +++ b/tests/test_tagging.py @@ -0,0 +1,67 @@ +import unittest +import ptulsconv +import os.path + +class TaggingIntegratedTests(unittest.TestCase): + + path = os.path.dirname(__file__) + '/export_cases/Tag Tests/Tag Tests.txt' + + def test_append(self): + with open(self.path, 'r') as f: + visitor = ptulsconv.DictionaryParserVisitor() + result = ptulsconv.protools_text_export_grammar.parse(f.read()) + parsed: dict = visitor.visit(result) + + tcxform = ptulsconv.transformations.TimecodeInterpreter() + tagxform = ptulsconv.transformations.TagInterpreter(show_progress=False, + ignore_muted=True, + log_output=False) + + parsed = tcxform.transform(parsed) + parsed = tagxform.transform(parsed) + + self.assertTrue(len(parsed['events']) > 2) + + self.assertEqual("Dolor sic amet the rain in spain", + parsed['events'][2]['PT.Clip.Name']) + + self.assertTrue("01:00:10:00", parsed['events'][2]['PT.Clip.Start']) + self.assertTrue("01:00:25:00", parsed['events'][2]['PT.Clip.Finish']) + self.assertTrue(240, parsed['events'][2]['PT.Clip.Start_Frames']) + self.assertTrue(600, parsed['events'][2]['PT.Clip.Finish_Frames']) + + self.assertIn('X', parsed['events'][2].keys()) + self.assertIn('ABC', parsed['events'][2].keys()) + self.assertIn('A', parsed['events'][2].keys()) + self.assertEqual('302', parsed['events'][2]['X']) + self.assertEqual('ABC', parsed['events'][2]['ABC']) + self.assertEqual('1', parsed['events'][2]['A']) + + def test_successive_appends(self): + with open(self.path, 'r') as f: + visitor = ptulsconv.DictionaryParserVisitor() + result = ptulsconv.protools_text_export_grammar.parse(f.read()) + parsed: dict = visitor.visit(result) + + tcxform = ptulsconv.transformations.TimecodeInterpreter() + tagxform = ptulsconv.transformations.TagInterpreter(show_progress=False, + ignore_muted=True, + log_output=False) + + parsed = tcxform.transform(parsed) + parsed = tagxform.transform(parsed) + + self.assertTrue(len(parsed['events']) > 3) + + self.assertEqual("A B C", + parsed['events'][3]['PT.Clip.Name']) + + self.assertTrue("01:00:15:00", parsed['events'][3]['PT.Clip.Start']) + self.assertTrue("01:00:45:00", parsed['events'][3]['PT.Clip.Finish']) + self.assertTrue(80, parsed['events'][3]['PT.Clip.Start_Frames']) + self.assertTrue(1080, parsed['events'][3]['PT.Clip.Finish_Frames']) + + + +if __name__ == '__main__': + unittest.main()