def start_resync(self): # 文件列表 types, trees = zip(*self.ct_trees) if min([x.topLevelItemCount() for x in trees]) < 1: QMessageBox.critical(self, "错误", "文件列表中没有文件") return videos = [x.topLevelItem(0).filename for x in trees] # 获取时间映射表 try: self.hide() timemapper = FormTimeMapper(types, videos) timemapper.exec() finally: self.show() self.activateWindow() # 准备文件名 videos_src = [] videos_dst = [] timelists_src = [] timelists_dst = [] subtitless_src = [] for type_, tree, video, timelist in \ zip(types, trees, videos, timemapper.timemap): if type_ == 'src': videos_src.append(video) timelists_src.append(timelist) subtitless_src.append([x.filename for x in tree.topLevelItem(0).children()]) else: videos_dst.append(video) timelists_dst.append(timelist) tree.takeTopLevelItem(0) for video_dst, timelist_dst in zip(videos_dst, timelists_dst): for video_src, timelist_src, subtitles_src in \ zip(videos_src, timelists_src, subtitless_src): timedelta = timemap.normalize(zip(timelist_src, timelist_dst)) for sub_src in subtitles_src: # 生成字幕文件名 video_src_mainname = os.path.splitext(os.path.split(video_src)[1])[0] sub_src_name = os.path.split(sub_src)[1] video_dst_mainname = os.path.splitext(os.path.split(video_dst)[1])[0] if sub_src_name.startswith(video_src_mainname): sub_dst_name = video_dst_mainname + sub_src_name[len(video_src_mainname):] else: sub_dst_name = sub_src_name sub_dst = os.path.join(os.path.dirname(video_dst), sub_dst_name) # 调整字幕 subtitle.shift(sub_src, sub_dst, timedelta, None, None, video_src, video_dst, config.playertype) self.statusBar().showMessage("调整成功")
def run(args=sys.argv): class ArgumentParser(argparse.ArgumentParser): def format_usage(self): return argparse.ArgumentParser.format_usage(self) \ .replace("usage:", "用法:") def format_help(self): return argparse.ArgumentParser.format_help(self) \ .replace("usage:", "用法:") \ .replace("positional arguments:", "参数:") \ .replace("\n\noptional arguments:", "") \ .replace("show this help message and exit", "显示此帮助并退出") parser = ArgumentParser( description='根据时间映射表调整字幕时间轴', epilog="""\ """, formatter_class=argparse.RawTextHelpFormatter) parser.add_argument('timemap', help="时间映射表文件名") parser.add_argument('source', help="原始字幕文件") parser.add_argument('result', help="调整后的字幕文件") parser.add_argument('-l', '--loglevel', default='info', choices=['none', 'error', 'warning', 'info', 'debug'], help="输出信息的等级,默认为 info") parser.add_argument('-d', '--diffdeltahandle', default='apart', choices=['falied', 'apart', 'start', 'end'], help="开始结束时间调整量不同的处理方法,默认为 apart") args = parser.parse_args(args) ftm = args.timemap fni = args.source fno = args.result loglevel = getattr(logging, args.loglevel.upper(), logging.CRITICAL) logging.basicConfig(format='%(levelname)s\t: %(message)s', level=loglevel) diffdeltahandledict = { 'falied': subtitle.SHIFT_FAILED, 'apart': subtitle.SHIFT_APART, 'start': subtitle.SHIFT_BY_START, 'end': subtitle.SHIFT_BY_END, } diff_delta_handler = diffdeltahandledict[args.diffdeltahandle] timemap = [] with open(ftm, encoding='utf-8') as f: for line in f: timemap.append([Time(x) for x in line.split()]) subtitle.shift(fni, fno, None, timemap, diff_delta_handler)