3 Commits

Author SHA1 Message Date
Jamie Hardt
6fe0ff4314 Merge branch 'master' of https://github.com/iluvcapra/ptulsconv 2019-10-12 12:38:24 -07:00
Jamie Hardt
a23119eb8c Tagging tests, fixed bug with append 2019-10-12 12:38:20 -07:00
Jamie Hardt
af29318a0c Update __main__.py
command tweaks
2019-10-12 10:11:27 -07:00
5 changed files with 177 additions and 6 deletions

View File

@@ -1,6 +1,6 @@
from ptulsconv.commands import convert, dump_field_map from ptulsconv.commands import convert, dump_field_map
from ptulsconv import __version__, __author__ from ptulsconv import __name__, __version__, __author__
from optparse import OptionParser from optparse import OptionParser, OptionGroup
from .reporting import print_status_style, print_banner_style, print_section_header_style, print_fatal_error from .reporting import print_status_style, print_banner_style, print_section_header_style, print_fatal_error
import datetime import datetime
import sys import sys
@@ -8,6 +8,7 @@ import sys
def main(): def main():
parser = OptionParser() parser = OptionParser()
parser.usage = "ptulsconv TEXT_EXPORT.txt" parser.usage = "ptulsconv TEXT_EXPORT.txt"
parser.add_option('-i', dest='in_time', help="Don't output events occurring before this timecode, and offset" parser.add_option('-i', dest='in_time', help="Don't output events occurring before this timecode, and offset"
" all events relative to this timecode.", metavar='TC') " all events relative to this timecode.", metavar='TC')
parser.add_option('-o', dest='out_time', help="Don't output events occurring after this timecode.", metavar='TC') parser.add_option('-o', dest='out_time', help="Don't output events occurring after this timecode.", metavar='TC')
@@ -16,13 +17,13 @@ def main():
parser.add_option('-m', '--include-muted', default=False, action='store_true', dest='include_muted', parser.add_option('-m', '--include-muted', default=False, action='store_true', dest='include_muted',
help='Read muted clips.') help='Read muted clips.')
parser.add_option('--show-tags', dest='show_tags', parser.add_option('--show-available-tags', dest='show_tags',
action='store_true', action='store_true',
default=False, help='Display tag mappings for the FMP XML output style and exit.') default=False, help='Display tag mappings for the FMP XML output style and exit.')
(options, args) = parser.parse_args(sys.argv) (options, args) = parser.parse_args(sys.argv)
print_banner_style("ptulsconv %s (c) 2019 %s. All rights reserved." % (__version__, __author__)) print_banner_style("%s %s (c) 2019 %s. All rights reserved." % (__name__, __version__, __author__))
print_section_header_style("Startup") print_section_header_style("Startup")
print_status_style("This run started %s" % (datetime.datetime.now().isoformat() ) ) print_status_style("This run started %s" % (datetime.datetime.now().isoformat() ) )

View File

@@ -191,8 +191,11 @@ class TagInterpreter(Transformation):
assert len(transformed) > 0, "First clip is in '&'-Append mode, fatal error." assert len(transformed) > 0, "First clip is in '&'-Append mode, fatal error."
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]['PT.Clip.Name'] = transformed[-1]['PT.Clip.Name'] + " " + clip_tags['line']
transformed[-1]['PT.Clip.End_Frames'] = clip['end_time_decoded']['frame_count'] 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': elif clip_tags['mode'] == 'Timespan':
rule = dict(start_time=clip_start, rule = dict(start_time=clip_start,

Binary file not shown.

View File

@@ -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

67
tests/test_tagging.py Normal file
View File

@@ -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()