95 lines
3.8 KiB
JavaScript
95 lines
3.8 KiB
JavaScript
|
|
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');
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|