Exemplo n.º 1
0
    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("调整成功")
Exemplo n.º 2
0
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)