Commit 17e3dec3 authored by 翟艳秋(20软)'s avatar 翟艳秋(20软)

Merge branch 'feat_1' of http://gitlab.uiiai.com/xuanweiace/accessibility_movie_2 into old_version

parents 12f22d5e 55693e69
云扬,男,年轻人 晓颜,女,年轻人
1.00(4字/秒) 1.25(5字/秒)
\ No newline at end of file \ No newline at end of file
class Content: class Content:
StartTimeColumn = 0 StartTimeColumn = 0
ActivateColumn = 2 AsideColumnNumber = 2
ActivateColumns = [2,3]
# ColumnCount = 3 # ColumnCount = 3
ObjectName = "all_tableWidget" ObjectName = "all_tableWidget"
TimeFormatColumns = [0]
class Aside: class Aside:
StartTimeColumn = 0 StartTimeColumn = 0
AsideColumnNumber = 3 AsideColumnNumber = 3
ActivateColumns = [3,4]
ObjectName = "pb_tableWidget" ObjectName = "pb_tableWidget"
TimeFormatColumns = [0,1]
class Subtitle: class Subtitle:
ObjectName = "zm_tableWidget" ObjectName = "zm_tableWidget"
TimeFormatColumns = [0,1]
import os import os
dir_path = os.path.dirname(os.path.abspath(__file__)) dir_path = os.path.dirname(os.path.abspath(__file__))
class Pathes: class Pathes:
......
...@@ -105,7 +105,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -105,7 +105,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.action_redo.triggered.connect(self.redo_slot) self.action_redo.triggered.connect(self.redo_slot)
self.action_view_history.triggered.connect(self.view_history_slot) self.action_view_history.triggered.connect(self.view_history_slot)
self.action_operate.triggered.connect(self.operate_slot) self.action_operate.triggered.connect(self.operate_slot)
self.action_insert_aside_from_now.triggered.connect(self.insert_aside_from_now_slot)
# 状态栏的动作 # 状态栏的动作
# self.statusbar.addPermanentWidget(self.statusbarButton, stretch=0) # self.statusbar.addPermanentWidget(self.statusbarButton, stretch=0)
...@@ -193,6 +193,8 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -193,6 +193,8 @@ class MainWindow(QMainWindow, Ui_MainWindow):
def import_slot(self): def import_slot(self):
video_path = self.openVideoFile().path() video_path = self.openVideoFile().path()
print("[import_slot] video_path=" + video_path) print("[import_slot] video_path=" + video_path)
if video_path == "" or video_path == None:
return
self.projectContext.Init(os.path.dirname(video_path), os.path.basename(video_path)) self.projectContext.Init(os.path.dirname(video_path), os.path.basename(video_path))
self.statusbar.showMessage("工程路径为:" + video_path) self.statusbar.showMessage("工程路径为:" + video_path)
...@@ -280,6 +282,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -280,6 +282,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
from narratage_detection import detect from narratage_detection import detect
self.refresh_tab_timer.start(10000) # 10秒一刷新
t = RunThread(funcName=detect, t = RunThread(funcName=detect,
args=(video_path, start_time, end_time, args=(video_path, start_time, end_time,
book_path, state, 1,self), book_path, state, 1,self),
...@@ -315,6 +318,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -315,6 +318,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.synthesis_timer.stop() self.synthesis_timer.stop()
else: else:
self.detect_timer.stop() self.detect_timer.stop()
self.refresh_tab_timer.stop()
print("===已有线程结束了 in %s ==="%(type)) print("===已有线程结束了 in %s ==="%(type))
self.statusbarLabel.setText(" %s完成"%(type)) self.statusbarLabel.setText(" %s完成"%(type))
self.progressBar.setValue(100) self.progressBar.setValue(100)
...@@ -380,7 +384,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -380,7 +384,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.init_previewed_audio() self.init_previewed_audio()
video_position = int((position / self.sld_video.maximum()) * self.player.duration()) video_position = int((position / self.sld_video.maximum()) * self.player.duration())
self.player.setPosition(video_position) self.player.setPosition(video_position)
self.lab_video.setText(utils.transfer_second_to_time(str(video_position/1000))) self.lab_video.setText(utils.transfer_second_to_time(str(round(video_position/1000,2))))
else: else:
self.sld_video.setValue(0) self.sld_video.setValue(0)
...@@ -391,7 +395,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -391,7 +395,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.init_previewed_audio() self.init_previewed_audio()
video_position = int((position / self.sld_video.maximum()) * self.player.duration()) video_position = int((position / self.sld_video.maximum()) * self.player.duration())
self.player.setPosition(video_position) self.player.setPosition(video_position)
self.lab_video.setText(utils.transfer_second_to_time(str(video_position/1000))) self.lab_video.setText(utils.transfer_second_to_time(str(round(video_position/1000,2))))
def pressSlider(self): def pressSlider(self):
self.sld_video_pressed = True self.sld_video_pressed = True
...@@ -404,7 +408,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -404,7 +408,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
if not self.sld_video_pressed: # 进度条被鼠标点击时不更新 if not self.sld_video_pressed: # 进度条被鼠标点击时不更新
self.vidoeLength = self.player.duration()+0.1 self.vidoeLength = self.player.duration()+0.1
self.sld_video.setValue(round((position/self.vidoeLength)*self.sld_video.maximum())) self.sld_video.setValue(round((position/self.vidoeLength)*self.sld_video.maximum()))
self.lab_video.setText(utils.transfer_second_to_time(str(position/1000))) self.lab_video.setText(utils.transfer_second_to_time(str(round(position/1000,2))))
# 播放音频 # 播放音频
# 0、视频必须在播放中 # 0、视频必须在播放中
...@@ -499,7 +503,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -499,7 +503,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.pb_tableWidget_idx = 0 self.pb_tableWidget_idx = 0
self.zm_tableWidget_idx = 0 self.zm_tableWidget_idx = 0
self.set_table_to_window() self.set_table_to_window()
def set_table_to_window(self): def set_table_to_window(self, need_refresh_all = True):
self.projectContext.initial_ing = True self.projectContext.initial_ing = True
header = self.projectContext.header header = self.projectContext.header
subtitle_list = self.projectContext.subtitle_list subtitle_list = self.projectContext.subtitle_list
...@@ -509,26 +513,29 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -509,26 +513,29 @@ class MainWindow(QMainWindow, Ui_MainWindow):
contentHeader = self.projectContext.contentHeader contentHeader = self.projectContext.contentHeader
aside_header = self.projectContext.aside_header aside_header = self.projectContext.aside_header
subtitle_header = self.projectContext.subtitle_header subtitle_header = self.projectContext.subtitle_header
self.zm_tableWidget.clear() # self.zm_tableWidget.clear()
self.pb_tableWidget.clear() # self.pb_tableWidget.clear()
self.zm_tableWidget.setRowCount(len(subtitle_list)) self.zm_tableWidget.setRowCount(len(subtitle_list))
self.zm_tableWidget.setColumnCount(len(subtitle_header)) self.zm_tableWidget.setColumnCount(len(subtitle_header))
self.zm_tableWidget.setHorizontalHeaderLabels(subtitle_header) self.zm_tableWidget.setHorizontalHeaderLabels(subtitle_header)
for i in range(self.zm_tableWidget_idx, len(subtitle_list)): st_idx = 0 if need_refresh_all else self.zm_tableWidget_idx
for i in range(st_idx, len(subtitle_list)):
self.setElememtToTable(self.zm_tableWidget, subtitle_list[i], i) self.setElememtToTable(self.zm_tableWidget, subtitle_list[i], i)
self.pb_tableWidget.setRowCount(len(aside_list)) self.pb_tableWidget.setRowCount(len(aside_list))
self.pb_tableWidget.setColumnCount(len(aside_header)) self.pb_tableWidget.setColumnCount(len(aside_header))
self.pb_tableWidget.setHorizontalHeaderLabels(aside_header) self.pb_tableWidget.setHorizontalHeaderLabels(aside_header)
for i in range(self.pb_tableWidget_idx, len(aside_list)): st_idx = 0 if need_refresh_all else self.pb_tableWidget_idx
for i in range(st_idx, len(aside_list)):
self.setElememtToTable(self.pb_tableWidget, aside_list[i], i) self.setElememtToTable(self.pb_tableWidget, aside_list[i], i)
self.all_tableWidget.clear() # self.all_tableWidget.clear()
self.all_tableWidget.setRowCount(len(all_elements)) self.all_tableWidget.setRowCount(len(all_elements))
self.all_tableWidget.setColumnCount(len(contentHeader)) self.all_tableWidget.setColumnCount(len(contentHeader))
self.all_tableWidget.setHorizontalHeaderLabels(contentHeader) self.all_tableWidget.setHorizontalHeaderLabels(contentHeader)
for i in range(self.all_tableWidget_idx, len(all_elements)): st_idx = 0 if need_refresh_all else self.all_tableWidget_idx
for i in range(st_idx, len(all_elements)):
self.setElememtToTable(self.all_tableWidget, all_elements[i], i) self.setElememtToTable(self.all_tableWidget, all_elements[i], i)
self.all_tableWidget_idx = len(all_elements) self.all_tableWidget_idx = len(all_elements)
...@@ -541,27 +548,35 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -541,27 +548,35 @@ class MainWindow(QMainWindow, Ui_MainWindow):
def setElememtToTable(self, table: QTableWidget, elem: Element, idx: int): def setElememtToTable(self, table: QTableWidget, elem: Element, idx: int):
elem_list = elem.to_list() elem_list = elem.to_list()
time_format_col_list = []
if table.objectName() == constant.Content.ObjectName: if table.objectName() == constant.Content.ObjectName:
elem_list = elem.to_short_list() elem_list = elem.to_short_list()
time_format_col_list = constant.Content.TimeFormatColumns
if table.objectName() == constant.Subtitle.ObjectName: if table.objectName() == constant.Subtitle.ObjectName:
elem_list = elem.to_subtitle_list() elem_list = elem.to_subtitle_list()
time_format_col_list = constant.Subtitle.TimeFormatColumns
if table.objectName() == constant.Aside.ObjectName: if table.objectName() == constant.Aside.ObjectName:
elem_list = elem.to_aside_list() elem_list = elem.to_aside_list()
time_format_col_list = constant.Aside.TimeFormatColumns
for j in range(len(elem_list)): for j in range(len(elem_list)):
text = elem_list[j] text = elem_list[j]
if type(text) == str and '插入旁白,推荐' in text: if type(text) == str and '插入旁白,推荐' in text:
text = text[text.index('推荐'):] text = text[text.index('推荐'):]
# 需要格式化成hh:mm:ss格式
if j in time_format_col_list and type(text)==str and len(text) != 0:
text = utils.transfer_second_to_time()
item = QTableWidgetItem(text) item = QTableWidgetItem(text)
# 设置为不可编辑 # 设置为不可编辑
if self.checkIfTableItemCanChange(table, idx, j) == False: if self.checkIfTableItemCanChange(table, idx, j) == False:
item.setFlags(Qt.ItemIsEnabled) item.setFlags(Qt.ItemIsEnabled)
table.setItem(idx, j, item) table.setItem(idx, j, item)
# 只有Content页的字幕列和 Aside页的字幕列 可编辑 # 只有Content页的字幕列和 Aside页的字幕列 可编辑
def checkIfTableItemCanChange(self, table: QTableWidget, i: int, j: int): def checkIfTableItemCanChange(self, table: QTableWidget, i: int, j: int):
if table.objectName() == self.all_tableWidget.objectName() and j == constant.Content.ActivateColumn: if table.objectName() == self.all_tableWidget.objectName() and j in constant.Content.ActivateColumns:
return True return True
if table.objectName() == self.pb_tableWidget.objectName() and j == constant.Aside.AsideColumnNumber: if table.objectName() == self.pb_tableWidget.objectName() and j in constant.Aside.ActivateColumns:
return True return True
return False return False
...@@ -580,11 +595,12 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -580,11 +595,12 @@ class MainWindow(QMainWindow, Ui_MainWindow):
col = item.column() # 获取列数 col = item.column() # 获取列数
print("row, col = %s, %s"%(row, col)) print("row, col = %s, %s"%(row, col))
text = item.text() # 获取内容 text = item.text() # 获取内容
sec_float = utils.trans_to_seconds(text)
self.init_previewed_audio() self.init_previewed_audio()
if self.checkIfVideoTimeCanChange(row, col): if self.checkIfVideoTimeCanChange(row, col):
self.video_timer.stop() self.video_timer.stop()
self.video_timer.start(1000) # 双击的时候,就重启计时器,避免他跳转回video.position的地方去。 self.video_timer.start(1000) # 双击的时候,就重启计时器,避免他跳转回video.position的地方去。
self.player.setPosition(int(float(text)*1000)) self.player.setPosition(int(float(sec_float)*1000))
...@@ -611,18 +627,18 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -611,18 +627,18 @@ class MainWindow(QMainWindow, Ui_MainWindow):
if col == constant.Aside.AsideColumnNumber: if col == constant.Aside.AsideColumnNumber:
self.projectContext.history_push(row, text, text) self.projectContext.history_push(row, text, text)
def writeHistoryFromContent(self, item): # def writeHistoryFromContent(self, item):
print("writeHistoryFromContent") # print("writeHistoryFromContent")
if item is None: # if item is None:
print("WRONG!!!! item Is None") # print("WRONG!!!! item Is None")
return # return
else: # else:
row = item.row() # 获取行数 # row = item.row() # 获取行数
col = item.column() # 获取列数 注意是column而不是col哦 # col = item.column() # 获取列数 注意是column而不是col哦
text = item.text() # 获取内容 # text = item.text() # 获取内容
if col == constant.Content.ActivateColumn: # if col == constant.Content.ActivateColumn:
#
self.projectContext.history_push(row, text, text) # self.projectContext.history_push(row, text, text)
def rewriteHistory(self, item): def rewriteHistory(self, item):
if self.projectContext.initial_ing == True: if self.projectContext.initial_ing == True:
...@@ -677,29 +693,29 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -677,29 +693,29 @@ class MainWindow(QMainWindow, Ui_MainWindow):
else: else:
self.projectContext.history_push(opt.row, opt.old_str, text) self.projectContext.history_push(opt.row, opt.old_str, text)
def rewriteHistoryFromContent(self, item): # def rewriteHistoryFromContent(self, item):
print("re rewriteHistoryFromContent") # print("re rewriteHistoryFromContent")
if item is None: # if item is None:
print("WRONG!!!! item Is None") # print("WRONG!!!! item Is None")
return # return
#
else: # else:
row = item.row() # 获取行数 # row = item.row() # 获取行数
col = item.column() # 获取列数 注意是column而不是col哦 # col = item.column() # 获取列数 注意是column而不是col哦
text = item.text() # 获取内容 # text = item.text() # 获取内容
#
if col != constant.Content.ActivateColumn: # if col != constant.Content.ActivateColumn:
return # return
#
opt = self.projectContext.history_pop() # opt = self.projectContext.history_pop()
if opt == None: # 刚打开表格的时候,会触发这个槽函数,此时opt肯定是None # if opt == None: # 刚打开表格的时候,会触发这个槽函数,此时opt肯定是None
return # return
# 抛出一个可能的异常 # # 抛出一个可能的异常
if row != opt.row: # if row != opt.row:
print("Warning!!!row=",row,", old_row=", opt.row) # print("Warning!!!row=",row,", old_row=", opt.row)
#
#
self.projectContext.history_push(opt.row, opt.old_str, text) # self.projectContext.history_push(opt.row, opt.old_str, text)
def write2ProjectFromAside(self, item): def write2ProjectFromAside(self, item):
if self.projectContext.initial_ing == True: if self.projectContext.initial_ing == True:
...@@ -718,19 +734,19 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -718,19 +734,19 @@ class MainWindow(QMainWindow, Ui_MainWindow):
# 更新【字幕旁白】这个tab里的字 # 更新【字幕旁白】这个tab里的字
start_time = self.pb_tableWidget.item(int(row), constant.Aside.StartTimeColumn).text() start_time = self.pb_tableWidget.item(int(row), constant.Aside.StartTimeColumn).text()
idx = self.projectContext.aside_subtitle_2contentId(Element(str(start_time),0,0,0,0)) idx = self.projectContext.aside_subtitle_2contentId(Element(str(start_time),0,0,0,0))
self.all_tableWidget.setItem(int(idx), constant.Content.ActivateColumn, QTableWidgetItem(text)) self.all_tableWidget.setItem(int(idx), constant.Content.AsideColumnNumber, QTableWidgetItem(text))
def write2ProjectFromContent(self, item): # def write2ProjectFromContent(self, item):
print("write2ProjectFromContent") # print("write2ProjectFromContent")
if item is None: # if item is None:
print("WRONG!!!! item Is None") # print("WRONG!!!! item Is None")
return # return
else: # else:
row = item.row() # 获取行数 # row = item.row() # 获取行数
col = item.column() # 获取列数 注意是column而不是col哦 # col = item.column() # 获取列数 注意是column而不是col哦
text = item.text() # 获取内容 # text = item.text() # 获取内容
#
if col == constant.Content.ActivateColumn: # if col == constant.Content.ActivateColumn:
self.projectContext.refresh_element(row, text) # self.projectContext.refresh_element(row, text)
def undo_slot(self): def undo_slot(self):
...@@ -771,8 +787,10 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -771,8 +787,10 @@ class MainWindow(QMainWindow, Ui_MainWindow):
def change_videotime_label(self): def change_videotime_label(self):
position = self.player.position()/1000 position = self.player.position()/1000
duration = self.player.duration()/1000 duration = self.player.duration()/1000
cur_time = utils.transfer_second_to_time(str(position))[:5] cur_time = utils.transfer_second_to_time(str(position))[:8]
duration_time = utils.transfer_second_to_time(str(duration))[:5] duration_time = utils.transfer_second_to_time(str(duration))[:8]
self.label_2.setText(cur_time + "/" + duration_time) self.label_2.setText(cur_time + "/" + duration_time)
def change_table_select_rows(self): def change_table_select_rows(self):
...@@ -790,17 +808,37 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -790,17 +808,37 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.sld_video.setMaximum(self.player.duration()/1000 + 1) self.sld_video.setMaximum(self.player.duration()/1000 + 1)
def refresh_tab_slot(self): def refresh_tab_slot(self):
self.set_table_to_window() self.set_table_to_window(False)
self.projectContext.save_project(False) self.projectContext.save_project(False)
def operate_slot(self): def operate_slot(self):
self.operation_dialog.show() self.operation_dialog.show()
def add_line_operation_slot(self, row, start_time, end_time, subtitle, suggest, aside): def insert_aside_from_now_slot(self):
cur_time = round(self.player.position()/1000, 2)
idx = self.calculate_element_row(cur_time)
# 其实end_time目前是没啥用的,可以删掉了
if idx != len(self.projectContext.all_elements):
self.add_line_operation_slot(idx, str(cur_time), self.projectContext.all_elements[idx+1].st_time_sec,
"", "插入旁白,推荐字数为0", "")
else:
self.add_line_operation_slot(idx, str(cur_time), str(cur_time+1),
"", "插入旁白,推荐字数为0", "")
def calculate_element_row(self, cur_time):
idx = 0
while idx < len(self.projectContext.all_elements):
if float(cur_time) < float(self.projectContext.all_elements[idx].st_time_sec):
break
idx += 1
return idx
def add_line_operation_slot(self, row, start_time, end_time, subtitle, suggest, aside, speed):
# 注意,这里需要用同一对象,不能生成多个Element # 注意,这里需要用同一对象,不能生成多个Element
new_element = Element(start_time, end_time, subtitle, suggest, aside) new_element = Element(start_time, end_time, subtitle, suggest, aside, speed)
self.projectContext.all_elements.insert(int(row), new_element) self.projectContext.all_elements.insert(int(row), new_element)
self.all_tableWidget_idx+=1
if suggest is not None and "插入旁白,推荐字数为" in suggest: if suggest is not None and "插入旁白,推荐字数为" in suggest:
idx = 0 idx = 0
while idx < len(self.projectContext.aside_list): while idx < len(self.projectContext.aside_list):
...@@ -808,6 +846,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -808,6 +846,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
break break
idx += 1 idx += 1
self.projectContext.aside_list.insert(idx, new_element) self.projectContext.aside_list.insert(idx, new_element)
self.pb_tableWidget_idx += 1
else: else:
idx = 0 idx = 0
while idx < len(self.projectContext.subtitle_list): while idx < len(self.projectContext.subtitle_list):
...@@ -815,6 +854,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -815,6 +854,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
break break
idx += 1 idx += 1
self.projectContext.subtitle_list.insert(idx, new_element) self.projectContext.subtitle_list.insert(idx, new_element)
self.zm_tableWidget_idx += 1
self.prompt_dialog.show_with_msg("操作成功!!请刷新表格查看变化") self.prompt_dialog.show_with_msg("操作成功!!请刷新表格查看变化")
...@@ -839,12 +879,15 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -839,12 +879,15 @@ class MainWindow(QMainWindow, Ui_MainWindow):
if to_be_delete_element.equalTo(self.projectContext.aside_list[i]): if to_be_delete_element.equalTo(self.projectContext.aside_list[i]):
self.projectContext.aside_list.pop(i) self.projectContext.aside_list.pop(i)
break break
self.pb_tableWidget_idx -= 1
else: else:
for i in range(len(self.projectContext.subtitle_header)): for i in range(len(self.projectContext.subtitle_header)):
if to_be_delete_element.equalTo(self.projectContext.subtitle_list[i]): if to_be_delete_element.equalTo(self.projectContext.subtitle_list[i]):
self.projectContext.subtitle_list.pop(i) self.projectContext.subtitle_list.pop(i)
break break
self.zm_tableWidget_idx -= 1
self.all_tableWidget_idx -= 1
self.projectContext.all_elements.pop(int(row)-1) self.projectContext.all_elements.pop(int(row)-1)
self.prompt_dialog.show_with_msg("操作成功!!请刷新表格查看变化") self.prompt_dialog.show_with_msg("操作成功!!请刷新表格查看变化")
......
...@@ -528,6 +528,7 @@ QPushButton:pressed { ...@@ -528,6 +528,7 @@ QPushButton:pressed {
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="action_insert_aside_from_now"/> <addaction name="action_insert_aside_from_now"/>
<addaction name="action_operate"/> <addaction name="action_operate"/>
<addaction name="action_insert_subtitle_from_now"/>
</widget> </widget>
<widget class="QMenu" name="menu_3"> <widget class="QMenu" name="menu_3">
<property name="title"> <property name="title">
...@@ -613,6 +614,11 @@ QPushButton:pressed { ...@@ -613,6 +614,11 @@ QPushButton:pressed {
<string>当前位置插入旁白</string> <string>当前位置插入旁白</string>
</property> </property>
</action> </action>
<action name="action_insert_subtitle_from_now">
<property name="text">
<string>当前位置插入字幕</string>
</property>
</action>
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget> <customwidget>
......
...@@ -80,12 +80,13 @@ class OperateRecord: ...@@ -80,12 +80,13 @@ class OperateRecord:
# 每一行的具体信息,"起始时间", "终止时间", "字幕", '建议', '解说脚本' # 每一行的具体信息,"起始时间", "终止时间", "字幕", '建议', '解说脚本'
class Element: class Element:
def __init__(self, st_time_sec: str, ed_time_sec: str, subtitle, suggest, aside): def __init__(self, st_time_sec: str, ed_time_sec: str, subtitle, suggest, aside, speed = "1.00(4字/秒)"):
self.st_time_sec = st_time_sec self.st_time_sec = st_time_sec
self.ed_time_sec = ed_time_sec self.ed_time_sec = ed_time_sec
self.subtitle = subtitle self.subtitle = subtitle
self.suggest = suggest self.suggest = suggest
self.aside = aside self.aside = aside
self.speed = speed
# 判断当前元素是否是字幕 # 判断当前元素是否是字幕
...@@ -97,17 +98,17 @@ class Element: ...@@ -97,17 +98,17 @@ class Element:
return not self.is_subtitle() return not self.is_subtitle()
def to_list(self): def to_list(self):
return [self.st_time_sec, self.ed_time_sec, self.subtitle, self.suggest, self.aside] return [self.st_time_sec, self.ed_time_sec, self.subtitle, self.suggest, self.aside, self.speed]
def to_short_list(self): def to_short_list(self):
return [self.st_time_sec, self.subtitle, self.aside] return [self.st_time_sec, self.subtitle, self.aside, self.speed]
def to_aside_list(self): def to_aside_list(self):
return [self.st_time_sec, self.ed_time_sec, self.suggest, self.aside] return [self.st_time_sec, self.ed_time_sec, self.suggest, self.aside, self.speed]
def to_subtitle_list(self): def to_subtitle_list(self):
return [self.st_time_sec, self.ed_time_sec, self.subtitle] return [self.st_time_sec, self.ed_time_sec, self.subtitle]
def print_self(self): def print_self(self):
print("st_time_sec:",self.st_time_sec,"ed_time_sec:",self.ed_time_sec, print("st_time_sec:",self.st_time_sec,"ed_time_sec:",self.ed_time_sec,
"subtitle:",self.subtitle,"suggest:",self.suggest, "aside", self.aside) "subtitle:",self.subtitle,"suggest:",self.suggest, "aside:", self.aside, "speed:", self.speed)
def equalTo(self, other)->bool: def equalTo(self, other)->bool:
return abs(float(self.st_time_sec) - float(other.st_time_sec)) < 0.1 return abs(float(self.st_time_sec) - float(other.st_time_sec)) < 0.1
...@@ -126,11 +127,11 @@ class ProjectContext: ...@@ -126,11 +127,11 @@ class ProjectContext:
self.speaker_info = rl[0].strip() self.speaker_info = rl[0].strip()
self.speaker_speed = rl[1].strip() self.speaker_speed = rl[1].strip()
# 一些常量 # 一些常量
self.header = ["起始时间", "终止时间", "字幕", '建议', '解说脚本'] self.header = ["起始时间", "终止时间", "字幕", '建议', '解说脚本', "语速"]
self.aside_header = ["起始时间", "终止时间", '建议', '解说脚本'] self.aside_header = ["起始时间", "终止时间", '建议', '解说脚本',"语速"]
self.subtitle_header = ["起始时间", "终止时间", "字幕"] self.subtitle_header = ["起始时间", "终止时间", "字幕"]
self.contentHeader = ["起始时间", "字幕", "旁白"] self.contentHeader = ["起始时间", "字幕", "旁白", "语速"]
self.excel_sheet_name = "旁白插入位置建议" self.excel_sheet_name = "旁白插入位置建议"
self.history_records = [] self.history_records = []
self.records_pos = 0 self.records_pos = 0
......
...@@ -4,16 +4,16 @@ from PyQt5.QtCore import *; ...@@ -4,16 +4,16 @@ from PyQt5.QtCore import *;
from PyQt5.QtGui import *; from PyQt5.QtGui import *;
from PyQt5.QtWidgets import *; from PyQt5.QtWidgets import *;
import utils
from operation_dialog_ui import Ui_Dialog from operation_dialog_ui import Ui_Dialog
from utils import validate_and_get_filepath, replace_path_suffix
#todo 注意,删除行,添加行,暂不支持【撤销与重做】功能!!! #todo 注意,删除行,添加行,暂不支持【撤销与重做】功能!!!
class Operation_Dialog(QDialog, Ui_Dialog): class Operation_Dialog(QDialog, Ui_Dialog):
#开始检测信号,传参分别是movie路径和输出表格路径 #开始检测信号,传参分别是movie路径和输出表格路径
start_add_signal = pyqtSignal(str, str, str, str, str, str) start_add_signal = pyqtSignal(str, str, str, str, str, str, str)
start_mod_signal = pyqtSignal(str, str, str, str, str, str) start_mod_signal = pyqtSignal(str, str, str, str, str, str, str)
start_del_signal = pyqtSignal(str, str, str, str, str, str) start_del_signal = pyqtSignal(str, str, str, str, str, str, str)
def __init__(self, mainWindow): def __init__(self, mainWindow):
super(Operation_Dialog, self).__init__() super(Operation_Dialog, self).__init__()
self.setupUi(self) self.setupUi(self)
...@@ -23,7 +23,7 @@ class Operation_Dialog(QDialog, Ui_Dialog): ...@@ -23,7 +23,7 @@ class Operation_Dialog(QDialog, Ui_Dialog):
self.pushButton.clicked.connect(self.check_validate_slot) self.pushButton.clicked.connect(self.check_validate_slot)
self.pushButton_2.clicked.connect(self.remake_slot) self.pushButton_2.clicked.connect(self.remake_slot)
#如果是【修改一行】,选择行的时候要瞬间更新成目前行的内容 #如果是【修改一行】,选择行的时候要瞬间更新成目前行的内容
self.pushButton_3.clicked.connect(self.row_num_change_slot) self.pushButton_3.clicked.connect(self.fill_row_info_slot)
self.buttonBox.setEnabled(False) self.buttonBox.setEnabled(False)
self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).clicked.connect(self.start_operation_slot) self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).clicked.connect(self.start_operation_slot)
...@@ -31,7 +31,8 @@ class Operation_Dialog(QDialog, Ui_Dialog): ...@@ -31,7 +31,8 @@ class Operation_Dialog(QDialog, Ui_Dialog):
self.comboBox.currentIndexChanged.connect(self.zmpb_change_slot) self.comboBox.currentIndexChanged.connect(self.zmpb_change_slot)
# 增加一行/删除一行 选择框 # 增加一行/删除一行 选择框
self.comboBox_2.currentIndexChanged.connect(self.adddel_change_slot) self.comboBox_2.currentIndexChanged.connect(self.adddel_change_slot)
self.speed_list = ["1.00(4字/秒)", "1.10(4.5字/秒)", "1.25(5字/秒)", "1.50(6字/秒)", "1.75(7字/秒)", "2.00(8字/秒)", "2.50(10字/秒)"]
self.comboBox_3.addItems(self.speed_list)
self.lineEdits = [self.lineEdit, self.lineEdit_2, self.lineEdit_3, self.lineEdit_4, self.lineEdit_5, self.lineEdit_6] self.lineEdits = [self.lineEdit, self.lineEdit_2, self.lineEdit_3, self.lineEdit_4, self.lineEdit_5, self.lineEdit_6]
self.zmpb_change_slot() self.zmpb_change_slot()
...@@ -72,15 +73,30 @@ class Operation_Dialog(QDialog, Ui_Dialog): ...@@ -72,15 +73,30 @@ class Operation_Dialog(QDialog, Ui_Dialog):
except Exception as e: except Exception as e:
self.mainWindow.prompt_dialog.show_with_msg("校验失败!总行数为[%d],你的输入为[%s]!!"%(rowCount, self.lineEdit.text())) self.mainWindow.prompt_dialog.show_with_msg("校验失败!总行数为[%d],你的输入为[%s]!!"%(rowCount, self.lineEdit.text()))
return False return False
# 校验时间填写是否是hh:mm:ss格式的
try:
import re
if type(self.lineEdit_2.text())==str and len(self.lineEdit_2.text()) > 0:
x = re.match("^(([0-1]\d)|(2[0-4])):[0-5]\d:[0-5]\d(.\d{1,2})?$", self.lineEdit_2.text())
assert x != None
if type(self.lineEdit_3.text()) == str and len(self.lineEdit_3.text()) > 0:
x = re.match("^(([0-1]\d)|(2[0-4])):[0-5]\d:[0-5]\d(.\d{1,2})?$", self.lineEdit_3.text())
assert x != None
except Exception as e:
self.mainWindow.prompt_dialog.show_with_msg("校验失败!起始或结束时间输入的格式有误!应该为hh:mm:ss!!"%(rowCount, self.lineEdit.text()))
return False
# 这些是只有【add】才需要检测的 # 这些是只有【add】才需要检测的
if self.comboBox_2.currentText() == "增加一行": if self.comboBox_2.currentText() == "增加一行":
#校验起始时间、结束时间 #校验起始时间、结束时间
start_time_f, end_time_f = 0.0, 0.0 start_time_f, end_time_f = 0.0, 0.0
try: try:
start_time_f = float(self.lineEdit_2.text()) start_time_f = float(utils.trans_to_seconds(self.lineEdit_2.text()))
if self.comboBox.currentText() == "字幕": if self.comboBox.currentText() == "字幕":
end_time_f = float(self.lineEdit_3.text()) end_time_f = float(utils.trans_to_seconds(self.lineEdit_3.text()))
assert start_time_f < end_time_f assert start_time_f < end_time_f
except Exception as e: except Exception as e:
self.mainWindow.prompt_dialog.show_with_msg("校验失败!起始时间或结束时间输入有误!!" ) self.mainWindow.prompt_dialog.show_with_msg("校验失败!起始时间或结束时间输入有误!!" )
...@@ -122,6 +138,12 @@ class Operation_Dialog(QDialog, Ui_Dialog): ...@@ -122,6 +138,12 @@ class Operation_Dialog(QDialog, Ui_Dialog):
def start_operation_slot(self): def start_operation_slot(self):
row, start_time, end_time, subtitle, suggest, aside = [x.text() for x in self.lineEdits] row, start_time, end_time, subtitle, suggest, aside = [x.text() for x in self.lineEdits]
speed = self.comboBox_3.currentText()
# 将hh:mm:ss转成秒的形式传给mainWindow
if type(start_time)==str and len(start_time)>0:
start_time = str(utils.trans_to_seconds(start_time))
if type(end_time)==str and len(end_time)>0:
end_time = str(utils.trans_to_seconds(end_time))
if self.comboBox.currentText() == "字幕": if self.comboBox.currentText() == "字幕":
suggest = "" suggest = ""
...@@ -138,28 +160,31 @@ class Operation_Dialog(QDialog, Ui_Dialog): ...@@ -138,28 +160,31 @@ class Operation_Dialog(QDialog, Ui_Dialog):
# 根据增删两种操作,分别触发不同信号。 # 根据增删两种操作,分别触发不同信号。
if self.comboBox_2.currentText() == "增加一行": if self.comboBox_2.currentText() == "增加一行":
self.start_add_signal.emit(row, start_time, end_time, subtitle, suggest, aside) self.start_add_signal.emit(row, start_time, end_time, subtitle, suggest, aside, speed)
elif self.comboBox_2.currentText() == "修改一行": elif self.comboBox_2.currentText() == "修改一行":
self.start_mod_signal.emit(row, start_time, end_time, subtitle, suggest, aside) self.start_mod_signal.emit(row, start_time, end_time, subtitle, suggest, aside, speed)
else: else:
self.start_del_signal.emit(row, start_time, end_time, subtitle, suggest, aside) self.start_del_signal.emit(row, start_time, end_time, subtitle, suggest, aside, speed)
def row_num_change_slot(self): def fill_row_info_slot(self):
text = self.lineEdit.text() text = self.lineEdit.text()
print("row_num_change_slot, text:", text) print("fill_row_info_slot, text:", text)
if text is not None: if text is not None:
try: try:
rowCount = self.mainWindow.all_tableWidget.rowCount() rowCount = self.mainWindow.all_tableWidget.rowCount()
row_number = int(self.lineEdit.text()) row_number = int(self.lineEdit.text())
assert 1 <= row_number <= rowCount assert 1 <= row_number <= rowCount
elem = self.mainWindow.projectContext.all_elements[int(row_number)-1] elem = self.mainWindow.projectContext.all_elements[int(row_number)-1]
self.lineEdit_2.setText(elem.st_time_sec) self.lineEdit_2.setText(str(utils.transfer_second_to_time(elem.st_time_sec)))
self.lineEdit_3.setText(elem.ed_time_sec) self.lineEdit_3.setText(str(utils.transfer_second_to_time(elem.ed_time_sec)))
self.lineEdit_4.setText(elem.subtitle) self.lineEdit_4.setText(elem.subtitle)
self.lineEdit_5.setText(elem.suggest[elem.suggest.index("推荐字数为") + 5:]) self.lineEdit_5.setText(elem.suggest[elem.suggest.index("推荐字数为") + 5:])
self.lineEdit_6.setText(elem.aside) self.lineEdit_6.setText(elem.aside)
# 如果是旁白的话
if elem.suggest is not None and "推荐字数为" in elem.suggest: if elem.suggest is not None and "推荐字数为" in elem.suggest:
self.lineEdit_5.setText(elem.suggest[elem.suggest.index("推荐字数为")+5:]) self.lineEdit_5.setText(elem.suggest[elem.suggest.index("推荐字数为")+5:])
self.comboBox_3.setCurrentIndex(self.speed_list.index(elem.speed))
except Exception as e: except Exception as e:
print("exception:", e) print("exception:", e)
pass pass
......
...@@ -6,8 +6,8 @@ ...@@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>680</width> <width>737</width>
<height>427</height> <height>437</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
...@@ -19,8 +19,8 @@ ...@@ -19,8 +19,8 @@
</property> </property>
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>470</x> <x>480</x>
<y>350</y> <y>380</y>
<width>101</width> <width>101</width>
<height>32</height> <height>32</height>
</rect> </rect>
...@@ -324,7 +324,7 @@ ...@@ -324,7 +324,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>350</x> <x>350</x>
<y>350</y> <y>380</y>
<width>93</width> <width>93</width>
<height>28</height> <height>28</height>
</rect> </rect>
...@@ -337,7 +337,7 @@ ...@@ -337,7 +337,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>230</x> <x>230</x>
<y>350</y> <y>380</y>
<width>93</width> <width>93</width>
<height>28</height> <height>28</height>
</rect> </rect>
...@@ -378,6 +378,35 @@ ...@@ -378,6 +378,35 @@
行信息</string> 行信息</string>
</property> </property>
</widget> </widget>
<widget class="QComboBox" name="comboBox_3">
<property name="enabled">
<bool>true</bool>
</property>
<property name="geometry">
<rect>
<x>540</x>
<y>310</y>
<width>101</width>
<height>22</height>
</rect>
</property>
<property name="editable">
<bool>false</bool>
</property>
</widget>
<widget class="QLabel" name="label_14">
<property name="geometry">
<rect>
<x>480</x>
<y>310</y>
<width>41</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>语速:</string>
</property>
</widget>
</widget> </widget>
<resources/> <resources/>
<connections> <connections>
......
...@@ -12,10 +12,10 @@ from PyQt5 import QtCore, QtGui, QtWidgets ...@@ -12,10 +12,10 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object): class Ui_Dialog(object):
def setupUi(self, Dialog): def setupUi(self, Dialog):
Dialog.setObjectName("Dialog") Dialog.setObjectName("Dialog")
Dialog.resize(680, 427) Dialog.resize(737, 437)
self.buttonBox = QtWidgets.QDialogButtonBox(Dialog) self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
self.buttonBox.setEnabled(False) self.buttonBox.setEnabled(False)
self.buttonBox.setGeometry(QtCore.QRect(470, 350, 101, 32)) self.buttonBox.setGeometry(QtCore.QRect(480, 380, 101, 32))
self.buttonBox.setToolTip("") self.buttonBox.setToolTip("")
self.buttonBox.setToolTipDuration(-1) self.buttonBox.setToolTipDuration(-1)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
...@@ -94,10 +94,10 @@ class Ui_Dialog(object): ...@@ -94,10 +94,10 @@ class Ui_Dialog(object):
self.label_12.setGeometry(QtCore.QRect(250, 270, 251, 20)) self.label_12.setGeometry(QtCore.QRect(250, 270, 251, 20))
self.label_12.setObjectName("label_12") self.label_12.setObjectName("label_12")
self.pushButton = QtWidgets.QPushButton(Dialog) self.pushButton = QtWidgets.QPushButton(Dialog)
self.pushButton.setGeometry(QtCore.QRect(350, 350, 93, 28)) self.pushButton.setGeometry(QtCore.QRect(350, 380, 93, 28))
self.pushButton.setObjectName("pushButton") self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(Dialog) self.pushButton_2 = QtWidgets.QPushButton(Dialog)
self.pushButton_2.setGeometry(QtCore.QRect(230, 350, 93, 28)) self.pushButton_2.setGeometry(QtCore.QRect(230, 380, 93, 28))
self.pushButton_2.setObjectName("pushButton_2") self.pushButton_2.setObjectName("pushButton_2")
self.label_13 = QtWidgets.QLabel(Dialog) self.label_13 = QtWidgets.QLabel(Dialog)
self.label_13.setGeometry(QtCore.QRect(250, 90, 311, 21)) self.label_13.setGeometry(QtCore.QRect(250, 90, 311, 21))
...@@ -108,6 +108,14 @@ class Ui_Dialog(object): ...@@ -108,6 +108,14 @@ class Ui_Dialog(object):
self.pushButton_3 = QtWidgets.QPushButton(Dialog) self.pushButton_3 = QtWidgets.QPushButton(Dialog)
self.pushButton_3.setGeometry(QtCore.QRect(540, 60, 71, 61)) self.pushButton_3.setGeometry(QtCore.QRect(540, 60, 71, 61))
self.pushButton_3.setObjectName("pushButton_3") self.pushButton_3.setObjectName("pushButton_3")
self.comboBox_3 = QtWidgets.QComboBox(Dialog)
self.comboBox_3.setEnabled(True)
self.comboBox_3.setGeometry(QtCore.QRect(540, 310, 101, 22))
self.comboBox_3.setEditable(False)
self.comboBox_3.setObjectName("comboBox_3")
self.label_14 = QtWidgets.QLabel(Dialog)
self.label_14.setGeometry(QtCore.QRect(480, 310, 41, 20))
self.label_14.setObjectName("label_14")
self.retranslateUi(Dialog) self.retranslateUi(Dialog)
self.buttonBox.rejected.connect(Dialog.reject) self.buttonBox.rejected.connect(Dialog.reject)
...@@ -139,5 +147,6 @@ class Ui_Dialog(object): ...@@ -139,5 +147,6 @@ class Ui_Dialog(object):
self.label_13.setText(_translate("Dialog", "*需要填在【字幕旁白】页面中的行数")) self.label_13.setText(_translate("Dialog", "*需要填在【字幕旁白】页面中的行数"))
self.pushButton_3.setText(_translate("Dialog", "填充\n" self.pushButton_3.setText(_translate("Dialog", "填充\n"
"行信息")) "行信息"))
self.label_14.setText(_translate("Dialog", "语速:"))
...@@ -26,13 +26,17 @@ def trans_to_seconds(timePoint: str) -> float: ...@@ -26,13 +26,17 @@ def trans_to_seconds(timePoint: str) -> float:
return time_in_seconds return time_in_seconds
def transfer_second_to_time(sec: str) -> str: def transfer_second_to_time(sec: str) -> str:
"""
输入xxxx.xxx秒,输出xx:xx:xx.xx的格式(输出不一定有小数点)
"""
duration = int(float(sec)) duration = int(float(sec))
minutes = int(duration / 60) hour = int(duration/3600)
seconds = int(duration - 60 * minutes) minutes = int((duration % 3600)/60)
seconds = int(duration%60)
idx = sec.find('.') idx = sec.find('.')
if(idx == -1): if(idx == -1):
idx = len(sec) idx = len(sec)
time = "%02d:%02d%s" % (minutes, seconds, sec[idx:]) time = "%02d:%02d:%02d%s" % (hour, minutes, seconds, sec[idx:idx+3])
return time return time
def replace_path_suffix(path, new_suffix): def replace_path_suffix(path, new_suffix):
...@@ -80,3 +84,41 @@ def get_sheetHead(book_path: str) -> list: ...@@ -80,3 +84,41 @@ def get_sheetHead(book_path: str) -> list:
if __name__ == '__main__': if __name__ == '__main__':
x = transfer_second_to_time("12000.923") x = transfer_second_to_time("12000.923")
print(x) print(x)
x = transfer_second_to_time("79.925")
print(x)
y = trans_to_seconds("1:00:00.92")
print(y)
z = transfer_second_to_time("1200.923")
print(z)
import time
strtime = "1:00:00.92"
# time.strptime(strtime, "%H:%M:%S")
import re
print("------------"*10)
# tests = ["00:12:34a", "01:12:34", "10:12:34.567", "12:12:34.89", "24:12:34.8", "2:34.2", "12:34.", "12:34.0", "02:34.0", "00:34.0"]
tests = ["01:12:34", "10:12:34.567", "12:12:34.89", "24:12:34.8", "2:34.2", "12:12:34.", "01:12:34.0", "02:02:34.0", "00:00:34.0"]
for s in tests:
x = re.match("^(([0-1]\d)|(2[0-4])):[0-5]\d:[0-5]\d(.\d{1,2})?$", s)
print("当前=", s)
print(x)
if x:
print(x.group())
print(x.group(1))
print("---------------------------------")
# print(re.match("^(([0-1]\d)|(2[0-4])):[0-5]\d$", "a12:34"))
# print(re.match("^(([0-1]\d)|(2[0-4])):[0-5]\d$", "a"))
# print(re.match("[^abc]", "plain"))
# print("------------")
# q = re.match("p|(pl)ain", "plain")
# print(q)
# print(q.group())
# print("------------")
# qq = re.match("ya(msen|nsen|nsem)", "yansen’s blog")
# print(qq)
# print(qq.group())
# print(qq.group(1))
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment