Compare commits

..
29 Commits
Author SHA1 Message Date
admin777 cb7d0dd23e V 3.4.3(2025.08.16)
1. 导出剪映草稿,字幕自动换行
2. 修复一键导出草稿保存数据
3. 修复 一拆四 无效
4. 适配 按主题下的导出草稿界面
2025-08-16 14:50:55 +08:00
admin777 683087d15e v 3.4.2.1 修复 一拆四 2025-08-11 14:29:58 +08:00
admin777 82ec437b5d v 3.4.2
1. 新增 图/文转视频 菜单界面,专注实现图/文转视频(目前只集成了 MJ VIDEO)
  1. 全新的界面排列,小说列表和批次任务更加分明
  2. 添加转视频进度,在主界面即可看到转视频的比例
  3. 单独的界面去处理图转视频,避免表格数据过多繁琐
  4. 新增分页显示,界面加载更快,也可切换不分页,需要更多的事件等待加载
  5. 单独操作面板,参数修改处理更加清晰,支持多种模式显示,右侧固定或抽屉模式
  6. 批量设置转视频配置,可以批量修改分类
  7. 友好的选择视频界面
2. 重写 软件导出剪映,修复若干草稿导出问题
  1. 修复导出剪映文案和图片对齐会有些许对不上,时长越长越明显
  2. 修复导出草稿关键帧部分问题
  3. 导出的文案通过分镜自动导入,不再需要手动选择SRT
3. 美化 生成草稿界面 弹窗,优化部分逻辑
  1. 删除选择SRT文件,SRT根据聚合推文中导入的SRT自动生成草稿
  2. 只需选择配音文件即可,配音文件和导入的SRT请自行对应
  3. 背景音乐不在内部设置,自行选择文件夹或者是MP3、WAV文件
  4. 背景音乐选择文件夹则读取文件夹,随机获取一个
  5. 背景音乐选择指定的音乐文件则使用选择的
2025-08-09 18:46:07 +08:00
admin777 c1d6fe181d temp 2025-07-19 12:46:27 +08:00
admin777 12e1da5681 V 3.4.1 (2025.07.08)
1. 适配 MJ V7 版本的 oref 参数
2. 恢复超级单帧中文版推理模式
3. 出图进度添加本地图片文件是否存在的判断
4. 新增 推理模式 Laitool提示词专家-全能优化版
2025-07-08 15:55:45 +08:00
admin777 87d3b7fc17 V 3.4.0
1. 新增来推内置自营生图包
2. 新增 工具箱 菜单,添加 图片压缩 和 LaiTool图床(用作MJ垫图)
3. 新增一个新的推理模式
4. 修复剪映关键缩放大小计算错误
5. MJ生图包适配修改
2025-06-23 22:08:22 +08:00
admin777 7a774c48da V 3.3.9(2025.05.29)
1. 生图包适配,修复部分任务无法获取图片的问题。
2. 新增聚合推文原创重置功能,直接重置GPT提示词、合并提示词、出图等。
3. 优化加载界面,提升用户体验。
4. 优化主页显示,优化UI界面,提升用户体验。
2025-05-29 14:44:37 +08:00
admin777 50900d3465 V3.3.8
1. 优化/适配生图包
2025-05-20 12:53:48 +08:00
admin777 4f61785cb0 V 3.3.6(2025.05.08)
1. 新增推理模式-Laitool分镜大师-全面版
2. 修复comfyui合并提示词
3. 完善停止后台任务
2025-05-08 20:30:50 +08:00
admin777 bf4b488a02 V 3.3.5
1. 支持自定义MJ API,接口格式必须满足 Midjourney-proxy-plus 接口,https://apiai.apifox.cn/folder-31977042
2. 支持自定义生图包。生图包的格式必须满足 Midjourney-proxy-plus 接口,https://apiai.apifox.cn/folder-31977042
3. 修改软件机器码生成方式
4. 新增推理模式(聚合推文,配合人物提取可以做到人物统一)
5. 修改软件内置人物提取提示词
2025-04-10 20:16:51 +08:00
admin777 863ac4d7f4 V 3.3.4
1. 新增MJ V7 模型
2. 添加MJ生图包
2025-04-08 14:37:35 +08:00
admin777 c43abd6908 V 3.3.3
1. 修复MJ设置初始化问题
2. 添加MJ本地代理模式,可以本地部署的代理模式
2025-04-02 19:52:57 +08:00
admin777 927dd14574 V 3.3.2
1. 修复SD出图子图需要重新刷新显示问题
2. 修复文件有特殊字符选图不能拖拽问题
2025-03-22 13:47:47 +08:00
admin777 6336b36ead V3.3.1
1. 初步接入 comfy UI 出图,设定工作流,导出API,直接添加到软件,选中对应的工作流调用出图
2. 文案处理模型改为选择,同步通用设置的模型列表和令牌,添加测试链接功能
3. 添加缓存区图片删除功能
4. 添加垫图/MJ提示词过滤,提示无效的垫图文件(在出图的时候和添加垫图链接的时候,主要过滤飞书链接)
5. 优化聚合推文选图逻辑,没有出过图也能拖拽
6. 优化处理软件所有的加载状态
7. 修复MJ设置初始化问题
2025-03-22 10:38:23 +08:00
admin777 77ee38d302 V 3.2.5(2025.02.26)
1. 修复新用户合并MJ设置初始化问题
2. 修复原创MJ设置数据缺失
2025-02-26 12:03:01 +08:00
admin777 03d3ff7e9d V 3.2.4(2025.02.24)
1. 新增MJ(API,代理模式)国内转发接口(不包括反推),解决部分用户不能访问外部网络
2. 新增 FLUX-API 国内转发接口,解决部分用户不能访问外部网络(可能出现超时报错)
3. 动态设置FLUX模型,统一后台管理
4. 新增图转视频国内(Kling,Luma,Runway)转发接口,解决部分用户不能访问外部网络
5. 新增支持 Luma 慢速模型
6. 优化MJ设置及MJ请求,减少出错
7. MJ代理模式取消账号生图速度校验
注意:本次更新需要重新设置MJ设置(代理账号不用)
2025-02-24 17:25:00 +08:00
admin777 6cf1e7df5b 修复升级数据库升级失败 2025-02-17 22:11:51 +08:00
admin777 b0eb7795e4 V 3.2.3
1.优化文案处理逻辑,重构界面
2.修复批量导出草稿只能导出一个的bug
3.添加自动 推理人物 场景 方便快速生成标签
4.(聚合推文) 修复删除数据bug
5.新增推理国内转发接口(包括翻译)
6.新增文案导入时导入SRT后可手动校验一遍时间数据,简化简单过程
7.语音服务那边添加字符不生效,格式化不生效
8.优化语音服务(数据结构优化,可设置合成超时时间)
2025-02-17 18:26:47 +08:00
admin777 1ce665a3e5 同步 2025-02-10 12:20:01 +08:00
admin777 d595e932e3 1 2025-02-10 11:44:51 +08:00
admin777 597adaa75a 还原大文件 2025-02-10 11:40:38 +08:00
admin777 60a80770e2 删除大文件 2025-02-10 11:22:59 +08:00
admin777 f17de033e1 V 3.2.2
1. 文案处理后端服务迁移(此版本之前的后端服务持续到12月1日)
2. 新增默认动图方式
3. (聚合推文)实现原创分类的图生视频(runway,luma,可灵)
4. 修复软件内配音
5. 删除旧的原创生图(原创,SD反推,MJ反推等操作在聚合推文中)
6. 导出剪映适配(视频)
7. 新增四个单句推理模式
2024-11-19 20:28:31 +08:00
admin777 6fa58e4d94 V 3.2.1 2024.11.9
1. (聚合推文)修复原创默认出图方式设置默认值
2. (聚合推文)优化出图显示
3. (聚合推文)添加图片上传功能,包括主图和选图区域
4. (聚合推文)新增图片缓存区,上传缓存图片(主图和选图区的图片),可以直接在当前小说所有的批次中的分镜中调用(下载到主图和选图区)
5. (聚合推文)添加一键修脸开关
6. (聚合推文)原创添加一键锁定
7. (聚合推文)新增小说批次任务显示当前所属小说
8. (聚合推文)小说批次任务状态显示优化
9. (聚合推文)优化后台任务状态显示
10. (聚合推文)原创,反推 一键生图 修复
2024-11-09 16:46:06 +08:00
admin777 51deef0c09 V3.2.0
修复聚合推文剪映抽帧时,导入srt没有输入
(聚合推文) SD 反推,MJ反推添加单句洗稿功能
(聚合推文)小说任务列表,添加进入出图文件夹的菜单
(聚合推文)新增一键出图
(聚合推文)新增默认出图方式设置,
5.1只对原创生效,SD反推默认是SD,MJ反推默认是MJ
5.2添加批次的默认出图方式同 a点说明,但是选择了 选择旧批次,新批次的默认出图方式会继承
后台任务,完成后台任务的可视化界面
(聚合推文)小说详情界面,添加小说和批次名称显示
2024-11-02 18:18:55 +08:00
admin777 22cfe65dde 3.1.9 2024.10.28
1. (聚合推文)MJ反推、SD反推 添加剪映分镜
2. (聚合推文)完善SD反推分类(界面同MJ反推,些许不一致)
3. (聚合推文)完成一键合成视频(单个和批量)
4. 修改聚合推文进入界面小说批次任务表格样式
5. (聚合推文)完善一键重置
6. (聚合推文)完善一键删除
2024-10-28 18:38:11 +08:00
admin777 0c5988ed41 V3.1.8
1. 添加软件高清倍率设置,实现自定义高清倍率(支持两倍、三倍和四倍,默认是两倍)
2. (聚合推文)新增导出草稿。可以依赖做好的草稿文件,只替换图片文件
3. (聚合推文)新增批量生成草稿
4. (聚合推文)修改小说批次任务进行详细界面操作为双击
2024-10-23 22:59:29 +08:00
admin777 f4d042f699 V 3.1.7
1. 移除软件包自带的本地 whisper(需单独安装)
2. 重构版本底层依赖,移除外部依赖
3. 修复 首页 暗黑模式不兼容的问题
4. 修复 SD 合并提示词报错
2024-10-20 23:19:22 +08:00
admin777 efa8d3b2a2 1. 添加英文配音
2. 修复聚合推文 任务没有文件不能删掉
3. 修复聚合推文删除所有的批次任务之后,不能再添加的问题
4. 添加版本更新通知,版本更新内容提醒
5. 添加MJ代理MJ账号设置,可以删除本地的账号和同步云端的账号(主要是状态和禁用原因)
2024-10-18 12:39:40 +08:00
355 changed files with 41183 additions and 12518 deletions
+11
View File
@@ -30,3 +30,14 @@ resources/config*
*.log* *.log*
resources/scripts/db/book.realm.lock resources/scripts/db/book.realm.lock
resources/scripts/db/software.realm.lock resources/scripts/db/software.realm.lock
resources/scripts/localWhisper/__pycache__/*
resources/scripts/laitool/.venv
resources/scripts/laitool/build
resources/scripts/laitool/dist
resources/scripts/localWhisper/build/*
resources/scripts/__pycache__/*
resources/scripts/db/*
resources/scripts/localWhisper/.venv/*
resources/scripts/localWhisper/_internal/*
resources/scripts/localWhisper/local_whisper.exe
resources/scripts/joyCaption/.venv/*
+25 -6
View File
@@ -1,24 +1,43 @@
import { resolve } from 'path' import { resolve } from 'path'
import { defineConfig, externalizeDepsPlugin, bytecodePlugin } from 'electron-vite' import { defineConfig, externalizeDepsPlugin, bytecodePlugin } from 'electron-vite'
import vue from '@vitejs/plugin-vue' import vue from '@vitejs/plugin-vue'
import Jsx from '@vitejs/plugin-vue-jsx' import AutoImport from 'unplugin-auto-import/vite'
import { NaiveUiResolver } from 'unplugin-vue-components/resolvers'
import tsconfigPaths from 'vite-tsconfig-paths'
import Components from 'unplugin-vue-components/vite'
export default defineConfig({ export default defineConfig({
main: { main: {
plugins: [externalizeDepsPlugin(), bytecodePlugin()] plugins: [externalizeDepsPlugin(), bytecodePlugin(), tsconfigPaths()]
}, },
discord: { discord: {
plugins: [externalizeDepsPlugin(), bytecodePlugin()] plugins: [externalizeDepsPlugin(), bytecodePlugin(), tsconfigPaths()]
}, },
preload: { preload: {
plugins: [externalizeDepsPlugin(), bytecodePlugin()] plugins: [externalizeDepsPlugin(), bytecodePlugin(), tsconfigPaths()]
}, },
renderer: { renderer: {
resolve: { resolve: {
alias: { alias: {
'@renderer': resolve('src/renderer/src') '@renderer': resolve('src/renderer/src'),
'@': resolve('src/')
} }
}, },
plugins: [vue(), Jsx()] plugins: [
vue(),
AutoImport({
imports: [
'vue',
{
'naive-ui': ['useDialog', 'useMessage', 'useNotification', 'useLoadingBar']
}
]
}),
Components({
resolvers: [NaiveUiResolver()],
// 不自动导入自己添加的组件
dirs: [] // 清空自动导入的目录,所有的自动导入都通过 resolvers 进行
})
]
} }
}) })
+923 -1726
View File
File diff suppressed because it is too large Load Diff
+18 -12
View File
@@ -1,6 +1,6 @@
{ {
"name": "laitool", "name": "laitool",
"version": "3.1.5", "version": "3.4.3",
"description": "An AI tool for image processing, video processing, and other functions.", "description": "An AI tool for image processing, video processing, and other functions.",
"main": "./out/main/index.js", "main": "./out/main/index.js",
"author": "laitool.cn", "author": "laitool.cn",
@@ -18,40 +18,37 @@
}, },
"dependencies": { "dependencies": {
"@alicloud/alimt20181012": "^1.2.0", "@alicloud/alimt20181012": "^1.2.0",
"@alicloud/openapi-client": "^0.4.12",
"@alicloud/tea-util": "^1.4.9",
"@electron-toolkit/preload": "^3.0.0", "@electron-toolkit/preload": "^3.0.0",
"@electron-toolkit/utils": "^3.0.0", "@electron-toolkit/utils": "^3.0.0",
"@vicons/ionicons5": "^0.12.0", "@vicons/ionicons5": "^0.12.0",
"@vitejs/plugin-vue-jsx": "^3.1.0",
"@volcengine/openapi": "^1.16.0", "@volcengine/openapi": "^1.16.0",
"7zip-min": "^1.4.4",
"artplayer": "^5.1.6", "artplayer": "^5.1.6",
"awesome-js": "^2.0.0", "awesome-js": "^2.0.0",
"axios": "^1.6.5", "axios": "^1.6.5",
"blob-to-buffer": "^1.2.9",
"compressing": "^1.10.0", "compressing": "^1.10.0",
"crypto-js": "^4.2.0", "crypto-js": "^4.2.0",
"electron-store": "^9.0.0",
"electron-updater": "^6.1.7",
"fluent-ffmpeg": "^2.1.3", "fluent-ffmpeg": "^2.1.3",
"form-data": "^4.0.1",
"highlight.js": "^11.9.0", "highlight.js": "^11.9.0",
"install": "^0.13.0", "https-proxy-agent": "^7.0.5",
"jieba-js": "^1.0.2",
"jsdom": "^24.0.0", "jsdom": "^24.0.0",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"moment-timezone": "^0.5.45", "moment-timezone": "^0.5.45",
"music-metadata": "^7.14.0", "music-metadata": "^7.14.0",
"node-edge-tts": "^1.2.3", "node-edge-tts": "^1.2.7",
"node-gyp": "^10.2.0",
"node-machine-id": "^1.1.12", "node-machine-id": "^1.1.12",
"node-pre-gyp": "^0.17.0",
"npm": "^10.7.0", "npm": "^10.7.0",
"paddle": "^1.0.0",
"pinia": "^2.1.7", "pinia": "^2.1.7",
"realm": "^12.9.0", "realm": "^12.9.0",
"sharp": "^0.33.2", "sharp": "^0.33.2",
"systeminformation": "^5.22.10", "systeminformation": "^5.22.10",
"tencentcloud-sdk-nodejs": "^4.0.821", "tencentcloud-sdk-nodejs": "^4.0.821",
"unplugin-auto-import": "^19.1.2",
"unplugin-vue-components": "^28.4.1",
"uuid": "^9.0.1", "uuid": "^9.0.1",
"vite-tsconfig-paths": "^5.0.1",
"vue-router": "^4.2.5", "vue-router": "^4.2.5",
"wav-file-info": "^0.0.10", "wav-file-info": "^0.0.10",
"winston": "^3.13.0", "winston": "^3.13.0",
@@ -73,6 +70,8 @@
"eslint-plugin-vue": "^9.19.2", "eslint-plugin-vue": "^9.19.2",
"naive-ui": "^2.38.2", "naive-ui": "^2.38.2",
"prettier": "^3.1.1", "prettier": "^3.1.1",
"process": "^0.11.10",
"util": "^0.12.5",
"vite": "^5.0.11", "vite": "^5.0.11",
"vue": "^3.4.5" "vue": "^3.4.5"
}, },
@@ -89,11 +88,18 @@
"resources/image/style/**", "resources/image/style/**",
"resources/image/zhanwei.png", "resources/image/zhanwei.png",
"resources/scripts/model/**", "resources/scripts/model/**",
"resources/scripts/Lai.exe",
"resources/scripts/xiangbei_jianying_main.exe",
"resources/scripts/discordScript.js", "resources/scripts/discordScript.js",
"resources/tmp/**", "resources/tmp/**",
"resources/icon.ico" "resources/icon.ico"
], ],
"nsis": {
"oneClick": false,
"allowToChangeInstallationDirectory": true
},
"win": { "win": {
"target": "nsis",
"icon": "./resources/icon.ico" "icon": "./resources/icon.ico"
} }
} }
Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

+53
View File
@@ -0,0 +1,53 @@
<svg class="svg-canvas" viewBox="0 0 800 600" width="1600" height="1200" preserveAspectRatio="none" version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<!--滤镜-->
<defs>
<filter id="filter_shadow_shape_HBt9Poo2sR" width="300%" height="300%" x="-100%" y="-100%">
<feDropShadow dx="7.431448254773942" dy="6.691306063588582" stdDeviation="1.2000000000000002" flood-color="#000000" flood-opacity="0.26"></feDropShadow>
</filter>
</defs>
<!--元素-->
<g id="shape_BG1gIWpILa" ref="shape_BG1gIWpILa" key="shape_BG1gIWpILa" mask="">
<g transform="translate(-82.01635169835797,-38.231795889017974) rotate(0,482.36560107022797,353.36560107022797) scale(1,1)" style="opacity: 1;mix-blend-mode: multiply;" filter="">
<!--普通元素-->
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
xmlns:xlink="http://www.w3.org/1999/xlink" width="964.7312021404559" height="706.7312021404559" viewBox="0 0 964.7312021404559 706.7312021404559" data-ligature="true" data-parent="shape_BG1gIWpILa">
<g data-role="text" data-width="354.00141380959474" data-height="117" transform="translate(305.3648941654306, 294.86560107022797)">
<path d="M17.66-71.89L17.66-71.89Q19.68-69.97 28.03-67.96L28.03-67.96Q30.43-66.61 30.43-63.83L30.43-63.83L30.43-63.54Q30.43-60.18 25.05-59.42L25.05-59.42L24.48-58.46L24.48-56.44Q21.79-45.79 21.79-40.89L21.79-40.89L22.08-38.20L20.35-28.70L20.64-27.26Q19.10-16.70 19.10-15.65L19.10-15.65L19.39-15.65Q24.57-15.65 44.44-15.93L44.44-15.93Q46.55-15.65 46.84-15.65L46.84-15.65Q51.64-18.91 53.37-18.91L53.37-18.91L53.94-18.91Q54.52-17.76 54.81-17.76L54.81-17.76Q54.52-14.78 54.52-13.25L54.52-13.25L54.52-12.38Q54.52-10.75 55.38-7.87L55.38-7.87Q55.38-6.72 53.08-4.90L53.08-4.90Q51.54-4.90 51.54-5.47L51.54-5.47L48.57-5.18L44.73-5.18Q41.37-5.18 36.09-5.47L36.09-5.47L35.51-5.18Q34.46-5.47 34.27-5.47L34.27-5.47Q28.12-4.90 24.19-4.90L24.19-4.90L22.08-4.90Q20.64-4.90 17.09-4.03L17.09-4.03L14.11-4.32Q10.46-3.46 10.46-3.17L10.46-3.17Q10.08-3.17 6.91-7.87L6.91-7.87Q4.22-9.89 4.22-11.42L4.22-11.42Q4.22-12.29 6.05-15.65L6.05-15.65Q6.05-17.47 8.45-21.02L8.45-21.02Q13.15-42.62 13.15-61.72L13.15-61.72Q13.44-61.72 13.44-63.25L13.44-63.25L11.71-64.69Q12.09-66.23 16.41-69.78L16.41-69.78Q16.41-71.89 17.66-71.89Z" transform="translate(0 94) " fill="rgb(50, 113, 174)" stroke="rgb(50, 113, 174)" stroke-width="0.164" data-glyph-w="63.4155967830671" data-glyph-h="95.986328125" data-glyph-ascender="84.46796875000001" data-glyph-descender="-11.518359375000001" data-kerning="0"></path>
<path d="M24.19-39.64L24.19-39.64L25.72-39.64Q27.84-39.64 30.72-35.80L30.72-35.80L31.39-35.80Q33.12-37.63 35.80-37.63L35.80-37.63Q39.64-36.19 39.64-32.54L39.64-32.54L41.47-28.99Q41.47-28.51 40.89-26.30L40.89-26.30Q40.89-26.11 41.18-24.48L41.18-24.48Q39.07-19.39 39.07-18.24L39.07-18.24L39.07-17.37Q39.07-15.07 41.18-13.25L41.18-13.25L41.75-13.25Q43.77-13.25 45.88-16.22L45.88-16.22L48.57-17.09Q49.62-17.09 50.10-13.82L50.10-13.82Q48.86-8.45 48.86-7.58L48.86-7.58Q49.43-7.29 49.82-7.29L49.82-7.29Q48.38-4.61 45.59-4.61L45.59-4.61Q44.73-4.61 43.58-4.90L43.58-4.90Q41.95-4.61 40.31-4.61L40.31-4.61Q34.08-7.29 33.12-9.02L33.12-9.02Q26.49-3.65 25.05-3.65L25.05-3.65Q25.05-3.07 20.64-2.78L20.64-2.78Q12.57-2.78 9.31-8.16L9.31-8.16Q5.76-12.48 5.76-17.95L5.76-17.95L5.76-21.21Q5.76-31.48 16.80-37.91L16.80-37.91Q22.46-39.64 24.19-39.64ZM13.15-19.49L13.15-19.49Q14.40-10.56 16.51-10.56L16.51-10.56L19.10-10.56Q23.32-10.56 27.45-19.49L27.45-19.49Q30.43-24.57 30.43-28.99L30.43-28.99Q29.08-30.24 27.16-34.65L27.16-34.65L26.30-34.65Q21.21-34.65 15.55-27.74L15.55-27.74Q13.15-23.71 13.15-19.49Z" transform="translate(63.4155967830671 94) " fill="rgb(50, 113, 174)" stroke="rgb(50, 113, 174)" stroke-width="0.164" data-glyph-w="54.872813579942104" data-glyph-h="95.986328125" data-glyph-ascender="84.46796875000001" data-glyph-descender="-11.518359375000001" data-kerning="0"></path>
<path d="M14.30-56.34L14.30-56.34Q18.24-56.34 20.25-50.68L20.25-50.68Q20.25-49.05 16.13-46.55L16.13-46.55Q12.96-47.32 12.19-47.99L12.19-47.99Q11.71-47.71 11.04-47.71L11.04-47.71Q9.21-50.20 9.21-50.68L9.21-50.68Q9.89-56.06 14.01-56.06L14.01-56.06Q14.01-56.34 14.30-56.34ZM9.21-39.93L9.50-41.47L10.17-41.47Q11.52-41.47 13.15-41.18L13.15-41.18L14.88-41.47Q16.51-41.47 17.85-39.07L17.85-39.07Q16.99-29.76 16.99-21.79L16.99-21.79Q17.28-20.25 17.28-20.06L17.28-20.06L16.99-18.24Q17.28-15.65 17.28-15.26L17.28-15.26L16.99-13.53Q17.28-10.65 17.28-8.16L17.28-8.16L17.28-5.76Q17.28-5.47 17.57-5.47L17.57-5.47Q16.80-0.96 16.41-0.96L16.41-0.96Q15.84-1.25 15.45-1.25L15.45-1.25L15.17-0.67L15.45-0.10Q15.17 0.77 14.88 0.77L14.88 0.77Q13.92 0.19 13.15 0.19L13.15 0.19Q12.86 0.67 12.86 1.34L12.86 1.34L12.48 1.34Q6.24-4.32 6.24-7.58L6.24-7.58Q8.16-20.06 9.21-38.20L9.21-38.20L9.21-39.93Z" transform="translate(118.2884103630092 94) " fill="rgb(50, 113, 174)" stroke="rgb(50, 113, 174)" stroke-width="0.164" data-glyph-w="27.804669048692098" data-glyph-h="95.986328125" data-glyph-ascender="84.46796875000001" data-glyph-descender="-11.518359375000001" data-kerning="0"></path>
<path d="M56.25-68.05L56.25-68.05Q61.34-67.29 61.34-62.97L61.34-62.97L61.34-62.68Q61.14-60.76 56.54-57.30L56.54-57.30Q55.96-56.15 55.96-55.58L55.96-55.58L53.85-55.86L53.56-55.86Q52.98-55.86 52.98-55.00L52.98-55.00Q47.90-55.58 46.17-55.58L46.17-55.58L44.06-55.58Q37.53-55.58 37.53-53.46L37.53-53.46Q37.53-53.08 36.57-52.31L36.57-52.31L36.95-51.06L36.28-49.62L36.57-47.51Q36.57-46.17 36.28-43.67L36.28-43.67Q36.57-38.20 36.57-34.46L36.57-34.46Q36.57-33.79 36.28-31.20L36.28-31.20Q36.57-30.62 36.57-30.24L36.57-30.24L35.99-24.57Q36.28-23.04 36.28-21.31L36.28-21.31Q36.28-20.45 35.99-19.29L35.99-19.29Q36.28-17.66 36.28-16.32L36.28-16.32L36.28-14.49Q34.56-0.77 31.87-0.77L31.87-0.77Q30.81-0.48 30.62-0.48L30.62-0.48Q30.04-0.48 28.60-1.15L28.60-1.15L20.83-0.48L20.83-1.44L19.68-5.86Q21.79-5.86 25.05-37.72L25.05-37.72Q25.05-40.31 25.34-52.02L25.34-52.02L25.63-53.46L25.05-53.75Q14.30-53.46 14.30-52.89L14.30-52.89L12.77-53.18L9.21-52.02Q5.09-52.02 5.09-58.55L5.09-58.55Q4.80-58.55 3.55-60.95L3.55-60.95L3.55-62.10Q3.65-62.68 4.22-62.68L4.22-62.68L4.80-62.68Q6.82-62.68 8.06-61.53L8.06-61.53L9.50-62.10L11.61-61.82Q40.60-66.23 45.88-66.23L45.88-66.23L50.30-66.23Q56.25-67.57 56.25-68.05Z" transform="translate(146.0930794117013 94) " fill="rgb(50, 113, 174)" stroke="rgb(50, 113, 174)" stroke-width="0.164" data-glyph-w="68.2149131893171" data-glyph-h="95.986328125" data-glyph-ascender="84.46796875000001" data-glyph-descender="-11.518359375000001" data-kerning="0"></path>
<path d="M26.49-40.41L26.49-40.41Q44.63-33.31 44.63-24.67L44.63-24.67L44.63-22.27Q44.63-16.32 39.83-11.81L39.83-11.81Q36.86-6.43 30.62-4.13L30.62-4.13Q23.61-2.02 21.69-2.02L21.69-2.02Q13.73-2.02 6.82-12.09L6.82-12.09Q5.95-14.78 5.95-15.74L5.95-15.74L5.95-17.76Q7.01-31.20 8.64-31.20L8.64-31.20Q15.74-40.12 21.98-40.12L21.98-40.12L24.67-39.83Q25.92-40.41 26.49-40.41ZM27.64-30.33L24.96-30.33Q24.96-28.51 18.72-28.51L18.72-28.51L17.85-28.51Q14.88-28.51 13.05-21.69L13.05-21.69L13.05-19.01Q14.21-13.05 17.28-13.05L17.28-13.05Q17.37-12.48 17.85-12.48L17.85-12.48L21.12-12.48Q28.03-12.48 32.44-22.56L32.44-22.56L32.73-25.24Q31.77-30.33 27.64-30.33L27.64-30.33Z" transform="translate(214.30799260101838 94) " fill="rgb(50, 113, 174)" stroke="rgb(50, 113, 174)" stroke-width="0.164" data-glyph-w="54.200909283067105" data-glyph-h="95.986328125" data-glyph-ascender="84.46796875000001" data-glyph-descender="-11.518359375000001" data-kerning="0"></path>
<path d="M26.49-40.41L26.49-40.41Q44.63-33.31 44.63-24.67L44.63-24.67L44.63-22.27Q44.63-16.32 39.83-11.81L39.83-11.81Q36.86-6.43 30.62-4.13L30.62-4.13Q23.61-2.02 21.69-2.02L21.69-2.02Q13.73-2.02 6.82-12.09L6.82-12.09Q5.95-14.78 5.95-15.74L5.95-15.74L5.95-17.76Q7.01-31.20 8.64-31.20L8.64-31.20Q15.74-40.12 21.98-40.12L21.98-40.12L24.67-39.83Q25.92-40.41 26.49-40.41ZM27.64-30.33L24.96-30.33Q24.96-28.51 18.72-28.51L18.72-28.51L17.85-28.51Q14.88-28.51 13.05-21.69L13.05-21.69L13.05-19.01Q14.21-13.05 17.28-13.05L17.28-13.05Q17.37-12.48 17.85-12.48L17.85-12.48L21.12-12.48Q28.03-12.48 32.44-22.56L32.44-22.56L32.73-25.24Q31.77-30.33 27.64-30.33L27.64-30.33Z" transform="translate(268.5089018840855 94) " fill="rgb(50, 113, 174)" stroke="rgb(50, 113, 174)" stroke-width="0.164" data-glyph-w="54.200909283067105" data-glyph-h="95.986328125" data-glyph-ascender="84.46796875000001" data-glyph-descender="-11.518359375000001" data-kerning="0"></path>
<path d="M18.33-68.73L18.33-68.73Q22.56-67.86 22.56-66.71L22.56-66.71Q21.31-61.34 21.31-59.80L21.31-59.80L21.31-57.50Q20.16-35.04 18.72-21.12L18.72-21.12L18.72-19.10L19.58-19.10Q19.58-19.49 24.28-22.36L24.28-22.36Q27.64-25.34 28.22-25.34L28.22-25.34L28.22-24.76Q25.72-19.20 23.71-11.33L23.71-11.33Q20.16-7.68 20.16-5.38L20.16-5.38Q20.16-2.98 13.34-2.40L13.34-2.40Q13.34-2.11 13.05-2.11L13.05-2.11L5.86-5.95Q5.28-7.77 4.99-7.77L4.99-7.77Q5.57-9.31 5.57-13.15L5.57-13.15L5.57-13.44Q8.64-13.44 10.65-52.41L10.65-52.41Q11.23-62.20 11.23-64.60L11.23-64.60Q10.75-64.89 10.08-64.89L10.08-64.89L10.08-65.46Q10.65-67.77 13.63-68.44L13.63-68.44Q14.11-68.44 18.33-68.73Z" transform="translate(322.7098111671526 94) " fill="rgb(50, 113, 174)" stroke="rgb(50, 113, 174)" stroke-width="0.164" data-glyph-w="35.2916026424421" data-glyph-h="95.986328125" data-glyph-ascender="84.46796875000001" data-glyph-descender="-11.518359375000001" data-kerning="0"></path>
</g>
</svg>
</g>
</g>
<g id="shape_HBt9Poo2sR" ref="shape_HBt9Poo2sR" key="shape_HBt9Poo2sR" mask="">
<g transform="translate(290.23123855735,120) rotate(0,109.76876144264,68.206715750285) scale(1,1)" style="opacity: 1;mix-blend-mode: undefined;" filter="url(#filter_shadow_shape_HBt9Poo2sR)">
<!--普通元素-->
<svg version="1.1" id="圖層_1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 -8.068921089172363 315.3833923339844 195.9689178466797" style="enable-background:new 0 0 304.3 187.9;" xml:space="preserve" width="219.53752288528" height="136.41343150057" class="style-removed" preserveAspectRatio="none" data-parent="shape_HBt9Poo2sR">
<g>
<path d="M214.9,124.7L214.9,124.7c1.3,4.5,2.7,9.1,4.2,13.7c12.6,40.3,27.1,42.9,27.1,42.9l4.4,0.4h0.3
c0,0,15.8-3.6,26.7-45c7.4-28.2,11.5-43.9,16.5-62h-64.6C225,91.1,220.3,107.5,214.9,124.7z" fill="rgb(50, 113, 174)" stroke-width="0"></path>
<path d="M88.6,6.5c-0.5-0.2-0.9-0.4-1.3-0.6h-2.8c0,0-13.2-1.6-22,30.7C52.8,72.3,44.9,105,33,141.8
c-14.7,45.5-33,46.1-33,46.1h72.9c0,0,16.6-3.6,27.5-46.3c9.1-35.9,12.6-52.2,19.5-77.5c-1.5-5.6-3.1-11.7-5-18.5
C105.9,13.5,90.3,7.2,88.6,6.5z" fill="rgb(50, 113, 174)" stroke-width="0"></path>
<path d="M212.7,140.4c-0.5-1.5-1-3.1-1.4-4.6c-11.1-36.2-18.8-68.7-28.1-104.1C175.3,1.4,163.6,0,161.6,0
c-0.2,0-0.3,0-0.3,0H90.8c-0.1,0-0.2,0.2-0.1,0.2c1.5,0.5,4.9,2,9.2,5.6c6.7,5.7,15.4,16.8,21.3,37.9c0.7,2.7,1.5,5.2,2.1,7.7
c8.6,31.4,11.7,47.7,21.8,88.6c10.9,44.1,27.5,47.8,27.5,47.8h72.8c-0.7-0.1-5-0.6-11-6.3C229.4,177.3,220.5,165.4,212.7,140.4z" fill="rgb(50, 113, 174)" stroke-width="0"></path>
<ellipse transform="matrix(0.8694 -0.4941 0.4941 0.8694 17.8966 137.5734)" cx="269.2" cy="34.9" rx="37" ry="28.4" fill="rgb(50, 113, 174)" stroke-width="0"></ellipse>
</g>
</svg>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1011 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1011 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 1011 KiB

+55 -16
View File
@@ -4,7 +4,6 @@ import json
import os import os
import sys import sys
import clip import clip
import getgrame
import Push_back_Prompt import Push_back_Prompt
import public_tools import public_tools
import shotSplit import shotSplit
@@ -17,9 +16,33 @@ if len(sys.argv) < 2:
sys.argv = [ sys.argv = [
"C:\\Users\\27698\\Desktop\\LAITool\\resources\\scripts\\Lai.exe", "C:\\Users\\27698\\Desktop\\LAITool\\resources\\scripts\\Lai.exe",
"-c", "-c",
"D:/来推项目集/7.4/娱乐:江湖大哥退休,去拍电影/scripts/output_crop_00001.json", "C:/Users/27698/Desktop/LAITool/project/73bca563-fd8f-42e3-b08b-e4b2ecbd0d71/scripts/output_00008_video_config.json",
"NVIDIA", "OTHER",
] ]
# sys.argv = [
# "C:\\Users\\27698\\Desktop\\LAITool\\resources\\scripts\\Lai.exe",
# "-p",
# "C:/Users/27698/Desktop/LAITool/resources/config/sd_config.json",
# "input",
# "C:\\Users\\27698\\Desktop\\测试\\123",
# ]
# sys.argv = [
# "C:\\Users\\27698\\Desktop\\LAITool\\resources\\scripts\\Lai.exe",
# "-pf",
# "C:\\Users\\27698\\Desktop\\测试\\123\\tmp\\input_crop",
# ]
# sys.argv = [
# "C:\\Users\\27698\\Desktop\\LAITool\\resources\\scripts\\Lai.exe",
# "-ps",
# "C:\\Users\\27698\\Desktop\\测试\\123\\tmp\\input_crop\\00008.png",
# ]
# sys.argv = [
# "C:\\Users\\27698\\Desktop\\LAITool\\resources\\scripts\\Lai.exe",
# "-pt",
# "C:\\Users\\27698\\Desktop\\测试\\123\\tmp\\input_crop\\1.txt",
# ]
print(sys.argv) print(sys.argv)
@@ -56,6 +79,8 @@ if sys.argv[1] == "-c":
clip = clip.Clip(cript_directory, sys.argv[2], sys.argv[3]) clip = clip.Clip(cript_directory, sys.argv[2], sys.argv[3])
clip.MergeVideosAndClip() clip.MergeVideosAndClip()
pass pass
# 获取字体 # 获取字体
elif sys.argv[1] == "-f": elif sys.argv[1] == "-f":
# 获取本地已安装的字幕。然后返回 # 获取本地已安装的字幕。然后返回
@@ -72,27 +97,41 @@ elif sys.argv[1] == "-f":
with open(sys.argv[2], "w", encoding="utf-8") as file: with open(sys.argv[2], "w", encoding="utf-8") as file:
json.dump(data, file, ensure_ascii=False, indent=4) json.dump(data, file, ensure_ascii=False, indent=4)
# 反推提示词 # 反推提示词(指定项目下面的input_crop文件夹)
elif sys.argv[1] == "-p": elif sys.argv[1] == "-p":
Push_back_Prompt.init(sys.argv[2], sys.argv[3], sys.argv[4]) Push_back_Prompt.init(sys.argv[2], sys.argv[3], sys.argv[4])
pass pass
# 剪映抽帧 # 反推指定的文件夹
elif sys.argv[1] == "-k": elif sys.argv[1] == "-pf":
# print("") Push_back_Prompt.getAssignDir(sys.argv[2])
getgrame.init(sys.argv[2], sys.argv[3], sys.argv[4]) pass
# 反推指定的图片文件
elif sys.argv[1] == "-ps":
Push_back_Prompt.getAssignImage(sys.argv[2])
pass
# 反推指定的图片文件
elif sys.argv[1] == "-pt":
Push_back_Prompt.getAssignTxt(sys.argv[2])
pass pass
elif sys.argv[1] == "-ka": elif sys.argv[1] == "-ka":
shotSplit.get_fram(sys.argv[2], sys.argv[3], sys.argv[4]) shotSplit.get_fram(sys.argv[2], sys.argv[3], sys.argv[4])
pass pass
# 智能分镜。字幕识别 elif sys.argv[1] == "-df":
elif sys.argv[1] == "-a": shotSplit.get_fram(sys.argv[2], sys.argv[3], sys.argv[4])
print("开始算法分镜:" + sys.argv[2] + " -- 输出文件夹:" + sys.argv[3])
shotSplit.init(sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5], sys.argv[6])
# 本地提取音频
elif sys.argv[1] == "-t":
print("开始提取文字:" + sys.argv[2])
shotSplit.GetTextTask(sys.argv[2], sys.argv[3], sys.argv[4])
pass pass
# # 智能分镜。字幕识别
# elif sys.argv[1] == "-a":
# print("开始算法分镜:" + sys.argv[2] + " -- 输出文件夹:" + sys.argv[3])
# shotSplit.init(sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5], sys.argv[6])
# # 本地提取音频
# elif sys.argv[1] == "-t":
# print("开始提取文字:" + sys.argv[2])
# shotSplit.GetTextTask(sys.argv[2], sys.argv[3], sys.argv[4])
# pass
+6 -17
View File
@@ -1,36 +1,34 @@
# -*- mode: python ; coding: utf-8 -*- # -*- mode: python ; coding: utf-8 -*-
from PyInstaller.building.datastruct import Tree
from PyInstaller.utils.hooks import get_package_paths
PACKAGE_DIRECTORY = get_package_paths('faster_whisper')[1]
datas = [(PACKAGE_DIRECTORY, 'faster_whisper')]
a = Analysis( a = Analysis(
['Lai.py'], ['Lai.py'],
pathex=[], pathex=[],
binaries=[], binaries=[],
datas=datas, datas=[],
hiddenimports=[], hiddenimports=[],
hookspath=[], hookspath=[],
hooksconfig={}, hooksconfig={},
runtime_hooks=[], runtime_hooks=[],
excludes=[], excludes=[],
noarchive=False, noarchive=False,
optimize=0,
) )
pyz = PYZ(a.pure) pyz = PYZ(a.pure)
exe = EXE( exe = EXE(
pyz, pyz,
a.scripts, a.scripts,
a.binaries,
a.datas,
[], [],
exclude_binaries=True,
name='Lai', name='Lai',
debug=False, debug=False,
bootloader_ignore_signals=False, bootloader_ignore_signals=False,
strip=False, strip=False,
upx=True, upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True, console=True,
disable_windowed_traceback=False, disable_windowed_traceback=False,
argv_emulation=False, argv_emulation=False,
@@ -38,12 +36,3 @@ exe = EXE(
codesign_identity=None, codesign_identity=None,
entitlements_file=None, entitlements_file=None,
) )
coll = COLLECT(
exe,
a.binaries,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='Lai',
)
@@ -1,11 +1,17 @@
# -*- mode: python ; coding: utf-8 -*- # -*- mode: python ; coding: utf-8 -*-
from PyInstaller.building.datastruct import Tree
from PyInstaller.utils.hooks import get_package_paths
PACKAGE_DIRECTORY = get_package_paths('faster_whisper')[1]
datas = [(PACKAGE_DIRECTORY, 'faster_whisper')]
a = Analysis( a = Analysis(
['lama_inpaint.py'], ['Lai.py'],
pathex=[], pathex=[],
binaries=[], binaries=[],
datas=[], datas=datas,
hiddenimports=[], hiddenimports=[],
hookspath=[], hookspath=[],
hooksconfig={}, hooksconfig={},
@@ -20,7 +26,7 @@ exe = EXE(
a.scripts, a.scripts,
[], [],
exclude_binaries=True, exclude_binaries=True,
name='lama_inpaint', name='Lai',
debug=False, debug=False,
bootloader_ignore_signals=False, bootloader_ignore_signals=False,
strip=False, strip=False,
@@ -39,5 +45,5 @@ coll = COLLECT(
strip=False, strip=False,
upx=True, upx=True,
upx_exclude=[], upx_exclude=[],
name='lama_inpaint', name='Lai',
) )
+85 -2
View File
@@ -148,10 +148,11 @@ class WaifuDiffusionInterrogator(Interrogator):
Dict[str, float], Dict[str, float] # rating confidents # tag confidents Dict[str, float], Dict[str, float] # rating confidents # tag confidents
]: ]:
# init model # init model
if not hasattr(self, 'model') or self.model is None: if not hasattr(self, "model") or self.model is None:
model_path = os.path.join(cript_directory, "model/tag/model.onnx") model_path = os.path.join(cript_directory, "model/tag/model.onnx")
tags_path = os.path.join(cript_directory, "model/tag/selected_tags.csv") tags_path = os.path.join(cript_directory, "model/tag/selected_tags.csv")
from onnxruntime import InferenceSession from onnxruntime import InferenceSession
providers = ["CUDAExecutionProvider", "CPUExecutionProvider"] providers = ["CUDAExecutionProvider", "CPUExecutionProvider"]
self.model = InferenceSession(str(model_path), providers=providers) self.model = InferenceSession(str(model_path), providers=providers)
print(f"{model_path} 读取 {self.name}模型") print(f"{model_path} 读取 {self.name}模型")
@@ -223,7 +224,89 @@ def filter_action(tag_actions: [], tags: []):
return action_tags, other_tags return action_tags, other_tags
def init(sd_setting,m,project_path): def getAssignTxt(txtPath):
if not os.path.exists(txtPath):
os.makedirs(txtPath)
# load model
model = WaifuDiffusionInterrogator(
"wd14-convnextv2-v2",
repo_id="SmilingWolf/wd-v1-4-convnextv2-tagger-v2",
revision="v2.0",
)
frame_files = []
with open(txtPath, 'r', encoding='utf-8') as file:
for line in file:
frame_files.append(line.strip()) # 使用 strip() 去除每行的换行符和多余的空白
# 轮询开始输出
frame_files.sort()
for frame_file in frame_files:
txt = getTags(model, frame_file)
# tags = txt.split(",")
# save tag
txt_file = os.path.join(os.path.dirname(frame_file), f"{Path(frame_file).stem}.txt")
with open(txt_file, "w", encoding="utf-8") as tags:
tags.write(txt)
print(f"{frame_file} 提示词反推完成")
sys.stdout.flush()
def getAssignImage(imagePath):
if not os.path.exists(imagePath):
os.makedirs(imagePath)
# load model
model = WaifuDiffusionInterrogator(
"wd14-convnextv2-v2",
repo_id="SmilingWolf/wd-v1-4-convnextv2-tagger-v2",
revision="v2.0",
)
txt = getTags(model, imagePath)
# tags = txt.split(",")
# save tag
txt_file = os.path.join(os.path.dirname(imagePath), f"{Path(imagePath).stem}.txt")
with open(txt_file, "w", encoding="utf-8") as tags:
tags.write(txt)
print(f"{imagePath} 提示词反推完成")
sys.stdout.flush()
def getAssignDir(imagePath):
if not os.path.exists(imagePath):
os.makedirs(imagePath)
# load model
model = WaifuDiffusionInterrogator(
"wd14-convnextv2-v2",
repo_id="SmilingWolf/wd-v1-4-convnextv2-tagger-v2",
revision="v2.0",
)
# 轮询开始输出
frame_files = [f for f in os.listdir(imagePath) if f.endswith(".png")]
frame_files.sort()
for frame in frame_files:
frame_file = os.path.join(imagePath, frame)
txt = getTags(model, frame_file)
# tags = txt.split(",")
# save tag
txt_file = os.path.join(imagePath, f"{Path(frame_file).stem}.txt")
with open(txt_file, "w", encoding="utf-8") as tags:
tags.write(txt)
print(f"{frame} 提示词反推完成")
sys.stdout.flush()
def init(sd_setting, m, project_path):
try: try:
setting_json = public_tools.read_config(sd_setting, webui=False) setting_json = public_tools.read_config(sd_setting, webui=False)
except Exception as e: except Exception as e:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
-2
View File
@@ -1,2 +0,0 @@
@echo off
pyinstaller -F --upx-dir="C:\\Users\\27698\\Desktop\\upx-4.2.4-win64\upx.exe" lama_inpaint.py
-173
View File
@@ -1,173 +0,0 @@
import io
import os
import sys
from typing import Union
import cv2
import torch
import numpy as np
from PIL import Image
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
# 判断sys.argv 的长度,如果小于2,说明没有传入参数,设置初始参数
# if len(sys.argv) < 2:
# sys.argv = [
# "C:/Users/27698/Desktop/LAITool/resources/scripts/lama/lama_inpaint.exe",
# "-l",
# "C:\\Users\\27698\\Desktop\\测试\\mjTest\\data\\mask\\temp\\1717508661218.png",
# "C:\\Users\\27698\\Desktop\\测试\\mjTest\\data\\mask\\mask_temp_1717508662659.png",
# "C:\\Users\\27698\\Desktop\\测试\\mjTest\\data\\mask\\temp\\1717508564042.png",
# ]
print(sys.argv)
if getattr(sys, "frozen", False):
cript_directory = os.path.dirname(sys.executable)
elif __file__:
cript_directory = os.path.dirname(__file__)
link_name = os.path.join(os.path.expanduser("~"), "big_lama.pt")
cu_name = os.path.join(cript_directory, "model\\big-lama.pt")
mode_pa = link_name
if len(sys.argv) < 2:
# # 判断model_path是否存在,如果不存在,设置默认值
if not os.path.exists(link_name):
os.system(f'mklink "{link_name}" "{cu_name}"')
print("Params: <runtime-config.json>")
sys.exit(0)
def get_image(image):
if isinstance(image, Image.Image):
img = np.array(image)
elif isinstance(image, np.ndarray):
img = image.copy()
else:
raise Exception("Input image should be either PIL Image or numpy array!")
if img.ndim == 3:
img = np.transpose(img, (2, 0, 1)) # chw
elif img.ndim == 2:
img = img[np.newaxis, ...]
assert img.ndim == 3
img = img.astype(np.float32) / 255
return img
def ceil_modulo(x, mod):
if x % mod == 0:
return x
return (x // mod + 1) * mod
def scale_image(img, factor, interpolation=cv2.INTER_AREA):
if img.shape[0] == 1:
img = img[0]
else:
img = np.transpose(img, (1, 2, 0))
img = cv2.resize(img, dsize=None, fx=factor, fy=factor, interpolation=interpolation)
if img.ndim == 2:
img = img[None, ...]
else:
img = np.transpose(img, (2, 0, 1))
return img
def pad_img_to_modulo(img, mod):
channels, height, width = img.shape
out_height = ceil_modulo(height, mod)
out_width = ceil_modulo(width, mod)
return np.pad(
img,
((0, 0), (0, out_height - height), (0, out_width - width)),
mode="symmetric",
)
def prepare_img_and_mask(image, mask, device, pad_out_to_modulo=8, scale_factor=None):
out_image = get_image(image)
out_mask = get_image(mask)
if scale_factor is not None:
out_image = scale_image(out_image, 1)
out_mask = scale_image(out_mask, scale_factor, interpolation=cv2.INTER_NEAREST)
if pad_out_to_modulo is not None and pad_out_to_modulo > 1:
out_image = pad_img_to_modulo(out_image, pad_out_to_modulo)
out_mask = pad_img_to_modulo(out_mask, pad_out_to_modulo)
out_image = torch.from_numpy(out_image).unsqueeze(0).to(device)
out_mask = torch.from_numpy(out_mask).unsqueeze(0).to(device)
out_mask = (out_mask > 0) * 1
return out_image, out_mask
class LamaInpaint:
def __init__(
self,
device,
model_path=None,
) -> None:
if model_path is None:
model_path = os.path.join(cript_directory, "model\\big-lama.pt")
self.model = torch.jit.load(model_path, map_location=device)
self.model.eval()
self.model.to(device)
self.device = device
def run(
self,
image: Union[Image.Image, np.ndarray],
mask: Union[Image.Image, np.ndarray],
):
if isinstance(image, np.ndarray):
orig_height, orig_width = image.shape[:2]
else:
orig_height, orig_width = np.array(image).shape[:2]
# image_width = image.shape[1]
# mask_width = mask.shape[1]
scale = image.width / mask.width
image, mask = prepare_img_and_mask(image, mask, self.device, 8, scale)
with torch.inference_mode():
inpainted = self.model(image, mask)
cur_res = inpainted[0].permute(1, 2, 0).detach().cpu().numpy()
cur_res = np.clip(cur_res * 255, 0, 255).astype("uint8")
cur_res = cur_res[:orig_height, :orig_width]
return cur_res
try:
de = "cpu"
if torch.cuda.is_available():
de = "cuda"
lama = LamaInpaint(de, mode_pa)
image_path = sys.argv[2]
mask_path = sys.argv[3]
output_path = sys.argv[4]
# 若是没有传递mask_path,需要自己计算mask区域
# 使用Image.open打开图片
image = Image.open(image_path).convert("RGB")
mask = Image.open(mask_path).convert("L")
res = lama.run(image, mask)
# 将修复后的图片保存到本地
img = Image.fromarray(res)
# 使用 save 方法将图像保存到文件
img.save(output_path)
sys.exit(0)
except Exception as e:
print(e)
sys.exit(str(e))
-37
View File
@@ -1,37 +0,0 @@
# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
['lama_inpaint.py'],
pathex=[],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name='lama_inpaint',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
-298
View File
@@ -1,298 +0,0 @@
accelerate==0.30.1
addict==2.4.0
aiofiles==23.2.1
aiohttp==3.8.6
aiosignal==1.3.1
alibabacloud-bailian20230601==1.6.1
alibabacloud-credentials==0.3.3
alibabacloud-endpoint-util==0.0.3
alibabacloud-gateway-spi==0.0.1
alibabacloud-openapi-util==0.2.2
alibabacloud-tea==0.3.6
alibabacloud-tea-openapi==0.3.9
alibabacloud-tea-util==0.3.12
alibabacloud-tea-xml==0.0.2
aliyun-python-sdk-core==2.15.0
aliyun-python-sdk-kms==2.16.2
altair==5.3.0
altgraph==0.17.4
annotated-types==0.6.0
anthropic==0.26.1
antlr4-python3-runtime==4.9.3
anyio==4.3.0
APScheduler==3.10.4
arxiv==2.1.0
astor==0.8.1
asttokens==2.4.1
async-timeout==4.0.3
attrdict==2.0.1
attrs==23.2.0
av==11.0.0
azure-cognitiveservices-speech==1.37.0
Babel==2.15.0
backports.tarfile==1.1.1
baidu-aip==4.16.13
bce-python-sdk==0.9.11
beautifulsoup4==4.12.3
bidict==0.23.1
blinker==1.8.2
broadscope-bailian==1.3.1
cachetools==5.3.3
certifi==2024.2.2
cffi==1.16.0
cfgv==3.4.0
chardet==5.2.0
charset-normalizer==3.3.2
chatgpt-tool-hub==0.5.0
cheroot==10.0.1
click==8.1.7
colorama==0.4.6
coloredlogs==15.0.1
comtypes==1.4.2
contourpy==1.2.1
controlnet-aux==0.0.3
crcmod==1.7
cryptography==42.0.5
cssselect==1.2.0
cssutils==2.11.0
ctranslate2==4.1.0
curl_cffi==0.6.4
cx-Logging==3.1.0
cx_Freeze==6.15.16
cycler==0.12.1
Cython==3.0.10
dashscope==1.19.2
datasets==2.18.0
decorator==4.4.2
diffusers==0.27.2
dill==0.3.8
dingtalk-stream==0.18.1
distlib==0.3.8
distro==1.9.0
dnspython==2.6.1
dulwich==0.22.1
easydict==1.13
edge-tts==6.1.12
einops==0.7.0
elevenlabs==1.0.3
email_validator==2.1.1
et-xmlfile==1.1.0
exceptiongroup==1.2.1
executing==2.0.1
fastapi==0.108.0
fastapi-cli==0.0.2
faster-whisper==1.0.1
feedparser==6.0.10
ffmpy==0.3.2
filelock==3.13.1
fire==0.6.0
Flask==3.0.3
flask-babel==4.0.0
flatbuffers==24.3.7
fonttools==4.53.0
frozenlist==1.4.1
fsspec==2024.2.0
future==1.0.0
gast==0.5.4
google-ai-generativelanguage==0.6.4
google-api-core==2.19.0
google-api-python-client==2.130.0
google-auth==2.29.0
google-auth-httplib2==0.2.0
google-generativeai==0.5.4
googleapis-common-protos==1.63.0
gradio==4.21.0
gradio_client==0.12.0
grpcio==1.64.0
grpcio-status==1.62.2
gTTS==2.5.1
h11==0.14.0
HTMLParser==0.0.2
httpcore==1.0.5
httplib2==0.22.0
httptools==0.6.1
httpx==0.27.0
huggingface-hub==0.23.2
humanfriendly==10.0
identify==2.5.36
idna==3.6
imageio==2.34.0
imageio-ffmpeg==0.4.9
imgaug==0.4.0
importlib_metadata==7.0.2
importlib_resources==6.4.0
install==1.3.5
IOPaint==1.3.3
ipython==8.24.0
itsdangerous==2.2.0
jaraco.context==5.3.0
jaraco.functools==4.0.1
jedi==0.19.1
Jinja2==3.1.3
jiter==0.4.0
jmespath==0.10.0
jsonschema==4.22.0
jsonschema-specifications==2023.12.1
kiwisolver==1.4.5
langid==1.1.6
lazy_loader==0.4
lief==0.14.1
linkai==0.0.6.0
lmdb==1.4.1
loguru==0.7.2
lxml==5.2.2
markdown-it-py==3.0.0
MarkupSafe==2.1.5
matplotlib==3.9.0
matplotlib-inline==0.1.7
mdurl==0.1.2
modelscope==1.13.1
more-itertools==10.2.0
moviepy==1.0.3
mpmath==1.3.0
multidict==6.0.5
multiprocess==0.70.16
networkx==3.2.1
nodeenv==1.8.0
Nuitka==2.1.2
numpy==1.24.2
omegaconf==2.3.0
onnxruntime==1.17.1
openai==0.27.8
opencv-contrib-python==4.6.0.66
opencv-python==4.6.0.66
opencv-python-headless==4.9.0.80
openpyxl==3.1.2
opt-einsum==3.3.0
optionaldict==0.1.2
ordered-set==4.1.0
orjson==3.10.3
oss2==2.18.4
packaging==24.0
paddleocr==2.7.3
paddlepaddle==2.6.1
pandas==2.2.1
parso==0.8.4
pdf2docx==0.5.8
pefile==2023.2.7
peft==0.7.1
piexif==1.1.3
pillow==10.3.0
platformdirs==4.2.0
pre-commit==3.7.1
premailer==3.10.0
proglog==0.1.10
prompt-toolkit==3.0.43
proto-plus==1.23.0
protobuf==3.20.2
psutil==5.9.8
pure-eval==0.2.2
pyarrow==15.0.1
pyarrow-hotfix==0.6
pyasn1==0.6.0
pyasn1_modules==0.4.0
pyclipper==1.3.0.post5
pycparser==2.21
pycryptodome==3.20.0
pydantic==2.5.3
pydantic_core==2.14.6
pydub==0.25.1
Pygments==2.18.0
pyinstaller==6.5.0
pyinstaller-hooks-contrib==2024.3
PyJWT==2.8.0
PyMuPDF==1.24.5
PyMuPDFb==1.24.3
pyOpenSSL==24.1.0
pyoxidizer==0.24.0
pyparsing==3.1.2
pypiwin32==223
pypng==0.20220715.0
PyQRCode==1.2.1
pyreadline3==3.4.1
pytesseract==0.3.10
python-dateutil==2.9.0.post0
python-docx==1.1.2
python-dotenv==1.0.1
python-engineio==4.9.1
python-multipart==0.0.9
python-socketio==5.7.2
pyttsx3==2.90
pytz==2024.1
pywin32==306
pywin32-ctypes==0.2.2
PyYAML==6.0.1
qrcode==7.4.2
rapidfuzz==3.9.3
rarfile==4.2
referencing==0.35.1
regex==2024.5.15
requests==2.31.0
rich==13.7.1
rpds-py==0.18.1
rsa==4.9
ruff==0.4.7
safetensors==0.4.3
scenedetect==0.6.3
scikit-image==0.23.2
scipy==1.12.0
semantic-version==2.10.0
sgmllib3k==1.0.0
shapely==2.0.4
shellingham==1.5.4
simple-websocket==1.0.0
simplejson==3.19.2
six==1.16.0
sniffio==1.3.1
sortedcontainers==2.4.0
soupsieve==2.5
SpeechRecognition==3.10.4
stack-data==0.6.3
starlette==0.32.0.post1
sympy==1.12
tenacity==8.2.3
termcolor==2.4.0
tifffile==2024.5.22
tiktoken==0.4.0
timm==1.0.3
tokenizers==0.19.1
tomli==2.0.1
tomlkit==0.12.0
toolz==0.12.1
torch==2.1.2+cu118
torchvision==0.16.2+cu118
tqdm==4.66.2
traitlets==5.14.3
transformers==4.41.2
typer==0.12.3
typer-config==1.4.0
typing_extensions==4.10.0
tzdata==2024.1
tzlocal==5.2
ujson==5.9.0
uritemplate==4.1.1
urllib3==2.2.1
utility==1.0
uvicorn==0.29.0
virtualenv==20.26.2
visualdl==2.5.3
watchfiles==0.21.0
wcwidth==0.2.13
web.py==0.62
websocket-client==1.2.0
websockets==11.0.3
wechatpy==1.8.18
Werkzeug==3.0.3
wikipedia==1.4.0
win32-setctime==1.1.0
wolframalpha==5.0.0
wsproto==1.2.0
xlrd==2.0.1
xmltodict==0.13.0
xxhash==3.4.1
yacs==0.1.8
yapf==0.40.2
yarl==1.9.4
zhipuai==2.1.0.20240521
zipp==3.18.1
zstandard==0.22.0
+111 -111
View File
@@ -8,8 +8,8 @@ import os
import sys import sys
import json import json
import subprocess import subprocess
from huggingface_hub import hf_hub_download # from huggingface_hub import hf_hub_download
from faster_whisper import WhisperModel # from faster_whisper import WhisperModel
import public_tools import public_tools
from pathlib import Path from pathlib import Path
@@ -174,111 +174,111 @@ def SplitAudio(video_out_folder, video_list):
return mp3_list return mp3_list
def GetText(out_folder, mp3_list): # def GetText(out_folder, mp3_list):
text = [] # text = []
# 先获取模型 # # 先获取模型
print("正在下载或加载模型") # print("正在下载或加载模型")
sys.stdout.flush() # sys.stdout.flush()
model_path = Path( # model_path = Path(
hf_hub_download(repo_id="Systran/faster-whisper-large-v3", filename="model.bin") # hf_hub_download(repo_id="Systran/faster-whisper-large-v3", filename="model.bin")
) # )
hf_hub_download( # hf_hub_download(
repo_id="Systran/faster-whisper-large-v3", # repo_id="Systran/faster-whisper-large-v3",
filename="config.json", # filename="config.json",
) # )
hf_hub_download( # hf_hub_download(
repo_id="Systran/faster-whisper-large-v3", # repo_id="Systran/faster-whisper-large-v3",
filename="preprocessor_config.json", # filename="preprocessor_config.json",
) # )
hf_hub_download( # hf_hub_download(
repo_id="Systran/faster-whisper-large-v3", # repo_id="Systran/faster-whisper-large-v3",
filename="tokenizer.json", # filename="tokenizer.json",
) # )
hf_hub_download( # hf_hub_download(
repo_id="Systran/faster-whisper-large-v3", # repo_id="Systran/faster-whisper-large-v3",
filename="vocabulary.json", # filename="vocabulary.json",
) # )
model = WhisperModel( # model = WhisperModel(
model_size_or_path=os.path.dirname(model_path), # model_size_or_path=os.path.dirname(model_path),
device="auto", # device="auto",
local_files_only=True, # local_files_only=True,
) # )
print("模型加载成功,开始识别") # print("模型加载成功,开始识别")
sys.stdout.flush() # sys.stdout.flush()
for mp in mp3_list: # for mp in mp3_list:
segments, info = model.transcribe( # segments, info = model.transcribe(
mp, # mp,
beam_size=5, # beam_size=5,
language="zh", # language="zh",
vad_filter=True, # vad_filter=True,
vad_parameters=dict(min_silence_duration_ms=1000), # vad_parameters=dict(min_silence_duration_ms=1000),
) # )
tmp_text = "" # tmp_text = ""
for segment in segments: # for segment in segments:
tmp_text += segment.text + "" # tmp_text += segment.text + "。"
print(mp + "识别完成") # print(mp + "识别完成")
sys.stdout.flush() # sys.stdout.flush()
text.append(tmp_text) # text.append(tmp_text)
# 数据写出 # # 数据写出
print("文本全部识别成功,正在写出") # print("文本全部识别成功,正在写出")
sys.stdout.flush() # sys.stdout.flush()
tools = public_tools.PublicTools() # tools = public_tools.PublicTools()
tools.write_to_file(text, os.path.join(out_folder, "文案.txt")) # tools.write_to_file(text, os.path.join(out_folder, "文案.txt"))
print("写出完成") # print("写出完成")
sys.stdout.flush() # sys.stdout.flush()
def GetTextTask(out_folder, mp, name): # def GetTextTask(out_folder, mp, name):
text = [] # text = []
# 先获取模型 # # 先获取模型
print("正在下载或加载模型") # print("正在下载或加载模型")
sys.stdout.flush() # sys.stdout.flush()
model_path = Path( # model_path = Path(
hf_hub_download(repo_id="Systran/faster-whisper-large-v3", filename="model.bin") # hf_hub_download(repo_id="Systran/faster-whisper-large-v3", filename="model.bin")
) # )
hf_hub_download( # hf_hub_download(
repo_id="Systran/faster-whisper-large-v3", # repo_id="Systran/faster-whisper-large-v3",
filename="config.json", # filename="config.json",
) # )
hf_hub_download( # hf_hub_download(
repo_id="Systran/faster-whisper-large-v3", # repo_id="Systran/faster-whisper-large-v3",
filename="preprocessor_config.json", # filename="preprocessor_config.json",
) # )
hf_hub_download( # hf_hub_download(
repo_id="Systran/faster-whisper-large-v3", # repo_id="Systran/faster-whisper-large-v3",
filename="tokenizer.json", # filename="tokenizer.json",
) # )
hf_hub_download( # hf_hub_download(
repo_id="Systran/faster-whisper-large-v3", # repo_id="Systran/faster-whisper-large-v3",
filename="vocabulary.json", # filename="vocabulary.json",
) # )
model = WhisperModel( # model = WhisperModel(
model_size_or_path=os.path.dirname(model_path), # model_size_or_path=os.path.dirname(model_path),
device="auto", # device="auto",
local_files_only=True, # local_files_only=True,
) # )
print("模型加载成功,开始识别") # print("模型加载成功,开始识别")
sys.stdout.flush() # sys.stdout.flush()
segments, info = model.transcribe( # segments, info = model.transcribe(
mp, # mp,
beam_size=5, # beam_size=5,
language="zh", # language="zh",
vad_filter=True, # vad_filter=True,
vad_parameters=dict(min_silence_duration_ms=1000), # vad_parameters=dict(min_silence_duration_ms=1000),
) # )
tmp_text = "" # tmp_text = ""
for segment in segments: # for segment in segments:
tmp_text += segment.text + "" # tmp_text += segment.text + "。"
print(mp + "识别完成") # print(mp + "识别完成")
sys.stdout.flush() # sys.stdout.flush()
text.append(tmp_text) # text.append(tmp_text)
# 数据写出 # # 数据写出
sys.stdout.flush() # sys.stdout.flush()
tools = public_tools.PublicTools() # tools = public_tools.PublicTools()
tools.write_to_file(text, os.path.join(out_folder, name + ".txt")) # tools.write_to_file(text, os.path.join(out_folder, name + ".txt"))
sys.stdout.flush() # sys.stdout.flush()
def get_fram(video_path, out_path, sensitivity): def get_fram(video_path, out_path, sensitivity):
@@ -297,12 +297,12 @@ def get_fram(video_path, out_path, sensitivity):
exit(0) exit(0)
def init(video_path, video_out_folder, image_out_folder, sensitivity, gpu_type): # def init(video_path, video_out_folder, image_out_folder, sensitivity, gpu_type):
v_l = ClipVideo( # v_l = ClipVideo(
video_path, video_out_folder, image_out_folder, sensitivity, gpu_type # video_path, video_out_folder, image_out_folder, sensitivity, gpu_type
) # )
# 开始分离音频 # # 开始分离音频
m_l = SplitAudio(video_out_folder, v_l) # m_l = SplitAudio(video_out_folder, v_l)
# 开始识别字幕 # # 开始识别字幕
GetText(os.path.dirname(video_out_folder), m_l) # GetText(os.path.dirname(video_out_folder), m_l)
Binary file not shown.
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -10,7 +10,7 @@
"translation_secret": "2234", "translation_secret": "2234",
"translation_auto": true, "translation_auto": true,
"theme": "light", "theme": "light",
"gpt_auto_inference": "storyFirst", "gpt_auto_inference": "laitoolStoryboardMasterGeneral",
"webui_api_url": "你的SD地址(后面要加/", "webui_api_url": "你的SD地址(后面要加/",
"gpt_count": 8, "gpt_count": 8,
"customize_gpt_prompt": "a93b693e-bb3f-406d-9730-cba43a6585a2", "customize_gpt_prompt": "a93b693e-bb3f-406d-9730-cba43a6585a2",
+123 -1
View File
@@ -1,4 +1,6 @@
import { escapeRegExp, isEmpty } from "lodash";
import axios from 'axios';
//#region 检查字符串中是不是包含中文或者标点符号
/** /**
* 检查字符串中是不是包含中文或者标点符号 * 检查字符串中是不是包含中文或者标点符号
* @param str 需要判断的字符串 * @param str 需要判断的字符串
@@ -10,6 +12,9 @@ export function ContainsChineseOrPunctuation(str: string): boolean {
) )
} }
//#endregion
//#region 通用的失败重试函数
/** /**
* 通用的重试函数 * 通用的重试函数
* @param fn 要执行的函数 * @param fn 要执行的函数
@@ -37,7 +42,9 @@ export async function RetryWithBackoff<T>(fn: () => Promise<T>, retries: number
} }
throw new Error('所有重试失败'); // 理论上不会到达这里 throw new Error('所有重试失败'); // 理论上不会到达这里
} }
//#endregion
//#region 并发执行任务(控制同时执行的任务数)
/** /**
* 并发执行任务(控制同时执行的任务数) * 并发执行任务(控制同时执行的任务数)
* @param tasks 总的任务列表 * @param tasks 总的任务列表
@@ -67,3 +74,118 @@ export async function ExecuteConcurrently(tasks: Array<() => Promise<any>>, conc
} }
return Promise.all(results); return Promise.all(results);
} }
//#endregion
//#region 替换主字符串中的子字符串
/**
* 替换主字符串中的子字符串
* @param mainString 主字符串
* @param substringArray 子字符串数组
* @returns 替换后的字符串
*/
export function ReplaceSubstrings(mainString: string, substringArray: string[], replacement: string = " "): string {
// 按长度降序排序子字符串数组,以确保较长的子字符串先被替换
substringArray.sort((a, b) => b.length - a.length);
// 对每个子字符串进行替换
for (const substring of substringArray) {
// 创建一个正则表达式,用于全局匹配子字符串
const regex = new RegExp(escapeRegExp(substring), 'g');
// 将匹配到的子字符串替换为等长的空格
mainString = mainString.replace(regex, replacement);
}
return mainString;
}
//#endregion
//#region 获取url的基础地址
/**
* 获取url的基础地址
* @param url 一个url地址
* @returns
*/
export function GetBaseUrl(url: string): string {
if (isEmpty(url)) {
throw new Error('url不能为空');
}
// 判断是不是一个合法的url
if (!url.startsWith('http')) {
throw new Error('一个合法的url请求地址');
}
const parsedUrl = new URL(url);
return `${parsedUrl.protocol}//${parsedUrl.host}`;
}
//#endregion
//#region 通用的下载完网络图片
/**
* 通用的下载完网络图片
* @param url 网络地址
* @param localPath 本地路径
* @returns
*/
export async function DownloadFile(url: string, localPath?: string): Promise<void> {
if (typeof window !== 'undefined' && window.document) {
// 浏览器环境
const response = await fetch(url);
if (!response.body) {
throw new Error('浏览器不支持流式下载');
}
const reader = response.body.getReader();
const contentLength = +response.headers.get('Content-Length')!;
let receivedLength = 0;
const chunks = [];
while (true) {
const { done, value } = await reader.read();
if (done) break;
chunks.push(value);
receivedLength += value.length;
// 可以在这里更新进度,比如:
// console.log(`已接收 ${receivedLength} / ${contentLength}`);
}
const blob = new Blob(chunks);
const link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = localPath || 'downloaded_file';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(link.href);
} else {
// Node.js 环境
const fs = require('fs');
const { pipeline } = require('stream');
const { promisify } = require('util');
const path = require('path');
const https = require('https');
const http = require('http');
const urlObj = new URL(url);
const filePath = localPath || path.basename(url);
const protocol = urlObj.protocol === 'https:' ? https : http;
const streamPipeline = promisify(pipeline);
const response = await new Promise((resolve, reject) => {
protocol.get(url, (res) => {
if (res.statusCode === 200) {
resolve(res);
} else {
reject(new Error(`请求失败,状态码:${res.statusCode}`));
}
}).on('error', reject);
});
await streamPipeline(response, fs.createWriteStream(filePath));
}
}
//#endregion
+2 -2
View File
@@ -11,9 +11,9 @@ const fspromises = fs.promises
* @param {*} path 文件或目录的路径 * @param {*} path 文件或目录的路径
* @returns true表示存在,false表示不存在 * @returns true表示存在,false表示不存在
*/ */
export async function CheckFileOrDirExist(path) { export async function CheckFileOrDirExist(filePath) {
try { try {
await fspromises.access(path) await fspromises.access(filePath)
return true // 文件或目录存在 return true // 文件或目录存在
} catch (error) { } catch (error) {
return false // 文件或目录不存在 return false // 文件或目录不存在
+3 -1
View File
@@ -2,10 +2,12 @@ import * as image from './image';
import * as common from './common'; import * as common from './common';
import * as file from './file' import * as file from './file'
import * as validate from './validate'; import * as validate from './validate';
import * as write from './write';
export { export {
image, image,
common, common,
file, file,
validate validate,
write
}; };
+22 -1
View File
@@ -5,11 +5,32 @@
* @returns 可以解析返回true,否则返回false * @returns 可以解析返回true,否则返回false
*/ */
export function ValidateJson(str: string): boolean { export function ValidateJson(str: string): boolean {
try { try {
if (str == null) {
return false;
}
JSON.parse(str); JSON.parse(str);
return true return true
} catch (e) { } catch (e) {
return false; return false;
} }
} }
/**
* 校验并解析JSON字符串
* @description 该函数会尝试解析传入的字符串,如果解析成功则返回解析后的对象,否则抛出错误
* @param str 要解析的字符串
* @returns 解析成功返回解析后的对象,否则报错
*/
export function ValidateJsonAndParse<T>(str: string): T {
try {
if (str == null) {
throw new Error('数据不能为空')
}
let res = JSON.parse(str) as T
return res
} catch (e) {
throw new Error('数据解析失败,请检查数据格式')
}
}
+36
View File
@@ -0,0 +1,36 @@
import { isEmpty } from "lodash";
/**
* 格式化文本,将文本根据指定的分隔符拆分成单词数组。
*
* @param text - 要格式化的文本。
* @param simpleSplitChar - 简单分隔符字符串,如果未提供则使用默认的分隔符。
* @param specialSplitChat - 特殊分隔符数组,如果未提供或为空数组则使用默认的特殊分隔符。
* @returns 拆分后的单词数组。
*/
export function FormatWord(text: string, simpleSplitChar?: string, specialSplitChat?: string[],): string[] {
const defaultSimpleSplitChar = '。,“”‘’!?【】《》()…—:;.,\'\'""!?[]<>()...-:;';
const defaultSpecialSplitChat = ['.', '*', '?', '+', '^', '$', '[', ']', '(', ')', '{', '}', '|', '\\'];
if (isEmpty(simpleSplitChar)) {
simpleSplitChar = defaultSimpleSplitChar;
}
if (specialSplitChat == null || specialSplitChat.length === 0) {
specialSplitChat = defaultSpecialSplitChat;
}
Array.from(simpleSplitChar).forEach((item) => {
let regex: RegExp;
if (defaultSpecialSplitChat.includes(item)) {
regex = new RegExp('\\' + item, 'g')
} else {
regex = new RegExp(item, 'g')
}
text = text.replace(regex, '\n')
})
let wordArr = text.split('\n')
wordArr = wordArr.filter((item) => item != '' && item != null)
return wordArr
}
-59
View File
@@ -1,59 +0,0 @@
let apiUrl = [
{
label: 'LAI API - 香港',
value: 'b44c6f24-59e4-4a71-b2c7-3df0c4e35e65',
gpt_url: 'https://api.laitool.cc/v1/chat/completions',
mj_url: {
imagine: 'https://api.laitool.cc/mj/submit/imagine',
describe: 'https://api.laitool.cc/mj/submit/describe',
update_file: 'https://api.laitool.cc/mj/submit/upload-discord-images',
once_get_task: 'https://api.laitool.cc/mj/task/${id}/fetch'
},
d3_url: {
image: 'https://api.laitool.cc/v1/images/generations'
},
buy_url: 'https://api.laitool.cc/register?aff=Zmdu'
},
{
label: 'openai-hk',
value: '3d64e50e-79c0-49ec-a72d-7dfdf508dd04',
gpt_url: 'https://api.openai-hk.com/v1/chat/completions',
mj_url: null,
buy_url: 'https://openai-hk.com/?i=10196'
},
{
label: '通义千问',
value: 'b630c69a-99e9-46bc-8d88-39a00bcc3d2a',
gpt_url: 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation',
mj_url: null,
buy_url: null
},
{
label: 'KIMI',
value: 'b5c8c8c5-f3c4-4c88-b25c-7f5a3d5f9d1f',
gpt_url: 'https://api.moonshot.cn/v1/chat/completions',
mj_url: null,
d3_url: null,
buy_url: 'https://platform.moonshot.cn/console/account'
},
{
label: 'DouBao',
value: 'd3f6a2a9-2d17-4c3b-8d7f-28356cfa676e',
gpt_url: 'https://ark.cn-beijing.volces.com/api/v3/chat/completions',
mj_url: null,
d3_url: null,
buy_url: 'https://www.volcengine.com/product/doubao'
}
]
/**
* 通过ID获取指定的数据(value)
* @param {*} id
*/
function getApiMessageByID(id) {
let mj_api_url_index = apiUrl.findIndex((item) => item.value == id)
if (mj_api_url_index == -1) {
throw new Error('没有找到对应的MJ API的配置,请先检查配置')
}
}
export { apiUrl, getApiMessageByID }
+119
View File
@@ -0,0 +1,119 @@
let apiUrl = [
{
label: 'LAI API - 香港',
value: 'b44c6f24-59e4-4a71-b2c7-3df0c4e35e65',
gpt_url: 'https://api.laitool.cc/v1/chat/completions',
isPackage: false,
mj_url: {
imagine: 'https://api.laitool.cc/mj/submit/imagine',
video: 'https://api.laitool.cc/mj/submit/video',
describe: 'https://api.laitool.cc/mj/submit/describe',
update_file: 'https://api.laitool.cc/mj/submit/upload-discord-images',
once_get_task: 'https://api.laitool.cc/mj/task/${id}/fetch'
},
d3_url: {
image: 'https://api.laitool.cc/v1/images/generations'
},
buy_url: 'https://api.laitool.cc/login'
},
{
label: 'LAI API - 美国',
value: '2b443f53-ba12-42b3-a57c-e4df92685c73',
gpt_url: 'https://laitool.net/v1/chat/completions',
isPackage: false,
mj_url: {
imagine: 'https://laitool.net/mj/submit/imagine',
video: 'https://laitool.net/mj/submit/video',
describe: 'https://laitool.net/mj/submit/describe',
update_file: 'https://laitool.net/mj/submit/upload-discord-images',
once_get_task: 'https://laitool.net/mj/task/${id}/fetch'
},
d3_url: {
image: 'https://laitool.net/v1/images/generations'
},
buy_url: 'https://laitool.net/login'
},
{
label: 'openai-hk',
value: '3d64e50e-79c0-49ec-a72d-7dfdf508dd04',
gpt_url: 'https://api.openai-hk.com/v1/chat/completions',
mj_url: null,
buy_url: 'https://openai-hk.com/?i=10196'
},
{
label: '通义千问',
value: 'b630c69a-99e9-46bc-8d88-39a00bcc3d2a',
gpt_url: 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation',
mj_url: null,
buy_url: null
},
{
label: 'KIMI',
value: 'b5c8c8c5-f3c4-4c88-b25c-7f5a3d5f9d1f',
gpt_url: 'https://api.moonshot.cn/v1/chat/completions',
mj_url: null,
d3_url: null,
buy_url: 'https://platform.moonshot.cn/console/account'
},
{
label: 'DouBao',
value: 'd3f6a2a9-2d17-4c3b-8d7f-28356cfa676e',
gpt_url: 'https://ark.cn-beijing.volces.com/api/v3/chat/completions',
mj_url: null,
d3_url: null,
buy_url: 'https://www.volcengine.com/product/doubao'
},
{
label: 'LaiTool生图包',
value: '9c9023bd-871d-4b63-8004-facb3b66c5b3',
isPackage: true,
mj_url: {
imagine: 'https://lms.laitool.cn/api/mjPackage/mj/submit/imagine',
describe: 'https://lms.laitool.cn/api/mjPackage/mj/submit/describe',
update_file: 'https://lms.laitool.cn/api/mjPackage/mj/submit/upload-discord-images',
once_get_task: 'https://lms.laitool.cn/api/mjPackage/mj/task/${id}/fetch',
query_url: "https://lms.laitool.cn/mjp/task"
},
buy_url: 'https://rvgyir5wk1c.feishu.cn/wiki/P94OwwHuCi2qh8kADutcUuw4nUe'
},
{
label: 'MJ生图包-1',
value: 'babe557a-bbb8-4aed-acca-70ea068c156f',
isPackage: true,
mj_url: {
imagine: 'https://mjapi.bzu.cn/mj/submit/imagine',
describe: 'https://mjapi.bzu.cn/mj/submit/describe',
update_file: 'https://mjapi.bzu.cn/mj/submit/upload-discord-images',
once_get_task: 'https://mjapi.bzu.cn/mj/task/${id}/fetch',
query_url: "https://mjapi.bzu.cn/"
},
buy_url: 'https://rvgyir5wk1c.feishu.cn/wiki/P94OwwHuCi2qh8kADutcUuw4nUe'
}
]
/**
* 通过ID获取指定的数据(value)
* @param {*} id
*/
function getApiMessageByID(id) {
let mj_api_url_index = apiUrl.findIndex((item) => item.value == id)
if (mj_api_url_index == -1) {
throw new Error('没有找到对应的MJ API的配置,请先检查配置')
}
}
/**
* 获取MJ API 可用的URL Options
* @returns
*/
function GetMJUrlOptions(type: string) {
if (type != 'api' && type != 'package') {
throw new Error('没有找到对应的MJ API的配置,请先检查配置')
}
if (type == 'api') {
return apiUrl.filter((item) => item.mj_url && item.isPackage == false)
} else if (type == 'package') {
return apiUrl.filter((item) => item.mj_url && item.isPackage == true)
}
}
export { apiUrl, getApiMessageByID, GetMJUrlOptions }
+36
View File
@@ -0,0 +1,36 @@
/**
* 生图包图片代理方式
*/
export let ImagePackageProxyOptions = [
{
label: "无-用原链接",
value: "empty",
}, {
label: "香港代理",
value: "https://hk.bzu.cn",
apiId: "babe557a-bbb8-4aed-acca-70ea068c156f"
}
, {
label: "美国代理",
value: "https://mj_jp.bzu.cn",
apiId: "babe557a-bbb8-4aed-acca-70ea068c156f"
},
{
label: "LaiTool默认代理",
value: "https://cdn.laitool.net",
}
]
export function GetImageProxyUrlOptions(apiId?: string) {
debugger
if (!apiId) {
return ImagePackageProxyOptions
}
let imageProxyUrl = ImagePackageProxyOptions.filter((item) => item.apiId == apiId || item.apiId == null)
if (imageProxyUrl) {
return imageProxyUrl
} else {
return []
}
}
+10
View File
@@ -0,0 +1,10 @@
export const SoftwareData = {
"version": "V3.4.3",
"date": "2025-08-16",
"notes": [
"1. 导出剪映草稿,字幕自动换行",
"2. 修复一键导出草稿保存数据",
"3. 修复 一拆四 无效",
"4. 适配 按主题下的导出草稿界面"
]
}
@@ -16,6 +16,8 @@ export class BookBackTaskList extends Realm.Object<BookBackTaskList> {
startTime: number startTime: number
endTime: number endTime: number
messageName?: string messageName?: string
taskId?: string // 任务ID,可能是视频生成任务的ID
taskMessage?: string // 任务消息,可能是视频生成任务的消息
static schema: ObjectSchema = { static schema: ObjectSchema = {
name: 'BookBackTaskList', name: 'BookBackTaskList',
@@ -33,7 +35,9 @@ export class BookBackTaskList extends Realm.Object<BookBackTaskList> {
updateTime: 'date', updateTime: 'date',
startTime: 'int', startTime: 'int',
endTime: 'int', endTime: 'int',
messageName: 'string?' messageName: 'string?',
taskId: 'string?', // 任务ID,可能是视频生成任务的ID
taskMessage: 'string?', // 任务消息,可能是视频生成任务的消息
}, },
primaryKey: 'id' primaryKey: 'id'
} }
+2
View File
@@ -12,6 +12,7 @@ export class BookModel extends Realm.Object<BookModel> {
oldVideoPath: string | null oldVideoPath: string | null
srtPath: string | null srtPath: string | null
audioPath: string | null audioPath: string | null
draftDepend?: string // 草稿依赖
draftSrtStyle: string | null // 草稿字幕样式 draftSrtStyle: string | null // 草稿字幕样式
backgroundMusic: string | null // 背景音乐ID backgroundMusic: string | null // 背景音乐ID
friendlyReminder: string | null // 友情提示 friendlyReminder: string | null // 友情提示
@@ -38,6 +39,7 @@ export class BookModel extends Realm.Object<BookModel> {
oldVideoPath: 'string?', oldVideoPath: 'string?',
srtPath: 'string?', srtPath: 'string?',
audioPath: 'string?', audioPath: 'string?',
draftDepend: "string?",
draftSrtStyle: 'string?', draftSrtStyle: 'string?',
backgroundMusic: 'string?', backgroundMusic: 'string?',
friendlyReminder: 'string?', friendlyReminder: 'string?',
+10 -1
View File
@@ -1,5 +1,6 @@
import Realm, { ObjectSchema } from 'realm' import Realm, { ObjectSchema } from 'realm'
import { BookImageCategory, BookTaskStatus, BookType } from '../../../enum/bookEnum' import { BookImageCategory, BookTaskStatus, BookType } from '../../../enum/bookEnum'
import { ImageToVideoModels } from '@/define/enum/video'
export class ImageDefineModel extends Realm.Object<ImageDefineModel> { export class ImageDefineModel extends Realm.Object<ImageDefineModel> {
label: string label: string
@@ -43,12 +44,14 @@ export class BookTaskModel extends Realm.Object<BookTaskModel> {
name: string name: string
generateVideoPath: string | null generateVideoPath: string | null
srtPath: string | null srtPath: string | null
draftDepend?: string // 草稿依赖
audioPath: string | null audioPath: string | null
draftSrtStyle: string | null // 草稿字幕样式 draftSrtStyle: string | null // 草稿字幕样式
backgroundMusic: string | null // 背景音乐ID backgroundMusic: string | null // 背景音乐ID
friendlyReminder: string | null // 友情提示 friendlyReminder: string | null // 友情提示
imageFolder: string | null imageFolder: string | null
imageStyle: string[] | null // 软件内置的样式 imageStyle: string | null // 软件内置的样式
cacheImageList: string[] | null // 缓存的图片列表
autoAnalyzeCharacter: string | null // 自动分析角色设置 autoAnalyzeCharacter: string | null // 自动分析角色设置
customizeImageStyle: string[] | null // 自定义的样式 customizeImageStyle: string[] | null // 自定义的样式
videoConfig: string | null // 合成视频设置 videoConfig: string | null // 合成视频设置
@@ -58,6 +61,8 @@ export class BookTaskModel extends Realm.Object<BookTaskModel> {
status: BookTaskStatus status: BookTaskStatus
errorMsg: string | null errorMsg: string | null
isAuto: boolean // 是否自动 isAuto: boolean // 是否自动
openVideoGenerate: boolean | null // 是否开启视频生成
videoCategory: ImageToVideoModels // 图转视频方式
updateTime: Date updateTime: Date
createTime: Date createTime: Date
imageCategory: BookImageCategory // 图片出图方式 imageCategory: BookImageCategory // 图片出图方式
@@ -72,12 +77,14 @@ export class BookTaskModel extends Realm.Object<BookTaskModel> {
name: 'string', name: 'string',
generateVideoPath: 'string?', generateVideoPath: 'string?',
srtPath: 'string?', srtPath: 'string?',
draftDepend: "string?",
audioPath: 'string?', audioPath: 'string?',
draftSrtStyle: 'string?', draftSrtStyle: 'string?',
backgroundMusic: 'string?', backgroundMusic: 'string?',
friendlyReminder: 'string?', friendlyReminder: 'string?',
imageFolder: 'string?', imageFolder: 'string?',
subImageFolder: "string?[]", subImageFolder: "string?[]",
cacheImageList: 'string?[]',
imageStyle: 'string?[]', imageStyle: 'string?[]',
autoAnalyzeCharacter: 'string?', autoAnalyzeCharacter: 'string?',
customizeImageStyle: 'string?[]', customizeImageStyle: 'string?[]',
@@ -85,11 +92,13 @@ export class BookTaskModel extends Realm.Object<BookTaskModel> {
prefixPrompt: "string?", prefixPrompt: "string?",
suffixPrompt: "string?", suffixPrompt: "string?",
status: 'string', status: 'string',
openVideoGenerate: 'bool?',
errorMsg: 'string?', errorMsg: 'string?',
isAuto: 'bool', isAuto: 'bool',
updateTime: 'date', updateTime: 'date',
createTime: 'date', createTime: 'date',
imageCategory: 'string', imageCategory: 'string',
videoCategory: "string",
}, },
// 主键为_id // 主键为_id
primaryKey: 'id' primaryKey: 'id'
+49 -3
View File
@@ -1,9 +1,6 @@
import Realm, { ObjectSchema } from 'realm' import Realm, { ObjectSchema } from 'realm'
import { import {
BookBackTaskStatus,
BookBackTaskType,
BookTaskStatus, BookTaskStatus,
BookType,
MJAction, MJAction,
} from '../../../enum/bookEnum' } from '../../../enum/bookEnum'
import { MJImageType } from '../../../enum/mjEnum' import { MJImageType } from '../../../enum/mjEnum'
@@ -54,6 +51,49 @@ export class MJMessage extends Realm.Object<MJMessage> {
} }
} }
export class VideoMessage extends Realm.Object<VideoMessage> {
id: string;
msg: string | null;
videoType: string;
prompt: string | null;
style: string | null;
imageUrl: string | null;
model: string | null;
bookTaskDetailId: string;
status: string | null;
videoUrl: string | null;
videoUrls: string[] | null; // 视频地址数组
taskId: string | null;
runwayOptions: string | null; // 生成视频的一些设置
lumaOptions: string | null; // 生成视频的一些设置
klingOptions: string | null; // 生成视频的一些设置
mjVideoOptions: string | null; // MJ生成视频的一些设置
messageData: string | null;
static schema: ObjectSchema = {
name: 'VideoMessage',
properties: {
id: 'string',
msg: 'string?',
videoType: 'string',
bookTaskDetailId: 'string?',
prompt: 'string?',
style: 'string?',
imageUrl: 'string?',
model: 'string?',
status: 'string?',
videoUrl: 'string?',
taskId: 'string?',
runwayOptions: "string?",
lumaOptions: "string?",
klingOptions: "string?",
mjVideoOptions: "string?",
messageData: 'string?',
videoUrls: 'string[]'
},
primaryKey: 'id'
}
}
export class WebuiConfig extends Realm.Object<WebuiConfig> { export class WebuiConfig extends Realm.Object<WebuiConfig> {
sampler_name: string // 采样器名称 sampler_name: string // 采样器名称
negative_prompt: string // 负面提示 negative_prompt: string // 负面提示
@@ -132,6 +172,8 @@ export class BookTaskDetailModel extends Realm.Object<BookTaskDetailModel> {
bookId: string bookId: string
bookTaskId: string bookTaskId: string
videoPath: string | null // 视频地址 videoPath: string | null // 视频地址
generateVideoPath: string | null // 生成视频地址
subVideoPath: string[] | null // 生成的批次视频的地址
audioPath: string | null // 音频地址 audioPath: string | null // 音频地址
word: string | null // 文案 word: string | null // 文案
oldImage: string | null // 旧图片(用于SD的图生图) oldImage: string | null // 旧图片(用于SD的图生图)
@@ -144,6 +186,7 @@ export class BookTaskDetailModel extends Realm.Object<BookTaskDetailModel> {
sceneTags: string[] | null // 场景标签 sceneTags: string[] | null // 场景标签
gptPrompt: string | null // GPT提示词 gptPrompt: string | null // GPT提示词
mjMessage: MJMessage | null // MJ消息 mjMessage: MJMessage | null // MJ消息
videoMessage: VideoMessage | null // 视频消息
outImagePath: string | null // 输出图片地址 outImagePath: string | null // 输出图片地址
subImagePath: string[] | null // 子图片地址 subImagePath: string[] | null // 子图片地址
imageLock: boolean // 图片锁 imageLock: boolean // 图片锁
@@ -165,6 +208,8 @@ export class BookTaskDetailModel extends Realm.Object<BookTaskDetailModel> {
bookId: { type: 'string', indexed: true }, bookId: { type: 'string', indexed: true },
bookTaskId: { type: 'string', indexed: true }, bookTaskId: { type: 'string', indexed: true },
videoPath: 'string?', videoPath: 'string?',
generateVideoPath: 'string?', // 生成视频地址
subVideoPath : "string[]", // 生成的批次视频的地址
audioPath: 'string?', audioPath: 'string?',
word: 'string?', word: 'string?',
oldImage: 'string?', oldImage: 'string?',
@@ -178,6 +223,7 @@ export class BookTaskDetailModel extends Realm.Object<BookTaskDetailModel> {
sceneTags: 'string[]', sceneTags: 'string[]',
gptPrompt: 'string?', gptPrompt: 'string?',
mjMessage: 'MJMessage?', mjMessage: 'MJMessage?',
videoMessage: 'VideoMessage?',
outImagePath: 'string?', outImagePath: 'string?',
subImagePath: 'string[]', subImagePath: 'string[]',
imageLock: 'bool', imageLock: 'bool',
+5 -1
View File
@@ -52,6 +52,8 @@ export class RemoteMJModel extends Realm.Object<RemoteMJModel> {
createTime: Date createTime: Date
updateTime: Date updateTime: Date
version: string version: string
blockMessage?: string
type?: string
static schema: ObjectSchema = { static schema: ObjectSchema = {
name: 'RemoteMJ', name: 'RemoteMJ',
properties: { properties: {
@@ -71,7 +73,9 @@ export class RemoteMJModel extends Realm.Object<RemoteMJModel> {
userToken: 'string', userToken: 'string',
createTime: 'date', createTime: 'date',
updateTime: 'date', updateTime: 'date',
version: 'string' version: 'string',
blockMessage: 'string?',
type: "string?"
}, },
// 主键为_id // 主键为_id
primaryKey: 'id' primaryKey: 'id'
+16
View File
@@ -0,0 +1,16 @@
import Realm, { ObjectSchema } from 'realm'
export class OptionsModel extends Realm.Object<OptionsModel> {
key: string;
value: string;
type: string;
static schema: ObjectSchema = {
name: 'Options',
properties: {
key: 'string',
value: 'string',
type: 'string'
},
primaryKey: 'key'
}
}
@@ -9,8 +9,9 @@ import { BaseRealmService } from './bookBasic'
import { isEmpty } from 'lodash' import { isEmpty } from 'lodash'
import { OtherData } from '../../../enum/softwareEnum.js' import { OtherData } from '../../../enum/softwareEnum.js'
import { BookBackTaskList } from '../../model/Book/BookBackTaskListModel.js' import { BookBackTaskList } from '../../model/Book/BookBackTaskListModel.js'
import { Book } from '../../../../model/book.js' import { Book } from '../../../../model/book/book.js'
import { GeneralResponse } from '../../../../model/generalResponse.js' import { GeneralResponse } from '../../../../model/generalResponse.js'
import { TaskModal } from '@/model/task.js'
const { v4: uuidv4 } = require('uuid') const { v4: uuidv4 } = require('uuid')
export class BookBackTaskListService extends BaseRealmService { export class BookBackTaskListService extends BaseRealmService {
@@ -259,6 +260,32 @@ export class BookBackTaskListService extends BaseRealmService {
} }
} }
/**
* 更新后台任务的数据
* @param taskId 任务ID
* @param backTaskParam 需要更新的任务数据部分字段
*/
UpdateBackTaskData(taskId: string, backTaskParam: Partial<TaskModal.Task>): void {
this.transaction(() => {
// 根据ID获取后台任务
let backTask = this.realm.objectForPrimaryKey('BookBackTaskList', taskId)
// 检查任务是否存在
if (backTask == null) {
throw new Error('更新后台任务数据失败,未找到对应的任务')
}
// 遍历需要更新的字段
for (const key in backTaskParam) {
// 跳过ID字段,防止主键被修改
if (key == "id") {
continue;
}
// 更新对应字段的值
backTask[key] = backTaskParam[key]
}
})
}
/** /**
* 删除满足条件的数据,包含 id、bookId、bookTaskId * 删除满足条件的数据,包含 id、bookId、bookTaskId
* 上面的条件,至少要有一个 * 上面的条件,至少要有一个
+117 -2
View File
@@ -7,6 +7,7 @@ import path from 'path'
import { import {
BookTaskDetailModel, BookTaskDetailModel,
MJMessage, MJMessage,
VideoMessage,
ReversePrompt, ReversePrompt,
SDConfig, SDConfig,
Subtitle, Subtitle,
@@ -176,6 +177,119 @@ const migration = (oldRealm: Realm, newRealm: Realm) => {
newBookTask[i].messageName = '' newBookTask[i].messageName = ''
} }
} }
// if (oldRealm.schemaVersion < 25) {
// const oldBookTask = oldRealm.objects('BookTaskDetail')
// const newBookTask = newRealm.objects('BookTaskDetail')
// for (let i = 0; i < oldBookTask.length; i++) {
// newBookTask[i].draftDepend = undefined
// }
// }
if (oldRealm.schemaVersion < 26) {
const oldBookTask = oldRealm.objects('BookTask')
const newBookTask = newRealm.objects('BookTask')
for (let i = 0; i < oldBookTask.length; i++) {
newBookTask[i].draftDepend = ''
}
}
if (oldRealm.schemaVersion < 27) {
const oldBookTask = oldRealm.objects('Book')
const newBookTask = newRealm.objects('Book')
for (let i = 0; i < oldBookTask.length; i++) {
newBookTask[i].draftDepend = ''
}
}
if (oldRealm.schemaVersion < 29) {
const oldBookTask = oldRealm.objects('BookTask')
const newBookTask = newRealm.objects('BookTask')
for (let i = 0; i < oldBookTask.length; i++) {
newBookTask[i].cacheImageList = undefined
}
}
if (oldRealm.schemaVersion < 30) {
const oldBookTask = oldRealm.objects('BookTaskDetail')
const newBookTask = newRealm.objects('BookTaskDetail')
for (let i = 0; i < oldBookTask.length; i++) {
newBookTask[i].generateVideoPath = undefined
}
}
if (oldRealm.schemaVersion < 31) {
const oldBookTask = oldRealm.objects('BookTask')
const newBookTask = newRealm.objects('BookTask')
for (let i = 0; i < oldBookTask.length; i++) {
newBookTask[i].openVideoGenerate = false
}
}
if (oldRealm.schemaVersion < 34) {
const oldBookTask = oldRealm.objects('BookTaskDetail')
const newBookTask = newRealm.objects('BookTaskDetail')
for (let i = 0; i < oldBookTask.length; i++) {
newBookTask[i].videoMessage = undefined
}
}
if (oldRealm.schemaVersion < 35) {
const oldBookTask = oldRealm.objects('VideoMessage')
const newBookTask = newRealm.objects('VideoMessage')
for (let i = 0; i < oldBookTask.length; i++) {
newBookTask[i].videoMessage = undefined
}
}
if (oldRealm.schemaVersion < 36) {
const oldBookTask = oldRealm.objects('VideoMessage')
const newBookTask = newRealm.objects('VideoMessage')
for (let i = 0; i < oldBookTask.length; i++) {
newBookTask[i].options = undefined
}
}
if (oldRealm.schemaVersion < 37) {
const oldBookTask = oldRealm.objects('VideoMessage')
const newBookTask = newRealm.objects('VideoMessage')
for (let i = 0; i < oldBookTask.length; i++) {
newBookTask[i].runwayOptions = oldBookTask[i].options;
newBookTask[i].lumaOptions = undefined;
newBookTask[i].klingOptions = undefined;
}
}
if (oldRealm.schemaVersion < 40) {
const oldBookTask = oldRealm.objects('BookTask')
const newBookTask = newRealm.objects('BookTask')
for (let i = 0; i < oldBookTask.length; i++) {
newBookTask[i].videoCategory = "RUNWAY";
newBookTask[i].videoCategory = "RUNWAY";
}
}
if (oldRealm.schemaVersion < 41) {
const oldBookTask = oldRealm.objects('BookTaskDetail')
const newBookTask = newRealm.objects('BookTaskDetail')
for (let i = 0; i < oldBookTask.length; i++) {
newBookTask[i].mjVideoOptions = undefined;
}
}
if (oldRealm.schemaVersion < 42) {
const oldBookTask = oldRealm.objects('VideoMessage')
const newBookTask = newRealm.objects('VideoMessage')
for (let i = 0; i < oldBookTask.length; i++) {
newBookTask[i].videoUrls = [];
}
}
if (oldRealm.schemaVersion < 43) {
const oldBookTask = oldRealm.objects('VideoMessage')
const newBookTask = newRealm.objects('VideoMessage')
for (let i = 0; i < oldBookTask.length; i++) {
newBookTask[i].subVideoPath = [];
}
}
if (oldRealm.schemaVersion < 44) {
const oldBookTask = oldRealm.objects('BookBackTaskList')
const newBookTask = newRealm.objects('BookBackTaskList')
for (let i = 0; i < oldBookTask.length; i++) {
newBookTask[i].taskId = undefined;
newBookTask[i].taskMessage = undefined;
}
}
} }
export class BaseRealmService extends BaseService { export class BaseRealmService extends BaseService {
@@ -214,10 +328,11 @@ export class BaseRealmService extends BaseService {
WebuiConfig, WebuiConfig,
BookTaskModel, BookTaskModel,
ReversePrompt, ReversePrompt,
BookTaskDetailModel BookTaskDetailModel,
VideoMessage
], ],
path: this.dbpath, path: this.dbpath,
schemaVersion: 24, schemaVersion: 44,
migration: migration migration: migration
} }
this.realm = await Realm.open(config) this.realm = await Realm.open(config)
+9 -4
View File
@@ -1,7 +1,7 @@
import Realm, { UpdateMode } from 'realm' import Realm, { UpdateMode } from 'realm'
import { BookModel } from '../../model/Book/book.js' import { BookModel } from '../../model/Book/book.js'
import path from 'path' import path from 'path'
import { define } from '../../../define.js' import { define } from '../../../define'
import { BookImageCategory, BookTaskStatus, BookType } from '../../../enum/bookEnum.js' import { BookImageCategory, BookTaskStatus, BookType } from '../../../enum/bookEnum.js'
import { successMessage } from '../../../../main/Public/generalTools' import { successMessage } from '../../../../main/Public/generalTools'
import { CheckFolderExistsOrCreate, CopyFileOrFolder } from '../../../Tools/file' import { CheckFolderExistsOrCreate, CopyFileOrFolder } from '../../../Tools/file'
@@ -10,8 +10,9 @@ import { BaseRealmService } from './bookBasic.js'
import { isEmpty } from 'lodash' import { isEmpty } from 'lodash'
import { FfmpegOptions } from '../../../../main/Service/ffmpegOptions.js' import { FfmpegOptions } from '../../../../main/Service/ffmpegOptions.js'
import { version } from '../../../../../package.json' import { version } from '../../../../../package.json'
import { Book } from '../../../../model/book.js' import { Book } from '../../../../model/book/book.js'
import { GeneralResponse } from '../../../../model/generalResponse.js' import { GeneralResponse } from '../../../../model/generalResponse.js'
import { ImageToVideoModels } from '@/define/enum/video.js'
export class BookService extends BaseRealmService { export class BookService extends BaseRealmService {
static instance: BookService | null = null static instance: BookService | null = null
@@ -205,11 +206,13 @@ export class BookService extends BaseRealmService {
} else if (book.type == BookType.MJ_REVERSE) { } else if (book.type == BookType.MJ_REVERSE) {
imageCategory = BookImageCategory.MJ imageCategory = BookImageCategory.MJ
} else if (book.type == BookType.ORIGINAL) { } else if (book.type == BookType.ORIGINAL) {
imageCategory = BookImageCategory.MJ imageCategory = global.config.defaultImageMode ?? BookImageCategory.MJ
} else { } else {
throw new Error('未知的小说类型') throw new Error('未知的小说类型')
} }
let videoCategory = ImageToVideoModels.MJ_VIDEO;
this.realm.write(() => { this.realm.write(() => {
book.version = version book.version = version
this.realm.create('Book', book) this.realm.create('Book', book)
@@ -232,7 +235,9 @@ export class BookService extends BaseRealmService {
updateTime: new Date(), updateTime: new Date(),
createTime: new Date(), createTime: new Date(),
version: version, version: version,
imageCategory: imageCategory imageCategory: imageCategory,
videoCategory: videoCategory,
openVideoGenerate: false
} }
// 添加任务 // 添加任务
@@ -8,8 +8,10 @@ import { cloneDeep, isEmpty } from 'lodash'
import { JoinPath } from '../../../Tools/file' import { JoinPath } from '../../../Tools/file'
import { BookTaskDetailModel, ReversePrompt } from '../../model/Book/bookTaskDetail.js' import { BookTaskDetailModel, ReversePrompt } from '../../model/Book/bookTaskDetail.js'
const { v4: uuidv4 } = require('uuid') const { v4: uuidv4 } = require('uuid')
import { Book } from "../../../../model/book" import { Book } from "../../../../model/book/book"
import { GeneralResponse } from '../../../../model/generalResponse.js' import { GeneralResponse } from '../../../../model/generalResponse.js'
import { BookTaskDetail } from '@/model/book/bookTaskDetail'
import { ValidateJson } from '@/define/Tools/validate'
let dbPath = path.resolve(define.db_path, 'book.realm') let dbPath = path.resolve(define.db_path, 'book.realm')
@@ -65,12 +67,29 @@ export class BookTaskDetailService extends BaseRealmService {
let resObj = { let resObj = {
...item, ...item,
videoPath: JoinPath(define.project_path, item.videoPath), videoPath: JoinPath(define.project_path, item.videoPath),
generateVideoPath: JoinPath(define.project_path, item.generateVideoPath),
audioPath: JoinPath(define.project_path, item.audioPath), audioPath: JoinPath(define.project_path, item.audioPath),
oldImage: JoinPath(define.project_path, item.oldImage), oldImage: JoinPath(define.project_path, item.oldImage),
outImagePath: JoinPath(define.project_path, item.outImagePath), outImagePath: JoinPath(define.project_path, item.outImagePath),
subImagePath: (item.subImagePath as string[])?.map((subImage) => { subImagePath: (item.subImagePath as string[])?.map((subImage) => {
return JoinPath(define.project_path, subImage) return JoinPath(define.project_path, subImage)
}), }),
subVideoPath: (item.subVideoPath as string[]).map((subVideo) => subVideo.toString()),
subVideoPathObject: (item.subVideoPath as string[])?.map((subVideo) => {
if (isEmpty(subVideo)) {
return {};
} else {
if (!ValidateJson(subVideo)) {
return {};
} else {
let obj = JSON.parse(subVideo);
if (!isEmpty(obj.localPath)) {
obj.localPath = JoinPath(define.project_path, obj.localPath) + '?t=' + new Date().getTime();
}
return obj
}
}
}),
characterTags: item.characterTags ? item.characterTags.map((tag) => tag) : null, characterTags: item.characterTags ? item.characterTags.map((tag) => tag) : null,
sceneTags: item.sceneTags ? item.sceneTags.map((tag) => tag) : null, sceneTags: item.sceneTags ? item.sceneTags.map((tag) => tag) : null,
subValue: isEmpty(item.subValue) ? null : JSON.parse(item.subValue), subValue: isEmpty(item.subValue) ? null : JSON.parse(item.subValue),
@@ -80,6 +99,11 @@ export class BookTaskDetailService extends BaseRealmService {
} }
}), }),
mjMessage: item.mjMessage ? item.mjMessage.toJSON() : null, mjMessage: item.mjMessage ? item.mjMessage.toJSON() : null,
videoMessage: item.videoMessage ? item.videoMessage.toJSON() : null,
}
// 不是网络地址,并且存在,进行地址的拼接
if (resObj.videoMessage && resObj.videoMessage.imageUrl && !isEmpty(resObj.videoMessage.imageUrl) && !(resObj.videoMessage.imageUrl as string).startsWith("http")) {
resObj.videoMessage.imageUrl = JoinPath(define.project_path, resObj.videoMessage.imageUrl as string);
} }
return cloneDeep(resObj) return cloneDeep(resObj)
}) })
@@ -93,6 +117,24 @@ export class BookTaskDetailService extends BaseRealmService {
} }
} }
/**
* 返回指定的小说分镜的指定的属性
* @param bookTaskDetailId 小说分镜的ID
* @param property 小说属性名字
* @returns
*/
GetBookTaskDetailProperty(bookTaskDetailId: string, property: string) {
let bookTaskDetail = this.GetBookTaskDetailDataById(bookTaskDetailId);
if (bookTaskDetail == null) {
throw new Error('未找到对应的小说任务详细信息 ' + bookTaskDetailId)
}
if (bookTaskDetail.hasOwnProperty(property)) {
return bookTaskDetail[property]
} else {
throw new Error(`未找到对应的属性 ${property}`)
}
}
/** /**
* 通过ID获取指定的小说任务分镜详细数据 * 通过ID获取指定的小说任务分镜详细数据
* @param bookTaskDetailId * @param bookTaskDetailId
@@ -177,7 +219,16 @@ export class BookTaskDetailService extends BaseRealmService {
} }
// 开始修改 // 开始修改
for (let key in updateData) { for (let key in updateData) {
bookTaskDetail[key] = updateData[key]
let newData = updateData[key];
if (key == "generateVideoPath") {
if (!isEmpty(updateData[key])) {
newData = path.relative(define.project_path, updateData[key])
}
}
bookTaskDetail[key] = newData;
} }
bookTaskDetail.updateTime = new Date() bookTaskDetail.updateTime = new Date()
}) })
@@ -213,6 +264,34 @@ export class BookTaskDetailService extends BaseRealmService {
} }
} }
/**
* 更新小说分镜的视频消息
* @param bookTaskDetailId
* @param videoMessage
*/
UpdateBookTaskDetailVideoMessage(bookTaskDetailId: string, videoMessage: BookTaskDetail.VideoMessage): void {
this.transaction(() => {
console.log("开始更新小说分镜的视频消息", bookTaskDetailId, videoMessage)
let bookTaskDetail = this.realm.objectForPrimaryKey('BookTaskDetail', bookTaskDetailId)
let videoMessageRes = this.realm.objectForPrimaryKey('VideoMessage', bookTaskDetailId)
if (bookTaskDetail.videoMessage == null) {
// 新增
videoMessage.id = bookTaskDetailId
bookTaskDetail.videoMessage = videoMessage
} else {
for (const key in videoMessage) {
if (key == "id") {
continue;
}
if (key == "imageUrl" && videoMessage[key] != null && !videoMessage[key].startsWith("http")) {
videoMessage[key] = path.relative(define.project_path, videoMessage[key])
}
videoMessageRes[key] = videoMessage[key]
}
}
})
}
/** /**
* 更新指定ID的反推提示词数据 * 更新指定ID的反推提示词数据
* @param bookTaskDetailId 分镜数据的ID * @param bookTaskDetailId 分镜数据的ID
@@ -244,7 +323,7 @@ export class BookTaskDetailService extends BaseRealmService {
* 删除满足条件的对象吗,必传小说ID和小说任务ID * 删除满足条件的对象吗,必传小说ID和小说任务ID
* @param condition bookIdbookTaskIdnameid * @param condition bookIdbookTaskIdnameid
*/ */
DeleteBookTaskDetail(condition) { DeleteBookTaskDetail(condition: Book.DeleteBookTaskDetailCondition) {
try { try {
if (isEmpty(condition.id) && isEmpty(condition.bookTaskId) && isEmpty(condition.bookId)) { if (isEmpty(condition.id) && isEmpty(condition.bookTaskId) && isEmpty(condition.bookId)) {
throw new Error('删除小说分镜信息失败,没有必要参数') throw new Error('删除小说分镜信息失败,没有必要参数')
@@ -8,11 +8,12 @@ import { BaseRealmService } from './bookBasic'
import { JoinPath } from '../../../Tools/file' import { JoinPath } from '../../../Tools/file'
import { BookBackTaskList } from '../../model/Book/BookBackTaskListModel.js' import { BookBackTaskList } from '../../model/Book/BookBackTaskListModel.js'
const { v4: uuidv4 } = require('uuid') const { v4: uuidv4 } = require('uuid')
import { Book } from '../../../../model/book' import { Book } from '../../../../model/book/book'
import { TagDefine } from '../../../tagDefine.js' import { TagDefine } from '../../../tagDefine.js'
import { ImageStyleDefine } from "../../../../define/iamgeStyleDefine" import { ImageStyleDefine } from "../../../../define/iamgeStyleDefine"
import { cloneDeep } from 'lodash' import { cloneDeep } from 'lodash'
import { GeneralResponse } from '../../../../model/generalResponse' import { GeneralResponse } from '../../../../model/generalResponse'
import { ImageToVideoModels } from '@/define/enum/video'
let dbPath = path.resolve(define.db_path, 'book.realm') let dbPath = path.resolve(define.db_path, 'book.realm')
@@ -89,7 +90,9 @@ export class BookTaskService extends BaseRealmService {
srtPath: JoinPath(define.project_path, bookTask.srtPath), srtPath: JoinPath(define.project_path, bookTask.srtPath),
audioPath: JoinPath(define.project_path, bookTask.audioPath), audioPath: JoinPath(define.project_path, bookTask.audioPath),
imageFolder: JoinPath(define.project_path, bookTask.imageFolder), imageFolder: JoinPath(define.project_path, bookTask.imageFolder),
cacheImageList: bookTask.cacheImageList ? Array.from(bookTask.cacheImageList).map(item => JoinPath(define.project_path, item)) : [],
imageCategory: bookTask.imageCategory ? bookTask.imageCategory : BookImageCategory.MJ, // 默认使用MJ出图 imageCategory: bookTask.imageCategory ? bookTask.imageCategory : BookImageCategory.MJ, // 默认使用MJ出图
videoCategory : bookTask.videoCategory ? bookTask.videoCategory : ImageToVideoModels.MJ_VIDEO
} as Book.SelectBookTask; } as Book.SelectBookTask;
}) })
@@ -1,16 +1,15 @@
import Realm, { UpdateMode } from 'realm' import Realm, { UpdateMode } from 'realm'
import path from 'path' import { successMessage } from '../../../../main/Public/generalTools'
import { BaseService } from '../baseService'
import { define } from '../../../define'
import { SoftwareModel } from '../../model/SoftWare/software'
import { ComponentSize, SoftwareThemeType } from '../../../enum/softwareEnum.js'
import { errorMessage, successMessage } from '../../../../main/Public/generalTools'
import { BaseSoftWareService } from './softwareBasic.js' import { BaseSoftWareService } from './softwareBasic.js'
import { isEmpty, isNumber } from 'lodash' import { cloneDeep, isEmpty } from 'lodash'
const { v4: uuidv4 } = require('uuid') const { v4: uuidv4 } = require('uuid')
import { version } from '../../../../../package.json' import { version } from '../../../../../package.json'
import { GeneralResponse } from '../../../../model/generalResponse' import { GeneralResponse } from '../../../../model/generalResponse'
import { MJCategroy } from '../../../enum/bookEnum' import { MJCategroy } from '../../../enum/bookEnum'
import { OptionRealmService } from './optionRealmService'
import { OptionKeyName } from '@/define/enum/option'
import { OptionModel } from '@/model/option/option'
import { ValidateJson } from '@/define/Tools/validate'
export class MJSettingService extends BaseSoftWareService { export class MJSettingService extends BaseSoftWareService {
static instance: MJSettingService | null = null static instance: MJSettingService | null = null
@@ -32,6 +31,7 @@ export class MJSettingService extends BaseSoftWareService {
return MJSettingService.instance return MJSettingService.instance
} }
/** /**
* 初始化数据 * 初始化数据
*/ */
@@ -300,6 +300,12 @@ export class MJSettingService extends BaseSoftWareService {
if (remoteMjQuery?.id) { if (remoteMjQuery?.id) {
remoteMjSettings = this.realm.objects('RemoteMJ').filtered('id = $0', remoteMjQuery.id) remoteMjSettings = this.realm.objects('RemoteMJ').filtered('id = $0', remoteMjQuery.id)
} }
if (remoteMjQuery?.accountId) {
remoteMjSettings = this.realm.objects('RemoteMJ').filtered('accountId = $0', remoteMjQuery.accountId)
}
if (remoteMjQuery?.type) {
remoteMjSettings = this.realm.objects('RemoteMJ').filtered('type = $0', remoteMjQuery.type)
}
let resRemoteMj = Array.from(remoteMjSettings).map((remoteMj) => { let resRemoteMj = Array.from(remoteMjSettings).map((remoteMj) => {
return { return {
...remoteMj ...remoteMj
@@ -348,9 +354,12 @@ export class MJSettingService extends BaseSoftWareService {
remoteMjSetting.createTime = new Date() remoteMjSetting.createTime = new Date()
remoteMjSetting.updateTime = new Date() remoteMjSetting.updateTime = new Date()
remoteMjSetting.version = version remoteMjSetting.version = version
remoteMjSetting.enable = true
remoteMjSetting.remark = global.machineId remoteMjSetting.remark = global.machineId
if (remoteMjSetting.hasOwnProperty('enable') == false) {
remoteMjSetting.enable = true
}
// 判断当前this.relam 是不是已经处于一个事务中 // 判断当前this.relam 是不是已经处于一个事务中
if (this.realm.isInTransaction) { if (this.realm.isInTransaction) {
this.realm.create('RemoteMJ', remoteMjSetting) this.realm.create('RemoteMJ', remoteMjSetting)
@@ -456,21 +465,28 @@ export class MJSettingService extends BaseSoftWareService {
* @param mjSettingQuery 查询的条件 Id null 返回全部 * @param mjSettingQuery 查询的条件 Id null 返回全部
* @returns * @returns
*/ */
GetMjSetting(mjSettingQuery) { GetMjSetting() {
try { try {
let mjSettings = this.realm.objects('MjSetting') let res = this.realm.objects('Options').filtered(`key = "${OptionKeyName.MJ_GlobalSetting}"`);
if (mjSettingQuery?.id) { let mjSetting: OptionModel.OptionItem | null = null;
mjSettings = this.realm.objects('MjSetting').filtered('id = $0', mjSettingQuery.id) if (res.length > 0) {
} let resData = Array.from(res).map((item) => {
let resObj = {
let resMjSetting = Array.from(mjSettings).map((mjSetting) => { ...item
return {
...mjSetting
} }
return cloneDeep(resObj)
}) })
mjSetting = resData[0] as OptionModel.OptionItem
return successMessage(resMjSetting, '获取MJ基础设置成功', 'MJSettingService_getMjSetting') if (!ValidateJson(mjSetting.value)) {
throw new Error('MJ设置的数据格式不正确,请检查数据格式')
}
return JSON.parse(mjSetting.value)?.mj_simpleSetting
} else {
throw new Error('没有找到MJ的设置信息,请检查')
}
} catch (error) { } catch (error) {
throw error throw error
} }
@@ -576,11 +592,14 @@ export class MJSettingService extends BaseSoftWareService {
GetMJSettingTreeData() { GetMJSettingTreeData() {
try { try {
// 获取MJ的基础配置信息 // 获取MJ的基础配置信息
let mjSettings = this.GetMjSetting(null) let mjSettings = this.GetMjSetting()
if (mjSettings.data.length <= 0) { // if (mjSettings.data.length <= 0) {
this.InitData(); // this.InitData();
mjSettings = this.GetMjSetting(null) // mjSettings = this.GetMjSetting(null)
// }
if (mjSettings == null) {
throw new Error('未找到MJ的设置信息,请检查');
} }
// 获取API的配置信息 // 获取API的配置信息
let apiSettings = this.GetAPIMjSetting(null) let apiSettings = this.GetAPIMjSetting(null)
@@ -588,7 +607,7 @@ export class MJSettingService extends BaseSoftWareService {
let remoteSettings = this.GetRemoteMJSettings(null) let remoteSettings = this.GetRemoteMJSettings(null)
// 获取浏览器模式的配置信息 // 获取浏览器模式的配置信息
let browserSettings = this.GetBrowserMJSetting(null) let browserSettings = this.GetBrowserMJSetting(null)
let mjSetting = mjSettings.data[0] let mjSetting = mjSettings
mjSetting.apiSetting = apiSettings.data.length > 0 ? apiSettings.data[0] : null mjSetting.apiSetting = apiSettings.data.length > 0 ? apiSettings.data[0] : null
mjSetting.remoteSetting = remoteSettings.data.length > 0 ? remoteSettings.data[0] : null mjSetting.remoteSetting = remoteSettings.data.length > 0 ? remoteSettings.data[0] : null
mjSetting.browserSetting = browserSettings.data.length > 0 ? browserSettings.data[0] : null mjSetting.browserSetting = browserSettings.data.length > 0 ? browserSettings.data[0] : null
@@ -0,0 +1,79 @@
import Realm from 'realm'
import { isEmpty, cloneDeep } from 'lodash'
import { OptionType } from '@/define/enum/option'
import { BaseSoftWareService } from './softwareBasic'
import { OptionModel } from '@/model/option/option'
export class OptionRealmService extends BaseSoftWareService {
static instance: OptionRealmService | null = null
declare realm: Realm
private constructor() {
super()
}
/**
* 获取当前实例对象,为空则创建一个新的
* @returns
*/
public static async getInstance() {
if (OptionRealmService.instance === null) {
OptionRealmService.instance = new OptionRealmService()
await super.getInstance()
}
await OptionRealmService.instance.open()
return OptionRealmService.instance
}
/**
* 获取指定的Option,通过key,不存在返回null
* @param key
* @returns
*/
public GetOptionByKey(key: string): OptionModel.OptionItem | null {
if (isEmpty(key)) {
return null
}
let res = this.realm.objects('Options').filtered(`key = "${key}"`);
if (res.length > 0) {
let resData = Array.from(res).map((item) => {
let resObj = {
...item
}
return cloneDeep(resObj)
})
return resData[0] as OptionModel.OptionItem
} else {
return null;
}
}
/**
* 修改指定的Option,通过key,不存在则创建
* @param key
* @param value
*/
public ModifyOptionByKey(key: string, value: string, type: OptionType = OptionType.STRING) {
if (isEmpty(key)) {
return false
}
let option = this.realm.objectForPrimaryKey('Options', key);
if (option) {
this.realm.write(() => {
option.value = value;
option.type = type;
})
} else {
this.realm.write(() => {
this.realm.create('Options', {
key: key,
value: value,
type: type
})
})
}
return true
}
}
@@ -13,6 +13,7 @@ import {
} from '../../model/SoftWare/mjSetting' } from '../../model/SoftWare/mjSetting'
import { MJImageType, MJRobotType } from '../../../enum/mjEnum' import { MJImageType, MJRobotType } from '../../../enum/mjEnum'
import { PresetModel } from '../../model/SoftWare/preset' import { PresetModel } from '../../model/SoftWare/preset'
import { OptionsModel } from '../../model/SoftWare/options'
const { v4: uuidv4 } = require('uuid') const { v4: uuidv4 } = require('uuid')
let dbPath = path.resolve(define.db_path, 'software.realm') let dbPath = path.resolve(define.db_path, 'software.realm')
@@ -159,6 +160,24 @@ const migration = (oldRealm: Realm, newRealm: Realm) => {
if (oldRealm.schemaVersion < 22) { if (oldRealm.schemaVersion < 22) {
} }
if (oldRealm.schemaVersion < 23) {
newRealm.write(() => {
const newSoftwares = newRealm.objects('RemoteMJ')
for (let software of newSoftwares) {
software.blockMessage = ''
}
})
}
if (oldRealm.schemaVersion < 25) {
}
if (oldRealm.schemaVersion < 26) {
newRealm.write(() => {
const newSoftwares = newRealm.objects('RemoteMJ')
for (let software of newSoftwares) {
software.type = "remote" // 默认都是启用的;
}
})
}
} }
export class BaseSoftWareService extends BaseService { export class BaseSoftWareService extends BaseService {
@@ -195,10 +214,11 @@ export class BaseSoftWareService extends BaseService {
RemoteMJModel, RemoteMJModel,
APIMjModel, APIMjModel,
MjSettingModel, MjSettingModel,
PresetModel PresetModel,
OptionsModel
], ],
path: dbPath, path: dbPath,
schemaVersion: 23, // 当前版本号 schemaVersion: 26, // 当前版本号
migration: migration migration: migration
} }
// 判断当前全局是不是又当前这个 // 判断当前全局是不是又当前这个
-152
View File
@@ -1,152 +0,0 @@
const path = require('path')
const { app } = require('electron')
let define = {}
if (!app.isPackaged) {
define = {
discordScript: path.join(__dirname, '../../src/main/discord/discordScript.js'),
zhanwei_image: path.join(__dirname, '../../resources/image/zhanwei.png'),
config_path: path.join(__dirname, '../../resources/config/global_setting.json'),
clip_setting: path.join(__dirname, '../../resources/config/clip_setting.json'),
sd_setting: path.join(__dirname, '../../resources/config/sd_config.json'),
dynamic_setting: path.join(__dirname, '../../resources/config/dynamic_setting.json'),
tag_setting: path.join(__dirname, '../../resources/config/tag_setting.json'),
img_base: path.join(__dirname, '../../resources/config/img_base.json'),
video_config: path.join(__dirname, '../../resources/config/video_config.json'),
system_config: path.join(__dirname, '../../resources/config/system_config.json'),
scripts_path: path.join(__dirname, '../../resources/scripts'),
db_path: path.join(__dirname, '../../resources/scripts/db'),
project_path: path.join(__dirname, '../../project'),
tts_path: path.join(__dirname, '../../tts'),
logger_path: path.join(__dirname, '../../resources/logger'),
package_path: path.join(__dirname, '../../resources/package'),
image_path: path.join(__dirname, '../../resources/image'),
temp_sd_image: path.join(__dirname, '../../resources/image/TempSDImage'),
draft_temp_path: path.join(__dirname, '../../resources/tmp/temp.zip'),
init_config_path: path.join(__dirname, '../../resources/tmp/config'),
clip_speed_temp_path: path.join(__dirname, '../../resources/tmp/Clip/speeds_tmp.json'),
add_canvases_temp_path: path.join(__dirname, '../../resources/tmp/Clip/canvases_tmp.json'),
add_sound_channel_mappings_temp_path: path.join(
__dirname,
'../../resources/tmp/Clip/sound_channel_mappings_tmp.json'
),
add_vocal_separations_temp_path: path.join(
__dirname,
'../../resources/tmp/Clip/vocal_separations_tmp.json'
),
add_material_video_temp_path: path.join(
__dirname,
'../../resources/tmp/Clip/videoMaterialTemp.json'
),
add_tracks_segments_temp_path: path.join(
__dirname,
'../../resources/tmp/Clip/tracks_segments_tmp.json'
),
add_tracks_type_temp_path: path.join(
__dirname,
'../../resources/tmp/Clip/tracks_type_tmp.json'
),
add_material_animations_temp_path: path.join(
__dirname,
'../../resources/tmp/Clip/material_animations_tmp.json'
),
add_material_text_temp_path: path.join(
__dirname,
'../../resources/tmp/Clip/material_text_temp.json'
),
add_track_text_segments_temp_path: path.join(
__dirname,
'../../resources/tmp/Clip/track_text_segments_temp.json'
),
add_materials_beats_tmp_path: path.join(
__dirname,
'../../resources/tmp/Clip/materials_beats_tmp.json'
),
add_materials_audios_tmp_path: path.join(
__dirname,
'../../resources/tmp/Clip/materials_audios_tmp.json'
),
add_tracks_audio_segments_tmp_path: path.join(
__dirname,
'../../resources/tmp/Clip/tracks_audio_segments_tmp.json'
),
add_keyframe_tmp_path: path.join(__dirname, '../../resources/tmp/Clip/keyframe_tmp.json')
}
} else {
define = {
zhanwei_image: path.join(__dirname, '../../../resources/image/zhanwei.png'),
config_path: path.join(__dirname, '../../../resources/config/global_setting.json'),
clip_setting: path.join(__dirname, '../../../resources/config/clip_setting.json'),
sd_setting: path.join(__dirname, '../../../resources/config/sd_config.json'),
dynamic_setting: path.join(__dirname, '../../../resources/config/dynamic_setting.json'),
tag_setting: path.join(__dirname, '../../../resources/config/tag_setting.json'),
video_config: path.join(__dirname, '../../../resources/config/video_config.json'),
system_config: path.join(__dirname, '../../../resources/config/system_config.json'),
img_base: path.join(__dirname, '../../../resources/config/img_base.json'),
scripts_path: path.join(__dirname, '../../../resources/scripts'),
db_path: path.join(__dirname, '../../../resources/scripts/db'),
project_path: path.join(__dirname, '../../../project'),
tts_path: path.join(__dirname, '../../../tts'),
logger_path: path.join(__dirname, '../../../resources/logger'),
package_path: path.join(__dirname, '../../../resources/package'),
discordScript: path.join(__dirname, '../../../resources/scripts/discordScript.js'),
image_path: path.join(__dirname, '../../../resources/image'),
temp_sd_image: path.join(__dirname, '../../../resources/image/TempSDImage'),
draft_temp_path: path.join(__dirname, '../../../resources/tmp/temp.zip'),
init_config_path: path.join(__dirname, '../../../resources/tmp/config'),
clip_speed_temp_path: path.join(__dirname, '../../../resources/tmp/Clip/speeds_tmp.json'),
add_canvases_temp_path: path.join(__dirname, '../../../resources/tmp/Clip/canvases_tmp.json'),
add_sound_channel_mappings_temp_path: path.join(
__dirname,
'../../../resources/tmp/Clip/sound_channel_mappings_tmp.json'
),
add_vocal_separations_temp_path: path.join(
__dirname,
'../../../resources/tmp/Clip/vocal_separations_tmp.json'
),
add_material_video_temp_path: path.join(
__dirname,
'../../../resources/tmp/Clip/videoMaterialTemp.json'
),
add_tracks_segments_temp_path: path.join(
__dirname,
'../../../resources/tmp/Clip/tracks_segments_tmp.json'
),
add_tracks_type_temp_path: path.join(
__dirname,
'../../../resources/tmp/Clip/tracks_type_tmp.json'
),
add_material_animations_temp_path: path.join(
__dirname,
'../../../resources/tmp/Clip/material_animations_tmp.json'
),
add_material_text_temp_path: path.join(
__dirname,
'../../../resources/tmp/Clip/material_text_temp.json'
),
add_track_text_segments_temp_path: path.join(
__dirname,
'../../../resources/tmp/Clip/track_text_segments_temp.json'
),
add_materials_beats_tmp_path: path.join(
__dirname,
'../../../resources/tmp/Clip/materials_beats_tmp.json'
),
add_materials_audios_tmp_path: path.join(
__dirname,
'../../../resources/tmp/Clip/materials_audios_tmp.json'
),
add_tracks_audio_segments_tmp_path: path.join(
__dirname,
'../../../resources/tmp/Clip/tracks_audio_segments_tmp.json'
),
add_keyframe_tmp_path: path.join(__dirname, '../../../resources/tmp/Clip/keyframe_tmp.json')
}
}
define['remotemj_api'] = 'https://api.laitool.net/'
define['serverUrl'] = 'http://lapi.laitool.cn'
// define['serverUrl'] = 'http://localhost:1578'
define['hkServerUrl'] = 'https://laitool.net/'
define['bakServerUrl'] = 'https://laitool.net/'
define['API'] = 'f85d39ed5a40fd09966f13f12b6cf0f0'
export { define }
+178
View File
@@ -0,0 +1,178 @@
// 检测当前环境
const isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined'
// 浏览器环境的路径处理函数
function joinPath(...segments: string[]): string {
return segments.join('/').replace(/\/+/g, '/');
}
// 统一的路径处理函数
const pathJoin = isBrowser ? joinPath : require('path').join;
// 定义类型接口
interface DefineConfig {
// 脚本和可执行文件路径
discordScript: string | null;
// 图片资源路径
zhanwei_image: string;
image_path: string;
temp_sd_image: string;
// 配置文件路径
config_path: string | null;
clip_setting: string | null;
sd_setting: string | null;
dynamic_setting: string | null;
tag_setting: string | null;
img_base: string | null;
video_config: string | null;
system_config: string | null;
// 目录路径
scripts_path: string | null;
db_path: string | null;
project_path: string | null;
tts_path: string | null;
logger_path: string | null;
package_path: string | null;
// 临时文件路径
draft_temp_path: string | null;
init_config_path: string | null;
// Clip 相关临时文件路径
clip_speed_temp_path: string | null;
add_canvases_temp_path: string | null;
add_sound_channel_mappings_temp_path: string | null;
add_vocal_separations_temp_path: string | null;
add_material_video_temp_path: string | null;
add_tracks_segments_temp_path: string | null;
add_tracks_type_temp_path: string | null;
add_material_animations_temp_path: string | null;
add_material_text_temp_path: string | null;
add_track_text_segments_temp_path: string | null;
add_materials_beats_tmp_path: string | null;
add_materials_audios_tmp_path: string | null;
add_tracks_audio_segments_tmp_path: string | null;
add_keyframe_tmp_path: string | null;
// API 配置
remotemj_api: string;
serverUrl: string;
hkServerUrl: string;
bakServerUrl: string;
API: string;
lms: string;
}
let define: DefineConfig = {} as DefineConfig;
if (!isBrowser) {
const path = require('path')
const { app } = require('electron')
// 根据打包状态确定基础路径
const basePath = !app.isPackaged ?
path.join(__dirname, '../../') :
path.join(__dirname, '../../../');
define = {
discordScript: !app.isPackaged ? pathJoin(__dirname, '../../src/main/discord/discordScript.js') : pathJoin(basePath, 'resources/scripts/discordScript.js'),
zhanwei_image: pathJoin(basePath, 'resources/image/zhanwei.png'),
config_path: pathJoin(basePath, 'resources/config/global_setting.json'),
clip_setting: pathJoin(basePath, 'resources/config/clip_setting.json'),
sd_setting: pathJoin(basePath, 'resources/config/sd_config.json'),
dynamic_setting: pathJoin(basePath, 'resources/config/dynamic_setting.json'),
tag_setting: pathJoin(basePath, 'resources/config/tag_setting.json'),
img_base: pathJoin(basePath, 'resources/config/img_base.json'),
video_config: pathJoin(basePath, 'resources/config/video_config.json'),
system_config: pathJoin(basePath, 'resources/config/system_config.json'),
scripts_path: pathJoin(basePath, 'resources/scripts'),
db_path: pathJoin(basePath, 'resources/scripts/db'),
project_path: pathJoin(basePath, 'project'),
tts_path: pathJoin(basePath, 'tts'),
logger_path: pathJoin(basePath, 'resources/logger'),
package_path: pathJoin(basePath, 'resources/package'),
image_path: pathJoin(basePath, 'resources/image'),
temp_sd_image: pathJoin(basePath, 'resources/image/TempSDImage'),
draft_temp_path: pathJoin(basePath, 'resources/tmp/temp.zip'),
init_config_path: pathJoin(basePath, 'resources/tmp/config'),
clip_speed_temp_path: pathJoin(basePath, 'resources/tmp/Clip/speeds_tmp.json'),
add_canvases_temp_path: pathJoin(basePath, 'resources/tmp/Clip/canvases_tmp.json'),
add_sound_channel_mappings_temp_path: pathJoin(basePath, 'resources/tmp/Clip/sound_channel_mappings_tmp.json'),
add_vocal_separations_temp_path: pathJoin(basePath, 'resources/tmp/Clip/vocal_separations_tmp.json'),
add_material_video_temp_path: pathJoin(basePath, 'resources/tmp/Clip/videoMaterialTemp.json'),
add_tracks_segments_temp_path: pathJoin(basePath, 'resources/tmp/Clip/tracks_segments_tmp.json'),
add_tracks_type_temp_path: pathJoin(basePath, 'resources/tmp/Clip/tracks_type_tmp.json'),
add_material_animations_temp_path: pathJoin(basePath, 'resources/tmp/Clip/material_animations_tmp.json'),
add_material_text_temp_path: pathJoin(basePath, 'resources/tmp/Clip/material_text_temp.json'),
add_track_text_segments_temp_path: pathJoin(basePath, 'resources/tmp/Clip/track_text_segments_temp.json'),
add_materials_beats_tmp_path: pathJoin(basePath, 'resources/tmp/Clip/materials_beats_tmp.json'),
add_materials_audios_tmp_path: pathJoin(basePath, 'resources/tmp/Clip/materials_audios_tmp.json'),
add_tracks_audio_segments_tmp_path: pathJoin(basePath, 'resources/tmp/Clip/tracks_audio_segments_tmp.json'),
add_keyframe_tmp_path: pathJoin(basePath, 'resources/tmp/Clip/keyframe_tmp.json'),
// API 配置
remotemj_api: 'https://api.laitool.net/',
serverUrl: 'http://lms.laitool.cn',
hkServerUrl: 'https://laitool.net/',
bakServerUrl: 'https://laitool.net/',
API: 'f85d39ed5a40fd09966f13f12b6cf0f0',
lms: 'https://lms.laitool.cn'
};
} else {
// 浏览器环境
const basePath = './';
define = {
discordScript: null,
zhanwei_image: pathJoin(basePath, 'resources/image/zhanwei.png'),
config_path: null,
clip_setting: null,
sd_setting: null,
dynamic_setting: null,
tag_setting: null,
img_base: null,
video_config: null,
system_config: null,
scripts_path: null,
db_path: null,
project_path: null,
tts_path: null,
logger_path: null,
package_path: null,
image_path: pathJoin(basePath, 'resources/image'),
temp_sd_image: pathJoin(basePath, 'resources/image/TempSDImage'),
draft_temp_path: null,
init_config_path: null,
clip_speed_temp_path: null,
add_canvases_temp_path: null,
add_sound_channel_mappings_temp_path: null,
add_vocal_separations_temp_path: null,
add_material_video_temp_path: null,
add_tracks_segments_temp_path: null,
add_tracks_type_temp_path: null,
add_material_animations_temp_path: null,
add_material_text_temp_path: null,
add_track_text_segments_temp_path: null,
add_materials_beats_tmp_path: null,
add_materials_audios_tmp_path: null,
add_tracks_audio_segments_tmp_path: null,
add_keyframe_tmp_path: null,
// API 配置
remotemj_api: 'https://api.laitool.net/',
serverUrl: 'http://lms.laitool.cn',
hkServerUrl: 'https://laitool.net/',
bakServerUrl: 'https://laitool.net/',
API: 'f85d39ed5a40fd09966f13f12b6cf0f0',
lms: 'https://lms.laitool.cn'
};
}
// 浏览器环境下挂载到window
if (isBrowser && typeof window !== 'undefined') {
(window as any).define = define;
}
// 导出类型和实例
export type { DefineConfig };
export { define };
@@ -0,0 +1,12 @@
const AXIOS = {
/** http的get请求 */
HTTP_GET: 'http:get',
/** http的post请求 */
HTTP_POST: 'http:post',
/** http的put请求 */
HTTP_PUT: 'http:put',
/** http的delete请求 */
HTTP_DELETE: 'http:delete'
}
export default AXIOS
@@ -0,0 +1,214 @@
const BOOK = {
MAIN_DATA_RETURN: 'MAIN_DATA_RETURN', // 监听任务返回
REPLACE_VIDEO_CURRENT_FRAME: 'REPLACE_VIDEO_CURRENT_FRAME',
GET_BOOK_TYPE: 'GET_BOOK_TYPE',
ADD_OR_MODIFY_BOOK: 'ADD_OR_MODIFY_BOOK',
GET_BOOK_DATA: 'GET_BOOK_DATA',
GET_FRAME_DATA: 'GET_FRAME_DATA',
GET_BOOK_TASK_DATA: 'GET_BOOK_TASK_DATA',
AUTO_ACTION: 'AUTO_ACTION',
SAVE_BOOK_SUBTITLE_POSITION: 'SAVE_BOOK_SUBTITLE_POSITION',
OPEN_BOOK_SUBTITLE_POSITION_SCREENSHOT: 'OPEN_BOOK_SUBTITLE_POSITION_SCREENSHOT',
GET_CURRENT_FRAME_TEXT: 'GET_CURRENT_FRAME_TEXT',
GET_VIDEO_FRAME_TEXT: 'GET_VIDEO_FRAME_TEXT',
GET_BOOK_TASK_DETAIL: 'GET_BOOK_TASK_DETAIL',
REVERSE_PROMPT_TO_GPT_PROMPT: 'REVERSE_PROMPT_TO_GPT_PROMPT',
SINGLE_REVERSE_TO_GPT_PROMPT: 'SINGLE_REVERSE_TO_GPT_PROMPT',
SAVE_IMAGE_STYLE: 'SAVE_IMAGE_STYLE',
IMAGE_LOCK_OPERATION: "IMAGE_LOCK_OPERATION",
DOWNLOAD_IMAGE_AND_SPLIT: "DOWNLOAD_IMAGE_AND_SPLIT",
ONE_TO_FOUR_BOOK_TASK: "ONE_TO_FOUR_BOOK_TASK",
RESET_BOOK_TASK: "RESET_BOOK_TASK",
DELETE_BOOK_TASK: "DELETE_BOOK_TASK",
GENERATE_IMAGE_ALL: "GENERATE_IMAGE_ALL",
CHECK_IMAGE_FILE_SIZE: "CHECK_IMAGE_FILE_SIZE",
HD_IMAGE: "HD_IMAGE",
USE_BOOK_VIDEO_DATA_TO_BOOK_TASK: "USE_BOOK_VIDEO_DATA_TO_BOOK_TASK",
ADD_JIANYING_DRAFT: "ADD_JIANYING_DRAFT",
EXPORT_COPYWRITING: "EXPORT_COPYWRITING",
IMPORT_COPYWRITING: 'IMPORT_COPYWRITING',
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',
ADD_NEW_BOOK_TASK: "ADD_NEW_BOOK_TASK",
REPLACE_BOOK_DATA: "REPLACE_BOOK_DATA",
SAVE_COPYWRITING: 'SAVE_COPYWRITING',
//#region 通用
/** 重置小说批次详细信息的数据 */
RESET_BOOK_TASK_DETAIL_DATA: "RESET_BOOK_TASK_DETAIL_DATA",
//#endregion
//#region 分镜
/** 剪映抽帧,并判断是不是切割视频 */
JIANYING_FRAME: "JIANYING_FRAME",
//#endregion
//#region 提示词
/**
* 原创推理提示词
*/
ORIGINAL_GPT_PROMPT: "ORIGINAL_GPT_PROMPT",
/** * 原创推理提示词返回 */
ORIGINAL_GPT_PROMPT_RETURN: "ORIGINAL_GPT_PROMPT_RETURN",
/** * 导入提示词,通用 */
IMPORT_GPT_PROMPT: "IMPORT_GPT_PROMPT",
/** 移除不想要的提示词 */
REMOVE_BAD_PROMPT: "REMOVE_BAD_PROMPT",
//#endregion
//#region 生图返回相关
/**
* MJ生图返回信息
*/
MJ_IMAGE_GENERATE_RETURN: 'MJ_IMAGE_GENERATE_RETURN',
/**
* SD生图返回信息
*/
SD_IMAGE_GENERATE_RETURN: 'SD_IMAGE_GENERATE_RETURN',
/**
* ComfyUI生图返回信息
*/
ComfyUI_IMAGE_GENERATE_RETURN: 'ComfyUI_IMAGE_GENERATE_RETURN',
/**
* D3 出图返回信息
*/
D3_IMAGE_GENERATE_RETURN: 'D3_IMAGE_GENERATE_RETURN',
/**
* flux forge 生图返回信息
*/
FLUX_FORGE_IMAGE_GENERATE_RETURN: "FLUX_FORGE_IMAGE_GENERATE_RETURN",
/**
* flux api 生图返回信息
*/
FLUX_API_IMAGE_GENERATE_RETURN: "FLUX_API_IMAGE_GENERATE_RETURN",
//#endregion
//#region 图片相关
/**
* 获取MJ的消息ID,下载图片并分割
*/
GET_IMAGE_URL_AND_DOWNLOAD: "GET_IMAGE_URL_AND_DOWNLOAD",
/** 添加一键生图后台任务 */
GENERATE_ALL_TASK_IMAGE: "GENERATE_ALL_TASK_IMAGE",
/** 上传图片到小说中,并修改小说信息 */
UPLOAD_IMAGE_TO_BOOK_AND_UPDATE_MESSAGE: "UPLOAD_IMAGE_TO_BOOK_AND_UPDATE_MESSAGE",
/** 上传图片到缓存 */
UPLOAD_IMAGE_TO_CACHE: "UPLOAD_IMAGE_TO_CACHE",
/** 获取当前小说中的所有的批次中的缓存图片 */
GET_ALL_BOOK_TASK_IMAGE_CACHE: "GET_ALL_BOOK_TASK_IMAGE_CACHE",
/** 保存缓存区的屠图片到小说主图或者是选图区 */
SAVE_CACHE_IMAGE_TO_DATA: "SAVE_CACHE_IMAGE_TO_DATA",
/** 删除缓存区中的图片 */
DELETE_CACHE_IMAGE: "DELETE_CACHE_IMAGE",
/** 移动指定图片链接到主图 */
MOVE_IMAGE_TO_MAIN_IMAGE: "MOVE_IMAGE_TO_MAIN_IMAGE",
//#endregion
COMPUTE_STORYBOARD: 'COMPUTE_STORYBOARD',
GET_FRAME: 'GET_FRAME',
FRAMING: 'FRAMING',
//#region 字幕相关
/**
* 获取copywriting
*/
GET_COPYWRITING: 'GET_COPYWRITING',
/**
* 获取copywriting的返回信息
*/
GET_COPYWRITING_RETURN: 'GET_COPYWRITING_RETURN',
//#endregion
REMOVE_WATERMARK: 'REMOVE_WATERMARK',
REMOVE_WATERMARK_RETURN: 'REMOVE_WATERMARK_RETURN',
SPLI_TAUDIO: 'SPLI_TAUDIO',
SPLI_TAUDIO_RETURN: 'SPLI_TAUDIO_RETURN',
//#region 反推相关
/**
* 添加反推任务
*/
ADD_REVERSE_PROMPT: 'ADD_REVERSE_PROMPT',
/**
* 反推任务返回信息
*/
REVERSE_PROMPT_RETURN: 'REVERSE_PROMPT_RETURN',
//#endregion
//#region 翻译相关
/**
* 反推翻译返回信息
*/
REVERSE_PROMPT_TRANSLATE_RETURN: 'REVERSE_PROMPT_TRANSLATE_RETURN',
//#endregion
//#region 合成视频相关
/** 添加合成视频任务 */
ADD_GENERATE_VIDEO_TASK: "ADD_GENERATE_VIDEO_TASK",
/** 生成视频返回 */
GENERATE_VIDEO_RETURN: "GENERATE_VIDEO_RETURN",
//#endregion
//#region 图生视频相关
/** 初始化视频消息 */
INIT_VIDEO_MESSAGE: "INIT_VIDEO_MESSAGE",
/** 修改小说分镜的VideoMessage */
UPDATE_BOOK_TASK_DETAIL_VIDEO_MESSAGE: "UPDATE_BOOK_TASK_DETAIL_VIDEO_MESSAGE",
/** 重新下载视频任务 */
RELOAD_VIDEO_TASK_INFO: "RELOAD_VIDEO_TASK_INFO",
/** Runway图转视频返回前端数据任务 */
RUNWAY_IMAGE_TO_VIDEO_RETURN: "RUNWAY_IMAGE_TO_VIDEO_RETURN",
/** MJ VIDEO 图转视频返回前端数据任务 */
MJ_VIDEO_TO_VIDEO_RETURN: "MJ_VIDEO_TO_VIDEO_RETURN",
/** 获取指定的条件的图转视频的数据,包含字批次 */
GET_VIDEO_BOOK_INFO_LIST: "GET_VIDEO_BOOK_INFO_LIST",
/** 获取小说图片和视频生成进度 */
GET_BOOK_IMAGE_AND_VIDEO_PROGRESS: "GET_BOOK_IMAGE_AND_VIDEO_PROGRESS"
//#endregion
}
export default BOOK;
@@ -0,0 +1,15 @@
const DB = {
UPDATE_BOOK_TASK_DATA: "UPDATE_BOOK_TASK_DATA",
UPDATE_BOOK_TASK_DETAIL_DATA: "UPDATE_BOOK_TASK_DETAIL_DATA",
UPDATE_BOOK_DATA: "UPDATE_BOOK_DATA",
UPDATE_SOFTWARE_SETTING: "UPDATE_SOFTWARE_SETTING",
//#region 小说分镜相关
/** 获取指定小说的分镜的某个属性数据 */
GET_BOOK_TASK_DETAIL_PROPERTY: "GET_BOOK_TASK_DETAIL_PROPERTY",
//#endregion
}
export default DB
+14 -181
View File
@@ -1,9 +1,23 @@
import { SYSTEM } from "./systemDefineString" import { SYSTEM } from "./systemDefineString"
import TASK from "./taskDefineString" import TASK from "./taskDefineString"
import TTS from "./ttsDefineString"
import SETTING from "./settingDefineString"
import BOOK from "./bookDefineString"
import WRITE from "./writeDefineString"
import DB from "./dbDefineString"
import OPTIONS from "./optionsDefineString"
import AXIOS from "./axiosDefineString"
export const DEFINE_STRING = { export const DEFINE_STRING = {
SYSTEM: SYSTEM, SYSTEM: SYSTEM,
AXIOS : AXIOS,
TASK: TASK, TASK: TASK,
TTS: TTS,
BOOK: BOOK,
SETTING: SETTING,
WRITE: WRITE,
DB: DB,
OPTIONS:OPTIONS,
SHOW_GLOBAL_MESSAGE: "SHOW_GLOBAL_MESSAGE", SHOW_GLOBAL_MESSAGE: "SHOW_GLOBAL_MESSAGE",
SHOW_GLOBAL_MAIN_NOTIFICATION: 'SHOW_GLOBAL_MAIN_NOTIFICATION', SHOW_GLOBAL_MAIN_NOTIFICATION: 'SHOW_GLOBAL_MAIN_NOTIFICATION',
OPEN_DEV_TOOLS_PASSWORD: 'OPEN_DEV_TOOLS_PASSWORD', OPEN_DEV_TOOLS_PASSWORD: 'OPEN_DEV_TOOLS_PASSWORD',
@@ -221,165 +235,6 @@ export const DEFINE_STRING = {
BATCH_PROCESS_IMAGE_RESULT: 'BATCH_PROCESS_IMAGE_RESULT', BATCH_PROCESS_IMAGE_RESULT: 'BATCH_PROCESS_IMAGE_RESULT',
PROCESS_IMAGE_WATERMASK_CHECK: "PROCESS_IMAGE_WATERMASK_CHECK" PROCESS_IMAGE_WATERMASK_CHECK: "PROCESS_IMAGE_WATERMASK_CHECK"
}, },
BOOK: {
MAIN_DATA_RETURN: 'MAIN_DATA_RETURN', // 监听任务返回
REPLACE_VIDEO_CURRENT_FRAME: 'REPLACE_VIDEO_CURRENT_FRAME',
GET_BOOK_TYPE: 'GET_BOOK_TYPE',
ADD_OR_MODIFY_BOOK: 'ADD_OR_MODIFY_BOOK',
GET_BOOK_DATA: 'GET_BOOK_DATA',
GET_FRAME_DATA: 'GET_FRAME_DATA',
GET_BOOK_TASK_DATA: 'GET_BOOK_TASK_DATA',
AUTO_ACTION: 'AUTO_ACTION',
SAVE_BOOK_SUBTITLE_POSITION: 'SAVE_BOOK_SUBTITLE_POSITION',
OPEN_BOOK_SUBTITLE_POSITION_SCREENSHOT: 'OPEN_BOOK_SUBTITLE_POSITION_SCREENSHOT',
GET_CURRENT_FRAME_TEXT: 'GET_CURRENT_FRAME_TEXT',
GET_VIDEO_FRAME_TEXT: 'GET_VIDEO_FRAME_TEXT',
GET_BOOK_TASK_DETAIL: 'GET_BOOK_TASK_DETAIL',
REVERSE_PROMPT_TO_GPT_PROMPT: 'REVERSE_PROMPT_TO_GPT_PROMPT',
SINGLE_REVERSE_TO_GPT_PROMPT: 'SINGLE_REVERSE_TO_GPT_PROMPT',
SAVE_IMAGE_STYLE: 'SAVE_IMAGE_STYLE',
IMAGE_LOCK_OPERATION: "IMAGE_LOCK_OPERATION",
DOWNLOAD_IMAGE_AND_SPLIT: "DOWNLOAD_IMAGE_AND_SPLIT",
ONE_TO_FOUR_BOOK_TASK: "ONE_TO_FOUR_BOOK_TASK",
RESET_BOOK_TASK: "RESET_BOOK_TASK",
DELETE_BOOK_TASK: "DELETE_BOOK_TASK",
GENERATE_IMAGE_ALL: "GENERATE_IMAGE_ALL",
CHECK_IMAGE_FILE_SIZE: "CHECK_IMAGE_FILE_SIZE",
HD_IMAGE: "HD_IMAGE",
USE_BOOK_VIDEO_DATA_TO_BOOK_TASK: "USE_BOOK_VIDEO_DATA_TO_BOOK_TASK",
ADD_JIANYING_DRAFT: "ADD_JIANYING_DRAFT",
EXPORT_COPYWRITING: "EXPORT_COPYWRITING",
IMPORT_COPYWRITING: 'IMPORT_COPYWRITING',
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',
ADD_NEW_BOOK_TASK: "ADD_NEW_BOOK_TASK",
REPLACE_BOOK_DATA: "REPLACE_BOOK_DATA",
SAVE_COPYWRITING: 'SAVE_COPYWRITING',
//#region 提示词
/**
* 原创推理提示词
*/
ORIGINAL_GPT_PROMPT: "ORIGINAL_GPT_PROMPT",
/**
* 原创推理提示词返回
*/
ORIGINAL_GPT_PROMPT_RETURN: "ORIGINAL_GPT_PROMPT_RETURN",
/**
* 导入提示词,通用
*/
IMPORT_GPT_PROMPT: "IMPORT_GPT_PROMPT",
//#endregion
//#region 生图返回相关
/**
* MJ生图返回信息
*/
MJ_IMAGE_GENERATE_RETURN: 'MJ_IMAGE_GENERATE_RETURN',
/**
* SD生图返回信息
*/
SD_IMAGE_GENERATE_RETURN: 'SD_IMAGE_GENERATE_RETURN',
/**
* D3 出图返回信息
*/
D3_IMAGE_GENERATE_RETURN: 'D3_IMAGE_GENERATE_RETURN',
/**
* flux forge 生图返回信息
*/
FLUX_FORGE_IMAGE_GENERATE_RETURN: "FLUX_FORGE_IMAGE_GENERATE_RETURN",
/**
* flux api 生图返回信息
*/
FLUX_API_IMAGE_GENERATE_RETURN: "FLUX_API_IMAGE_GENERATE_RETURN",
//#endregion
//#region 图片相关
/**
* 获取MJ的消息ID,下载图片并分割
*/
GET_IMAGE_URL_AND_DOWNLOAD: "GET_IMAGE_URL_AND_DOWNLOAD",
//#endregion
COMPUTE_STORYBOARD: 'COMPUTE_STORYBOARD',
GET_FRAME: 'GET_FRAME',
FRAMING: 'FRAMING',
//#region 字幕相关
/**
* 获取copywriting
*/
GET_COPYWRITING: 'GET_COPYWRITING',
/**
* 获取copywriting的返回信息
*/
GET_COPYWRITING_RETURN: 'GET_COPYWRITING_RETURN',
//#endregion
REMOVE_WATERMARK: 'REMOVE_WATERMARK',
REMOVE_WATERMARK_RETURN: 'REMOVE_WATERMARK_RETURN',
SPLI_TAUDIO: 'SPLI_TAUDIO',
SPLI_TAUDIO_RETURN: 'SPLI_TAUDIO_RETURN',
//#region 反推相关
/**
* 添加反推任务
*/
ADD_REVERSE_PROMPT: 'ADD_REVERSE_PROMPT',
/**
* 反推任务返回信息
*/
REVERSE_PROMPT_RETURN: 'REVERSE_PROMPT_RETURN',
//#endregion
//#region 翻译相关
/**
* 反推翻译返回信息
*/
REVERSE_PROMPT_TRANSLATE_RETURN: 'REVERSE_PROMPT_TRANSLATE_RETURN',
//#endregion
},
SETTING: {
GET_DATA_BY_TYPE_AND_PROPERTY: 'GET_DATA_BY_TYPE_AND_PROPERTY',
SAVE_DATA_BY_TYPE_AND_PROPERTY: 'SAVE_DATA_BY_TYPE_AND_PROPERTY',
DELETE_DATA_BY_TYPE_AND_PROPERTY: 'DELETE_DATA_BY_TYPE_AND_PROPERTY',
GET_SOFTWARE_SETTING: 'GET_SOFTWARE_SETTING',
SAVE_SOFT_WARE_SETTING: 'SAVE_SOFT_WARE_SETTING',
GET_COMPONENT_SIZE: 'GET_COMPONENT_SIZE',
GET_MJ_SETTING_TREE_DATA: 'GET_MJ_SETTING_TREE_DATA',
SAVE_MJ_SETTING_TREE_DATA: 'SAVE_MJ_SETTING_TREE_DATA',
MJ_REMOTE_ACCOUNT_SYNC: 'MJ_REMOTE_ACCOUNT_SYNC',
GET_MJ_SETTING: 'GET_MJ_SETTING',
UPDATE_MJ_SETTING: 'UPDATE_MJ_SETTING',
GET_REMOTE_MJ_SETTINGS: 'GET_REMOTE_MJ_SETTINGS',
ADD_REMOTE_MJ_SETTING: 'ADD_REMOTE_MJ_SETTING',
UPDATE_REMOTE_MJ_SETTING: 'UPDATE_REMOTE_MJ_SETTING',
DELETE_REMOTE_MJ_SETTING: 'DELETE_REMOTE_MJ_SETTING',
GET_WATER_MARK_SETTING: 'GET_WATER_MARK_SETTING',
SAVE_WATER_MARK_SETTING: 'SAVE_WATER_MARK_SETTING'
},
PROMPT: { PROMPT: {
GET_SORT_OPTIONS: 'GET_SORT_OPTIONS', GET_SORT_OPTIONS: 'GET_SORT_OPTIONS',
SAVE_PROMPT_SORT_DATA: 'SAVE_PROMPT_SORT_DATA', SAVE_PROMPT_SORT_DATA: 'SAVE_PROMPT_SORT_DATA',
@@ -398,27 +253,5 @@ export const DEFINE_STRING = {
* 获取场景的预设(只获取 label 和 id) * 获取场景的预设(只获取 label 和 id)
*/ */
GET_SCENE_PRESET: "GET_SCENE_PRESET" GET_SCENE_PRESET: "GET_SCENE_PRESET"
},
TTS: {
GET_TTS_CONFIG: 'GET_TTS_CONFIG',
GENERATE_AUDIO: 'GENERATE_AUDIO',
SAVE_TTS_CONFIG: 'SAVE_TTS_CONFIG',
GENERATE_SRT: "GENERATE_SRT",
GET_TTS_HISTORY_DATA: 'GET_TTS_HISTORY_DATA',
DELETE_TTS_HISTORY: 'DELETE_TTS_HISTORY',
},
WRITE: {
GET_WRITE_CONFIG: 'GET_WRITE_CONFIG',
SAVE_WRITE_CONFIG: 'SAVE_WRITE_CONFIG',
ACTION_START: 'ACTION_START',
GET_SUBTITLE_SETTING: "GET_SUBTITLE_SETTING",
RESET_SUBTITLE_SETTING: "RESET_SUBTITLE_SETTING",
SAVE_SUBTITLE_SETTING: "SAVE_SUBTITLE_SETTING",
},
DB: {
UPDATE_BOOK_TASK_DATA: "UPDATE_BOOK_TASK_DATA",
UPDATE_BOOK_TASK_DETAIL_DATA: "UPDATE_BOOK_TASK_DETAIL_DATA",
UPDATE_BOOK_DATA: "UPDATE_BOOK_DATA",
UPDATE_SOFTWARE_SETTING: "UPDATE_SOFTWARE_SETTING"
} }
} }
@@ -0,0 +1,19 @@
const OPTIONS = {
/**
* 获取指定的Option,通过key,不存在返回null
*/
GET_OPTION_BY_KEY: 'GET_OPTION_BY_KEY',
/**
* 修改指定的Option,通过key,不存在则创建
*/
MODIFY_OPTION_BY_KEY: 'MODIFY_OPTION_BY_KEY',
/**
* 同步文案处理中的AI设置旧数据到新的数据表中
*/
INIT_COPY_WRITING_AI_SETTING: "INIT_COPY_WRITING_AI_SETTING"
}
export default OPTIONS
@@ -0,0 +1,23 @@
const SETTING = {
GET_DATA_BY_TYPE_AND_PROPERTY: 'GET_DATA_BY_TYPE_AND_PROPERTY',
SAVE_DATA_BY_TYPE_AND_PROPERTY: 'SAVE_DATA_BY_TYPE_AND_PROPERTY',
DELETE_DATA_BY_TYPE_AND_PROPERTY: 'DELETE_DATA_BY_TYPE_AND_PROPERTY',
GET_SOFTWARE_SETTING: 'GET_SOFTWARE_SETTING',
SAVE_SOFT_WARE_SETTING: 'SAVE_SOFT_WARE_SETTING',
GET_COMPONENT_SIZE: 'GET_COMPONENT_SIZE',
GET_MJ_SETTING_TREE_DATA: 'GET_MJ_SETTING_TREE_DATA',
SAVE_MJ_SETTING_TREE_DATA: 'SAVE_MJ_SETTING_TREE_DATA',
MJ_REMOTE_ACCOUNT_SYNC: 'MJ_REMOTE_ACCOUNT_SYNC',
GET_MJ_SETTING: 'GET_MJ_SETTING',
UPDATE_MJ_SETTING: 'UPDATE_MJ_SETTING',
GET_REMOTE_MJ_SETTINGS: 'GET_REMOTE_MJ_SETTINGS',
ADD_REMOTE_MJ_SETTING: 'ADD_REMOTE_MJ_SETTING',
UPDATE_REMOTE_MJ_SETTING: 'UPDATE_REMOTE_MJ_SETTING',
DELETE_REMOTE_MJ_SETTING: 'DELETE_REMOTE_MJ_SETTING',
GET_WATER_MARK_SETTING: 'GET_WATER_MARK_SETTING',
SAVE_WATER_MARK_SETTING: 'SAVE_WATER_MARK_SETTING',
/** 获取远程代理服务器的账号信息 */
GET_REMOTE_MJ_SETTINGS_FROM_SERVICE: "GET_REMOTE_MJ_SETTINGS_FROM_SERVICE"
}
export default SETTING
+12 -1
View File
@@ -8,5 +8,16 @@ export const SYSTEM = {
/** 获取机器码 */ /** 获取机器码 */
GET_MACHINE_ID: "GET_MACHINE_ID", GET_MACHINE_ID: "GET_MACHINE_ID",
/** 检查机器码状态 */ /** 检查机器码状态 */
CHECK_MACHINE_STATUS : "CHECK_MACHINE_STATUS" CHECK_MACHINE_STATUS: "CHECK_MACHINE_STATUS",
/** 获取软件版本信息,更新信息,首页内容,公告等 */
GET_REMOTE_SYSTEM_INFORMATION: 'GET_REMOTE_SYSTEM_INFORMATION',
/** 选择单个指定文件后缀的文件 */
SELECT_SINGLE_FILE: "SELECT_SINGLE_FILE",
/** 选择多个指定文件后缀的文件 */
SELECT_MULTIPLE_FILE: "SELECT_MULTIPLE_FILE",
/** 选择文件夹或指定后缀的文件 */
SELECT_FOLDER_OR_FILE: "SELECT_FOLDER_OR_FILE",
} }
@@ -9,6 +9,12 @@ const TASK = {
/** 获取等待中的任务 */ /** 获取等待中的任务 */
GET_ALL_STATUS_TASK_COUNT: "GET_ALL_STATUS_TASK_COUNT", GET_ALL_STATUS_TASK_COUNT: "GET_ALL_STATUS_TASK_COUNT",
/** 获取后台任务的集合,分页 */
GET_BACK_TASK_COLLECTION: "GET_BACK_TASK_COLLECTION",
/** 更新后台任务的状态 */
UPDATE_TASK_STATUS: "UPDATE_TASK_STATUS",
}; };
export default TASK; export default TASK;
@@ -0,0 +1,19 @@
/** TTS 相关的消息任务 */
const TTS = {
/** 获取TTS配置 */
GET_TTS_CONFIG: 'GET_TTS_CONFIG',
/** 生成配音 */
GENERATE_AUDIO: 'GENERATE_AUDIO',
/** 保存TTS配置 */
SAVE_TTS_CONFIG: 'SAVE_TTS_CONFIG',
/** 生成SRT文件 */
GENERATE_SRT: "GENERATE_SRT",
/** 获取TTS历史数据 */
GET_TTS_HISTORY_DATA: 'GET_TTS_HISTORY_DATA',
/** 删除TTS配音历史记录 */
DELETE_TTS_HISTORY: 'DELETE_TTS_HISTORY',
/** 获取TTS的Options */
GET_TTS_OPTIONS: 'GET_TTS_OPTIONS',
}
export default TTS;
@@ -0,0 +1,23 @@
const WRITE = {
GET_WRITE_CONFIG: 'GET_WRITE_CONFIG',
SAVE_WRITE_CONFIG: 'SAVE_WRITE_CONFIG',
GET_SUBTITLE_SETTING: "GET_SUBTITLE_SETTING",
RESET_SUBTITLE_SETTING: "RESET_SUBTITLE_SETTING",
SAVE_SUBTITLE_SETTING: "SAVE_SUBTITLE_SETTING",
/** 生成洗稿后文案 */
GENERATE_AFTER_GPT_WORD: "GENERATE_AFTER_GPT_WORD",
/** 生成洗稿后文案返回数据,前端接收 */
GENERATE_AFTER_GPT_WORD_RESPONSE: "GENERATE_AFTER_GPT_WORD_RESPONSE",
//#region 文案改写
/**
* AI处理文案
*/
COPY_WRITING_AI_GENERATION: "COPY_WRITING_AI_GENERATION",
//#endregion
}
export default WRITE
+385 -3
View File
@@ -1,3 +1,5 @@
import { TaskModal } from "@/model/task";
export enum BookType { export enum BookType {
// 原创 // 原创
ORIGINAL = 'original', ORIGINAL = 'original',
@@ -15,6 +17,8 @@ export enum BookImageCategory {
MJ = 'mj', MJ = 'mj',
// SD // SD
SD = 'sd', SD = 'sd',
// ComfyUI
ComfyUI = "comfyui",
// D3 // D3
D3 = 'd3', D3 = 'd3',
// FLUX API // FLUX API
@@ -73,6 +77,8 @@ export enum BookBackTaskType {
MJ_IMAGE = 'mj_image', MJ_IMAGE = 'mj_image',
// SD 生成图片 // SD 生成图片
SD_IMAGE = 'sd_image', SD_IMAGE = 'sd_image',
// ComfyUI 生成图片
ComfyUI_IMAGE = 'comfyui_image',
// flux forge 生成图片 // flux forge 生成图片
FLUX_FORGE_IMAGE = 'flux_forge_image', FLUX_FORGE_IMAGE = 'flux_forge_image',
// flux api 生成图片 // flux api 生成图片
@@ -86,7 +92,19 @@ export enum BookBackTaskType {
// 推理 // 推理
INFERENCE = 'inference', INFERENCE = 'inference',
// 翻译 // 翻译
TRANSLATE = 'translate' TRANSLATE = 'translate',
// ruanway 生成视频
RUNWAY_VIDEO = 'runway_video',
// luma 生成视频
LUMA_VIDEO = 'luma_video',
// kling 生成视频
KLING_VIDEO = 'kling_video',
// MJ Video
MJ_VIDEO = 'mj_video',
// MJ VIDEO EXTEND 视频拓展
MJ_VIDEO_EXTEND = 'mj_video_extend'
} }
export enum BookBackTaskStatus { export enum BookBackTaskStatus {
@@ -208,7 +226,16 @@ export enum BookTaskStatus {
COMPOSING_DONE = 'composing_done', COMPOSING_DONE = 'composing_done',
// 合成视频失败 // 合成视频失败
COMPOSING_FAIL = 'composing_fail' COMPOSING_FAIL = 'composing_fail',
/** 添加草稿完成 */
DRAFT_DONE = 'draft_done',
/** 添加草稿失败 */
DRAFT_FAIL = 'draft_fail',
/** 图转视频失败 */
IMAGE_TO_VIDEO_ERROR = 'image_to_video_error',
/** 图转视频成功 */
IMAGE_TO_VIDEO_SUCCESS = "IMAGE_TO_VIDEO_SUCCESS"
} }
export enum TagDefineType { export enum TagDefineType {
@@ -232,7 +259,8 @@ export enum OperateBookType {
BOOK = 'book', // 这个小说的所有批次 BOOK = 'book', // 这个小说的所有批次
BOOKTASK = 'bookTask', // 整个小说批次分镜合并 BOOKTASK = 'bookTask', // 整个小说批次分镜合并
BOOKTASKDETAIL = 'bookTaskDetail', // 单个分镜合并 BOOKTASKDETAIL = 'bookTaskDetail', // 单个分镜合并
UNDERBOOKTASK = 'underBookTask' // 执行小说批次任务的指定ID以及后面的所有的东西 UNDERBOOKTASK = 'underBookTask', // 执行小说批次任务的指定ID以及后面的所有的东西
ASSIGNBOOKTASK = 'assignBookTask' // 指定小说批次任务
} }
export enum CopyImageType { export enum CopyImageType {
@@ -276,3 +304,357 @@ export enum BookTagSelectType {
// 标签 // 标签
TAG = 'tag' TAG = 'tag'
} }
/**
* 根据小说类型值返回对应的中文标签
* @param value 小说类型值
* @returns 中文标签
*/
export function GetBookTypeLabel(value: string) {
if (value == BookType.MJ_REVERSE) {
return 'MJ反推'
} else if (value == BookType.SD_REVERSE) {
return 'SD反推'
} else if (value == BookType.ORIGINAL) {
return '原创'
} else {
return '未知'
}
}
/**
* 根据小说图片生成方式返回对应的标签
* @param value 图片生成方式类型
* @returns 对应的显示标签
*/
export function GetBookImageCategoryLabel(value: string) {
switch (value) {
case BookImageCategory.MJ:
return 'MJ';
case BookImageCategory.SD:
return 'SD';
case BookImageCategory.ComfyUI:
return 'ComfyUI';
case BookImageCategory.D3:
return 'D3';
case BookImageCategory.FLUX_API:
return 'FLUX API';
case BookImageCategory.FLUX_FORGE:
return 'FLUX FORGE';
default:
return '未知';
}
}
/**
* 根据Key返回指定的后台任务类型的label
* @param key
* @returns
*/
export function GetBookBackTaskTypeLabel(key: string) {
switch (key) {
case BookBackTaskType.STORYBOARD:
return '分镜计算';
case BookBackTaskType.SPLIT:
return '分割视频';
case BookBackTaskType.AUDIO:
return '提取音频';
case BookBackTaskType.RECOGNIZE:
return '识别字幕';
case BookBackTaskType.FRAME:
return '抽帧';
case BookBackTaskType.MJ_REVERSE:
return 'MJ反推';
case BookBackTaskType.SD_REVERSE:
return 'SD反推';
case BookBackTaskType.MJ_IMAGE:
return 'MJ生成图片';
case BookBackTaskType.SD_IMAGE:
return 'SD生成图片';
case BookBackTaskType.FLUX_FORGE_IMAGE:
return 'flux forge生成图片';
case BookBackTaskType.FLUX_API_IMAGE:
return 'flux api生成图片';
case BookBackTaskType.D3_IMAGE:
return 'D3生成图片';
case BookBackTaskType.HD:
return '高清';
case BookBackTaskType.COMPOSING:
return '合成视频';
case BookBackTaskType.INFERENCE:
return '推理';
case BookBackTaskType.TRANSLATE:
return '翻译';
case BookBackTaskType.RUNWAY_VIDEO:
return 'runway生成视频';
case BookBackTaskType.LUMA_VIDEO:
return 'luma生成视频';
case BookBackTaskType.KLING_VIDEO:
return 'kling生成视频';
default:
return key;
}
}
/**
* 根据Key返回指定的后台任务状态的label
* @param key
* @returns
*/
export function GetBookTaskDetailStatusLabel(key: string): TaskModal.TaskStatus {
switch (key) {
case BookTaskStatus.WAIT:
return {
status: BookTaskStatus.WAIT,
label: '等待',
type: 'warning'
};
case BookTaskStatus.STORYBOARD:
return {
status: BookTaskStatus.STORYBOARD,
label: '分镜计算中',
type: 'info'
};
case BookTaskStatus.STORYBOARD_FAIL:
return {
status: BookTaskStatus.STORYBOARD_FAIL,
label: '分镜计算失败',
type: 'error'
};
case BookTaskStatus.STORYBOARD_DONE:
return {
status: BookTaskStatus.STORYBOARD_DONE,
label: '分镜计算完成',
type: 'success'
};
case BookTaskStatus.SPLIT:
return {
status: BookTaskStatus.SPLIT,
label: '分割视频中',
type: 'info'
};
case BookTaskStatus.SPLIT_FAIL:
return {
status: BookTaskStatus.SPLIT_FAIL,
label: '分割视频失败',
type: 'error'
};
case BookTaskStatus.SPLIT_DONE:
return {
status: BookTaskStatus.SPLIT_DONE,
label: '分割视频完成',
type: 'success'
};
case BookTaskStatus.AUDIO:
return {
status: BookTaskStatus.AUDIO,
label: '提取音频中',
type: 'info'
};
case BookTaskStatus.AUDIO_FAIL:
return {
status: BookTaskStatus.AUDIO_FAIL,
label: '提取音频失败',
type: 'error'
};
case BookTaskStatus.AUDIO_DONE:
return {
status: BookTaskStatus.AUDIO_DONE,
label: '提取音频完成',
type: 'success'
};
case BookTaskStatus.RECOGNIZE:
return {
status: BookTaskStatus.RECOGNIZE,
label: '识别字幕中',
type: 'info'
};
case BookTaskStatus.RECOGNIZE_FAIL:
return {
status: BookTaskStatus.RECOGNIZE_FAIL,
label: '识别字幕失败',
type: 'error'
};
case BookTaskStatus.RECOGNIZE_DONE:
return {
status: BookTaskStatus.RECOGNIZE_DONE,
label: '识别字幕完成',
type: 'success'
};
case BookTaskStatus.FRAME:
return {
status: BookTaskStatus.FRAME,
label: '抽帧中',
type: 'info'
};
case BookTaskStatus.FRAME_FAIL:
return {
status: BookTaskStatus.FRAME_FAIL,
label: '抽帧失败',
type: 'error'
};
case BookTaskStatus.FRAME_DONE:
return {
status: BookTaskStatus.FRAME_DONE,
label: '抽帧完成',
type: 'success'
};
case BookTaskStatus.REVERSE:
return {
status: BookTaskStatus.REVERSE,
label: '反推中',
type: 'info'
};
case BookTaskStatus.REVERSE_FAIL:
return {
status: BookTaskStatus.REVERSE_FAIL,
label: '反推失败',
type: 'error'
};
case BookTaskStatus.REVERSE_DONE:
return {
status: BookTaskStatus.REVERSE_DONE,
label: '反推完成',
type: 'success'
};
case BookTaskStatus.IMAGE:
return {
status: BookTaskStatus.IMAGE,
label: '生成图片中',
type: 'info'
};
case BookTaskStatus.IMAGE_FAIL:
return {
status: BookTaskStatus.IMAGE_FAIL,
label: '生成图片失败',
type: 'error'
};
case BookTaskStatus.IMAGE_DONE:
return {
status: BookTaskStatus.IMAGE_DONE,
label: '生成图片完成',
type: 'success'
};
case BookTaskStatus.HD:
return {
status: BookTaskStatus.HD,
label: '高清中',
type: 'info'
};
case BookTaskStatus.HD_FAIL:
return {
status: BookTaskStatus.HD_FAIL,
label: '高清失败',
type: 'error'
};
case BookTaskStatus.HD_DONE:
return {
status: BookTaskStatus.HD_DONE,
label: '高清完成',
type: 'success'
};
case BookTaskStatus.COMPOSING:
return {
status: BookTaskStatus.COMPOSING,
label: '合成视频中',
type: 'info'
};
case BookTaskStatus.COMPOSING_FAIL:
return {
status: BookTaskStatus.COMPOSING_FAIL,
label: '合成视频失败',
type: 'error'
};
case BookTaskStatus.COMPOSING_DONE:
return {
status: BookTaskStatus.COMPOSING_DONE,
label: '合成视频完成',
type: 'success'
};
case BookTaskStatus.DRAFT_DONE:
return {
status: BookTaskStatus.DRAFT_DONE,
label: '添加草稿完成',
type: 'success'
};
case BookTaskStatus.DRAFT_FAIL:
return {
status: BookTaskStatus.DRAFT_FAIL,
label: '添加草稿失败',
type: 'error'
};
case BookTaskStatus.IMAGE_TO_VIDEO_ERROR:
return {
status: BookTaskStatus.IMAGE_TO_VIDEO_ERROR,
label: '图转视频失败',
type: 'error'
};
case BookTaskStatus.IMAGE_TO_VIDEO_SUCCESS:
return {
status: BookTaskStatus.IMAGE_TO_VIDEO_SUCCESS,
label: '图转视频成功',
type: 'success'
};
default:
return {
status: "UNKNOWN",
label: "UNKNOWN",
type: 'warning'
};
}
}
/**
* 根据Key返回指定的后台任务状态的label
* @param key
* @returns
*/
export function GetBookBackTaskStatusLabel(key: string): TaskModal.TaskStatus {
switch (key) {
case BookBackTaskStatus.WAIT:
return {
status: BookBackTaskStatus.WAIT,
label: '等待',
type: 'warning'
};
case BookBackTaskStatus.RUNNING:
return {
status: BookBackTaskStatus.RUNNING,
label: '运行中',
type: 'info'
};
case BookBackTaskStatus.PAUSE:
return {
status: BookBackTaskStatus.PAUSE,
label: '暂停',
type: 'warning'
};
case BookBackTaskStatus.DONE:
return {
status: BookBackTaskStatus.DONE,
label: '完成',
type: 'success'
};
case BookBackTaskStatus.FAIL:
return {
status: BookBackTaskStatus.FAIL,
label: '失败',
type: 'error'
};
case BookBackTaskStatus.RECONNECT:
return {
status: BookBackTaskStatus.RECONNECT,
label: '重连',
type: 'warning'
};
default:
return {
status: "UNKNOWN",
label: "UNKNOWN",
type: 'warning'
};
}
}
-11
View File
@@ -1,15 +1,4 @@
/**
* Flux 调用API时候的 生图模型
*/
export enum FLxuAPIImageType {
FLUX = "flux",
FLUX_PRO = "flux-pro",
FLUX_DEV = "flux-dev",
FLUX_SCHNELL = "flux-schnell",
FLUX_PRO_MAX = "flux-pro-max"
}
export enum PresetType { export enum PresetType {
// 角色 // 角色
+7 -2
View File
@@ -8,12 +8,17 @@ export enum MJImageType {
// 浏览器模式 // 浏览器模式
BROWSER_MJ = 'browser_mj', BROWSER_MJ = 'browser_mj',
// MJ生图包
PACKAGE_MJ = 'package_mj',
// API模式 // API模式
API_MJ = 'api_mj', API_MJ = 'api_mj',
// 本地 SD // 本地 SD
LOCAL_SD = 'local_sd', LOCAL_SD = 'local_sd',
// ComfyUI
ComfyUI = 'comfyui',
// flux-api // flux-api
FLUX_API = 'flux-api', FLUX_API = 'flux-api',
@@ -35,10 +40,10 @@ export enum MJRobotType {
export enum MJSpeed { export enum MJSpeed {
// 快速 // 快速
FAST = 'fast', FAST = 'FAST',
// 休闲 // 休闲
RELAX = 'relaxed' RELAX = 'RELAXED'
} }
export enum MJRespoonseType { export enum MJRespoonseType {
+96
View File
@@ -0,0 +1,96 @@
/**
* Option Value的数据类型,用于数据的格式化
*/
export enum OptionType {
STRING = 'string',
NUMBER = 'number',
BOOLEAN = 'boolean',
JSON = 'json'
}
export enum OptionKeyName {
//#region 文案处理
/**
* 文案处理的AI设置
*/
CW_AISetting = 'CW_AISetting',
/**
* 文案处理数据界面数据
*/
CW_AISimpleSetting = 'CW_AISimpleSetting',
/**
* 格式化的特殊字符数据
*/
CW_FormatSpecialChar = 'CW_FormatSpecialChar',
//#endregion
//#region TTS
/**
* TTS界面视图数据
*/
TTS_GlobalSetting = 'TTS_GlobalSetting',
//#endregion
//#region MJ
/**
* MJ 基础设置
*/
MJ_GlobalSetting = 'MJ_GlobalSetting',
/**
* MJ 自定义API设置
*/
MJ_CustomAPISetting = 'MJ_CustomAPISetting',
/**
* MJ 自定义生图包设置
*/
MJ_CustomPackageSetting = 'MJ_CustomPackageSetting',
//#endregion
//#region FLUX
/**
* FLUX API 模型列表
*/
FLUX_APIModelList = 'FLUX_APIModelList',
//#endregion
//#region SD/ComfyUI
/**
* ComfyUI 基础设置
*/
ComfyUI_SimpleSetting = "ComfyUI_SimpleSetting",
/**
* ComfyUI 工作流设置
*/
ComfyUI_WorkFlowSetting = "ComfyUI_WorkFlowSetting",
//#endregion
//#region Image To Video
/** 是否显示右侧的Image To Video 操作面板 */
ImageToVideo_ShowRightPanel = 'ImageToVideo_ShowRightPanel',
/** 是否显示分页 */
ImageToVideo_ShowPagination = 'ImageToVideo_ShowPagination',
//#endregion
}
+8
View File
@@ -60,10 +60,18 @@ export enum ResponseMessageType {
GET_TEXT = 'getText', // 获取文案 GET_TEXT = 'getText', // 获取文案
REMOVE_WATERMARK = "REMOVE_WATERMARK",// 删除水印 REMOVE_WATERMARK = "REMOVE_WATERMARK",// 删除水印
MJ_REVERSE = 'MJ_REVERSE',// MJ反推,返回反推结果 MJ_REVERSE = 'MJ_REVERSE',// MJ反推,返回反推结果
SD_REVERSE = 'SD_REVERSE',// MJ反推,返回反推结果
REVERSE_PROMPT_TRANSLATE = 'REVERSE_PROMPT_TRANSLATE',// 反推提示词翻译 REVERSE_PROMPT_TRANSLATE = 'REVERSE_PROMPT_TRANSLATE',// 反推提示词翻译
GPT_PROMPT_TRANSLATE = 'GPT_PROMPT_TRANSLATE', // GPT提示词翻译 GPT_PROMPT_TRANSLATE = 'GPT_PROMPT_TRANSLATE', // GPT提示词翻译
MJ_IMAGE = 'MJ_IMAGE',// MJ 生成图片 MJ_IMAGE = 'MJ_IMAGE',// MJ 生成图片
ComfyUI_IMAGE = 'ComfyUI_IMAGE',// ComfyUI 生成图片
HD_IMAGE = 'HD_IMAGE',// HD 生成图片 HD_IMAGE = 'HD_IMAGE',// HD 生成图片
RUNWAY_VIDEO = "RUNWAY_VIDEO",// Runway生成视频
LUMA_VIDEO = "LUMA_VIDEO",// Luma生成视频
KLING_VIDEO = "KLING_VIDEO",// Kling生成视频
MJ_VIDEO = "MJ_VIDEO",// MJ生成视频
MJ_VIDEO_EXTEND = "MJ_VIDEO_EXTEND",// MJ生成视频拓展
VIDEO_SUCESS = "VIDEO_SUCESS" //视频生成成功
} }
export enum LaiAPIType { export enum LaiAPIType {
+209
View File
@@ -0,0 +1,209 @@
//#region 图转视频类型
import { BookBackTaskType } from "./bookEnum";
/** 图片转视频的方式 */
export enum ImageToVideoModels {
/** runway 生成视频 */
RUNWAY = "RUNWAY",
/** luma 生成视频 */
LUMA = "LUMA",
/** 可灵生成视频 */
KLING = "KLING",
/** Pika 生成视频 */
PIKA = "PIKA",
/** MJ 图转视频 */
MJ_VIDEO = "MJ_VIDEO",
/** MJ 视频拓展 */
MJ_VIDEO_EXTEND = "MJ_VIDEO_EXTEND"
}
export const MappingTaskTypeToVideoModel = (type: BookBackTaskType | string) => {
switch (type) {
case BookBackTaskType.LUMA_VIDEO:
return ImageToVideoModels.LUMA;
case BookBackTaskType.RUNWAY_VIDEO:
return ImageToVideoModels.RUNWAY;
case BookBackTaskType.KLING_VIDEO:
return ImageToVideoModels.KLING;
case BookBackTaskType.MJ_VIDEO:
return ImageToVideoModels.MJ_VIDEO;
case BookBackTaskType.MJ_VIDEO_EXTEND:
return ImageToVideoModels.MJ_VIDEO_EXTEND;
default:
return "UNKNOWN"
}
}
/**
* 图片转视频模型的名称转换
* @param model 图片转视频的模型类型
* @returns 模型的中文名称
*/
export const GetImageToVideoModelsLabel = (model: ImageToVideoModels | string) => {
switch (model) {
case ImageToVideoModels.RUNWAY:
return "Runway";
case ImageToVideoModels.LUMA:
return "Luma";
case ImageToVideoModels.KLING:
return "可灵";
case ImageToVideoModels.PIKA:
return "Pika";
case ImageToVideoModels.MJ_VIDEO:
return "MJ视频";
default:
return "未知";
}
}
/**
* 获取图像转视频模型选项的函数
*
* 该函数返回一个包含所有可用图像转视频模型的选项数组。
* 每个选项包含一个标签(label)和一个值(value)。
* 标签通过调用 GetImageToVideoModelsLabel 函数获得,而值则直接使用 ImageToVideoModels 枚举值。
*
* @returns 图像转视频模型选项数组,每个选项包含 label 和 value 属性
*/
export const GetImageToVideoModelsOptions = () => {
return [
{ label: GetImageToVideoModelsLabel(ImageToVideoModels.MJ_VIDEO), value: ImageToVideoModels.MJ_VIDEO },
{ label: GetImageToVideoModelsLabel(ImageToVideoModels.RUNWAY), value: ImageToVideoModels.RUNWAY },
{ label: GetImageToVideoModelsLabel(ImageToVideoModels.LUMA), value: ImageToVideoModels.LUMA },
{ label: GetImageToVideoModelsLabel(ImageToVideoModels.KLING), value: ImageToVideoModels.KLING },
{ label: GetImageToVideoModelsLabel(ImageToVideoModels.PIKA), value: ImageToVideoModels.PIKA },
]
}
//#endregion
//#region 通用
/** 生成视频的方式 */
export enum VideoModel {
/** 文生视频 */
TEXT_TO_VIDEO = "textToVideo",
/** 图生视频 */
IMAGE_TO_VIDEO = "imageToVideo",
}
/** 图转视频的状态 */
export enum VideoStatus {
/** 等待 */
WAIT = "wait",
/** 处理中 */
PROCESSING = "processing",
/** 完成 */
SUCCESS = "success",
/** 失败 */
FAIL = "fail",
}
export const GetVideoStatus = (status: VideoStatus | string) => {
switch (status) {
case VideoStatus.WAIT:
case "0":
return "等待";
case VideoStatus.PROCESSING:
case "1":
return "处理中";
case VideoStatus.SUCCESS:
case "3":
return "完成";
case VideoStatus.FAIL:
case '2':
return "失败";
default:
return "未知";
}
}
//#endregion
//#region runway 相关
/** runway 生成视频的模型 */
export enum RunawayModel {
GNE2 = "gen2",
GNE3 = "gen3",
}
/** runway 合成视频的时长 */
export enum RunwaySeconds {
FIVE = 5,
TEN = 10,
}
//#endregion
//#region 可灵相关
export enum KlingMode {
/** 高性能 */
STD = "std",
/** 高表现 */
PRO = "pro"
}
//#endregion
//#region MJ Video
/**
* 对视频任务进行操作。不为空时,index、taskId必填
*/
export enum MJVideoAction {
Extend = "extend",
}
/**
* 首帧图片,扩展时可为空
*/
export enum MJVideoImageType {
Base64 = "base64",
Url = "url",
}
/**
* MJ Video的动作幅度
*/
export enum MJVideoMotion {
High = "high",
Low = "low",
}
/**
* 获取MJ视频动作幅度的标签
*
* @param model MJ视频动作幅度枚举值或字符串
* @returns 返回对应的中英文标签
*/
export function GetMJVideoMotionLabel(model: MJVideoMotion | string) {
switch (model) {
case MJVideoMotion.High:
return "高 (High)";
case MJVideoMotion.Low:
return "低 (Low)";
default:
return "无效"
}
}
/**
* 获取MJ视频动作幅度的选项列表
*
* @returns 返回包含标签和值的选项数组,用于下拉选择框等UI组件
*/
export function GetMJVideoMotionOptions() {
return [
{
label: GetMJVideoMotionLabel(MJVideoMotion.Low), value: MJVideoMotion.Low
}, {
label: GetMJVideoMotionLabel(MJVideoMotion.High), value: MJVideoMotion.High
}
]
}
//#endregion
+992 -47
View File
File diff suppressed because it is too large Load Diff
+25
View File
@@ -0,0 +1,25 @@
import { ValidateJson } from "../Tools/validate";
/**
* 获取转发请求的数据,序列化后返回
* @param response
* @returns
*/
function GetForwardResponseData(response: any) {
if (response.status != 200) {
throw new Error(response.message)
}
if (response.data.code != 1) {
throw new Error(response.data.message)
}
if (!ValidateJson(response.data.data)) {
throw new Error(response.data.data)
}
return JSON.parse(response.data.data);
}
let ForwardResponse = {
GetForwardResponseData,
}
export default ForwardResponse;
+6 -2
View File
@@ -42,13 +42,17 @@ export const ImageSetting = {
return { return {
code: 1, code: 1,
data: [ data: [
{
label: 'MJ',
value: 'mj'
},
{ {
label: 'SD', label: 'SD',
value: 'sd' value: 'sd'
}, },
{ {
label: 'MJ', label: 'ComfyUI',
value: 'mj' value: 'comfyui'
}, },
{ {
label: 'D3', label: 'D3',
+3
View File
@@ -11,6 +11,9 @@ export function GetTTSSelect() {
* 获取当前 edge-tts 支持的角色,返回一个数组 * 获取当前 edge-tts 支持的角色,返回一个数组
*/ */
export function GetEdgeTTSRole() { export function GetEdgeTTSRole() {
//
return [ return [
{ {
value: 'zh-CN-XiaoxiaoNeural', value: 'zh-CN-XiaoxiaoNeural',
+85
View File
@@ -0,0 +1,85 @@
import { ipcMain } from 'electron'
import axios from 'axios'
import { DEFINE_STRING } from '../../define/define_string'
function AxiosIpc() {
// 通用 GET 请求
ipcMain.handle(DEFINE_STRING.AXIOS.HTTP_GET, async (_, url, config = {}) => {
try {
const response = await axios.get(url, config)
return {
success: true,
data: response.data,
status: response.status
}
} catch (error: any) {
return {
success: false,
error: error.message,
message: error.message,
status: error.response?.status,
data: error.response?.data
}
}
})
// 通用 POST 请求
ipcMain.handle(DEFINE_STRING.AXIOS.HTTP_POST, async (_, url, data = {}, config = {}) => {
try {
const response = await axios.post(url, data, config)
return {
success: true,
data: response.data,
status: response.status
}
} catch (error: any) {
return {
success: false,
error: error.message,
message: error.message,
status: error.response?.status,
data: error.response?.data
}
}
})
// 通用 PUT 请求
ipcMain.handle(DEFINE_STRING.AXIOS.HTTP_PUT, async (_, url, data = {}, config = {}) => {
try {
const response = await axios.put(url, data, config)
return {
success: true,
data: response.data,
status: response.status
}
} catch (error: any) {
return {
success: false,
error: error.message,
status: error.response?.status,
data: error.response?.data
}
}
})
// 通用 DELETE 请求
ipcMain.handle(DEFINE_STRING.AXIOS.HTTP_DELETE, async (_, url, config = {}) => {
try {
const response = await axios.delete(url, config)
return {
success: true,
data: response.data,
status: response.status
}
} catch (error: any) {
return {
success: false,
error: error.message,
status: error.response?.status,
data: error.response?.data
}
}
})
}
export default AxiosIpc
+82 -12
View File
@@ -15,6 +15,8 @@ import { BookFrame } from '../Service/Book/bookFrame'
import { BookPrompt } from '../Service/Book/bookPrompt' import { BookPrompt } from '../Service/Book/bookPrompt'
import { BookGeneral } from '../Service/Book/bookGeneral' import { BookGeneral } from '../Service/Book/bookGeneral'
import { OperateBookType } from '../../define/enum/bookEnum' import { OperateBookType } from '../../define/enum/bookEnum'
import { VideoGlobal } from '../Service/video/videoGlobal'
import { BookImageTextToVideoIndex } from "@/main/Service/Book/BookImageTextToVideo/bookImageTextToVideoIndex";
let reverseBook = new ReverseBook() let reverseBook = new ReverseBook()
let basicReverse = new BasicReverse() let basicReverse = new BasicReverse()
let subtitle = new Subtitle() let subtitle = new Subtitle()
@@ -29,6 +31,8 @@ let subtitleService = new SubtitleService()
let bookFrame = new BookFrame() let bookFrame = new BookFrame()
let bookPrompt = new BookPrompt(); let bookPrompt = new BookPrompt();
let bookGeneral = new BookGeneral() let bookGeneral = new BookGeneral()
let videoGlobal = new VideoGlobal()
let bookImageTextToVideoIndex = new BookImageTextToVideoIndex();
export function BookIpc() { export function BookIpc() {
// 获取样式图片的子列表 // 获取样式图片的子列表
@@ -92,10 +96,11 @@ export function BookIpc() {
//#endregion //#endregion
//#region 小说通用操作 //#region 小说详情通用操作
ipcMain.handle(DEFINE_STRING.BOOK.REPLACE_BOOK_DATA, async (event, bookTaskId, replaceData) => await bookGeneral.ReplaceBookData(bookTaskId, replaceData)) ipcMain.handle(DEFINE_STRING.BOOK.REPLACE_BOOK_DATA, async (event, bookTaskId, replaceData) => await bookGeneral.ReplaceBookData(bookTaskId, replaceData))
//#endregion //#endregion
//#region 分镜相关 //#region 分镜相关
@@ -116,6 +121,9 @@ export function BookIpc() {
await bookFrame.ReplaceVideoCurrentFrame(bookTaskDetailId, currentTime) await bookFrame.ReplaceVideoCurrentFrame(bookTaskDetailId, currentTime)
) )
// 剪映抽帧,并判断是不是切割视频
ipcMain.handle(DEFINE_STRING.BOOK.JIANYING_FRAME, async (event, bookTaskId, draftName) => await bookFrame.JianyingFrame(bookTaskId, draftName))
//#endregion //#endregion
//#region 提示词相关 //#region 提示词相关
@@ -154,6 +162,12 @@ export function BookIpc() {
async (event, bookTaskId: string, txtPath: string) => await bookPrompt.ImportGPTPrompt(bookTaskId, txtPath) async (event, bookTaskId: string, txtPath: string) => await bookPrompt.ImportGPTPrompt(bookTaskId, txtPath)
) )
/** 移除不想要的提示词 */
ipcMain.handle(
DEFINE_STRING.BOOK.REMOVE_BAD_PROMPT,
async (event, bookTaskId: string) => await bookPrompt.RemoveBadPrompt(bookTaskId)
)
//#endregion //#endregion
//#region 文案相关 //#region 文案相关
@@ -241,14 +255,14 @@ export function BookIpc() {
// 高清图片前检查,主要是检查图片大小 // 高清图片前检查,主要是检查图片大小
ipcMain.handle( ipcMain.handle(
DEFINE_STRING.BOOK.CHECK_IMAGE_FILE_SIZE, DEFINE_STRING.BOOK.CHECK_IMAGE_FILE_SIZE,
async (event, id, fileSize, operateBookType) => async (event, id: string | string[], fileSize: number, operateBookType: OperateBookType) =>
await bookImage.CheckImageFileSize(id, fileSize, operateBookType) await bookImage.CheckImageFileSize(id, fileSize, operateBookType)
) )
// 开始执行高清图片 // 开始执行高清图片
ipcMain.handle( ipcMain.handle(
DEFINE_STRING.BOOK.HD_IMAGE, DEFINE_STRING.BOOK.HD_IMAGE,
async (event, id, scale, operateBookType) => await bookImage.HDImage(id, scale, operateBookType) async (event, id: string | string[], scale: number, operateBookType: OperateBookType) => await bookImage.HDImage(id, scale, operateBookType)
) )
// 删除所有的生成图片 // 删除所有的生成图片
@@ -257,21 +271,45 @@ export function BookIpc() {
async (event, id, operateBookType) => await bookImage.ResetGenerateImage(id, operateBookType) async (event, id, operateBookType) => await bookImage.ResetGenerateImage(id, operateBookType)
) )
// 获取图片的URL并且下载
ipcMain.handle( ipcMain.handle(
DEFINE_STRING.BOOK.GET_IMAGE_URL_AND_DOWNLOAD, DEFINE_STRING.BOOK.GET_IMAGE_URL_AND_DOWNLOAD,
async (event, id: string, operateBookType: OperateBookType, coverData: boolean) => async (event, id: string, operateBookType: OperateBookType, coverData: boolean) =>
await bookImage.GetImageUrlAndDownload(id, operateBookType, coverData) await bookImage.GetImageUrlAndDownload(id, operateBookType, coverData)
) )
/** 添加一键生图后台任务 */
ipcMain.handle(
DEFINE_STRING.BOOK.GENERATE_ALL_TASK_IMAGE,
async (event, ids: string[], operateBookType: OperateBookType) => await bookImage.GenerateAllTaskImage(ids, operateBookType)
)
/**上传图片到小说中,并修改小说信息 */
ipcMain.handle(
DEFINE_STRING.BOOK.UPLOAD_IMAGE_TO_BOOK_AND_UPDATE_MESSAGE,
async (event, bookTaskDetailId: string, imageFile: string | string[], option: string) => await bookImage.UpLoadImageToBookAndUpdateMessage(bookTaskDetailId, imageFile, option)
)
/** 上传图片到缓存 */
ipcMain.handle(DEFINE_STRING.BOOK.UPLOAD_IMAGE_TO_CACHE,
async (event, bookTaskId: string, imageFile: string | string[]) => await bookImage.UpLoadImageToCache(bookTaskId, imageFile)
)
/** 获取当前小说中的所有的批次中的缓存图片 */
ipcMain.handle(DEFINE_STRING.BOOK.GET_ALL_BOOK_TASK_IMAGE_CACHE, async (event, bookTaskId: string) => await bookImage.GetAllBookTaskImageCache(bookTaskId))
/** 保存缓存区的屠图片到小说主图或者是选图区 */
ipcMain.handle(DEFINE_STRING.BOOK.SAVE_CACHE_IMAGE_TO_DATA, async (event, bookTaskDetailId: string, imageFile: string | string[], option: string) => await bookImage.SaveCacheImageToData(bookTaskDetailId, imageFile, option))
/** 删除缓存区的图片 */
ipcMain.handle(DEFINE_STRING.BOOK.DELETE_CACHE_IMAGE, async (event, bookTaskId: string, imageFile: string) => await bookImage.DeleteCacheImage(bookTaskId, imageFile))
/** 移动指定的图片链接到主图 */
ipcMain.handle(DEFINE_STRING.BOOK.MOVE_IMAGE_TO_MAIN_IMAGE, async (event, bookTaskId: string, bookTaskDetailId: string, sourceImagePath: string) => await bookImage.MoveImageToMainImage(bookTaskId, bookTaskDetailId, sourceImagePath))
//#endregion //#endregion
// 一拆四,将一个任务拆分成四个任务,并且复制对应的图片
ipcMain.handle(
DEFINE_STRING.BOOK.ONE_TO_FOUR_BOOK_TASK,
async (event, bookTaskDetailId) => await bookTask.OneToFourBookTask(bookTaskDetailId)
)
//#region 小说相关 //#region 小说相关
// 重置小说数据 // 重置小说数据
@@ -284,19 +322,25 @@ export function BookIpc() {
//#region 小说批次任务相关 //#region 小说批次任务相关
// 一拆四,将一个任务拆分成四个任务,并且复制对应的图片
ipcMain.handle(
DEFINE_STRING.BOOK.ONE_TO_FOUR_BOOK_TASK,
async (event, bookTaskDetailId) => await bookTask.OneToFourBookTask(bookTaskDetailId)
)
// 新建小说批次任务 // 新建小说批次任务
ipcMain.handle(DEFINE_STRING.BOOK.ADD_NEW_BOOK_TASK, async (event, addBookTaskData) => await bookTask.AddNewBookTask(addBookTaskData)) ipcMain.handle(DEFINE_STRING.BOOK.ADD_NEW_BOOK_TASK, async (event, addBookTaskData) => await bookTask.AddNewBookTask(addBookTaskData))
// 重置小说批次数据 // 重置小说批次数据
ipcMain.handle( ipcMain.handle(
DEFINE_STRING.BOOK.RESET_BOOK_TASK, DEFINE_STRING.BOOK.RESET_BOOK_TASK,
async (event, bookTaskId) => await bookTask.ReSetBookTask(bookTaskId) async (event, bookTaskId, operateBookType) => await bookTask.ReSetBookTask(bookTaskId, operateBookType)
) )
// 删除小说批次数据 // 删除小说批次数据
ipcMain.handle( ipcMain.handle(
DEFINE_STRING.BOOK.DELETE_BOOK_TASK, DEFINE_STRING.BOOK.DELETE_BOOK_TASK,
async (event, bookTaskId) => await bookTask.DeleteBookTask(bookTaskId) async (event, bookTaskId, operateBookType) => await bookTask.DeleteBookTask(bookTaskId, operateBookType)
) )
@@ -310,7 +354,33 @@ export function BookIpc() {
// 将小说任务添加到剪映草稿 // 将小说任务添加到剪映草稿
ipcMain.handle( ipcMain.handle(
DEFINE_STRING.BOOK.ADD_JIANYING_DRAFT, DEFINE_STRING.BOOK.ADD_JIANYING_DRAFT,
async (event, id, operateBookType) => await bookVideo.AddJianyingDraft(id, operateBookType) async (event, id: string | string[], operateBookType: OperateBookType) => await bookVideo.AddJianyingDraft(id, operateBookType)
)
ipcMain.handle(
DEFINE_STRING.BOOK.ADD_GENERATE_VIDEO_TASK,
async (event, id: string | string[], operateBookType: OperateBookType) => await bookVideo.AddGenerateVideoTask(id, operateBookType)
) )
//#endregion //#endregion
//#region 图转视频相关
/** 初始化图转视频 */
ipcMain.handle(DEFINE_STRING.BOOK.INIT_VIDEO_MESSAGE, async (event, bookTaskDetailId) => await videoGlobal.InitVideoMessage(bookTaskDetailId))
/** 修改小说详细分镜的Videomessage */
ipcMain.handle(DEFINE_STRING.BOOK.UPDATE_BOOK_TASK_DETAIL_VIDEO_MESSAGE, async (event, bookTaskDetailId, videoMessage) => await videoGlobal.UpdateBookTaskDetailVideoMessage(bookTaskDetailId, videoMessage))
/** 重新下载视频任务 */
ipcMain.handle(DEFINE_STRING.BOOK.RELOAD_VIDEO_TASK_INFO, async (_, bookTaskDetailId) => await bookImageTextToVideoIndex.ReloadVideoTaskInfo(bookTaskDetailId))
/** 获取指定的条件的图转视频的数据,包含子批次 */
ipcMain.handle(DEFINE_STRING.BOOK.GET_VIDEO_BOOK_INFO_LIST, async (event,
condition: BookVideo.BookVideoInfoListQuertCondition) => await bookImageTextToVideoIndex.GetVideoBookInfoList(condition))
/** 获取小说图片和视频生成进度 */
ipcMain.handle(DEFINE_STRING.BOOK.GET_BOOK_IMAGE_AND_VIDEO_PROGRESS, async (event, bookId?: string, bookTaskId?: string) => await bookImageTextToVideoIndex.bookImageTextToVideoInfo.GetBookImageAndVideoProgress(bookId, bookTaskId))
//#endregion
} }
+16 -1
View File
@@ -1,11 +1,12 @@
import { ipcMain } from 'electron' import { ipcMain } from 'electron'
import { DEFINE_STRING } from '../../define/define_string' import { DEFINE_STRING } from '../../define/define_string'
import { errorMessage, successMessage } from '../Public/generalTools' import { errorMessage, successMessage } from '../Public/generalTools'
import { Book } from '../../model/book' import { Book } from '../../model/book/book'
import { BookTaskService } from '../../define/db/service/Book/bookTaskService' import { BookTaskService } from '../../define/db/service/Book/bookTaskService'
import { BookTaskDetailService } from '../../define/db/service/Book/bookTaskDetailService' import { BookTaskDetailService } from '../../define/db/service/Book/bookTaskDetailService'
import { BookService } from '../../define/db/service/Book/bookService' import { BookService } from '../../define/db/service/Book/bookService'
import { SoftWareServiceBasic } from '../Service/ServiceBasic/softwareServiceBasic' import { SoftWareServiceBasic } from '../Service/ServiceBasic/softwareServiceBasic'
import { BookServiceBasic } from '../Service/ServiceBasic/bookServiceBasic'
async function DBIpc() { async function DBIpc() {
@@ -13,6 +14,7 @@ async function DBIpc() {
let bookTaskDetailService = await BookTaskDetailService.getInstance() let bookTaskDetailService = await BookTaskDetailService.getInstance()
let bookService = await BookService.getInstance() let bookService = await BookService.getInstance()
let softWareServiceBasic = new SoftWareServiceBasic() let softWareServiceBasic = new SoftWareServiceBasic()
let bookServiceBasic = new BookServiceBasic()
//#region 小说相关的修改 //#region 小说相关的修改
// 修改小说任务的数据 // 修改小说任务的数据
@@ -49,6 +51,19 @@ async function DBIpc() {
//#endregion //#endregion
//#region 小说分镜相关
/** 获取指定小说的分镜的某个属性数据 */
ipcMain.handle(DEFINE_STRING.DB.GET_BOOK_TASK_DETAIL_PROPERTY, async (event, bookTaskDetailId: string, property: string) => {
try {
let result = await bookServiceBasic.GetBookTaskDetailProperty(bookTaskDetailId, property)
return successMessage(result, "获取指定小说的分镜的某个属性数据成功", "DBIpc_GetBookTaskDetailProperty")
} catch (error) {
return errorMessage("获取指定小说的分镜的某个属性数据失败", "DBIpc_GetBookTaskDetailProperty")
}
})
//#endregion
//#region 软件设置的修改 //#region 软件设置的修改
@@ -1,22 +1,24 @@
import { PromptIpc } from './promptIpc' import { PromptIpc } from './promptIpc'
import { SettingIpc } from './settingIpc.js' import { SettingIpc } from './settingIpc'
import { ImageGenerateIpc } from './imageGenerateIpc.js' import { ImageGenerateIpc } from './imageGenerateIpc'
import { WritingIpc } from './writingIpc.js' import { WritingIpc } from './writingIpc'
import { VideoGenerateIpc } from './videoGenerateIpc' import { VideoGenerateIpc } from './videoGenerateIpc'
import { TranslateIpc } from './translateIpc.js' import { TranslateIpc } from './translateIpc'
import { GptIpc } from './gptIpc.js' import { GptIpc } from './gptIpc'
import { MjIpc } from './mjIpc.js' import { MjIpc } from './mjIpc'
import { OriginalImageGenerateIpc } from './originalImageGenerateIpc' import { OriginalImageGenerateIpc } from './originalImageGenerateIpc'
import { SdIpc } from './sdIpc.js' import { SdIpc } from './sdIpc'
import { MainIpc } from './mainIpc.js' import { MainIpc } from './mainIpc'
import { GlobalIpc } from './globalIpc.js' import { GlobalIpc } from './globalIpc'
import { ImageIpc } from './imageIpc.js' import { ImageIpc } from './imageIpc'
import { SystemIpc } from './systemIpc' import { SystemIpc } from './systemIpc'
import { BookIpc } from './bookIpc' import { BookIpc } from './bookIpc'
import { TTSIpc } from './ttsIpc.js' import { TTSIpc } from './ttsIpc'
import { DBIpc } from './dbIpc' import { DBIpc } from './dbIpc'
import { PresetIpc } from './presetIpc' import { PresetIpc } from './presetIpc'
import { TaskIpc } from './taskIpc' import { TaskIpc } from './taskIpc'
import { OptionsIpc } from './optionsIpc'
import AxiosIpc from './axiosIpc'
export async function RegisterIpc(createWindow) { export async function RegisterIpc(createWindow) {
PromptIpc() PromptIpc()
@@ -38,4 +40,6 @@ export async function RegisterIpc(createWindow) {
SystemIpc() SystemIpc()
BookIpc() BookIpc()
TTSIpc() TTSIpc()
OptionsIpc()
AxiosIpc()
} }
-1
View File
@@ -60,7 +60,6 @@ function MjIpc() {
) )
// 获取MJ生图的方式 // 获取MJ生图的方式
// GetMJGenerateCategory: async (callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.MJ.GET_MJ_GENERATE_CATEGORY)),
ipcMain.handle( ipcMain.handle(
DEFINE_STRING.MJ.GET_MJ_GENERATE_CATEGORY, DEFINE_STRING.MJ.GET_MJ_GENERATE_CATEGORY,
async (event) => await mjSimple.GetMJGenerateCategory() async (event) => await mjSimple.GetMJGenerateCategory()
+33
View File
@@ -0,0 +1,33 @@
import { ipcMain } from 'electron'
import { DEFINE_STRING } from '../../define/define_string'
import OptionHandle from '../Service/Options/index'
import { OptionType } from '@/define/enum/option'
function OptionsIpc() {
/**
* 获取指定的Option,通过key,不存在返回null
*/
ipcMain.handle(
DEFINE_STRING.OPTIONS.GET_OPTION_BY_KEY,
async (_, key: string | string[]) => await OptionHandle.GetOptionByKey(key)
)
/**
* 修改指定的Option,通过key,不存在则创建
*/
ipcMain.handle(
DEFINE_STRING.OPTIONS.MODIFY_OPTION_BY_KEY,
async (_, key: string, value: string, type: OptionType) =>
await OptionHandle.ModifyOptionByKey(key, value, type)
)
/**
* 同步文案处理中的AI设置旧数据到新的数据表中
*/
ipcMain.handle(
DEFINE_STRING.OPTIONS.INIT_COPY_WRITING_AI_SETTING,
async () => await OptionHandle.InitCopyWritingAISetting()
)
}
export { OptionsIpc }
@@ -14,6 +14,9 @@ let mjSetting = new MJSetting()
import { Watermark } from '../Service/watermark' import { Watermark } from '../Service/watermark'
let watermark = new Watermark() let watermark = new Watermark()
import { SoftWareServiceBasic } from '../Service/ServiceBasic/softwareServiceBasic'
let softWareServiceBasic = new SoftWareServiceBasic()
async function SettingIpc() { async function SettingIpc() {
// 获取背景音乐配置列表 // 获取背景音乐配置列表
ipcMain.handle( ipcMain.handle(
@@ -179,12 +182,6 @@ async function SettingIpc() {
async (event, value) => await mjSetting.GetMJSetting(value) async (event, value) => await mjSetting.GetMJSetting(value)
) )
// 保存MJ的基础设置信息
ipcMain.handle(
DEFINE_STRING.SETTING.UPDATE_MJ_SETTING,
async (event, value) => await mjSetting.UpdateMJSetting(value)
)
// 获取MJ的所有设置 // 获取MJ的所有设置
ipcMain.handle( ipcMain.handle(
DEFINE_STRING.SETTING.GET_MJ_SETTING_TREE_DATA, DEFINE_STRING.SETTING.GET_MJ_SETTING_TREE_DATA,
@@ -200,25 +197,31 @@ async function SettingIpc() {
// 获取所有的代理MJ信息 // 获取所有的代理MJ信息
ipcMain.handle( ipcMain.handle(
DEFINE_STRING.SETTING.GET_REMOTE_MJ_SETTINGS, DEFINE_STRING.SETTING.GET_REMOTE_MJ_SETTINGS,
async (event) => await mjSetting.GetRemoteMJSettings() async (event, type: string) => await mjSetting.GetRemoteMJSettings(type)
) )
// 创建新的代理MJ信息 // 创建新的代理MJ信息
ipcMain.handle( ipcMain.handle(
DEFINE_STRING.SETTING.ADD_REMOTE_MJ_SETTING, DEFINE_STRING.SETTING.ADD_REMOTE_MJ_SETTING,
async (event, value) => await mjSetting.AddRemoteMJSetting(value) async (event, value, type: string) => await mjSetting.AddRemoteMJSetting(value, true, type)
) )
// 修改MJ账号并重连 // 修改MJ账号并重连
ipcMain.handle( ipcMain.handle(
DEFINE_STRING.SETTING.UPDATE_REMOTE_MJ_SETTING, DEFINE_STRING.SETTING.UPDATE_REMOTE_MJ_SETTING,
async (event, value) => await mjSetting.UpdateRemoteMJSetting(value) async (event, value, type: string) => await mjSetting.UpdateRemoteMJSetting(value, type)
) )
// 删除指定的MJ账号 // 删除指定的MJ账号
ipcMain.handle( ipcMain.handle(
DEFINE_STRING.SETTING.DELETE_REMOTE_MJ_SETTING, DEFINE_STRING.SETTING.DELETE_REMOTE_MJ_SETTING,
async (event, value) => await mjSetting.DeleteRemoteMJSetting(value) async (event, value, isRemote) => await mjSetting.DeleteRemoteMJSetting(value, isRemote)
)
/** 同步MJ远程代理服务器账户信息 */
ipcMain.handle(
DEFINE_STRING.SETTING.GET_REMOTE_MJ_SETTINGS_FROM_SERVICE,
async (event, type: string) => await mjSetting.GetRemoteMJSettingsFromService(type)
) )
//#endregion //#endregion
+11
View File
@@ -26,5 +26,16 @@ function SystemIpc() {
ipcMain.handle(DEFINE_STRING.SYSTEM.GET_MACHINE_ID, async (event) => await systemInfo.GetMachineId()) ipcMain.handle(DEFINE_STRING.SYSTEM.GET_MACHINE_ID, async (event) => await systemInfo.GetMachineId())
/** 检查机器码状态 */ /** 检查机器码状态 */
ipcMain.handle(DEFINE_STRING.SYSTEM.CHECK_MACHINE_STATUS, async (event, value: string) => await systemInfo.CheckMachineStatus(value)) ipcMain.handle(DEFINE_STRING.SYSTEM.CHECK_MACHINE_STATUS, async (event, value: string) => await systemInfo.CheckMachineStatus(value))
/** 获取软件版本信息,更新信息,首页内容,公告等 */
ipcMain.handle(DEFINE_STRING.SYSTEM.GET_REMOTE_SYSTEM_INFORMATION, async (event) => await systemInfo.GetRemoteSystemInformation())
/** 选择单个指定文件后缀的文件 */
ipcMain.handle(DEFINE_STRING.SYSTEM.SELECT_SINGLE_FILE, async (event, value: string[]) => await electronInterface.SelectSingleFile(value))
/** 选择多个指定文件后缀的文件 */
ipcMain.handle(DEFINE_STRING.SYSTEM.SELECT_MULTIPLE_FILE, async (event, value: string[]) => await electronInterface.SelectMultipleFile(value))
/** 选择文件夹或指定后缀的文件 */
ipcMain.handle(DEFINE_STRING.SYSTEM.SELECT_FOLDER_OR_FILE, async (event, value?: string[]) => await electronInterface.SelectFolderOrFile(value))
} }
export { SystemIpc } export { SystemIpc }
+9
View File
@@ -6,6 +6,8 @@ import { BookBackTaskStatus, BookBackTaskType, TaskExecuteType } from "../../def
let bookServiceBasic = new BookServiceBasic(); let bookServiceBasic = new BookServiceBasic();
import BackTaskService from '../Service/task/backTaskService' import BackTaskService from '../Service/task/backTaskService'
import { TaskModal } from "@/model/task";
import { Book } from "@/model/book/book";
const backTaskService = new BackTaskService() const backTaskService = new BackTaskService()
function TaskIpc() { function TaskIpc() {
@@ -38,8 +40,15 @@ function TaskIpc() {
return errorMessage(`添加多个任务失败,错误信息如下:${error.toString()} `, 'TaskIpc_AddMultiBookBackTask') return errorMessage(`添加多个任务失败,错误信息如下:${error.toString()} `, 'TaskIpc_AddMultiBookBackTask')
} }
}) })
/** 获取指定状态的任务数量 */ /** 获取指定状态的任务数量 */
ipcMain.handle(DEFINE_STRING.TASK.GET_ALL_STATUS_TASK_COUNT, async (event, value: BookBackTaskStatus[]) => await backTaskService.GetAllStatusTaskCount(value)) ipcMain.handle(DEFINE_STRING.TASK.GET_ALL_STATUS_TASK_COUNT, async (event, value: BookBackTaskStatus[]) => await backTaskService.GetAllStatusTaskCount(value))
/** 获取后台任务的集合,分页 */
ipcMain.handle(DEFINE_STRING.TASK.GET_BACK_TASK_COLLECTION, async (event, queryTaskCondition: TaskModal.QueryTaskCondition) => await backTaskService.GetBackTaskCollection(queryTaskCondition))
/** 修改后台队列的状态 */
ipcMain.handle(DEFINE_STRING.TASK.UPDATE_TASK_STATUS, async (event, bookBackTask: Book.UpdateBookTaskListStatus) => await backTaskService.UpdateTaskStatus(bookBackTask))
} }
export { TaskIpc } export { TaskIpc }
@@ -5,19 +5,11 @@ import { TTS } from '../Service/tts'
const tts = new TTS() const tts = new TTS()
export function TTSIpc() { export function TTSIpc() {
// 获取当前的TTS配置数据
ipcMain.handle(DEFINE_STRING.TTS.GET_TTS_CONFIG, async () => await tts.GetTTSCOnfig())
// 保存TTS配置
ipcMain.handle(
DEFINE_STRING.TTS.SAVE_TTS_CONFIG,
async (event, data) => await tts.SaveTTSConfig(data)
)
// 生成音频 // 生成音频
ipcMain.handle( ipcMain.handle(
DEFINE_STRING.TTS.GENERATE_AUDIO, DEFINE_STRING.TTS.GENERATE_AUDIO,
async (event, text) => await tts.GenerateAudio(text) async (event) => await tts.GenerateAudio()
) )
// 生成SRT字幕文件 // 生成SRT字幕文件
@@ -37,4 +29,7 @@ export function TTSIpc() {
DEFINE_STRING.TTS.GET_TTS_HISTORY_DATA, DEFINE_STRING.TTS.GET_TTS_HISTORY_DATA,
async (event, queryCondition) => await tts.GetTTSHistoryData(queryCondition) async (event, queryCondition) => await tts.GetTTSHistoryData(queryCondition)
) )
ipcMain.handle(
DEFINE_STRING.TTS.GET_TTS_OPTIONS, async (event, key) => await tts.GetTTSOptions(key))
} }
@@ -5,7 +5,11 @@ let writing = new Writing(global)
import { WritingSetting } from '../setting/writeSetting' import { WritingSetting } from '../setting/writeSetting'
let writingSetting = new WritingSetting() let writingSetting = new WritingSetting()
import { SubtitleService } from '../Service/Subtitle/subtitleService' import { SubtitleService } from '../Service/Subtitle/subtitleService'
import { BookPrompt } from '../Service/Book/bookPrompt'
let subtitleService = new SubtitleService() let subtitleService = new SubtitleService()
const bookPrompt = new BookPrompt();
import CopyWritingService from '@/main/Service/copywriting/index'
function WritingIpc() { function WritingIpc() {
// 监听分镜时间的保存 // 监听分镜时间的保存
@@ -67,9 +71,25 @@ function WritingIpc() {
async (event, subtitleSetting) => await subtitleService.SaveSubtitleSetting(subtitleSetting) async (event, subtitleSetting) => await subtitleService.SaveSubtitleSetting(subtitleSetting)
) )
//#region 文案处理
/**
* AI处理文案
*/
ipcMain.handle( ipcMain.handle(
DEFINE_STRING.WRITE.ACTION_START, DEFINE_STRING.WRITE.COPY_WRITING_AI_GENERATION,
async (event, aiSetting, word) => await writing.ActionStart(aiSetting, word) async (event, ids: string[]) => await CopyWritingService.CopyWritingAIGeneration(ids)
) )
//#endregion
//#region 文案洗稿相关
/** 生成洗稿后文案 */
ipcMain.handle(
DEFINE_STRING.WRITE.GENERATE_AFTER_GPT_WORD,
async (event, ids: string[], isEmpty: boolean) => await bookPrompt.GenerateAfterGptWord(ids, isEmpty)
)
//#endregion
} }
export { WritingIpc } export { WritingIpc }
+1 -2
View File
@@ -4,7 +4,6 @@ import { DEFINE_STRING } from '../../define/define_string'
import { define } from '../../define/define' import { define } from '../../define/define'
let fspromises = require('fs').promises let fspromises = require('fs').promises
import { gptDefine } from '../../define/gptDefine' import { gptDefine } from '../../define/gptDefine'
import { apiUrl } from '../../define/api/apiUrlDefine'
import { successMessage } from '../Public/generalTools' import { successMessage } from '../Public/generalTools'
import { RetryWithBackoff } from '../../define/Tools/common' import { RetryWithBackoff } from '../../define/Tools/common'
@@ -354,7 +353,7 @@ export class GPT {
}, },
{ {
role: 'user', role: 'user',
content: gptDefine.getUserContentByType('character', {}) content: gptDefine.getUserContentByType('character', {textContent: value})
} }
] ]
let content = await RetryWithBackoff( let content = await RetryWithBackoff(
+33 -1
View File
@@ -351,6 +351,37 @@ export class Translate {
content: translateData content: translateData
}) })
let content = ''
// 判断整体是不是需要LMS转发
if (global.config.useTransfer) {
let url = define.lms + '/lms/Forward/SimpleTransfer'
let config = {
method: 'post',
url: url,
maxBodyLength: Infinity,
headers: {
'Content-Type': 'application/json'
},
data: JSON.stringify({
url: this.translationBusiness,
apiKey: token,
dataString: JSON.stringify(data)
})
}
// 重试机制
let res = await RetryWithBackoff(
async () => {
return await axios.request(config)
},
5,
2000
)
if (res.data.code != 1) {
throw new Error(res.data.message)
}
content = GetOpenAISuccessResponse(res.data.data)
} else {
let config = { let config = {
method: 'post', method: 'post',
maxBodyLength: Infinity, maxBodyLength: Infinity,
@@ -369,9 +400,10 @@ export class Translate {
2000 2000
) )
// 将返回的数据进行拼接数据处理 // 将返回的数据进行拼接数据处理
content = GetOpenAISuccessResponse(res.data)
}
let res_data = [] let res_data = []
let content = GetOpenAISuccessResponse(res.data)
if (to == 'zh') { if (to == 'zh') {
res_data.push({ res_data.push({
+2 -2
View File
@@ -773,8 +773,8 @@ export class ClipDraft {
// 计算方式和上面的不同 // 计算方式和上面的不同
let sub_total = Math.abs(up_pos - down_pos); let sub_total = Math.abs(up_pos - down_pos);
let currwnt_rate = sub_total * (1 - time_rate); let currwnt_rate = sub_total * (1 - time_rate);
up_pos = up_pos + currwnt_rate / 2; up_pos = up_pos - (up_pos * (currwnt_rate / up_pos)) / 2;
down_pos = down_pos - currwnt_rate / 2; down_pos = down_pos + (down_pos * (currwnt_rate / down_pos)) / 2;
} }
// 修改上面的数据,添加Y轴缩放 // 修改上面的数据,添加Y轴缩放
+157 -122
View File
@@ -1,17 +1,17 @@
import path from "path"; import path from 'path'
import { define } from "../../define/define"; import { define } from '../../define/define'
import { Tools } from "../tools"; import { Tools } from '../tools'
import { DEFINE_STRING } from "../../define/define_string"; import { DEFINE_STRING } from '../../define/define_string'
import { get, has } from "lodash"; import { get, has } from 'lodash'
const util = require('util'); const util = require('util')
const { spawn, exec } = require('child_process'); const { spawn, exec } = require('child_process')
const execAsync = util.promisify(exec); const execAsync = util.promisify(exec)
const fspromises = require("fs").promises; const fspromises = require('fs').promises
export class PublicMethod { export class PublicMethod {
constructor(global) { constructor(global) {
this.global = global; this.global = global
this.tools = new Tools(); this.tools = new Tools()
} }
/** /**
@@ -21,35 +21,34 @@ export class PublicMethod {
*/ */
async SaveConfigJsonProperty(value) { async SaveConfigJsonProperty(value) {
try { try {
let data = value[0]; let data = value[0]
let property = value[1]; let property = value[1]
let parse = value[2]; let parse = value[2]
if (parse) { if (parse) {
data = JSON.parse(value[0]) data = JSON.parse(value[0])
} }
let json_path = path.join(global.config.project_path, "scripts/config.json"); let json_path = path.join(global.config.project_path, 'scripts/config.json')
// 判断文件是不是存在 // 判断文件是不是存在
let isExit = await this.tools.checkExists(json_path); let isExit = await this.tools.checkExists(json_path)
let json_data = {}; let json_data = {}
if (!isExit) { if (!isExit) {
const dirPath = path.dirname(json_path); const dirPath = path.dirname(json_path)
await fspromises.mkdir(dirPath, { recursive: true }); await fspromises.mkdir(dirPath, { recursive: true })
await fspromises.writeFile(json_path, '{}'); await fspromises.writeFile(json_path, '{}')
} } else {
else { const o_data = await fspromises.readFile(json_path, 'utf8')
const o_data = await fspromises.readFile(json_path, 'utf8');
// 将读取的 JSON 字符串转换为 JavaScript 对象 // 将读取的 JSON 字符串转换为 JavaScript 对象
let obj = JSON.parse(o_data); let obj = JSON.parse(o_data)
json_data = obj; json_data = obj
} }
json_data[property] = data; json_data[property] = data
await fspromises.writeFile(json_path, JSON.stringify(json_data)); await fspromises.writeFile(json_path, JSON.stringify(json_data))
return { return {
code: 1 code: 1
} }
} catch (error) { } catch (error) {
throw error; throw error
} }
} }
@@ -62,14 +61,19 @@ export class PublicMethod {
async GetConfigJson(value, ckeck = true) { async GetConfigJson(value, ckeck = true) {
try { try {
value = JSON.parse(value) value = JSON.parse(value)
let srt_config_path = path.join(global.config.project_path, "scripts/config.json"); let srt_config_path = path.join(global.config.project_path, 'scripts/config.json')
let data = await this.tools.getJsonFilePropertyValue(srt_config_path, value[0], value[1], ckeck); let data = await this.tools.getJsonFilePropertyValue(
srt_config_path,
value[0],
value[1],
ckeck
)
return { return {
code: 1, code: 1,
data: data data: data
} }
} catch (error) { } catch (error) {
throw error; throw error
} }
} }
@@ -78,33 +82,41 @@ export class PublicMethod {
* @param {传入的要修改的数据数组} value * @param {传入的要修改的数据数组} value
*/ */
async ModifyImageTaskList(value) { async ModifyImageTaskList(value) {
this.global.fileQueue.enqueue(async () => { this.global.fileQueue.enqueue(
async () => {
try { try {
let task_list_path = path.join(this.global.config.project_path, "scripts/task_list.json"); let task_list_path = path.join(this.global.config.project_path, 'scripts/task_list.json')
let isE = await this.tools.checkExists(task_list_path); let isE = await this.tools.checkExists(task_list_path)
if (!isE) { if (!isE) {
throw new Error("任务队列文件不存在。请先添加 批次任务"); throw new Error('任务队列文件不存在。请先添加 批次任务')
} }
let task_list_json = JSON.parse(await fspromises.readFile(task_list_path, "utf-8")); let task_list_json = JSON.parse(await fspromises.readFile(task_list_path, 'utf-8'))
// 循环循环数据。修改 // 循环循环数据。修改
for (let i = 0; i < value.length; i++) { for (let i = 0; i < value.length; i++) {
const element = value[i]; const element = value[i]
let index = task_list_json.task_list.findIndex(item => item.id == element.id); let index = task_list_json.task_list.findIndex((item) => item.id == element.id)
task_list_json.task_list[index] = element; task_list_json.task_list[index] = element
} }
await fspromises.writeFile(task_list_path, JSON.stringify(task_list_json)); await fspromises.writeFile(task_list_path, JSON.stringify(task_list_json))
} catch (error) { } catch (error) {
throw error; throw error
} }
}, "modifyFile", "modifyFile", "task_list") },
this.global.fileQueue.setSubBatchCompletionCallback("modifyFile", "task_list", async (failedTasks) => { 'modifyFile',
'modifyFile',
'task_list'
)
this.global.fileQueue.setSubBatchCompletionCallback(
'modifyFile',
'task_list',
async (failedTasks) => {
// 报错 // 报错
if (failedTasks.length > 0) { if (failedTasks.length > 0) {
let message = ""; let message = ''
failedTasks.forEach(({ taskId, error }) => { failedTasks.forEach(({ taskId, error }) => {
message += `${taskId}-, \n 错误信息: ${error}` + '\n'; message += `${taskId}-, \n 错误信息: ${error}` + '\n'
}); })
throw new Error(message); throw new Error(message)
// this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { // this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, {
// code: 0, // code: 0,
// message: message // message: message
@@ -116,10 +128,10 @@ export class PublicMethod {
// message: "修改成功" // message: "修改成功"
// }) // })
// } // }
return true; return true
}) }
)
} }
/** /**
* 高清指定的文件夹 * 高清指定的文件夹
@@ -127,41 +139,43 @@ export class PublicMethod {
*/ */
async ImproveFolder(folder) { async ImproveFolder(folder) {
try { try {
let bakPath = path.join(this.global.config.project_path, "tmp/bak"); let bakPath = path.join(this.global.config.project_path, 'tmp/bak')
let oldInput = path.join(this.global.config.project_path, "tmp/" + folder); let oldInput = path.join(this.global.config.project_path, 'tmp/' + folder)
let newInput = path.join(this.global.config.project_path, "tmp/bak/" + folder) let newInput = path.join(this.global.config.project_path, 'tmp/bak/' + folder)
// 创建文件夹 // 创建文件夹
let existFolder = await this.tools.checkExists(bakPath); let existFolder = await this.tools.checkExists(bakPath)
if (!existFolder) { if (!existFolder) {
await fspromises.mkdir(bakPath, { recursive: true }); await fspromises.mkdir(bakPath, { recursive: true })
} }
let isExistNewFolder = await this.tools.checkExists(newInput); let isExistNewFolder = await this.tools.checkExists(newInput)
if (isExistNewFolder) { if (isExistNewFolder) {
await fspromises.rm(newInput, { recursive: true, force: true }); await fspromises.rm(newInput, { recursive: true, force: true })
} }
// 备份文件 // 备份文件
await fspromises.rename(oldInput, newInput); await fspromises.rename(oldInput, newInput)
//创建同名的文件,用作输出 //创建同名的文件,用作输出
await fspromises.mkdir(oldInput, { recursive: true }); await fspromises.mkdir(oldInput, { recursive: true })
// 开始高清 // 开始高清
let command = `"${path.join(define.package_path, "Improve/rnv.exe")}" -i "${newInput}" -o "${oldInput}"`; let command = `"${path.join(
let out = await execAsync(command, { maxBuffer: 1024 * 1024 * 10, encoding: 'utf-8' }); define.package_path,
console.log(out); 'Improve/rnv.exe'
await this.ModifyTaskStatus('out_folder', folder, "video_improvied"); )}" -i "${newInput}" -o "${oldInput}" -s ${this.global.config.hdScale ?? 2}`
let out = await execAsync(command, { maxBuffer: 1024 * 1024 * 10, encoding: 'utf-8' })
console.log(out)
await this.ModifyTaskStatus('out_folder', folder, 'video_improvied')
this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, { this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, {
out_folder: folder, out_folder: folder,
status: "video_improvied" status: 'video_improvied'
}) })
} catch (error) { } catch (error) {
await this.ModifyTaskStatus('out_folder', folder, "video_improvie_error"); await this.ModifyTaskStatus('out_folder', folder, 'video_improvie_error')
this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, { this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, {
out_folder: folder, out_folder: folder,
status: "video_improvie_error" status: 'video_improvie_error'
}) })
throw error; throw error
} }
} }
@@ -171,30 +185,39 @@ export class PublicMethod {
async AddWebuiJson() { async AddWebuiJson() {
try { try {
// 读取所有txt文件 // 读取所有txt文件
let txtfile = await this.tools.getFilesWithExtensions(path.join(this.global.config.project_path, 'tmp/input_crop'), '.txt'); let txtfile = await this.tools.getFilesWithExtensions(
let image = await this.tools.getFilesWithExtensions(path.join(this.global.config.project_path, 'tmp/input_crop'), '.png'); path.join(this.global.config.project_path, 'tmp/input_crop'),
let promptJson = await this.tools.getFilesWithExtensions(path.join(this.global.config.project_path, 'tmp/input_crop'), '.json'); '.txt'
)
let image = await this.tools.getFilesWithExtensions(
path.join(this.global.config.project_path, 'tmp/input_crop'),
'.png'
)
let promptJson = await this.tools.getFilesWithExtensions(
path.join(this.global.config.project_path, 'tmp/input_crop'),
'.json'
)
// json 已经存在,不做后续处理 // json 已经存在,不做后续处理
if (image.length == promptJson.length) { if (image.length == promptJson.length) {
return { return {
code: 1, code: 1
} }
} }
if (txtfile.length != image.length) { if (txtfile.length != image.length) {
throw new Error("关键词文件和图片数量对不上,请检查!!") throw new Error('关键词文件和图片数量对不上,请检查!!')
} }
let sd_config = JSON.parse(await fspromises.readFile(define.sd_setting, 'utf-8')); let sd_config = JSON.parse(await fspromises.readFile(define.sd_setting, 'utf-8'))
for (let i = 0; i < image.length; i++) { for (let i = 0; i < image.length; i++) {
const element = image[i]; const element = image[i]
let txtpath = element.split('.png')[0] + '.txt'; let txtpath = element.split('.png')[0] + '.txt'
let prompt = await fspromises.readFile(txtpath, 'utf-8'); let prompt = await fspromises.readFile(txtpath, 'utf-8')
// console.log(txtpath) // console.log(txtpath)
let obj = {} let obj = {}
obj.model = sd_config.setting.type; obj.model = sd_config.setting.type
obj.api = sd_config.setting.webui_api_url + 'sdapi/v1/img2img'; obj.api = sd_config.setting.webui_api_url + 'sdapi/v1/img2img'
obj.webui_config = { obj.webui_config = {
sampler_name: sd_config.webui.sampler_name, sampler_name: sd_config.webui.sampler_name,
prompt: prompt + ',' + sd_config.webui.prompt, prompt: prompt + ',' + sd_config.webui.prompt,
@@ -206,22 +229,21 @@ export class PublicMethod {
width: sd_config.webui.width, width: sd_config.webui.width,
height: sd_config.webui.height, height: sd_config.webui.height,
seed: sd_config.setting.seed, seed: sd_config.setting.seed,
init_images: element, init_images: element
} }
obj.adetailer = sd_config.webui.adetailer; obj.adetailer = sd_config.webui.adetailer
// 写入 // 写入
await fspromises.writeFile(element + '.json', JSON.stringify(obj)); await fspromises.writeFile(element + '.json', JSON.stringify(obj))
// 删除对应的txt文件 // 删除对应的txt文件
await fspromises.unlink(txtpath); await fspromises.unlink(txtpath)
} }
return { return {
code: 1, code: 1
} }
} catch (error) { } catch (error) {
throw error; throw error
} }
} }
@@ -230,15 +252,15 @@ export class PublicMethod {
*/ */
async GetImageTask() { async GetImageTask() {
try { try {
let json_path = path.join(this.global.config.project_path, "scripts/task_list.json"); let json_path = path.join(this.global.config.project_path, 'scripts/task_list.json')
let isExit = await this.tools.checkExists(json_path); let isExit = await this.tools.checkExists(json_path)
if (!isExit) { if (!isExit) {
return { return {
code: 1, code: 1,
data: null data: null
} }
} }
let json_data = JSON.parse(await fspromises.readFile(json_path)); let json_data = JSON.parse(await fspromises.readFile(json_path))
return { return {
code: 1, code: 1,
data: json_data data: json_data
@@ -251,7 +273,6 @@ export class PublicMethod {
} }
} }
/** /**
* 修改任务的状态 * 修改任务的状态
* @param {查找的类型 id out_folder} type * @param {查找的类型 id out_folder} type
@@ -259,48 +280,63 @@ export class PublicMethod {
* @param {新的状态} newStatus * @param {新的状态} newStatus
*/ */
async ModifyTaskStatus(type, id, newStatus) { async ModifyTaskStatus(type, id, newStatus) {
this.global.fileQueue.enqueue(async () => { this.global.fileQueue.enqueue(
async () => {
try { try {
// 将修改数据写入到一个并发为 1 的队列中 // 将修改数据写入到一个并发为 1 的队列中
let tmp_task = await fspromises.readFile(path.join(this.global.config.project_path, 'scripts/task_list.json'), 'utf-8'); let tmp_task = await fspromises.readFile(
path.join(this.global.config.project_path, 'scripts/task_list.json'),
'utf-8'
)
console.log(tmp_task) console.log(tmp_task)
let task = JSON.parse(tmp_task); let task = JSON.parse(tmp_task)
if (type == "id") { if (type == 'id') {
let index = task.task_list.findIndex(item => item.id == id); let index = task.task_list.findIndex((item) => item.id == id)
if (index < 0) { if (index < 0) {
throw new Error("传入的数据未找到"); throw new Error('传入的数据未找到')
} else { } else {
task.task_list[index].status = newStatus; task.task_list[index].status = newStatus
} }
} else if (type == "out_folder") { } else if (type == 'out_folder') {
let index = task.task_list.findIndex(item => item.out_folder == id); let index = task.task_list.findIndex((item) => item.out_folder == id)
if (index < 0) { if (index < 0) {
throw new Error("传入的数据未找到"); throw new Error('传入的数据未找到')
} else { } else {
task.task_list[index].status = newStatus; task.task_list[index].status = newStatus
} }
} else { } else {
throw new Error("输入类型错误") throw new Error('输入类型错误')
} }
await fspromises.writeFile(path.join(this.global.config.project_path, 'scripts/task_list.json'), JSON.stringify(task)); await fspromises.writeFile(
path.join(this.global.config.project_path, 'scripts/task_list.json'),
JSON.stringify(task)
)
} catch (error) { } catch (error) {
throw error; throw error
} }
}, "modifyFile", "modifyFile", "task_list") },
this.global.fileQueue.setSubBatchCompletionCallback("modifyFile", "task_list", async (failedTasks) => { 'modifyFile',
'modifyFile',
'task_list'
)
this.global.fileQueue.setSubBatchCompletionCallback(
'modifyFile',
'task_list',
async (failedTasks) => {
// 报错 // 报错
if (failedTasks.length > 0) { if (failedTasks.length > 0) {
let message = ""; let message = ''
failedTasks.forEach(({ taskId, error }) => { failedTasks.forEach(({ taskId, error }) => {
message += `${taskId}-, \n 错误信息: ${error}` + '\n'; message += `${taskId}-, \n 错误信息: ${error}` + '\n'
}); })
this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, {
code: 0, code: 0,
message: message message: message
}) })
} }
}) }
)
} }
/** /**
@@ -313,23 +349,22 @@ export class PublicMethod {
async getSubFolderList(parentFolder, condition, value) { async getSubFolderList(parentFolder, condition, value) {
try { try {
// console.log(value); // console.log(value);
let folders = await fspromises.readdir(parentFolder, { withFileTypes: true }); let folders = await fspromises.readdir(parentFolder, { withFileTypes: true })
folders = folders.filter(item => item.isDirectory()) folders = folders.filter((item) => item.isDirectory()).map((item) => item.name)
.map(item => item.name)
if (condition == "start") { if (condition == 'start') {
folders = folders.filter(item => item.startsWith(value)); folders = folders.filter((item) => item.startsWith(value))
} else if (condition == "end") { } else if (condition == 'end') {
folders = folders.filter(item => item.endsWith(value)); folders = folders.filter((item) => item.endsWith(value))
} else if (condition == "include") { } else if (condition == 'include') {
//包含过滤 //包含过滤
folders = folders.filter(item => item.includes(value)); folders = folders.filter((item) => item.includes(value))
} else { } else {
throw new Error("条件参数错误"); throw new Error('条件参数错误')
} }
return folders; return folders
} catch (error) { } catch (error) {
throw error; throw error
} }
} }
} }
+17 -8
View File
@@ -1,13 +1,12 @@
import { BookType, OperateBookType, TagDefineType } from '../../../define/enum/bookEnum' import { BookType } from '../../../define/enum/bookEnum'
import { errorMessage, successMessage } from '../../Public/generalTools' import { errorMessage, successMessage } from '../../Public/generalTools'
import { BookService } from '../../../define/db/service/Book/bookService' import { BookService } from '../../../define/db/service/Book/bookService'
import path from 'path' import path from 'path'
import { CheckFileOrDirExist, CheckFolderExistsOrCreate, CopyFileOrFolder, DeleteFolderAllFile, GetSubdirectories } from '../../../define/Tools/file' import { CheckFileOrDirExist, DeleteFolderAllFile, GetSubdirectories } from '../../../define/Tools/file'
import { GeneralResponse } from '../../../model/generalResponse' import { GeneralResponse } from '../../../model/generalResponse'
import { BookServiceBasic } from '../ServiceBasic/bookServiceBasic' import { BookServiceBasic } from '../ServiceBasic/bookServiceBasic'
import { BookTask } from './bookTask' import { BookTask } from './bookTask'
import fs from 'fs' import { Book } from '../../../model/book/book'
import { Book } from '../../../model/book'
export class BookBasic { export class BookBasic {
bookServiceBasic: BookServiceBasic bookServiceBasic: BookServiceBasic
@@ -101,9 +100,14 @@ export class BookBasic {
try { try {
let book = await this.bookServiceBasic.GetBookDataById(bookId) let book = await this.bookServiceBasic.GetBookDataById(bookId)
// 获取所有的小说批次 // 获取所有的小说批次
let bookTasks = (await this.bookServiceBasic.GetBookTaskData({ let bookTasksObj = (await this.bookServiceBasic.GetBookTaskData({
bookId: bookId bookId: bookId
})).bookTasks; }, true));
// 删除之前判断是不是有子批次 没有直接退出
let bookTasks = bookTasksObj.bookTasks;
if (bookTasks.length == 0) {
return successMessage('未找到小说批次数据,正常退出', 'BookBasic_ResetBookData');
}
// 重置批次任务 // 重置批次任务
for (let i = 0; i < bookTasks.length; i++) { for (let i = 0; i < bookTasks.length; i++) {
const element = bookTasks[i]; const element = bookTasks[i];
@@ -179,14 +183,19 @@ export class BookBasic {
if (resetRes.code == 0) { if (resetRes.code == 0) {
throw new Error(resetRes.message) throw new Error(resetRes.message)
} }
let bookTasks = (await this.bookServiceBasic.GetBookTaskData({ let bookTasksObj = (await this.bookServiceBasic.GetBookTaskData({
bookId: bookId bookId: bookId
})).bookTasks; }, true))
let bookTasks = bookTasksObj.bookTasks;
// 有数据才删除
if (bookTasks.length > 0) {
// 删除遗留重置的小说批次任务 // 删除遗留重置的小说批次任务
for (let i = 0; i < bookTasks.length; i++) { for (let i = 0; i < bookTasks.length; i++) {
const element = bookTasks[i]; const element = bookTasks[i];
await this.bookServiceBasic.DeleteBookTaskData(element.id); await this.bookServiceBasic.DeleteBookTaskData(element.id);
} }
}
// 开始删除数据 // 开始删除数据
await this.bookServiceBasic.DeleteBookData(bookId); await this.bookServiceBasic.DeleteBookData(bookId);

Some files were not shown because too many files have changed in this diff Show More