#!/usr/bin/env python
# From http://www.dwerg.net/projects/python/srttool.py
# Converts MicroDVD Scripts into CMML
# More information at http://trac.annodex.net/wiki/CmmlSubtitles
## Copyright (C) 2004- Commonwealth Scientific and Industrial Research
## Organisation (CSIRO) Australia
##
## Redistribution and use in source and binary forms, with or without
## modification, are permitted provided that the following conditions
## are met:
##
## - Redistributions of source code must retain the above copyright
## notice, this list of conditions and the following disclaimer.
##
## - Redistributions in binary form must reproduce the above copyright
## notice, this list of conditions and the following disclaimer in the
## documentation and/or other materials provided with the distribution.
##
## - Neither the name of CSIRO Australia nor the names of its
## contributors may be used to endorse or promote products derived from
## this software without specific prior written permission.
##
## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
## ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
## PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ORGANISATION OR
## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
## EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
## PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
## PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
## LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
## NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import re
import sys
import math
global savecmml
global id
class CorruptMicError(Exception):
"""
The MicroDVD File is incorrectly formatted
"""
pass
def time_calculation(seconds, amt_in_sec):
val = seconds / amt_in_sec
val_rounded = math.floor(val)
secs_remainder = (val * amt_in_sec) - (val_rounded * amt_in_sec)
return (val_rounded, secs_remainder)
def convert_timeperiod(frame, fps):
try:
totalsec = frame / fps
(hours, secs_remainder) = time_calculation(totalsec, 3600)
(minutes, secs_remainder) = time_calculation(secs_remainder, 60)
(secs, millisecs) = time_calculation(secs_remainder, 1)
millisecs = round(millisecs*1000)
timeperiod = '%(val1)02d:%(val2)02d:%(val3)02d.%(val4)03d' % {'val1':hours, 'val2':minutes, 'val3':secs, 'val4':millisecs}
return timeperiod
except IndexError:
raise CorruptMicError("Corrupt Frame Format")
def convert_block(lines, fps):
global savecmml
global id
finalmsg = ''
for line in lines:
parts = line.split('}')
startframe = parts[0].replace('{', '')
endframe = parts[1].replace('{', '')
sframe = float(startframe)
eframe = float(endframe)
start = convert_timeperiod(sframe, fps)
end = convert_timeperiod(eframe, fps)
messages = parts[2].split('|')
for message in messages:
finalmsg += ' ' + message + '\n'
savecmml += '\n' % (id, start, end)
savecmml += ' \n'
savecmml += finalmsg
savecmml += ' \n'
savecmml += '\n'
finalmsg = ''
id += 1
def convert_clips(file, fps):
current = []
for line in file:
if not line.strip():
convert_block(current, fps)
current = []
else:
current.append(line.strip())
def convert_mic(file, fps):
global savecmml
global id
id = 1
savecmml = '\n'
savecmml += '\n'
savecmml += ' ' + sys.argv[1] + '\n'
savecmml += '\n'
convert_clips (file, fps)
savecmml += '\n'
if __name__ == '__main__':
global savecmml
fps = None
print 'Frames-per-Second of Video Required:\nEnter Frames-per-Second:'
while not fps:
try:
fps = float(raw_input())
except ValueError:
print 'Invalid FPS Entered. Try Again.'
try:
try:
filesave = open(sys.argv[2], 'w')
convert_mic(file(sys.argv[1]), fps)
filesave.write(savecmml)
filesave.close()
except IndexError:
convert_mic(file(sys.argv[1]), fps)
print savecmml
except IndexError:
print "Usage: %s [Input MicroDVD File] [Output CMML File]" % sys.argv[0]