示例#1
0
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)
示例#2
0
# -*- 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
示例#3
0
# -*- 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(