201 lines
6.8 KiB
JavaScript
201 lines
6.8 KiB
JavaScript
import { BookBackTaskListService } from '../../define/db/service/Book/bookBackTaskListService'
|
||
import { BookService } from '../../define/db/service/Book/bookService'
|
||
import { BookTaskDetailService } from '../../define/db/service/Book/bookTaskDetailService'
|
||
import { BookTaskService } from '../../define/db/service/Book/bookTaskService'
|
||
import { OtherData } from '../../define/enum/softwareEnum'
|
||
import { BookBackTaskStatus, BookBackTaskType, TaskExecuteType } from '../../define/enum/bookEnum'
|
||
import { isEmpty } from 'lodash'
|
||
import { SoftwareService } from '../../define/db/service/SoftWare/softwareService'
|
||
import { errorMessage, successMessage } from '../generalTools'
|
||
import { BasicReverse } from './basicReverse'
|
||
|
||
export class TaskManager {
|
||
constructor() {
|
||
this.isExecuting = false
|
||
this.currentTaskList = []
|
||
this.globalConfig = global.config
|
||
// this.taskExecute = new TaskExecute()
|
||
this.basicReverse = new BasicReverse()
|
||
}
|
||
|
||
/**
|
||
* 初始化服务
|
||
*/
|
||
async InitService() {
|
||
if (!this.softwareService) {
|
||
this.softwareService = await SoftwareService.getInstance()
|
||
}
|
||
if (!this.bookBackTaskListService) {
|
||
this.bookBackTaskListService = await BookBackTaskListService.getInstance()
|
||
}
|
||
}
|
||
/**
|
||
* 加载数据库中的配置到全局变量中
|
||
*/
|
||
async GetGlobalConfig() {
|
||
try {
|
||
await this.InitService()
|
||
let softData = this.softwareService.GetSoftwareData(null)
|
||
if (softData.data.length <= 0) {
|
||
throw new Error('获取软件数据失败')
|
||
}
|
||
let config = softData.data[0]
|
||
global.config = JSON.parse(config.globalSetting)
|
||
this.globalConfig = global.config
|
||
return successMessage(global.config, '获取全局配置完成', 'TaskManager_GetGlobalConfig')
|
||
} catch (error) {
|
||
return errorMessage(
|
||
`获取全局配置失败,失败信息如下:` + error.message,
|
||
'TaskManager_GetGlobalConfig'
|
||
)
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 执行自动任务
|
||
* @returns
|
||
*/
|
||
async ExecuteAutoTask() {
|
||
await this.InitService()
|
||
if (this.isExecuting && this.currentTaskList.length > this.globalConfig.task_number) {
|
||
console.log('任务正在执行,跳过此次执行')
|
||
return
|
||
}
|
||
this.isExecuting = true
|
||
try {
|
||
while (this.currentTaskList.length < this.globalConfig.task_number) {
|
||
// 获取正在等待中第一个任务
|
||
const tasks = this.bookBackTaskListService.GetWaitTaskAndSlice(TaskExecuteType.AUTO, 1)
|
||
if (!tasks.data || tasks.data.length <= 0) {
|
||
console.log('没有等待中的任务')
|
||
break
|
||
}
|
||
let task = tasks.data[0]
|
||
this.currentTaskList.push(task)
|
||
this.handleTask(task)
|
||
.then((data) => {
|
||
if (data.code == 0) {
|
||
this.bookBackTaskListService.UpdateTaskStatus({
|
||
id: task.id,
|
||
status: BookBackTaskStatus.FAIL,
|
||
errorMessage: data.message
|
||
})
|
||
return Promise.reject(new Error(data.message))
|
||
} else if (data.code == 1) {
|
||
this.bookBackTaskListService.UpdateTaskStatus({
|
||
id: task.id,
|
||
status: BookBackTaskStatus.DONE
|
||
})
|
||
} else {
|
||
return Promise.reject(new Error(`${task.type} 返回的数据结构不对`))
|
||
}
|
||
})
|
||
.catch((error) => {
|
||
// 失败,修改当前task的状态为fail
|
||
this.bookBackTaskListService.UpdateTaskStatus({
|
||
id: task.id,
|
||
status: BookBackTaskStatus.FAIL,
|
||
errorMessage: error.message
|
||
})
|
||
throw error
|
||
})
|
||
.finally(() => {
|
||
this.currentTaskList = this.currentTaskList.filter((t) => t.id != task.id)
|
||
this.ExecuteAutoTask()
|
||
})
|
||
}
|
||
} catch (err) {
|
||
return errorMessage(
|
||
`执行任务失败,失败信息如下:${err.message}`,
|
||
'TaskManager_ExecuteAutoTask'
|
||
)
|
||
} finally {
|
||
// 判断是不是还有任务,没有则设置任务执行状态为false
|
||
if (this.currentTaskList.length <= 0) {
|
||
this.isExecuting = false
|
||
}
|
||
}
|
||
}
|
||
|
||
async handleTask(task) {
|
||
try {
|
||
let _bookBackTaskListService = await BookBackTaskListService.getInstance()
|
||
let res
|
||
// 调用分镜头任务
|
||
if (task.type == BookBackTaskType.STORYBOARD) {
|
||
res = await this.basicReverse.GetFrameData(task)
|
||
} else if (task.type == BookBackTaskType.SPLIT) {
|
||
// 调用分割视频任务
|
||
res = await this.basicReverse.CutVideoData(task)
|
||
} else if (task.type == BookBackTaskType.AUDIO) {
|
||
// 提取音频任务
|
||
res = await this.basicReverse.SplitAudioData(task)
|
||
} else if (task.type == BookBackTaskType.FRAME) {
|
||
// 抽取视频帧任务
|
||
res = await this.basicReverse.GetFrame(task)
|
||
} else if (task.type == BookBackTaskType.RECOGNIZE) {
|
||
// 识别识别字幕任务
|
||
res = await this.basicReverse.ExtractSubtitlesData(task)
|
||
}
|
||
// 未知的任务类型
|
||
else {
|
||
throw new Error('未知的任务类型')
|
||
}
|
||
|
||
if (res.code == 0) {
|
||
// 修改当前队列的任务状态
|
||
let updateRes = _bookBackTaskListService.UpdateTaskStatus({
|
||
id: task.id,
|
||
status: BookBackTaskStatus.FAIL,
|
||
errorMessage: res.message
|
||
})
|
||
if (updateRes.code == 0) {
|
||
throw new Error(updateRes.message)
|
||
}
|
||
throw new Error(res.message)
|
||
}
|
||
|
||
// 判断是不是要添加后续任务
|
||
await this.AddTaskHandle(task, true)
|
||
|
||
// 修改当前队列的任务状态
|
||
let updateRes = _bookBackTaskListService.UpdateTaskStatus({
|
||
id: task.id,
|
||
status: BookBackTaskStatus.DONE
|
||
})
|
||
if (updateRes.code == 0) {
|
||
throw new Error(updateRes.message)
|
||
}
|
||
return successMessage(null, '任务执行成功', 'TaskManager_handleTask')
|
||
} catch (error) {
|
||
return errorMessage(
|
||
`处理 ${task.type} 类型任务 ${task.name} 失败,失败信息如下:${error.message}`,
|
||
'TaskManager_handleTask'
|
||
)
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 是否添加后续任务
|
||
* @param {*} task
|
||
* @param {*} isAdd
|
||
*/
|
||
async AddTaskHandle(task, isAdd = false) {
|
||
if (!isAdd) {
|
||
return
|
||
}
|
||
|
||
if (task.type == BookBackTaskType.STORYBOARD) {
|
||
await this.basicReverse.AddCutVideoDataTask(task.bookId)
|
||
} else if (task.type == BookBackTaskType.SPLIT) {
|
||
await this.basicReverse.AddSplitAudioDataTask(task.bookId, task.bookTaskId)
|
||
} else if (task.type == BookBackTaskType.AUDIO) {
|
||
await this.basicReverse.AddGetFrameTask(task.bookId, task.bookTaskId)
|
||
} else if (task.type == BookBackTaskType.FRAME) {
|
||
await this.basicReverse.AddExtractSubtitlesDataTask(task.bookId, task.bookTaskId)
|
||
} else {
|
||
throw new Error('不支持的任务类型')
|
||
}
|
||
}
|
||
}
|