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'); } } }