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
Beispiel #2
0
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
Beispiel #3
0
    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("时间偏移表为空")