def _is_same_time_delta(self, times1, times2): # 所用项目非空(都是映射而不是分段) if all(times1) and all(times2): # 时间差在允许的范围内 delta = [time1-time2 for time1, time2 in zip(times1, times2)] if time.is_approx_equal(min(delta), max(delta), Player.timedelta_tolerance): return True return False
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
def shift(self, timedelta=None, diff_delta_handler=SHIFT_APART): """根据时间偏移表 timedelta 平移字幕的时间轴 diff_delta_handler 开始时间与结束时间偏移量不同时的处理方式 """ self._timedelta = timedelta if len(timedelta) > 0: for line in self._subs: # 确定这条字幕的起止时间对应的偏移量 delta_start = next(x for x in timedelta if line.start < x['until'])['delta'] delta_end = next(x for x in timedelta if line.end < x['until'])['delta'] # 处理起止时间偏移量不同 if not time.is_approx_equal(delta_start, delta_end): logging.warning("字幕 {} 的开始时间与结束时间平移量不同".format(str(line))) if diff_delta_handler == SHIFT_FAILED: raise Exception("开始时间与结束时间平移量不同") elif diff_delta_handler == SHIFT_APART: pass elif diff_delta_handler == SHIFT_BY_START: delta_end = delta_start elif diff_delta_handler == SHIFT_BY_END: delta_start = delta_end # 平移! line.start += delta_start line.end += delta_end # 处理平移后时间小于 0 is_not_zero_length = line.start != line.end # 对 0 时长的字幕不发出警告 if line.start < Time.zero: line.start = Time.zero if is_not_zero_length: logging.warning("字幕 {} 的开始时间平移后小于0".format(str(line))) if line.end < Time.zero: line.end = Time.zero if is_not_zero_length: logging.warning("字幕 {} 的结束时间平移后小于0".format(str(line))) else: logging.warning("时间偏移表为空")