feat(engine): 优化字幕引擎、提升程序健壮性

- 优化服务器启动流程,增加异常处理
- 主程序和字幕引擎的 WebSocket 端口号改为随机生成
This commit is contained in:
himeditator mac
2025-07-29 19:37:03 +08:00
parent e4f937e6b6
commit d5d692188e
17 changed files with 182 additions and 856 deletions

View File

@@ -18,6 +18,10 @@
<div class="engine-status-title">ppid</div>
<div>{{ ppid }}</div>
</a-col>
<a-col :flex="1" :title="$t('status.port')" style="cursor:pointer;">
<div class="engine-status-title">port</div>
<div>{{ port }}</div>
</a-col>
<a-col :flex="1" :title="$t('status.cpu')" style="cursor:pointer;">
<div class="engine-status-title">cpu</div>
<div>{{ cpu.toFixed(1) }}%</div>
@@ -79,7 +83,7 @@
<p class="about-desc">{{ $t('status.about.desc') }}</p>
<a-divider />
<div class="about-info">
<p><b>{{ $t('status.about.version') }}</b><a-tag color="green">v0.5.1</a-tag></p>
<p><b>{{ $t('status.about.version') }}</b><a-tag color="green">v0.6.0</a-tag></p>
<p>
<b>{{ $t('status.about.author') }}</b>
<a
@@ -133,10 +137,11 @@ const pending = ref(false)
const captionLog = useCaptionLogStore()
const { captionData } = storeToRefs(captionLog)
const engineControl = useEngineControlStore()
const { engineEnabled, engine, customized } = storeToRefs(engineControl)
const { engineEnabled, engine, customized, errorSignal } = storeToRefs(engineControl)
const pid = ref(0)
const ppid = ref(0)
const port = ref(0)
const cpu = ref(0)
const mem = ref(0)
const elapsed = ref(0)
@@ -163,6 +168,7 @@ function getEngineInfo() {
window.electron.ipcRenderer.invoke('control.engine.info').then((data: EngineInfo) => {
pid.value = data.pid
ppid.value = data.ppid
port.value = data.port
cpu.value = data.cpu
mem.value = data.mem
elapsed.value = data.elapsed
@@ -172,6 +178,11 @@ function getEngineInfo() {
watch(engineEnabled, () => {
pending.value = false
})
watch(errorSignal, () => {
pending.value = false
errorSignal.value = false
})
</script>
<style scoped>

View File

@@ -22,6 +22,8 @@ export default {
"stopped": "Caption Engine Stopped",
"stoppedInfo": "The caption engine has stopped. You can click the 'Start Caption Engine' button to restart it.",
"error": "An error occurred",
"engineError": "The subtitle engine encountered an error and requested a forced exit.",
"wsError": "The WebSocket connection between the main program and the subtitle engine was not successfully established.",
"engineChange": "Cpation Engine Configuration Changed",
"changeInfo": "If the caption engine is already running, you need to restart it for the changes to take effect.",
"styleChange": "Caption Style Changed",
@@ -95,6 +97,7 @@ export default {
"pid": "Process ID",
"ppid": "Parent Process ID",
"cpu": "CPU Usage",
"port": "WebSocket Port Number",
"mem": "Memory Usage",
"elapsed": "Running Time",
"customized": "Customized",
@@ -116,7 +119,7 @@ export default {
"projLink": "Project Link",
"manual": "User Manual",
"engineDoc": "Caption Engine Manual",
"date": "July 17, 2025"
"date": "July 29, 2025"
}
},
log: {

View File

@@ -22,6 +22,8 @@ export default {
"stopped": "字幕エンジンが停止しました",
"stoppedInfo": "字幕エンジンが停止しました。再起動するには「字幕エンジンを開始」ボタンをクリックしてください。",
"error": "エラーが発生しました",
"engineError": "字幕エンジンにエラーが発生し、強制終了が要求されました。",
"wsError": "メインプログラムと字幕エンジン間の WebSocket 接続が確立されませんでした。",
"engineChange": "字幕エンジンの設定が変更されました",
"changeInfo": "字幕エンジンがすでに起動している場合、変更を有効にするには再起動が必要です。",
"styleChange": "字幕のスタイルが変更されました",
@@ -94,6 +96,7 @@ export default {
"engineStatus": "字幕エンジンの状態",
"pid": "プロセス ID",
"ppid": "親プロセス ID",
"port": "WebSocket ポート番号",
"cpu": "CPU 使用率",
"mem": "メモリ使用量",
"elapsed": "稼働時間",
@@ -116,7 +119,7 @@ export default {
"projLink": "プロジェクトリンク",
"manual": "ユーザーマニュアル",
"engineDoc": "字幕エンジンマニュアル",
"date": "2025 年 7 月 17 日"
"date": "2025 年 7 月 29 日"
}
},
log: {

View File

@@ -22,6 +22,8 @@ export default {
"stopped": "字幕引擎停止",
"stoppedInfo": "字幕引擎已经停止,可点击“启动字幕引擎”按钮重新启动",
"error": "发生错误",
"engineError": "字幕引擎发生错误并请求强制退出",
"wsError": "主程序与字幕引擎的 WebSocket 未成功连接",
"engineChange": "字幕引擎配置已更改",
"changeInfo": "如果字幕引擎已经启动,需要重启字幕引擎修改才会生效",
"styleChange": "字幕样式已修改",
@@ -94,6 +96,7 @@ export default {
"engineStatus": "字幕引擎状态",
"pid": "进程ID",
"ppid": "父进程ID",
"port": "WebSocket 端口号",
"cpu": "CPU使用率",
"mem": "内存使用量",
"elapsed": "运行时间",
@@ -116,7 +119,7 @@ export default {
"projLink": "项目链接",
"manual": "用户手册",
"engineDoc": "字幕引擎手册",
"date": "2025 年 7 月 17 日"
"date": "2025 年 7 月 29 日"
}
},
log: {

View File

@@ -29,6 +29,7 @@ export const useEngineControlStore = defineStore('engineControl', () => {
const customizedCommand = ref<string>('')
const changeSignal = ref<boolean>(false)
const errorSignal = ref<boolean>(false)
function sendControlsChange() {
const controls: Controls = {
@@ -47,7 +48,22 @@ export const useEngineControlStore = defineStore('engineControl', () => {
window.electron.ipcRenderer.send('control.controls.change', controls)
}
function setControls(controls: Controls) {
function setControls(controls: Controls, set = false) {
if(set && !engineEnabled.value && !controls.engineEnabled) {
errorSignal.value = true
notification.open({
message: t('noti.error'),
description: t("noti.engineError"),
duration: null,
icon: () => h(ExclamationCircleOutlined, { style: 'color: #ff4d4f' })
});
notification.open({
message: t('noti.error'),
description: t("noti.wsError"),
duration: null,
icon: () => h(ExclamationCircleOutlined, { style: 'color: #ff4d4f' })
});
}
sourceLang.value = controls.sourceLang
targetLang.value = controls.targetLang
engine.value = controls.engine
@@ -71,7 +87,7 @@ export const useEngineControlStore = defineStore('engineControl', () => {
}
window.electron.ipcRenderer.on('control.controls.set', (_, controls: Controls) => {
setControls(controls)
setControls(controls, true)
})
window.electron.ipcRenderer.on('control.engine.started', (_, args) => {
@@ -125,5 +141,6 @@ export const useEngineControlStore = defineStore('engineControl', () => {
sendControlsChange, // 发送最新控制消息到后端
emptyModelPathErr, // 模型路径为空时显示警告
changeSignal, // 配置改变信号
errorSignal, // 错误信号
}
})

View File

@@ -58,6 +58,7 @@ export interface FullConfig {
export interface EngineInfo {
pid: number,
ppid: number,
port:number,
cpu: number,
mem: number,
elapsed: number

View File

@@ -36,7 +36,6 @@ const { leftBarWidth, antdTheme } = storeToRefs(generalSettingStore)
background-color: var(--control-background);
}
.caption-control {
height: 100vh;
border-right: 1px solid var(--tag-color);