Skip to content

Instantly share code, notes, and snippets.

@byroot
Created May 12, 2012 14:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save byroot/2667002 to your computer and use it in GitHub Desktop.
Save byroot/2667002 to your computer and use it in GitHub Desktop.
import argparse
from pysrt import SubRipFile, SubRipItem, SubRipTime
parser = argparse.ArgumentParser(description='Merge 2 srt files.')
parser.add_argument('fin', type=str, nargs=2,
help='input file')
parser.add_argument(dest='fout', type=str, nargs=1,
help='the output file')
args = parser.parse_args()
master = args.fin[0]
slave = args.fin[1]
result = args.fout[0]
msubs = SubRipFile.open (master, encoding='iso-8859-1')
ssubs = SubRipFile.open (slave, encoding='iso-8859-1')
rsubs = SubRipFile.from_string ("", encoding='iso-8859-1')
tp = SubRipTime()
for msub in msubs:
#"start before, ends before"
for ssub in ssubs.slice (starts_after=tp, ends_before=msub.start):
rsubs.append (SubRipItem(index=len(rsubs), start=ssub.start, end=ssub.end, text=ssub.text))
ssubs.remove (ssub) # remove as completely handled.
tp = msub.start
#"start before; ends before end of master sub"
for ssub in ssubs.slice (starts_before=msub.start, ends_after=msub.start):
rsubs.append (SubRipItem(index=len(rsubs), start=ssub.start, end=msub.start, text=ssub.text))
rsubs.append (SubRipItem(index=len(rsubs), start=msub.start, end=ssub.end, text=ssub.text))
rsubs.append (SubRipItem(index=len(rsubs), start=msub.start, end=ssub.end, text=msub.text))
ssubs.remove (ssub) # remove as completely handled.
tp = ssub.end
#"start during; ends before master"
for ssub in ssubs.slice (starts_after=msub.start, ends_before=msub.end):
if (tp != ssub.start):
rsubs.append (SubRipItem(index=len(rsubs), start=tp, end=ssub.start, text=msub.text))
rsubs.append (SubRipItem(index=len(rsubs), start=ssub.start, end=ssub.end, text=ssub.text))
rsubs.append (SubRipItem(index=len(rsubs), start=ssub.start, end=ssub.end, text=msub.text))
tp = ssub.end
ssubs.remove (ssub) # remove as completely handled.
#"start during; ends after master"
for ssub in ssubs.slice (starts_before=msub.end, ends_after=msub.end):
rsubs.append (SubRipItem(index=len(rsubs), start=ssub.start, end=msub.end, text=ssub.text))
rsubs.append (SubRipItem(index=len(rsubs), start=msub.end, end=ssub.end, text=ssub.text))
rsubs.append (SubRipItem(index=len(rsubs), start=ssub.start, end=msub.end, text=msub.text))
ssubs.remove (ssub) # remove as completely handled.
tp = msub.end
if (tp != msub.end):
if (tp.ordinal < msub.start.ordinal):
tp = msub.start
rsubs.append (SubRipItem(index=len(rsubs), start=tp, end=msub.end, text=msub.text))
tp = msub.end
rsubs.sort(key=lambda SubRipItem: SubRipItem.start.ordinal)
for idx, rsub in enumerate(rsubs):
rsub.index = idx
rsubs.save (result, encoding='iso-8859-1')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment