def shift(source_sub_path, target_sub_path, timedelta=None, timemap_=None, diff_delta_handler=SHIFT_APART, source_media_path=None, target_media_path=None, playertype=None): """平移一个字幕的时间轴 source_sub_path 源字幕路径 target_sub_path 目标字幕路径 source_media_path 源媒体路径 target_media_path 目标媒体路径 timedelta 时间偏移表 timemap_ 时间映射表 当 timedelta 为 None 时会使用 timemap_ 生成 timedelta diff_delta_handler 开始时间与结束时间偏移量不同时的处理方式 """ if timedelta is None: timedelta = timemap.normalize(timemap_) player_name = player.getplayer(playertype).name if playertype else None subs = Subtitle(source_sub_path) subs.shift(timedelta, diff_delta_handler) subs.set_resync_info(source_media_path, target_media_path, player_name) subs.save_as(target_sub_path)
# -*- coding: utf-8 -*- from itertools import zip_longest from subsync import player, config from subsync.time import Time, is_approx_equal tolerance = player.getplayer(config.playertype).timedelta_tolerance def normalize(timemap): """一般化时间映射表,生成时间偏移表""" timemap = [item for item in timemap if 1 <= len(item) <= 2] timedelta = [] for item, next_ in zip_longest(timemap, timemap[1:], fillvalue=[Time(h=100)]): if len(item) == 2 and item[1] is not None: timedelta.append({'delta': item[1]-item[0], 'until': next_[0]}) averaged = [] while timedelta: i = 0 for (i, item), next_ in zip_longest(enumerate(timedelta), timedelta[1:]): if next_ and not is_approx_equal(item['delta'], next_['delta'], tolerance): break average_delta = sum(map(lambda x: x['delta'], timedelta[:i+1]), Time.zero) / (i+1) if abs(average_delta.ms_time) < tolerance: average_delta = Time.zero averaged.append({'delta': average_delta, 'until': timedelta[i]['until']}) timedelta = timedelta[i+1:] return averaged
# -*- coding: utf-8 -*- import logging from itertools import cycle from PyQt5.QtCore import Qt, pyqtSignal, QItemSelectionModel from PyQt5.QtGui import QKeySequence, QColor, QBrush from PyQt5.QtWidgets import QDialog, QTableWidgetItem, QHeaderView, QMessageBox from pygs import QxtGlobalShortcut from subsync import config, player, time from subsync.time import Time from subsync.gui.timemapper_ui import Ui_FormTimeMapper Player = player.getplayer(config.playertype) class FormTimeMapper(QDialog, Ui_FormTimeMapper): finished = pyqtSignal(list) def __init__(self, filetypes, filepaths, callback=None): super(FormTimeMapper, self).__init__() self.setupUi(self) self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint) self.move(0, 0) self.ct_table.setRowCount(0) self.ct_table.setColumnCount(len(filepaths)) self.ct_table.horizontalHeader().setSectionResizeMode(