小工具: 调整外置文本字幕的时间

有时外置字幕的版本与现有版本不对应,会造成字幕显示时间不匹配。本文用python写了一个小工具,用来调整srt字幕的时间。暂未实现其他字幕格式的支持,可以参考本文自行添加。

import os
import sys
import argparse
from datetime import datetime,timedelta
import pathlib
import codecs

from abc import abstractmethod

class subtitle_item(object):
    def __init__(self):
        super().__init__()
        self.index = 0
        self.stime = 0
        self.etime = 0
        self.text = ''

class subtitle_imp(object):
    def __init__(self) -> None:
        super().__init__()
        self._subItems = []

    @abstractmethod
    def load_file(self,input_file):
        pass
    @abstractmethod
    def save_file(self,output_file = None):
        pass

    def adjust_time(self,ad_time):
        for sub_tmp in self._subItems:
            sub_tmp.stime += timedelta(seconds=ad_time)
            sub_tmp.etime += timedelta(seconds=ad_time)

    def set_sub_items(self,items):
        self._subItems = items
    def get_sub_items(self):
        return self._subItems

class srt_sub_imp(subtitle_imp):
    def __init__(self):
        super().__init__()

    def parse(self,item_strs):
        srt_item = subtitle_item()
        srt_item.index = int(item_strs[0])
        srt_item.text = item_strs[2]

        time_strs = item_strs[1].split("-->")

        srt_item.stime = datetime.strptime(time_strs[0].strip(),"%H:%M:%S,%f")
        srt_item.etime = datetime.strptime(time_strs[1].strip(),"%H:%M:%S,%f")
        return srt_item

    def load_file(self,input_file):
        rlines =[]
        with open(input_file,'r',encoding='utf8') as f:
            rlines = f.readlines()
        
        data = rlines[0].encode(encoding = "utf-8")
        if data[:3] == codecs.BOM_UTF8:
            rlines[0] = data[3:].decode(encoding = "utf-8")
        i =0
        while i <  len(rlines):
            if rlines[i].strip() == '':
                i +=1
                continue

            srt_strs = []
            srt_strs.append(rlines[i].strip())
            i+=1
            srt_strs.append(rlines[i].strip())
            i +=1

            text_str = ''
            while rlines[i].strip() !='':
                text_str = text_str+rlines[i]
                i+=1
            srt_strs.append(text_str)

            self._subItems.append(self.parse(srt_strs))


    def save_file(self,output_file = None):
        with open(output_file,'w',encoding='utf8') as f:
            for sub_tmp in self._subItems:
                f.write("%d\n"%(sub_tmp.index))
                f.write("%s --> %s \n"%(sub_tmp.stime.strftime("%H:%M:%S,%f")[:-3],
                   sub_tmp.etime.strftime("%H:%M:%S,%f")[:-3]))
                f.write("%s\n"%(sub_tmp.text))

def gen_subtitle_imp_by_name(filename):
    filterstr = pathlib.Path(filename).suffix
    if filterstr == '.srt':
        return srt_sub_imp()
    else:
        return None

def init_arg_table():
    '''init argument table,return args.'''
    parse = argparse.ArgumentParser(description="subtitle tools.",
        epilog="Author: renyi.zhang <renyi.zhang@amlogic.com>",fromfile_prefix_chars='@')
    
    parse.add_argument('-i','--input',type=str,required=True,
        dest='inputfile',help='input subtitle file')
    parse.add_argument('-o','--output',default='',type=str,required=False,
        dest='outputfile',help='output subtitle file')
    parse.add_argument('-t','--time',default=0,type=float,required=False,dest='ad_time',
        help='adjustment time.')
    
    return parse.parse_args()

if __name__ == '__main__':
    args = init_arg_table()

    if not os.path.isfile(args.inputfile):
        print(args.inputfile+" isn't exist.\n")
        sys.exit(-1)

    if args.outputfile == '':
        args.outputfile = args.inputfile

    sub_imp = gen_subtitle_imp_by_name(args.inputfile)
    if sub_imp is None:
        print(args.inputfile+'is invalid subtitle file.\n')
        sys.exit(-1)

    sub_imp.load_file(args.inputfile)

    if args.ad_time !=0:
        sub_imp.adjust_time(args.ad_time)
    
    if pathlib.Path(args.inputfile).suffix == pathlib.Path(args.outputfile).suffix:
        sub_imp.save_file(args.outputfile)
    else:
        print("other format will support later..\n")

    print("save file to  %s  finished.\n "%(args.outputfile))

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值