From ccddd2412a480975bd0ad0953ad3706b6281ca7e Mon Sep 17 00:00:00 2001 From: lq1405 <2769838458@qq.com> Date: Wed, 21 Aug 2024 11:47:05 +0800 Subject: [PATCH] LaiTool V3.0.3 --- package-lock.json | 4 +- package.json | 2 +- resources/scripts/db/book.realm.lock | Bin 1416 -> 1416 bytes resources/scripts/db/software.realm.lock | Bin 1416 -> 1416 bytes .../db/service/Book/bookTaskDetailService.ts | 20 ++ src/define/define_string.ts | 5 +- src/main/IPCEvent/bookIpc.ts | 97 ++++--- src/main/Service/Book/ReverseBook.ts | 23 -- src/main/Service/Book/bookImage.ts | 107 +++++--- src/main/Service/Book/bookPrompt.ts | 153 +++++++++++ src/main/Service/MJ/mj.ts | 49 +--- src/main/Service/SD/sd.ts | 2 +- .../Service/ServiceBasic/bookServiceBasic.ts | 11 +- src/main/Service/Subtitle/subtitleService.ts | 59 +++- src/preload/book.js | 19 +- .../Book/Components/DatatableAfterGpt.vue | 9 +- .../Components/DatatableGptPromptButton.vue | 6 +- .../Book/Components/DatatableHeaderPrompt.vue | 4 +- .../Components/ManageBookDetailButton.vue | 252 ++++++++++++++---- .../Book/MJReverse/SelectMJReversePrompt.vue | 15 +- .../src/components/Book/ManageBook.vue | 4 +- .../src/components/Book/ManageBookDetail.vue | 2 +- 22 files changed, 615 insertions(+), 228 deletions(-) create mode 100644 src/main/Service/Book/bookPrompt.ts diff --git a/package-lock.json b/package-lock.json index 1a608ba..b0a5bf7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "laitool", - "version": "3.0.2", + "version": "3.0.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "laitool", - "version": "3.0.2", + "version": "3.0.3", "hasInstallScript": true, "dependencies": { "@alicloud/alimt20181012": "^1.2.0", diff --git a/package.json b/package.json index d842f46..1f1929d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "laitool", - "version": "3.0.2", + "version": "3.0.3", "description": "An AI tool for image processing, video processing, and other functions.", "main": "./out/main/index.js", "author": "laitool.cn", diff --git a/resources/scripts/db/book.realm.lock b/resources/scripts/db/book.realm.lock index ce583d083ec40a705e6c6f7a7bac705a53bf546b..fdf514abb2f87dfffbb760031acbda6e942d442a 100644 GIT binary patch literal 1416 zcmZQ%Ksy0 z?G5;7fmPjZH1i~O7=zU@!L&o^4zzILkhVcn0pYGfvv%r?Arut9giY a010P>GKjtC=3&)5DmWSfqai?22mk;sRvvZ$ literal 1416 zcmZQ%$^un@FgBn76a?7^!XUs2x3?P1w^*VC hrqKz6`ylEznDKy>z|28cKgu5sfzc2c4S~TP0syA31i%0Q diff --git a/resources/scripts/db/software.realm.lock b/resources/scripts/db/software.realm.lock index ae999762c0268f2a453a284cdfc06a8c60000517..52188d94b1356099035b151b8b2503d902d3fa6c 100644 GIT binary patch literal 1416 zcmZQ%g3JS9Y(N1hh%6rpw->@t*p6K%!hH~R aE0iGWu&c&q^QhQp2#kinXb23h5C8y5NCOW5 diff --git a/src/define/db/service/Book/bookTaskDetailService.ts b/src/define/db/service/Book/bookTaskDetailService.ts index b9e9ae6..5c7abe2 100644 --- a/src/define/db/service/Book/bookTaskDetailService.ts +++ b/src/define/db/service/Book/bookTaskDetailService.ts @@ -294,4 +294,24 @@ export class BookTaskDetailService extends BaseRealmService { } }) } + + /** + * 删除MJ中生成图片的所有的信息,包括 outImagePath subImagePath mjMessage (mjMessage是另一张表,要单独生成) + * @param bookTaskDetailId + */ + DeleteBoookTaskDetailGenerateImage(bookTaskDetailId: string): void { + this.transaction(() => { + let bookTaskDetail = this.realm.objectForPrimaryKey('BookTaskDetail', bookTaskDetailId) + if (bookTaskDetail == null) { + throw new Error("没有找到要删除的分镜信息") + } + if (bookTaskDetail.mjMessage) { + this.realm.delete(bookTaskDetail.mjMessage) + } + bookTaskDetail.mjMessage = undefined + bookTaskDetail.outImagePath = undefined; + bookTaskDetail.subImagePath = [] + }) + + } } diff --git a/src/define/define_string.ts b/src/define/define_string.ts index 1d84901..440448f 100644 --- a/src/define/define_string.ts +++ b/src/define/define_string.ts @@ -236,6 +236,10 @@ export const DEFINE_STRING = { MERGE_PROMPT: "MERGE_PROMPT", RESET_BOOK_DATA: "RESET_BOOK_DATA", DELETE_BOOK_DATA: "DELETE_BOOK_DATA", + CLEAR_IMPORT_WORD: "CLEAR_IMPORT_WORD", + RESET_GPT_REVERSE_DATA: "RESET_GPT_REVERSE_DATA", + REMOVE_MERGE_PROMPT_DATA: "REMOVE_MERGE_PROMPT_DATA", + REMOVE_GENERATE_IMAGE: 'REMOVE_GENERATE_IMAGE', COMPUTE_STORYBOARD: 'COMPUTE_STORYBOARD', @@ -253,7 +257,6 @@ export const DEFINE_STRING = { SPLI_TAUDIO_RETURN: 'SPLI_TAUDIO_RETURN', ADD_REVERSE_PROMPT: 'ADD_REVERSE_PROMPT', - REMOVE_REVERSE_DATA: 'REMOVE_REVERSE_DATA' }, SYSTEM: { OPEN_FILE: 'OPEN_FILE', diff --git a/src/main/IPCEvent/bookIpc.ts b/src/main/IPCEvent/bookIpc.ts index e5bae53..5af27bd 100644 --- a/src/main/IPCEvent/bookIpc.ts +++ b/src/main/IPCEvent/bookIpc.ts @@ -12,6 +12,7 @@ import { BookVideo } from '../Service/Book/bookVideo' import { Watermark } from '../Service/watermark' import { SubtitleService } from '../Service/Subtitle/subtitleService' import { BookFrame } from '../Service/Book/bookFrame' +import { BookPrompt } from '../Service/Book/bookPrompt' let reverseBook = new ReverseBook() let basicReverse = new BasicReverse() let subtitle = new Subtitle() @@ -24,6 +25,7 @@ let bookVideo = new BookVideo() let watermark = new Watermark() let subtitleService = new SubtitleService() let bookFrame = new BookFrame() +let bookPrompt = new BookPrompt(); export function BookIpc() { // 获取样式图片的子列表 @@ -112,10 +114,28 @@ export function BookIpc() { // 合并提示词 ipcMain.handle(DEFINE_STRING.BOOK.MERGE_PROMPT, async (event, id, type, operateBookType) => await reverseBook.MergePrompt(id, type, operateBookType)) + // 将反推出来的提示词写入到GPT提示词里面 + ipcMain.handle( + DEFINE_STRING.BOOK.REVERSE_PROMPT_TO_GPT_PROMPT, + async (event, bookId, bookTaskId, index) => + await bookPrompt.ReversePromptToGptPrompt(bookId, bookTaskId, index) + ) + + // 删除所有的反推出来的提示词 + ipcMain.handle( + DEFINE_STRING.BOOK.RESET_GPT_REVERSE_DATA, + async (event, id, operateBookType, type) => await bookPrompt.ResetGptReverseData(id, operateBookType, type) + ) + + // 删除所有的合并提示词 + ipcMain.handle( + DEFINE_STRING.BOOK.REMOVE_MERGE_PROMPT_DATA, + async (event, id, operateBookType) => await bookPrompt.RemoveMergePromptData(id, operateBookType) + ) + //#endregion - //#region 一键反推的单个任务 - + //#region 文案相关 // 开始执行获取小说文案的方法 ipcMain.handle( @@ -129,6 +149,15 @@ export function BookIpc() { async (event, bookTaskId) => await subtitleService.ExportCopywriting(bookTaskId) ) + // 清除导入对齐的文案 + ipcMain.handle(DEFINE_STRING.BOOK.CLEAR_IMPORT_WORD, async (event, bookTaskId) => await subtitleService.ClearImportWord(bookTaskId)) + + //#endregion + + //#region 一键反推的单个任务 + + + // 执行去除水印 ipcMain.handle( DEFINE_STRING.BOOK.REMOVE_WATERMARK, @@ -142,13 +171,6 @@ export function BookIpc() { await reverseBook.AddReversePrompt(bookTaskDetailIds, operateBookType, type) ) - // 将反推出来的提示词写入到GPT提示词里面 - ipcMain.handle( - DEFINE_STRING.BOOK.REVERSE_PROMPT_TO_GPT_PROMPT, - async (event, bookId, bookTaskId, index) => - await mjOpt.ReversePromptToGptPrompt(bookId, bookTaskId, index) - ) - // 重选单个反推提示词到输出种 ipcMain.handle( DEFINE_STRING.BOOK.SINGLE_REVERSE_TO_GPT_PROMPT, @@ -156,13 +178,10 @@ export function BookIpc() { await mjOpt.SingleReverseToGptPrompt(bookTaskDetailId, index) ) - // 删除所有的反推出来的提示词 - ipcMain.handle( - DEFINE_STRING.BOOK.REMOVE_REVERSE_DATA, - async (event, bookTaskDetailIds) => await reverseBook.RemoveReverseData(bookTaskDetailIds) - ) - //#endregion + + //#region 图片相关 + // 对指定的小说任务的图片进行锁定和解锁 ipcMain.handle( DEFINE_STRING.BOOK.IMAGE_LOCK_OPERATION, @@ -177,6 +196,35 @@ export function BookIpc() { await bookImage.DownloadImageUrlAndSplit(bookTaskDetailId, imageUrl) ) + // 一键生成当前批次的所有图片 + ipcMain.handle( + DEFINE_STRING.BOOK.GENERATE_IMAGE_ALL, + async (event, bookTaskId, imageCategory) => + await bookImage.GenerateImageAll(bookTaskId, imageCategory) + ) + + // 高清图片前检查,主要是检查图片大小 + ipcMain.handle( + DEFINE_STRING.BOOK.CHECK_IMAGE_FILE_SIZE, + async (event, id, fileSize, operateBookType) => + await bookImage.CheckImageFileSize(id, fileSize, operateBookType) + ) + + // 开始执行高清图片 + ipcMain.handle( + DEFINE_STRING.BOOK.HD_IMAGE, + async (event, id, scale, operateBookType) => await bookImage.HDImage(id, scale, operateBookType) + ) + + // 删除所有的生成图片 + ipcMain.handle( + DEFINE_STRING.BOOK.REMOVE_GENERATE_IMAGE, + async (event, id, operateBookType) => await bookImage.ResetGenerateImage(id, operateBookType) + ) + + //#endregion + + // 一拆四,将一个任务拆分成四个任务,并且复制对应的图片 ipcMain.handle( DEFINE_STRING.BOOK.ONE_TO_FOUR_BOOK_TASK, @@ -207,25 +255,6 @@ export function BookIpc() { async (event, bookTaskId) => await bookTask.DeleteBookTask(bookTaskId) ) - // 一键生成当前批次的所有图片 - ipcMain.handle( - DEFINE_STRING.BOOK.GENERATE_IMAGE_ALL, - async (event, bookTaskId, imageCategory) => - await bookImage.GenerateImageAll(bookTaskId, imageCategory) - ) - - // 高清图片前检查,主要是检查图片大小 - ipcMain.handle( - DEFINE_STRING.BOOK.CHECK_IMAGE_FILE_SIZE, - async (event, id, fileSize, operateBookType) => - await bookImage.CheckImageFileSize(id, fileSize, operateBookType) - ) - - // 开始执行高清图片 - ipcMain.handle( - DEFINE_STRING.BOOK.HD_IMAGE, - async (event, id, scale, operateBookType) => await bookImage.HDImage(id, scale, operateBookType) - ) // 将小说视频相关的设置添加到小说任务批次 ipcMain.handle( diff --git a/src/main/Service/Book/ReverseBook.ts b/src/main/Service/Book/ReverseBook.ts index 7c7d09f..b7172a8 100644 --- a/src/main/Service/Book/ReverseBook.ts +++ b/src/main/Service/Book/ReverseBook.ts @@ -400,29 +400,6 @@ export class ReverseBook { return errorMessage("单个反推失败,错误信息如下:" + error.message, "ReverseBook_SingleReversePrompt") } } - - /** - * 删除指定的提示词数据 - * @param bookTaskDetailIds 要删除的提示词ID - */ - async RemoveReverseData(bookTaskDetailIds: string[]) { - try { - // 开始删除 - if (bookTaskDetailIds.length <= 0) { - throw new Error("没有传入要删除的数据") - } - - for (let i = 0; i < bookTaskDetailIds.length; i++) { - const element = bookTaskDetailIds[i]; - await this.bookServiceBasic.DeleteBookTaskDetailReversePromptById(element); - } - - // 全部删除完毕 - return successMessage(null, "删除反推数据成功", "ReverseBook_RemoveReverseData") - } catch (error) { - return errorMessage("删除反推数据失败,错误信息如下:" + error.message, "ReverseBook_RemoveReverseData") - } - } //#endregion //#region 提示词相关操作 diff --git a/src/main/Service/Book/bookImage.ts b/src/main/Service/Book/bookImage.ts index 8c681bd..b249345 100644 --- a/src/main/Service/Book/bookImage.ts +++ b/src/main/Service/Book/bookImage.ts @@ -1,9 +1,6 @@ import { BookImageCategory, BookType, OperateBookType } from "../../../define/enum/bookEnum"; import { GeneralResponse } from "../../../model/generalResponse"; import { errorMessage, successMessage } from "../../Public/generalTools"; -import { BookTaskService } from "../../../define/db/service/Book/bookTaskService"; -import { BookTaskDetailService } from "../../../define/db/service/Book/bookTaskDetailService"; -import { BookService } from "../../../define/db/service/Book/bookService"; import { Book } from "../../../model/book"; import path from 'path' import { Tools } from "../../../main/tools" @@ -14,6 +11,7 @@ import { MJOpt } from "../MJ/mj"; import { isEmpty } from "lodash"; import { DEFINE_STRING } from "../../../define/define_string"; import { ResponseMessageType } from "../../../define/enum/softwareEnum"; +import { BookServiceBasic } from "../ServiceBasic/bookServiceBasic"; import util from 'util' import { exec } from 'child_process' const execAsync = util.promisify(exec); @@ -22,26 +20,13 @@ const execAsync = util.promisify(exec); * 小说图片执行的相关操作 */ export class BookImage { - bookTaskService: BookTaskService - bookTaskDetailService: BookTaskDetailService - bookService: BookService + bookServiceBasic: BookServiceBasic tools: Tools; mjOpt: MJOpt; constructor() { this.tools = new Tools() this.mjOpt = new MJOpt() - } - - async InitService() { - if (!this.bookTaskService) { - this.bookTaskService = await BookTaskService.getInstance(); - } - if (!this.bookTaskDetailService) { - this.bookTaskDetailService = await BookTaskDetailService.getInstance(); - } - if (!this.bookService) { - this.bookService = await BookService.getInstance(); - } + this.bookServiceBasic = new BookServiceBasic() } /** @@ -52,6 +37,50 @@ export class BookImage { global.newWindow[0].win.webContents.send(message_name, data) } + //#region 删除生成的图片 + + /** + * 删除所有的图片数据(只删除数据库中的,不删除本地文件) + * @param id + * @param operateBookType + */ + async ResetGenerateImage(id: string, operateBookType: OperateBookType): Promise { + try { + let bookTaskDetails = undefined as Book.SelectBookTaskDetail[] + let bookTask = undefined as Book.SelectBookTask + if (operateBookType == OperateBookType.BOOKTASK) { + bookTaskDetails = await this.bookServiceBasic.GetBookTaskDetailData({ + bookTaskId: id + }) + bookTask = await this.bookServiceBasic.GetBookTaskDataById(id) + } else { + throw new Error('不支持的操作类型,请检查') + } + if (bookTaskDetails.length <= 0) { + throw new Error('没有要删除的分镜数据,请检查') + } + + + // 开始删除数据,要删除图片数据和出图的信息 + for (let i = 0; i < bookTaskDetails.length; i++) { + const element = bookTaskDetails[i]; + if (bookTask.imageCategory == BookImageCategory.MJ) { + await this.bookServiceBasic.DeleteBoookTaskDetailGenerateImage(element.id); + } else if (bookTask.imageCategory == BookImageCategory.D3) { + throw new Error('暂时不支持D3生成的图片删除') + } else if (bookTask.imageCategory == BookImageCategory.SD) { + throw new Error('暂时不支持SD生成的图片删除') + } else { + throw new Error('未知的小说类型,请检查') + } + } + return successMessage(bookTask.imageCategory, "删除所有的生图数据成功", "BookImage_ResetGenerateImage") + } catch (error) { + return errorMessage("删除所有的图片数据失败,失败信息如下:" + error.toString(), "BookImage_ResetGenerateImage") + } + } + //#endregion + /** * 开始高清图片,当前默认是四倍,后续可以调整 * @param id 要高清操作的ID @@ -60,21 +89,20 @@ export class BookImage { */ async HDImage(id: string, scale: number, operateBookType: OperateBookType): Promise { try { - await this.InitService() if (scale <= 0 || scale > 4) { throw new Error('高清倍率只能是2,3,4') } let bookTasks = undefined as Book.SelectBookTask[] if (operateBookType == OperateBookType.BOOK) { // 获取所有的小说批次任务 - bookTasks = this.bookTaskService.GetBookTaskData({ + bookTasks = (await this.bookServiceBasic.GetBookTaskData({ bookId: id - }).data.bookTasks + })).bookTasks } else if (operateBookType == OperateBookType.BOOKTASK) { // 获取当前的小说批次任务 - bookTasks = this.bookTaskService.GetBookTaskData({ + bookTasks = (await this.bookServiceBasic.GetBookTaskData({ id: id - }).data.bookTasks + })).bookTasks } else { throw new Error("不支持的操作类型,请检查") } @@ -155,18 +183,17 @@ export class BookImage { */ async CheckImageFileSize(id: string, fileSize: number, operateBookType: OperateBookType) { try { - await this.InitService() let bookTasks = undefined as Book.SelectBookTask[] if (operateBookType == OperateBookType.BOOK) { // 获取所有的小说批次任务 - bookTasks = this.bookTaskService.GetBookTaskData({ + bookTasks = (await this.bookServiceBasic.GetBookTaskData({ bookId: id - }).data.bookTasks + })).bookTasks } else if (operateBookType == OperateBookType.BOOKTASK) { // 获取当前的小说批次任务 - bookTasks = this.bookTaskService.GetBookTaskData({ + bookTasks = (await this.bookServiceBasic.GetBookTaskData({ id: id - }).data.bookTasks + })).bookTasks } else { throw new Error("不支持的操作类型,请检查") } @@ -177,9 +204,9 @@ export class BookImage { let result = [] for (let i = 0; i < bookTasks.length; i++) { const element = bookTasks[i]; - let bookTaskDetail = this.bookTaskDetailService.GetBookTaskData({ + let bookTaskDetail = await this.bookServiceBasic.GetBookTaskDetailData({ bookTaskId: element.id - }).data + }) for (let i = 0; i < bookTaskDetail.length; i++) { const item = bookTaskDetail[i]; if (isEmpty(item.outImagePath)) { @@ -209,7 +236,6 @@ export class BookImage { async GenerateImageAll(bookTaskId: string, imageCategory: BookImageCategory): Promise { try { console.log('开始生成所有的图片', bookTaskId) - await this.InitService() let res = undefined as GeneralResponse.ErrorItem | GeneralResponse.SuccessItem switch (imageCategory) { case BookImageCategory.SD: @@ -236,14 +262,14 @@ export class BookImage { */ async ImageLockOperation(id: string, type: string, operateBookType: OperateBookType): Promise { try { - await this.InitService() let bookTaskDetail = undefined as Book.SelectBookTaskDetail[] if (operateBookType == OperateBookType.BOOKTASK) { - bookTaskDetail = this.bookTaskDetailService.GetBookTaskData({ + bookTaskDetail = await this.bookServiceBasic.GetBookTaskDetailData({ bookTaskId: id - }).data + }) } else if (operateBookType == OperateBookType.BOOKTASKDETAIL) { - bookTaskDetail = [this.bookTaskDetailService.GetBookTaskDetailDataById(id)]; + let tempBookTaskDetail = await this.bookServiceBasic.GetBookTaskDetailDataById(id); + bookTaskDetail = [tempBookTaskDetail]; } else { throw new Error('操作的对象类型不正确') @@ -263,7 +289,7 @@ export class BookImage { for (let i = 0; i < bookTaskDetail.length; i++) { const element = bookTaskDetail[i]; let lock = type == "lock" ? true : false - this.bookTaskDetailService.UpdateBookTaskDetail(element.id, { + await this.bookServiceBasic.UpdateBookTaskDetail(element.id, { imageLock: lock }) @@ -287,16 +313,15 @@ export class BookImage { */ async DownloadImageUrlAndSplit(bookTaskDetailId: string, imageUrl: string,) { try { - await this.InitService(); - let bookTaskDetail = this.bookTaskDetailService.GetBookTaskDetailDataById(bookTaskDetailId) + let bookTaskDetail = await this.bookServiceBasic.GetBookTaskDetailDataById(bookTaskDetailId) if (bookTaskDetail == null) { throw new Error('获取到的数据分镜为空,无法执行操作') } - let book = this.bookService.GetBookDataById(bookTaskDetail.bookId) + let book = await this.bookServiceBasic.GetBookDataById(bookTaskDetail.bookId) if (book == null) { throw new Error('获取到的小说为空,无法执行操作') } - let bookTask = this.bookTaskService.GetBookTaskDataById(bookTaskDetail.bookTaskId) + let bookTask = await this.bookServiceBasic.GetBookTaskDataById(bookTaskDetail.bookTaskId) if (bookTask == null) { throw new Error('获取到的任务为空,无法执行操作') } @@ -327,7 +352,7 @@ export class BookImage { await CopyFileOrFolder(firstImage, out_file); // 修改分镜的数据 - this.bookTaskDetailService.UpdateBookTaskDetail(bookTaskDetailId, { + await this.bookServiceBasic.UpdateBookTaskDetail(bookTaskDetailId, { outImagePath: path.relative(define.project_path, out_file), subImagePath: imageRes.map((item) => path.relative(define.project_path, item)) }) diff --git a/src/main/Service/Book/bookPrompt.ts b/src/main/Service/Book/bookPrompt.ts new file mode 100644 index 0000000..86e3bf8 --- /dev/null +++ b/src/main/Service/Book/bookPrompt.ts @@ -0,0 +1,153 @@ +import { isEmpty } from "lodash"; +import { BookType, OperateBookType } from "../../../define/enum/bookEnum"; +import { Book } from "../../../model/book"; +import { GeneralResponse } from "../../../model/generalResponse"; +import { errorMessage, successMessage } from "../../Public/generalTools"; +import { BookServiceBasic } from "../ServiceBasic/bookServiceBasic"; + +export class BookPrompt { + bookServiceBasic: BookServiceBasic + constructor() { + this.bookServiceBasic = new BookServiceBasic() + } + + /** + * 将MJ反推出来的数据,选择指定的写入到GPT提示词中 + * @param bookId 小说的ID + * @param bookTaskId 小说的任务ID + * @param index 反推的数据的索引 + * @returns + */ + async ReversePromptToGptPrompt(bookId: string, bookTaskId: string, index: number): Promise { + try { + let bookTaskDetails = await this.bookServiceBasic.GetBookTaskDetailData({ + bookId: bookId, + bookTaskId: bookTaskId + }) + + if (bookTaskDetails.length <= 0) { + throw new Error("没有找到对应的分镜数据") + } + let emptyName = [] + + // 开始修改数据 + for (let i = 0; i < bookTaskDetails.length; i++) { + const element = bookTaskDetails[i]; + let reversePrompts = element.reversePrompt + // 没有反推提示词跳过 + if (!reversePrompts || reversePrompts.length <= 0) { + emptyName.push(element.name) + continue; + } + let reversePrompt = reversePrompts[index - 1] + let gptPrompt = undefined + if (!isEmpty(reversePrompt.promptCN) && reversePrompt.promptCN != "") { + gptPrompt = reversePrompt.promptCN + } + if (!gptPrompt) { + gptPrompt = reversePrompt.prompt + } + // 开始修改 + await this.bookServiceBasic.UpdateBookTaskDetail(element.id, { + gptPrompt: gptPrompt + }) + } + // 全部修改完毕,将修改后的数据返回 + let res = await this.bookServiceBasic.GetBookTaskDetailData({ + bookTaskId: bookTaskId + }); + let returnString = '选择的反推提示词数据写出成功' + if (emptyName.length > 0) { + returnString = '选择的反推提示词数据写出成功,但是以下分镜没有反推提示词:' + emptyName.join(',') + } + return successMessage(res, returnString, "ReverseBook_ReversePromptToGptPrompt") + } catch (error) { + return errorMessage("反推数据写出失败,错误信息如下:" + error.message, "ReverseBook_ReversePromptToGptPrompt") + } + } + + /** + * 删除所有的提示词数据(反推和推理的) + * @param id 操作的ID + * @param operateBookType 操作的类型(小说批次任务还是小说分镜数据) + * @param type 类型 + * @returns + */ + async ResetGptReverseData(id: string, operateBookType: OperateBookType, type: BookType): Promise { + try { + console.log(id, operateBookType, type) + let bookTask = undefined as Book.SelectBookTask + let bookTaskDetails = undefined as Book.SelectBookTaskDetail[] + if (operateBookType == OperateBookType.BOOKTASK) { + bookTask = await this.bookServiceBasic.GetBookTaskDataById(id) + bookTaskDetails = await this.bookServiceBasic.GetBookTaskDetailData({ + bookTaskId: id + }) + } else if (operateBookType == OperateBookType.BOOKTASKDETAIL) { + let bookTaskDetail = await this.bookServiceBasic.GetBookTaskDetailDataById(id) + bookTaskDetails = [bookTaskDetail] + } + else { + throw new Error('未知的操作类型,请检查'); + } + if (bookTaskDetails.length <= 0) { + throw new Error("没有传入要删除的数据") + } + + // 开始执行不同的删除逻辑 + if (type == BookType.MJ_REVERSE) { + // MJ 反推 + for (let i = 0; i < bookTaskDetails.length; i++) { + const element = bookTaskDetails[i]; + await this.bookServiceBasic.DeleteBookTaskDetailReversePromptById(element.id); + } + } else if (type == BookType.ORIGINAL) { + throw new Error("原创小说删除还不支持") + } else if (type == BookType.SD_REVERSE) { } + else { + throw new Error("SD反推删除还不支持") + } + + // 全部删除完毕 + return successMessage(null, "重置反推/GPT数据成功", "ReverseBook_ResetGptReverseData") + } catch (error) { + return errorMessage("删除反推数据失败,错误信息如下:" + error.message, "ReverseBook_ResetGptReverseData") + } + } + + /** + * 删除指定小说批次数据的合并提示词数据 + * @param id 要操作的ID + * @param operateBookType 操作的类型 + * @returns + */ + async RemoveMergePromptData(id: string, operateBookType: OperateBookType): Promise { + try { + let bookTaskDetails = undefined as Book.SelectBookTaskDetail[] + if (operateBookType == OperateBookType.BOOKTASK) { + bookTaskDetails = await this.bookServiceBasic.GetBookTaskDetailData({ + bookTaskId: id + }) + } else { + throw new Error('未知的操作类型,请检查'); + } + + if (bookTaskDetails.length <= 0) { + throw new Error("没有传入要删除的分镜数据") + } + + // 开始删除合并提示词数据 + for (let i = 0; i < bookTaskDetails.length; i++) { + const element = bookTaskDetails[i]; + await this.bookServiceBasic.UpdateBookTaskDetail(element.id, { + prompt: undefined + }) + } + return successMessage(null, "删除所有的合并提示词数据成功", "ReverseBook_RemoveMergePromptData") + } catch (error) { + return errorMessage("删除合并提示词数据失败,错误信息如下:" + error.message, "ReverseBook_RemoveMergePromptData") + } + } + + +} \ No newline at end of file diff --git a/src/main/Service/MJ/mj.ts b/src/main/Service/MJ/mj.ts index d32c53a..be626d5 100644 --- a/src/main/Service/MJ/mj.ts +++ b/src/main/Service/MJ/mj.ts @@ -81,53 +81,6 @@ export class MJOpt { //#region 选择反推的提示词相关 - /** - * 将MJ反推出来的数据,选择指定的写入到GPT提示词中 - * @param bookId 小说的ID - * @param bookTaskId 小说的任务ID - * @param index 反推的数据的索引 - * @returns - */ - async ReversePromptToGptPrompt(bookId: string, bookTaskId: string, index: number): Promise { - try { - await this.InitService(); - let bookTaskDetails = this.bookTaskDetail.GetBookTaskData({ - bookId: bookId, - bookTaskId: bookTaskId - }).data as Book.SelectBookTaskDetail[] - - if (bookTaskDetails.length <= 0) { - throw new Error("没有找到对应的分镜数据") - } - - // 开始修改数据 - for (let i = 0; i < bookTaskDetails.length; i++) { - const element = bookTaskDetails[i]; - let reversePrompts = element.reversePrompt - let reversePrompt = reversePrompts[index - 1] - let gptPrompt = undefined - if (!isEmpty(reversePrompt.promptCN) && reversePrompt.promptCN != "") { - gptPrompt = reversePrompt.promptCN - } - if (!gptPrompt) { - gptPrompt = reversePrompt.prompt - } - // 开始修改 - this.bookTaskDetail.UpdateBookTaskDetail(element.id, { - gptPrompt: gptPrompt - }) - } - // 全部修改完毕,将修改后的数据返回 - let res = await this.reverseBook.GetBookTaskDetail(bookTaskId); - if (res.code == 0) { - throw new Error(res.message) - } - return successMessage(res.data, "反推数据写出成功", "ReverseBook_ReversePromptToGptPrompt") - } catch (error) { - return errorMessage("反推数据写出失败,错误信息如下:" + error.message, "ReverseBook_ReversePromptToGptPrompt") - } - } - /** * MJ反推,将反推的数据写入到GPT中 * @param bookTaskDetailId @@ -356,7 +309,7 @@ export class MJOpt { } } if (emptyName.length > 0) { - throw new Error("有空的提示词,请先推理") + throw new Error(`${emptyName.join(',')} 的提示词为空,请先推理`) } } else if (operateBookType == OperateBookType.BOOKTASKDETAIL) { let tempBookTaskDetail = await this.bookServiceBasic.GetBookTaskDetailDataById(id); diff --git a/src/main/Service/SD/sd.ts b/src/main/Service/SD/sd.ts index d184dcb..848fe60 100644 --- a/src/main/Service/SD/sd.ts +++ b/src/main/Service/SD/sd.ts @@ -61,7 +61,7 @@ export class SDOpt { } } if (emptyName.length > 0) { - throw new Error("有空的提示词,请先推理") + throw new Error(`${emptyName.join(',')} 的提示词为空,请先推理`) } } else if (operateBookType == OperateBookType.BOOKTASKDETAIL) { let tempBookTaskDetail = await this.bookServiceBasic.GetBookTaskDetailDataById(id); diff --git a/src/main/Service/ServiceBasic/bookServiceBasic.ts b/src/main/Service/ServiceBasic/bookServiceBasic.ts index 96e82cd..82230f1 100644 --- a/src/main/Service/ServiceBasic/bookServiceBasic.ts +++ b/src/main/Service/ServiceBasic/bookServiceBasic.ts @@ -88,7 +88,7 @@ export class BookServiceBasic { * @param bookTaskId 小说批次任务ID * @returns */ - async GetBookTaskDataId(bookTaskId: string): Promise { + async GetBookTaskDataById(bookTaskId: string): Promise { await this.InitService(); let bookTask = this.bookTaskService.GetBookTaskDataById(bookTaskId); if (bookTask == null) { @@ -195,6 +195,15 @@ export class BookServiceBasic { this.bookTaskDetailService.DeleteBookTaskDetailReversePromptById(bookTaskDetailId) } + /** + * 删除指定的小说分镜生成的图片 + * @param bookTaskDetailId + */ + async DeleteBoookTaskDetailGenerateImage(bookTaskDetailId: string): Promise { + await this.InitService() + this.bookTaskDetailService.DeleteBoookTaskDetailGenerateImage(bookTaskDetailId); + } + //#endregion //#region 小说后台任务相关操作 diff --git a/src/main/Service/Subtitle/subtitleService.ts b/src/main/Service/Subtitle/subtitleService.ts index deb1c56..8023c9e 100644 --- a/src/main/Service/Subtitle/subtitleService.ts +++ b/src/main/Service/Subtitle/subtitleService.ts @@ -14,6 +14,7 @@ import { Subtitle } from "./subtitle"; import { TaskScheduler } from "../taskScheduler"; import { OperateBookType } from "../../../define/enum/bookEnum"; import { Book } from "../../../model/book"; +import { TimeStringToMilliseconds } from "../../../define/Tools/time"; export class SubtitleService { softWareServiceBasic: SoftWareServiceBasic @@ -197,7 +198,7 @@ export class SubtitleService { */ async ExportCopywriting(bookTaskId: string): Promise { try { - let bookTask = await this.bookServiceBasic.GetBookTaskDataId(bookTaskId) + let bookTask = await this.bookServiceBasic.GetBookTaskDataById(bookTaskId) let book = await this.bookServiceBasic.GetBookDataById(bookTask.bookId) let bookTaskDetails = await this.bookServiceBasic.GetBookTaskDetailData({ bookId: book.id, @@ -228,8 +229,64 @@ export class SubtitleService { } catch (error) { return errorMessage("导出文案失败,失败信息如下:" + error.message, 'ReverseBook_ExportCopywriting') } + } + //#region 文案相关的操作 + + /** + * 清除导入的对齐后的文案 + * @param bookTaskId 小说批次任务ID + */ + async ClearImportWord(bookTaskId: string): Promise { + try { + let bookTaskDetails = await this.bookServiceBasic.GetBookTaskDetailData({ + bookTaskId: bookTaskId + }) + if (bookTaskDetails.length <= 0) { + throw new Error("没有找到对应小说批次任务的的分镜数据") + } + let book = await this.bookServiceBasic.GetBookDataById(bookTaskDetails[0].bookId) + let originalTimePath = path.join(book.bookFolderPath, `data/${book.id}.mp4.json`); + let originalTime = [] as any[]; + if (await CheckFileOrDirExist(originalTimePath)) { + let originalTimeString = await fs.promises.readFile(originalTimePath, 'utf-8'); + if (ValidateJson(originalTimeString)) { + originalTime = JSON.parse(originalTimeString) + } + } + // 判断分镜数据和批次数据是不是相同的 + if (originalTime.length != bookTaskDetails.length) { + originalTime = [] + } + + // 开始删除,需要做的操作,删除 bookTaskDetail 众的subValue 数据,将时间数据复原 + for (let i = 0; i < bookTaskDetails.length; i++) { + const element = bookTaskDetails[i]; + let updateObj = { + subValue: undefined + } as Book.SelectBookTaskDetail + + // 开始重置时间 + if (originalTime[i]) { + let startTime = TimeStringToMilliseconds(originalTime[i][0]) + let endTime = TimeStringToMilliseconds(originalTime[i][1]) + updateObj.startTime = startTime; + updateObj.endTime = endTime; + updateObj.timeLimit = undefined + } + await this.bookServiceBasic.UpdateBookTaskDetail(element.id, updateObj); + } + let returnBookTaskDetail = await this.bookServiceBasic.GetBookTaskDetailData({ + bookTaskId: bookTaskId + }) + // 成功 + return successMessage(returnBookTaskDetail, "重置导入文案对齐数据成功", "ReverseBook_ClearImportWord") + } catch (error) { + return errorMessage("清除导入的文案失败,失败信息如下:" + error.message, 'ReverseBook_ClearImportWord') + } } //#endregion + + //#endregion } \ No newline at end of file diff --git a/src/preload/book.js b/src/preload/book.js index 709e2cf..e9a31e6 100644 --- a/src/preload/book.js +++ b/src/preload/book.js @@ -85,6 +85,10 @@ const book = { ExportCopywriting: async (bookTaskId) => await ipcRenderer.invoke(DEFINE_STRING.BOOK.EXPORT_COPYWRITING, bookTaskId), + // 清除导入对齐的文案 + ClearImportWord: async (bookTaskId) => + await ipcRenderer.invoke(DEFINE_STRING.BOOK.CLEAR_IMPORT_WORD, bookTaskId), + //#endregion //#region 水印 @@ -130,9 +134,18 @@ const book = { index ), - // 删除掉所有的反推数据 - RemoveReverseData: async (bookTaskDetailIds) => - await ipcRenderer.invoke(DEFINE_STRING.BOOK.REMOVE_REVERSE_DATA, bookTaskDetailIds), + // 删除掉所有的反推和GPT提示词数据 + ResetGptReverseData: async (id, operateBookType, type) => + await ipcRenderer.invoke(DEFINE_STRING.BOOK.RESET_GPT_REVERSE_DATA, id, operateBookType, type), + + // 删除所有的合并提示词数据 + ResetMergePromptData: async (id, operateBookType) => + await ipcRenderer.invoke(DEFINE_STRING.BOOK.REMOVE_MERGE_PROMPT_DATA, id, operateBookType), + + // 删除所有的生成图片 + ResetGenerateImage: async (id, operateBookType) => + await ipcRenderer.invoke(DEFINE_STRING.BOOK.REMOVE_GENERATE_IMAGE, id, operateBookType), + //#endregion // 将小说任务的所有的图片进行锁定和解锁 diff --git a/src/renderer/src/components/Book/Components/DatatableAfterGpt.vue b/src/renderer/src/components/Book/Components/DatatableAfterGpt.vue index 8e497d0..77287e6 100644 --- a/src/renderer/src/components/Book/Components/DatatableAfterGpt.vue +++ b/src/renderer/src/components/Book/Components/DatatableAfterGpt.vue @@ -1,5 +1,5 @@