LaiTool/src/main/Task/basicReverse.js

95 lines
3.8 KiB
JavaScript
Raw Normal View History

2024-06-24 13:11:19 +08:00
import path from 'path';
import fs from 'fs';
const util = require('util');
const { exec } = require('child_process');
const execAsync = util.promisify(exec);
import { define } from '../../define/define';
import BooKService from '../../define/db/service/Book/bookService';
import { TaskScheduler } from './taskScheduler';
import { LoggerStatus, LoggerType, OtherData } from '../../define/enum/softwareEnum';
import { errorMessage } from '../generalTools';
import { CheckFileOrDirExist } from '../../define/Tools/file';
import { BookTaskDetailService } from '../../define/db/service/Book/bookTaskDetailService';
const fspromises = fs.promises;
// 基础的反推(抽帧,分镜,提取字幕等)
export class BasicReverse {
constructor() {
this.taskScheduler = new TaskScheduler()
}
/**
* 分镜通过传入的bookId
* @param {*} bookId 传入的bookId
* @returns
*/
async GetFrameData(bookId) {
try {
let _bookService = await BooKService.getInstance();
let _bookTaskDetailService = await BookTaskDetailService.getInstance();
// 获取对应的小说小说数据,找到对应的小说视频地址
let bookQuery = {
bookId: bookId
}
let bookData = await _bookService.GetBookData(bookQuery)
if (bookData.code == 0) {
return bookData
}
if (bookData.data.book_length <= 0 || bookData.data.res_book.length <= 0) {
throw new Error("没有找到对应的小说数据请检查bookId是否正确")
}
// 获取小说的视频地址
let book = bookData.data.res_book[0]
let oldVideoPath = book.oldVideoPath
let frameJson = oldVideoPath + '.json'
let sensitivity = 30
// 开始之前,推送日志
let log_content = `开始进行分镜操作,视频地址:${oldVideoPath},敏感度:${sensitivity},正在调用程序进行处理`
await this.taskScheduler.AddLogToDB(bookId, book.type, log_content, OtherData.DEFAULT, LoggerStatus.DOING)
// 小说进行分镜python进行将结果写道一个json里面
// 使用异步的方法调用一个python程序然后写入到指定的json文件中k
let command = `"${path.join(define.scripts_path, "Lai.exe")}" "-ka" "${oldVideoPath}" "${frameJson}" "${sensitivity}"`
const output = await execAsync(command, { maxBuffer: 1024 * 1024 * 10, encoding: 'utf-8' });
// 有错误输出
if (output.stderr != '') {
await this.taskScheduler.AddLogToDB(bookId, book.type, `分镜失败,错误信息如下:${output.stderr}`, OtherData.DEFAULT, LoggerStatus.FAIL)
throw new Error(output.stderr);
}
// 分镜成功,处理输出
let josnIsExist = CheckFileOrDirExist(frameJson)
if (!josnIsExist) {
let error_message = `分镜失败,没有找到对应的分镜输出文件:${frameJson}`
await this.taskScheduler.AddLogToDB(bookId, book.type, error_message, OtherData.DEFAULT, LoggerStatus.FAIL)
throw new Error(error_message)
}
let frameJsonData = JSON.parse(await fspromises.readFile(frameJson, 'utf-8'))
if (frameJsonData.length <= 0) {
await this.taskScheduler.AddLogToDB(bookId, book.type, `分镜失败,没有找到对应的分镜数据`, OtherData.DEFAULT, LoggerStatus.FAIL)
throw new Error("分镜失败,没有找到对应的分镜数据")
}
// 循环写入小说人物详细数据
for (let i = 0; i < frameJsonData.length; i++) {
let frameData = frameJsonData[i]
let bookTaskDetail = {
bookId: bookId,
}
await _bookTaskDetailService.AddBookTaskDetail(frameDataQuery)
}
console.log()
console.log(output.stdout)
} catch (error) {
return errorMessage(error.message, 'BasicReverse_GetFrameData');
}
}
}