Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cb7d0dd23e | ||
|
|
683087d15e | ||
|
|
82ec437b5d | ||
|
|
c1d6fe181d | ||
|
|
12e1da5681 | ||
|
|
87d3b7fc17 | ||
|
|
7a774c48da | ||
|
|
50900d3465 | ||
|
|
4f61785cb0 | ||
|
|
bf4b488a02 | ||
|
|
863ac4d7f4 | ||
|
|
c43abd6908 | ||
|
|
927dd14574 | ||
|
|
6336b36ead | ||
|
|
77ee38d302 | ||
|
|
03d3ff7e9d | ||
|
|
6cf1e7df5b | ||
|
|
b0eb7795e4 | ||
|
|
1ce665a3e5 | ||
|
|
d595e932e3 | ||
|
|
597adaa75a | ||
|
|
60a80770e2 | ||
|
|
f17de033e1 | ||
|
|
6fa58e4d94 | ||
|
|
51deef0c09 | ||
|
|
22cfe65dde | ||
|
|
0c5988ed41 | ||
|
|
f4d042f699 | ||
|
|
efa8d3b2a2 | ||
|
|
224ee47984 | ||
|
|
92c1d99efd |
@@ -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/*
|
||||||
|
|||||||
@@ -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 进行
|
||||||
|
})
|
||||||
|
]
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "laitool",
|
"name": "laitool",
|
||||||
"version": "3.1.3",
|
"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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 566 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 1011 KiB |
|
After Width: | Height: | Size: 1011 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 1011 KiB |
|
After Width: | Height: | Size: 5.3 MiB |
|
After Width: | Height: | Size: 5.0 MiB |
|
After Width: | Height: | Size: 5.7 MiB |
|
After Width: | Height: | Size: 5.6 MiB |
|
After Width: | Height: | Size: 5.4 MiB |
@@ -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
|
||||||
|
|||||||
@@ -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',
|
||||||
)
|
)
|
||||||
@@ -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:
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
@echo off
|
|
||||||
pyinstaller -F --upx-dir="C:\\Users\\27698\\Desktop\\upx-4.2.4-win64\upx.exe" lama_inpaint.py
|
|
||||||
@@ -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))
|
|
||||||
@@ -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,
|
|
||||||
)
|
|
||||||
@@ -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
|
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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 // 文件或目录不存在
|
||||||
|
|||||||
@@ -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
|
||||||
};
|
};
|
||||||
@@ -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('数据解析失败,请检查数据格式')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -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 }
|
|
||||||
@@ -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 }
|
||||||
@@ -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 []
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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?',
|
||||||
|
|||||||
@@ -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'
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -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'
|
||||||
|
|||||||
@@ -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 {
|
||||||
@@ -131,6 +132,17 @@ export class BookBackTaskListService extends BaseRealmService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取指定状态的任务数量
|
||||||
|
*/
|
||||||
|
GetAllStatusTaskCount(status: BookBackTaskStatus[]): number {
|
||||||
|
let taskLength = this.realm
|
||||||
|
.objects<BookBackTaskList>('BookBackTaskList').filtered(
|
||||||
|
'status == $0', status
|
||||||
|
).length;
|
||||||
|
return taskLength;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 新增一个小说相关的后台任务队列
|
* 新增一个小说相关的后台任务队列
|
||||||
* @param bookBackTask 要添加的小说数据
|
* @param bookBackTask 要添加的小说数据
|
||||||
@@ -248,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
|
||||||
* 上面的条件,至少要有一个
|
* 上面的条件,至少要有一个
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -144,7 +186,10 @@ export class BookTaskDetailService extends BaseRealmService {
|
|||||||
bookTaskDetail.imageLock = false
|
bookTaskDetail.imageLock = false
|
||||||
bookTaskDetail.createTime = new Date()
|
bookTaskDetail.createTime = new Date()
|
||||||
bookTaskDetail.updateTime = new Date()
|
bookTaskDetail.updateTime = new Date()
|
||||||
bookTaskDetail.adetailer = false // 先写死false
|
|
||||||
|
if (!bookTaskDetail.hasOwnProperty('adetailer')) {
|
||||||
|
bookTaskDetail.adetailer = false; // 设置默认值
|
||||||
|
}
|
||||||
// 开始添加
|
// 开始添加
|
||||||
this.transaction(() => {
|
this.transaction(() => {
|
||||||
this.realm.create('BookTaskDetail', bookTaskDetail)
|
this.realm.create('BookTaskDetail', bookTaskDetail)
|
||||||
@@ -174,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()
|
||||||
})
|
})
|
||||||
@@ -210,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
|
||||||
@@ -241,7 +323,7 @@ export class BookTaskDetailService extends BaseRealmService {
|
|||||||
* 删除满足条件的对象吗,必传小说ID和小说任务ID
|
* 删除满足条件的对象吗,必传小说ID和小说任务ID
|
||||||
* @param condition bookId,bookTaskId,name,id
|
* @param condition bookId,bookTaskId,name,id
|
||||||
*/
|
*/
|
||||||
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 = {
|
||||||
|
...item
|
||||||
|
}
|
||||||
|
return cloneDeep(resObj)
|
||||||
|
})
|
||||||
|
mjSetting = resData[0] as OptionModel.OptionItem
|
||||||
|
|
||||||
let resMjSetting = Array.from(mjSettings).map((mjSetting) => {
|
if (!ValidateJson(mjSetting.value)) {
|
||||||
return {
|
throw new Error('MJ设置的数据格式不正确,请检查数据格式')
|
||||||
...mjSetting
|
|
||||||
}
|
}
|
||||||
})
|
return JSON.parse(mjSetting.value)?.mj_simpleSetting
|
||||||
|
|
||||||
return successMessage(resMjSetting, '获取MJ基础设置成功', 'MJSettingService_getMjSetting')
|
} 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
|
||||||
}
|
}
|
||||||
// 判断当前全局是不是又当前这个
|
// 判断当前全局是不是又当前这个
|
||||||
|
|||||||
@@ -1,151 +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'),
|
|
||||||
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'),
|
|
||||||
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 }
|
|
||||||
@@ -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
|
||||||
@@ -1,4 +1,23 @@
|
|||||||
|
import { SYSTEM } from "./systemDefineString"
|
||||||
|
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,
|
||||||
|
AXIOS : AXIOS,
|
||||||
|
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',
|
||||||
@@ -81,7 +100,6 @@ export const DEFINE_STRING = {
|
|||||||
GET_ADETAILER_LIST: 'GET_ADETAILER_LIST',
|
GET_ADETAILER_LIST: 'GET_ADETAILER_LIST',
|
||||||
SAVE_DETAILER_CONFIG: 'SAVE_DETAILER_CONFIG',
|
SAVE_DETAILER_CONFIG: 'SAVE_DETAILER_CONFIG',
|
||||||
OPEN_URL: 'OPEN_URL',
|
OPEN_URL: 'OPEN_URL',
|
||||||
GET_VERSION: 'GET_VERSION',
|
|
||||||
GET_FRAME_RETUN: 'GET_FRAME_RETUN',
|
GET_FRAME_RETUN: 'GET_FRAME_RETUN',
|
||||||
DOWNLOAD_MODEL: 'DOWNLOAD_MODEL',
|
DOWNLOAD_MODEL: 'DOWNLOAD_MODEL',
|
||||||
START_STORY_BOARDING: 'START_STORY_BOARDING',
|
START_STORY_BOARDING: 'START_STORY_BOARDING',
|
||||||
@@ -217,140 +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',
|
|
||||||
|
|
||||||
GET_COPYWRITING: 'GET_COPYWRITING',
|
|
||||||
GET_COPYWRITING_RETURN: 'GET_COPYWRITING_RETURN',
|
|
||||||
|
|
||||||
REMOVE_WATERMARK: 'REMOVE_WATERMARK',
|
|
||||||
REMOVE_WATERMARK_RETURN: 'REMOVE_WATERMARK_RETURN',
|
|
||||||
|
|
||||||
SPLI_TAUDIO: 'SPLI_TAUDIO',
|
|
||||||
SPLI_TAUDIO_RETURN: 'SPLI_TAUDIO_RETURN',
|
|
||||||
|
|
||||||
ADD_REVERSE_PROMPT: 'ADD_REVERSE_PROMPT',
|
|
||||||
},
|
|
||||||
SYSTEM: {
|
|
||||||
OPEN_FILE: 'OPEN_FILE',
|
|
||||||
RETURN_LOGGER: 'RETURN_LOGGER'
|
|
||||||
},
|
|
||||||
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',
|
||||||
@@ -369,41 +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"
|
|
||||||
},
|
|
||||||
/**
|
|
||||||
* 后台任务相关
|
|
||||||
*/
|
|
||||||
TASK: {
|
|
||||||
/**
|
|
||||||
* 添加单个后台任务
|
|
||||||
*/
|
|
||||||
ADD_BOOK_BACK_TASK: "ADD_BOOK_BACK_TASK",
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 添加多个后台任务
|
|
||||||
*/
|
|
||||||
ADD_MULTI_BOOK_BACK_TASK: 'ADD_MULTI_BOOK_BACK_TASK'
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
export const SYSTEM = {
|
||||||
|
/** 打开文件夹 */
|
||||||
|
OPEN_FILE: 'OPEN_FILE',
|
||||||
|
/** 返回日志写出 */
|
||||||
|
RETURN_LOGGER: 'RETURN_LOGGER',
|
||||||
|
/** 获取版本信息和显卡信息 */
|
||||||
|
GET_VISION_AND_GPU_MESSAGE: 'GET_VISION_AND_GPU_MESSAGE',
|
||||||
|
/** 获取机器码 */
|
||||||
|
GET_MACHINE_ID: "GET_MACHINE_ID",
|
||||||
|
/** 检查机器码状态 */
|
||||||
|
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",
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
|
||||||
|
const TASK = {
|
||||||
|
/** 启动后台任务 */
|
||||||
|
START_BACK_TASK: "START_BACK_TASK",
|
||||||
|
/** 添加单个后台任务 */
|
||||||
|
ADD_BOOK_BACK_TASK: "ADD_BOOK_BACK_TASK",
|
||||||
|
/** 添加多个后台任务 */
|
||||||
|
ADD_MULTI_BOOK_BACK_TASK: 'ADD_MULTI_BOOK_BACK_TASK',
|
||||||
|
/** 获取等待中的任务 */
|
||||||
|
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;
|
||||||
@@ -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
|
||||||
@@ -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'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
// 角色
|
// 角色
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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;
|
||||||
@@ -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',
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.js'
|
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()
|
||||||
}
|
}
|
||||||
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
import { ipcMain } from 'electron'
|
|
||||||
import { DEFINE_STRING } from '../../define/define_string'
|
|
||||||
import { CheckFileOrDirExist } from '../../define/Tools/file'
|
|
||||||
import { errorMessage, successMessage } from '../Public/generalTools'
|
|
||||||
import path from 'path'
|
|
||||||
const { shell } = require('electron')
|
|
||||||
|
|
||||||
function SystemIpc() {
|
|
||||||
// 打开指定的文件
|
|
||||||
ipcMain.on(DEFINE_STRING.SYSTEM.OPEN_FILE, async (event, value) => {
|
|
||||||
await shell.openPath(value)
|
|
||||||
})
|
|
||||||
|
|
||||||
// 试用文件资源打开指定的文件夹
|
|
||||||
ipcMain.handle(DEFINE_STRING.OPEN_FOLDER, async (event, value) => {
|
|
||||||
try {
|
|
||||||
let openFolder = null
|
|
||||||
if (value.baseProject) {
|
|
||||||
openFolder = path.join(global.config.project_path, value.folderPath)
|
|
||||||
}
|
|
||||||
if (value.dirFloder) {
|
|
||||||
openFolder = path.dirname(value.folderPath)
|
|
||||||
}
|
|
||||||
if (!openFolder) {
|
|
||||||
openFolder = value.folderPath
|
|
||||||
}
|
|
||||||
// 判断文件夹是不是存在
|
|
||||||
let isExist = await CheckFileOrDirExist(openFolder)
|
|
||||||
if (!isExist) {
|
|
||||||
throw new Error('文件夹不存在,请检查')
|
|
||||||
}
|
|
||||||
shell.openPath(openFolder)
|
|
||||||
return successMessage(null, '打开成功')
|
|
||||||
} catch (error) {
|
|
||||||
return errorMessage('打开文件夹错误,错误信息如下:' + error.message, 'SystemIpc_OPEN_FOLDER')
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
export { SystemIpc }
|
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
import { ipcMain } from 'electron'
|
||||||
|
import { DEFINE_STRING } from '../../define/define_string'
|
||||||
|
import { CheckFileOrDirExist } from '../../define/Tools/file'
|
||||||
|
import { errorMessage, successMessage } from '../Public/generalTools'
|
||||||
|
import path from 'path'
|
||||||
|
import { shell } from 'electron'
|
||||||
|
import SystemInfo from '../Service/system/systeminfo'
|
||||||
|
import ElectronInterface, { OpenFolderParams } from '../Service/system/electronInterface'
|
||||||
|
|
||||||
|
const systemInfo = new SystemInfo();
|
||||||
|
const electronInterface = new ElectronInterface()
|
||||||
|
|
||||||
|
function SystemIpc() {
|
||||||
|
/**打开指定的文件 */
|
||||||
|
ipcMain.on(DEFINE_STRING.SYSTEM.OPEN_FILE, async (event, value) => {
|
||||||
|
await shell.openPath(value)
|
||||||
|
})
|
||||||
|
/**试用文件资源打开指定的文件夹 */
|
||||||
|
ipcMain.handle(DEFINE_STRING.OPEN_FOLDER, async (event, value: OpenFolderParams) => await electronInterface.OpenFolder(value))
|
||||||
|
/**
|
||||||
|
* 获取指定的版本好电脑的CPU
|
||||||
|
* 判断获取时间是不是超过一天,如果超过一天就重新获取
|
||||||
|
*/
|
||||||
|
ipcMain.handle(DEFINE_STRING.SYSTEM.GET_VISION_AND_GPU_MESSAGE, async (event) => await systemInfo.GetViosionAndGpuMessage())
|
||||||
|
/**获取系统的机器码 */
|
||||||
|
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.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 }
|
||||||
@@ -2,12 +2,18 @@ import { ipcMain } from "electron"
|
|||||||
import { BookServiceBasic } from "../Service/ServiceBasic/bookServiceBasic"
|
import { BookServiceBasic } from "../Service/ServiceBasic/bookServiceBasic"
|
||||||
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 { BookBackTaskType, TaskExecuteType } from "../../define/enum/bookEnum";
|
import { BookBackTaskStatus, BookBackTaskType, TaskExecuteType } from "../../define/enum/bookEnum";
|
||||||
|
|
||||||
let bookServiceBasic = new BookServiceBasic();
|
let bookServiceBasic = new BookServiceBasic();
|
||||||
|
import BackTaskService from '../Service/task/backTaskService'
|
||||||
|
import { TaskModal } from "@/model/task";
|
||||||
|
import { Book } from "@/model/book/book";
|
||||||
|
const backTaskService = new BackTaskService()
|
||||||
|
|
||||||
function TaskIpc() {
|
function TaskIpc() {
|
||||||
|
|
||||||
|
ipcMain.handle(DEFINE_STRING.TASK.START_BACK_TASK, async (event, isGiveUp: boolean) => await backTaskService.StartBackTask(isGiveUp))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 添加后台任务,单个
|
* 添加后台任务,单个
|
||||||
*/
|
*/
|
||||||
@@ -34,6 +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_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 }
|
||||||
@@ -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(
|
||||||
|
|||||||
@@ -351,27 +351,59 @@ export class Translate {
|
|||||||
content: translateData
|
content: translateData
|
||||||
})
|
})
|
||||||
|
|
||||||
let config = {
|
let content = ''
|
||||||
method: 'post',
|
// 判断整体是不是需要LMS转发
|
||||||
maxBodyLength: Infinity,
|
if (global.config.useTransfer) {
|
||||||
url: this.translationBusiness,
|
let url = define.lms + '/lms/Forward/SimpleTransfer'
|
||||||
headers: {
|
let config = {
|
||||||
'Content-Type': 'application/json',
|
method: 'post',
|
||||||
Authorization: `Bearer ${token}`
|
url: url,
|
||||||
},
|
maxBodyLength: Infinity,
|
||||||
data: JSON.stringify(data)
|
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 = {
|
||||||
|
method: 'post',
|
||||||
|
maxBodyLength: Infinity,
|
||||||
|
url: this.translationBusiness,
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
Authorization: `Bearer ${token}`
|
||||||
|
},
|
||||||
|
data: JSON.stringify(data)
|
||||||
|
}
|
||||||
|
let res = await RetryWithBackoff(
|
||||||
|
async () => {
|
||||||
|
return await axios.request(config)
|
||||||
|
},
|
||||||
|
5,
|
||||||
|
2000
|
||||||
|
)
|
||||||
|
// 将返回的数据进行拼接数据处理
|
||||||
|
content = GetOpenAISuccessResponse(res.data)
|
||||||
}
|
}
|
||||||
let res = await RetryWithBackoff(
|
|
||||||
async () => {
|
|
||||||
return await axios.request(config)
|
|
||||||
},
|
|
||||||
5,
|
|
||||||
2000
|
|
||||||
)
|
|
||||||
// 将返回的数据进行拼接数据处理
|
|
||||||
|
|
||||||
let res_data = []
|
let res_data = []
|
||||||
let content = GetOpenAISuccessResponse(res.data)
|
|
||||||
|
|
||||||
if (to == 'zh') {
|
if (to == 'zh') {
|
||||||
res_data.push({
|
res_data.push({
|
||||||
|
|||||||
@@ -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轴缩放
|
||||||
|
|||||||
@@ -1,335 +1,370 @@
|
|||||||
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()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改config.json文件中的指定的属性
|
||||||
|
* @param {*} value 0: 要修改的数据 1: 要修改的属性 2: 是否需要解析
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
async SaveConfigJsonProperty(value) {
|
||||||
|
try {
|
||||||
|
let data = value[0]
|
||||||
|
let property = value[1]
|
||||||
|
let parse = value[2]
|
||||||
|
if (parse) {
|
||||||
|
data = JSON.parse(value[0])
|
||||||
|
}
|
||||||
|
let json_path = path.join(global.config.project_path, 'scripts/config.json')
|
||||||
|
// 判断文件是不是存在
|
||||||
|
let isExit = await this.tools.checkExists(json_path)
|
||||||
|
let json_data = {}
|
||||||
|
if (!isExit) {
|
||||||
|
const dirPath = path.dirname(json_path)
|
||||||
|
await fspromises.mkdir(dirPath, { recursive: true })
|
||||||
|
await fspromises.writeFile(json_path, '{}')
|
||||||
|
} else {
|
||||||
|
const o_data = await fspromises.readFile(json_path, 'utf8')
|
||||||
|
// 将读取的 JSON 字符串转换为 JavaScript 对象
|
||||||
|
let obj = JSON.parse(o_data)
|
||||||
|
json_data = obj
|
||||||
|
}
|
||||||
|
json_data[property] = data
|
||||||
|
|
||||||
|
await fspromises.writeFile(json_path, JSON.stringify(json_data))
|
||||||
|
return {
|
||||||
|
code: 1
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
throw error
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改config.json文件中的指定的属性
|
* 返回当前项目的config.json文件中的指定的属性信息,若是没有传入属性,则返回所有的信息
|
||||||
* @param {*} value 0: 要修改的数据 1: 要修改的属性 2: 是否需要解析
|
* @param {Array} value 0 要获取的属性 1 返回的默认值
|
||||||
* @returns
|
* @param {Boolean} ckeck 是否需要校验属性不存在
|
||||||
*/
|
* @returns
|
||||||
async SaveConfigJsonProperty(value) {
|
*/
|
||||||
|
async GetConfigJson(value, ckeck = true) {
|
||||||
|
try {
|
||||||
|
value = JSON.parse(value)
|
||||||
|
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
|
||||||
|
)
|
||||||
|
return {
|
||||||
|
code: 1,
|
||||||
|
data: data
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改生成图片的任务队列数据
|
||||||
|
* @param {传入的要修改的数据数组} value
|
||||||
|
*/
|
||||||
|
async ModifyImageTaskList(value) {
|
||||||
|
this.global.fileQueue.enqueue(
|
||||||
|
async () => {
|
||||||
try {
|
try {
|
||||||
let data = value[0];
|
let task_list_path = path.join(this.global.config.project_path, 'scripts/task_list.json')
|
||||||
let property = value[1];
|
let isE = await this.tools.checkExists(task_list_path)
|
||||||
let parse = value[2];
|
if (!isE) {
|
||||||
if (parse) {
|
throw new Error('任务队列文件不存在。请先添加 批次任务')
|
||||||
data = JSON.parse(value[0])
|
}
|
||||||
}
|
let task_list_json = JSON.parse(await fspromises.readFile(task_list_path, 'utf-8'))
|
||||||
let json_path = path.join(global.config.project_path, "scripts/config.json");
|
// 循环循环数据。修改
|
||||||
// 判断文件是不是存在
|
for (let i = 0; i < value.length; i++) {
|
||||||
let isExit = await this.tools.checkExists(json_path);
|
const element = value[i]
|
||||||
let json_data = {};
|
let index = task_list_json.task_list.findIndex((item) => item.id == element.id)
|
||||||
if (!isExit) {
|
task_list_json.task_list[index] = element
|
||||||
const dirPath = path.dirname(json_path);
|
}
|
||||||
await fspromises.mkdir(dirPath, { recursive: true });
|
await fspromises.writeFile(task_list_path, JSON.stringify(task_list_json))
|
||||||
await fspromises.writeFile(json_path, '{}');
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
const o_data = await fspromises.readFile(json_path, 'utf8');
|
|
||||||
// 将读取的 JSON 字符串转换为 JavaScript 对象
|
|
||||||
let obj = JSON.parse(o_data);
|
|
||||||
json_data = obj;
|
|
||||||
}
|
|
||||||
json_data[property] = data;
|
|
||||||
|
|
||||||
await fspromises.writeFile(json_path, JSON.stringify(json_data));
|
|
||||||
return {
|
|
||||||
code: 1
|
|
||||||
}
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw error;
|
throw error
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
'modifyFile',
|
||||||
/**
|
'modifyFile',
|
||||||
* 返回当前项目的config.json文件中的指定的属性信息,若是没有传入属性,则返回所有的信息
|
'task_list'
|
||||||
* @param {Array} value 0 要获取的属性 1 返回的默认值
|
)
|
||||||
* @param {Boolean} ckeck 是否需要校验属性不存在
|
this.global.fileQueue.setSubBatchCompletionCallback(
|
||||||
* @returns
|
'modifyFile',
|
||||||
*/
|
'task_list',
|
||||||
async GetConfigJson(value, ckeck = true) {
|
async (failedTasks) => {
|
||||||
try {
|
// 报错
|
||||||
value = JSON.parse(value)
|
if (failedTasks.length > 0) {
|
||||||
let srt_config_path = path.join(global.config.project_path, "scripts/config.json");
|
let message = ''
|
||||||
let data = await this.tools.getJsonFilePropertyValue(srt_config_path, value[0], value[1], ckeck);
|
failedTasks.forEach(({ taskId, error }) => {
|
||||||
return {
|
message += `${taskId}-, \n 错误信息: ${error}` + '\n'
|
||||||
code: 1,
|
})
|
||||||
data: data
|
throw new Error(message)
|
||||||
}
|
// this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, {
|
||||||
} catch (error) {
|
// code: 0,
|
||||||
throw error;
|
// message: message
|
||||||
|
// })
|
||||||
}
|
}
|
||||||
|
// else {
|
||||||
|
// this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, {
|
||||||
|
// code: 1,
|
||||||
|
// message: "修改成功"
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 高清指定的文件夹
|
||||||
|
* @param {要高清的文件夹} folder
|
||||||
|
*/
|
||||||
|
async ImproveFolder(folder) {
|
||||||
|
try {
|
||||||
|
let bakPath = path.join(this.global.config.project_path, 'tmp/bak')
|
||||||
|
let oldInput = path.join(this.global.config.project_path, 'tmp/' + folder)
|
||||||
|
let newInput = path.join(this.global.config.project_path, 'tmp/bak/' + folder)
|
||||||
|
// 创建文件夹
|
||||||
|
let existFolder = await this.tools.checkExists(bakPath)
|
||||||
|
if (!existFolder) {
|
||||||
|
await fspromises.mkdir(bakPath, { recursive: true })
|
||||||
|
}
|
||||||
|
|
||||||
|
let isExistNewFolder = await this.tools.checkExists(newInput)
|
||||||
|
if (isExistNewFolder) {
|
||||||
|
await fspromises.rm(newInput, { recursive: true, force: true })
|
||||||
|
}
|
||||||
|
// 备份文件
|
||||||
|
await fspromises.rename(oldInput, newInput)
|
||||||
|
//创建同名的文件,用作输出
|
||||||
|
await fspromises.mkdir(oldInput, { recursive: true })
|
||||||
|
|
||||||
|
// 开始高清
|
||||||
|
let command = `"${path.join(
|
||||||
|
define.package_path,
|
||||||
|
'Improve/rnv.exe'
|
||||||
|
)}" -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, {
|
||||||
|
out_folder: folder,
|
||||||
|
status: 'video_improvied'
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
await this.ModifyTaskStatus('out_folder', folder, 'video_improvie_error')
|
||||||
|
this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, {
|
||||||
|
out_folder: folder,
|
||||||
|
status: 'video_improvie_error'
|
||||||
|
})
|
||||||
|
throw error
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改生成图片的任务队列数据
|
* 生成SD相对的JSON文件。删除反推的txt文件
|
||||||
* @param {传入的要修改的数据数组} value
|
*/
|
||||||
*/
|
async AddWebuiJson() {
|
||||||
async ModifyImageTaskList(value) {
|
try {
|
||||||
this.global.fileQueue.enqueue(async () => {
|
// 读取所有txt文件
|
||||||
try {
|
let txtfile = await this.tools.getFilesWithExtensions(
|
||||||
let task_list_path = path.join(this.global.config.project_path, "scripts/task_list.json");
|
path.join(this.global.config.project_path, 'tmp/input_crop'),
|
||||||
let isE = await this.tools.checkExists(task_list_path);
|
'.txt'
|
||||||
if (!isE) {
|
)
|
||||||
throw new Error("任务队列文件不存在。请先添加 批次任务");
|
let image = await this.tools.getFilesWithExtensions(
|
||||||
}
|
path.join(this.global.config.project_path, 'tmp/input_crop'),
|
||||||
let task_list_json = JSON.parse(await fspromises.readFile(task_list_path, "utf-8"));
|
'.png'
|
||||||
// 循环循环数据。修改
|
)
|
||||||
for (let i = 0; i < value.length; i++) {
|
let promptJson = await this.tools.getFilesWithExtensions(
|
||||||
const element = value[i];
|
path.join(this.global.config.project_path, 'tmp/input_crop'),
|
||||||
let index = task_list_json.task_list.findIndex(item => item.id == element.id);
|
'.json'
|
||||||
task_list_json.task_list[index] = element;
|
)
|
||||||
}
|
|
||||||
await fspromises.writeFile(task_list_path, JSON.stringify(task_list_json));
|
|
||||||
} catch (error) {
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}, "modifyFile", "modifyFile", "task_list")
|
|
||||||
this.global.fileQueue.setSubBatchCompletionCallback("modifyFile", "task_list", async (failedTasks) => {
|
|
||||||
// 报错
|
|
||||||
if (failedTasks.length > 0) {
|
|
||||||
let message = "";
|
|
||||||
failedTasks.forEach(({ taskId, error }) => {
|
|
||||||
message += `${taskId}-, \n 错误信息: ${error}` + '\n';
|
|
||||||
});
|
|
||||||
throw new Error(message);
|
|
||||||
// this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, {
|
|
||||||
// code: 0,
|
|
||||||
// message: message
|
|
||||||
// })
|
|
||||||
}
|
|
||||||
// else {
|
|
||||||
// this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, {
|
|
||||||
// code: 1,
|
|
||||||
// message: "修改成功"
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
return true;
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// json 已经存在,不做后续处理
|
||||||
/**
|
if (image.length == promptJson.length) {
|
||||||
* 高清指定的文件夹
|
return {
|
||||||
* @param {要高清的文件夹} folder
|
code: 1
|
||||||
*/
|
|
||||||
async ImproveFolder(folder) {
|
|
||||||
try {
|
|
||||||
let bakPath = path.join(this.global.config.project_path, "tmp/bak");
|
|
||||||
let oldInput = path.join(this.global.config.project_path, "tmp/" + folder);
|
|
||||||
let newInput = path.join(this.global.config.project_path, "tmp/bak/" + folder)
|
|
||||||
// 创建文件夹
|
|
||||||
let existFolder = await this.tools.checkExists(bakPath);
|
|
||||||
if (!existFolder) {
|
|
||||||
await fspromises.mkdir(bakPath, { recursive: true });
|
|
||||||
}
|
|
||||||
|
|
||||||
let isExistNewFolder = await this.tools.checkExists(newInput);
|
|
||||||
if (isExistNewFolder) {
|
|
||||||
await fspromises.rm(newInput, { recursive: true, force: true });
|
|
||||||
}
|
|
||||||
// 备份文件
|
|
||||||
await fspromises.rename(oldInput, newInput);
|
|
||||||
//创建同名的文件,用作输出
|
|
||||||
await fspromises.mkdir(oldInput, { recursive: true });
|
|
||||||
|
|
||||||
// 开始高清
|
|
||||||
let command = `"${path.join(define.package_path, "Improve/rnv.exe")}" -i "${newInput}" -o "${oldInput}"`;
|
|
||||||
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, {
|
|
||||||
out_folder: folder,
|
|
||||||
status: "video_improvied"
|
|
||||||
})
|
|
||||||
|
|
||||||
} catch (error) {
|
|
||||||
await this.ModifyTaskStatus('out_folder', folder, "video_improvie_error");
|
|
||||||
this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, {
|
|
||||||
out_folder: folder,
|
|
||||||
status: "video_improvie_error"
|
|
||||||
})
|
|
||||||
throw error;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
if (txtfile.length != image.length) {
|
||||||
* 生成SD相对的JSON文件。删除反推的txt文件
|
throw new Error('关键词文件和图片数量对不上,请检查!!')
|
||||||
*/
|
}
|
||||||
async AddWebuiJson() {
|
let sd_config = JSON.parse(await fspromises.readFile(define.sd_setting, 'utf-8'))
|
||||||
try {
|
|
||||||
// 读取所有txt文件
|
|
||||||
let txtfile = await this.tools.getFilesWithExtensions(path.join(this.global.config.project_path, 'tmp/input_crop'), '.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 已经存在,不做后续处理
|
for (let i = 0; i < image.length; i++) {
|
||||||
if (image.length == promptJson.length) {
|
const element = image[i]
|
||||||
return {
|
let txtpath = element.split('.png')[0] + '.txt'
|
||||||
code: 1,
|
let prompt = await fspromises.readFile(txtpath, 'utf-8')
|
||||||
}
|
// console.log(txtpath)
|
||||||
}
|
let obj = {}
|
||||||
|
obj.model = sd_config.setting.type
|
||||||
if (txtfile.length != image.length) {
|
obj.api = sd_config.setting.webui_api_url + 'sdapi/v1/img2img'
|
||||||
throw new Error("关键词文件和图片数量对不上,请检查!!")
|
obj.webui_config = {
|
||||||
}
|
sampler_name: sd_config.webui.sampler_name,
|
||||||
let sd_config = JSON.parse(await fspromises.readFile(define.sd_setting, 'utf-8'));
|
prompt: prompt + ',' + sd_config.webui.prompt,
|
||||||
|
negative_prompt: sd_config.webui.negative_prompt,
|
||||||
for (let i = 0; i < image.length; i++) {
|
batch_size: 1,
|
||||||
const element = image[i];
|
steps: sd_config.webui.steps,
|
||||||
let txtpath = element.split('.png')[0] + '.txt';
|
cfg_scale: sd_config.webui.cfg_scale,
|
||||||
let prompt = await fspromises.readFile(txtpath, 'utf-8');
|
denoising_strength: sd_config.webui.denoising_strength,
|
||||||
// console.log(txtpath)
|
width: sd_config.webui.width,
|
||||||
let obj = {}
|
height: sd_config.webui.height,
|
||||||
obj.model = sd_config.setting.type;
|
seed: sd_config.setting.seed,
|
||||||
obj.api = sd_config.setting.webui_api_url + 'sdapi/v1/img2img';
|
init_images: element
|
||||||
obj.webui_config = {
|
|
||||||
sampler_name: sd_config.webui.sampler_name,
|
|
||||||
prompt: prompt + ',' + sd_config.webui.prompt,
|
|
||||||
negative_prompt: sd_config.webui.negative_prompt,
|
|
||||||
batch_size: 1,
|
|
||||||
steps: sd_config.webui.steps,
|
|
||||||
cfg_scale: sd_config.webui.cfg_scale,
|
|
||||||
denoising_strength: sd_config.webui.denoising_strength,
|
|
||||||
width: sd_config.webui.width,
|
|
||||||
height: sd_config.webui.height,
|
|
||||||
seed: sd_config.setting.seed,
|
|
||||||
init_images: element,
|
|
||||||
}
|
|
||||||
obj.adetailer = sd_config.webui.adetailer;
|
|
||||||
|
|
||||||
// 写入
|
|
||||||
await fspromises.writeFile(element + '.json', JSON.stringify(obj));
|
|
||||||
// 删除对应的txt文件
|
|
||||||
await fspromises.unlink(txtpath);
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
code: 1,
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (error) {
|
|
||||||
throw error;
|
|
||||||
}
|
}
|
||||||
}
|
obj.adetailer = sd_config.webui.adetailer
|
||||||
|
|
||||||
/**
|
// 写入
|
||||||
* 获取当前项目的生图任务列表
|
await fspromises.writeFile(element + '.json', JSON.stringify(obj))
|
||||||
*/
|
// 删除对应的txt文件
|
||||||
async GetImageTask() {
|
await fspromises.unlink(txtpath)
|
||||||
try {
|
}
|
||||||
let json_path = path.join(this.global.config.project_path, "scripts/task_list.json");
|
|
||||||
let isExit = await this.tools.checkExists(json_path);
|
return {
|
||||||
if (!isExit) {
|
code: 1
|
||||||
return {
|
}
|
||||||
code: 1,
|
} catch (error) {
|
||||||
data: null
|
throw error
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let json_data = JSON.parse(await fspromises.readFile(json_path));
|
|
||||||
return {
|
/**
|
||||||
code: 1,
|
* 获取当前项目的生图任务列表
|
||||||
data: json_data
|
*/
|
||||||
}
|
async GetImageTask() {
|
||||||
} catch (error) {
|
try {
|
||||||
return {
|
let json_path = path.join(this.global.config.project_path, 'scripts/task_list.json')
|
||||||
code: 0,
|
let isExit = await this.tools.checkExists(json_path)
|
||||||
message: error
|
if (!isExit) {
|
||||||
}
|
return {
|
||||||
|
code: 1,
|
||||||
|
data: null
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
let json_data = JSON.parse(await fspromises.readFile(json_path))
|
||||||
|
return {
|
||||||
|
code: 1,
|
||||||
|
data: json_data
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
return {
|
||||||
|
code: 0,
|
||||||
|
message: error
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
/**
|
* 修改任务的状态
|
||||||
* 修改任务的状态
|
* @param {查找的类型 id out_folder} type
|
||||||
* @param {查找的类型 id out_folder} type
|
* @param {查找的类型} id
|
||||||
* @param {查找的类型} id
|
* @param {新的状态} newStatus
|
||||||
* @param {新的状态} newStatus
|
*/
|
||||||
*/
|
async ModifyTaskStatus(type, id, newStatus) {
|
||||||
async ModifyTaskStatus(type, id, newStatus) {
|
this.global.fileQueue.enqueue(
|
||||||
this.global.fileQueue.enqueue(async () => {
|
async () => {
|
||||||
try {
|
|
||||||
// 将修改数据写入到一个并发为 1 的队列中
|
|
||||||
let tmp_task = await fspromises.readFile(path.join(this.global.config.project_path, 'scripts/task_list.json'), 'utf-8');
|
|
||||||
console.log(tmp_task)
|
|
||||||
let task = JSON.parse(tmp_task);
|
|
||||||
if (type == "id") {
|
|
||||||
let index = task.task_list.findIndex(item => item.id == id);
|
|
||||||
if (index < 0) {
|
|
||||||
throw new Error("传入的数据未找到");
|
|
||||||
} else {
|
|
||||||
task.task_list[index].status = newStatus;
|
|
||||||
}
|
|
||||||
} else if (type == "out_folder") {
|
|
||||||
let index = task.task_list.findIndex(item => item.out_folder == id);
|
|
||||||
if (index < 0) {
|
|
||||||
throw new Error("传入的数据未找到");
|
|
||||||
} else {
|
|
||||||
task.task_list[index].status = newStatus;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
throw new Error("输入类型错误")
|
|
||||||
}
|
|
||||||
await fspromises.writeFile(path.join(this.global.config.project_path, 'scripts/task_list.json'), JSON.stringify(task));
|
|
||||||
} catch (error) {
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}, "modifyFile", "modifyFile", "task_list")
|
|
||||||
this.global.fileQueue.setSubBatchCompletionCallback("modifyFile", "task_list", async (failedTasks) => {
|
|
||||||
// 报错
|
|
||||||
if (failedTasks.length > 0) {
|
|
||||||
let message = "";
|
|
||||||
failedTasks.forEach(({ taskId, error }) => {
|
|
||||||
message += `${taskId}-, \n 错误信息: ${error}` + '\n';
|
|
||||||
});
|
|
||||||
|
|
||||||
this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, {
|
|
||||||
code: 0,
|
|
||||||
message: message
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取指定文件夹下面特定条件的文件夹
|
|
||||||
* @param {指定的文件夹目录} parentFolder
|
|
||||||
* @param {查询条件 start end include} condition
|
|
||||||
* @param {查询的值} value
|
|
||||||
* @returns
|
|
||||||
*/
|
|
||||||
async getSubFolderList(parentFolder, condition, value) {
|
|
||||||
try {
|
try {
|
||||||
// console.log(value);
|
// 将修改数据写入到一个并发为 1 的队列中
|
||||||
let folders = await fspromises.readdir(parentFolder, { withFileTypes: true });
|
let tmp_task = await fspromises.readFile(
|
||||||
folders = folders.filter(item => item.isDirectory())
|
path.join(this.global.config.project_path, 'scripts/task_list.json'),
|
||||||
.map(item => item.name)
|
'utf-8'
|
||||||
|
)
|
||||||
if (condition == "start") {
|
console.log(tmp_task)
|
||||||
folders = folders.filter(item => item.startsWith(value));
|
let task = JSON.parse(tmp_task)
|
||||||
} else if (condition == "end") {
|
if (type == 'id') {
|
||||||
folders = folders.filter(item => item.endsWith(value));
|
let index = task.task_list.findIndex((item) => item.id == id)
|
||||||
} else if (condition == "include") {
|
if (index < 0) {
|
||||||
//包含过滤
|
throw new Error('传入的数据未找到')
|
||||||
folders = folders.filter(item => item.includes(value));
|
|
||||||
} else {
|
} else {
|
||||||
throw new Error("条件参数错误");
|
task.task_list[index].status = newStatus
|
||||||
}
|
}
|
||||||
return folders;
|
} else if (type == 'out_folder') {
|
||||||
|
let index = task.task_list.findIndex((item) => item.out_folder == id)
|
||||||
|
if (index < 0) {
|
||||||
|
throw new Error('传入的数据未找到')
|
||||||
|
} else {
|
||||||
|
task.task_list[index].status = newStatus
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new Error('输入类型错误')
|
||||||
|
}
|
||||||
|
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) => {
|
||||||
|
// 报错
|
||||||
|
if (failedTasks.length > 0) {
|
||||||
|
let message = ''
|
||||||
|
failedTasks.forEach(({ taskId, error }) => {
|
||||||
|
message += `${taskId}-, \n 错误信息: ${error}` + '\n'
|
||||||
|
})
|
||||||
|
|
||||||
|
this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, {
|
||||||
|
code: 0,
|
||||||
|
message: message
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取指定文件夹下面特定条件的文件夹
|
||||||
|
* @param {指定的文件夹目录} parentFolder
|
||||||
|
* @param {查询条件 start end include} condition
|
||||||
|
* @param {查询的值} value
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
async getSubFolderList(parentFolder, condition, value) {
|
||||||
|
try {
|
||||||
|
// console.log(value);
|
||||||
|
let folders = await fspromises.readdir(parentFolder, { withFileTypes: true })
|
||||||
|
folders = folders.filter((item) => item.isDirectory()).map((item) => item.name)
|
||||||
|
|
||||||
|
if (condition == 'start') {
|
||||||
|
folders = folders.filter((item) => item.startsWith(value))
|
||||||
|
} else if (condition == 'end') {
|
||||||
|
folders = folders.filter((item) => item.endsWith(value))
|
||||||
|
} else if (condition == 'include') {
|
||||||
|
//包含过滤
|
||||||
|
folders = folders.filter((item) => item.includes(value))
|
||||||
|
} else {
|
||||||
|
throw new Error('条件参数错误')
|
||||||
|
}
|
||||||
|
return folders
|
||||||
|
} catch (error) {
|
||||||
|
throw error
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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,13 +183,18 @@ 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;
|
||||||
for (let i = 0; i < bookTasks.length; i++) {
|
|
||||||
const element = bookTasks[i];
|
// 有数据才删除
|
||||||
await this.bookServiceBasic.DeleteBookTaskData(element.id);
|
if (bookTasks.length > 0) {
|
||||||
|
// 删除遗留重置的小说批次任务
|
||||||
|
for (let i = 0; i < bookTasks.length; i++) {
|
||||||
|
const element = bookTasks[i];
|
||||||
|
await this.bookServiceBasic.DeleteBookTaskData(element.id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 开始删除数据
|
// 开始删除数据
|
||||||
|
|||||||
@@ -0,0 +1,64 @@
|
|||||||
|
import { errorMessage, successMessage } from "@/main/Public/generalTools";
|
||||||
|
import { BookBasicHandle } from "../bookBasicHandle";
|
||||||
|
import { ImageToVideoModels } from "@/define/enum/video";
|
||||||
|
import { MJVideoService } from "../../video/mjVideo";
|
||||||
|
import { isEmpty } from "lodash";
|
||||||
|
import { GeneralResponse } from "@/model/generalResponse";
|
||||||
|
|
||||||
|
|
||||||
|
export class BookImageTextToVideoCategory extends BookBasicHandle {
|
||||||
|
mjVideoService: MJVideoService
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.mjVideoService = new MJVideoService();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重新加载视频任务信息
|
||||||
|
*
|
||||||
|
* 根据小说分镜的ID重新获取视频任务的信息。该方法会检查小说分镜数据是否存在,
|
||||||
|
* 视频消息数据是否存在,视频任务ID是否存在,然后根据视频类型调用相应的服务
|
||||||
|
* 重新加载视频任务。
|
||||||
|
*
|
||||||
|
* @param bookTaskDetailId - 小说分镜的ID
|
||||||
|
* @returns 成功时返回任务信息,失败时返回错误信息
|
||||||
|
* @throws 如果重新加载过程中发生错误
|
||||||
|
*/
|
||||||
|
async ReloadVideoTaskInfo(bookTaskDetailId: string) {
|
||||||
|
try {
|
||||||
|
await this.InitBookBasicHandle()
|
||||||
|
let bookTaskDetail = this.bookTaskDetailService.GetBookTaskDetailDataById(bookTaskDetailId);
|
||||||
|
if (bookTaskDetail == null) {
|
||||||
|
return errorMessage('没有找到对应的小说分镜数据,请先添加小说分镜', 'BookImageTextToVideoCategory_ReloadVideoTaskInfo');
|
||||||
|
}
|
||||||
|
|
||||||
|
let videoMessage = bookTaskDetail.videoMessage;
|
||||||
|
if (videoMessage == null) {
|
||||||
|
return errorMessage('没有找到对应的小说分镜的视频消息数据,请先添加视频消息', 'BookImageTextToVideoCategory_ReloadVideoTaskInfo');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isEmpty(videoMessage.taskId)) {
|
||||||
|
return errorMessage('没有找到对应的小说分镜的视频任务ID,请先添加视频任务', 'BookImageTextToVideoCategory_ReloadVideoTaskInfo');
|
||||||
|
}
|
||||||
|
|
||||||
|
let res: GeneralResponse.ErrorItem | GeneralResponse.SuccessItem;
|
||||||
|
switch (videoMessage.videoType) {
|
||||||
|
case ImageToVideoModels.MJ_VIDEO:
|
||||||
|
res = await this.mjVideoService.ReloadMJVideoTask(bookTaskDetail, videoMessage.taskId);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return errorMessage('不支持的视频类型,请检查视频类型', 'BookImageTextToVideoCategory_ReloadVideoTaskInfo');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查返回结果
|
||||||
|
if (res.code != 1) {
|
||||||
|
return errorMessage(res.message, 'BookImageTextToVideoCategory_ReloadVideoTaskInfo');
|
||||||
|
}
|
||||||
|
return successMessage(res.data, res.message, 'BookImageTextToVideoCategory_ReloadVideoTaskInfo');
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
return errorMessage('重新下载视频任务失败,错误信息:' + error.message, 'BookImageTextToVideoCategory_ReloadVideoTaskInfo');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
import { BookImageTextToVideoInfo } from "./bookImageTextToVideoInfo";
|
||||||
|
import { BookImageTextToVideoCategory } from "./bookImageTextToVideoCategory";
|
||||||
|
|
||||||
|
|
||||||
|
export class BookImageTextToVideoIndex {
|
||||||
|
|
||||||
|
bookImageTextToVideoInfo: BookImageTextToVideoInfo;
|
||||||
|
bookImageTextToVideoCategory: BookImageTextToVideoCategory
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.bookImageTextToVideoInfo = new BookImageTextToVideoInfo();
|
||||||
|
this.bookImageTextToVideoCategory = new BookImageTextToVideoCategory();
|
||||||
|
}
|
||||||
|
|
||||||
|
//#region Info
|
||||||
|
|
||||||
|
/** 获取用于视频生成的小说信息列表 根据查询条件返回小说数据,如果指定了bookTaskId,则返回对应小说的单个任务数据 否则返回所有启用了视频生成功能的小说及其任务数据 */
|
||||||
|
GetVideoBookInfoList = async (condition: BookVideo.BookVideoInfoListQuertCondition) => await this.bookImageTextToVideoInfo.GetVideoBookInfoList(condition)
|
||||||
|
|
||||||
|
|
||||||
|
/** 获取小说图片和视频生成的进度信息 根据提供的参数查询指定小说或小说任务的图片和视频生成进度 */
|
||||||
|
GetBookImageAndVideoProgress = async (bookId?: string, bookTaskId?: string) => await this.bookImageTextToVideoInfo.GetBookImageAndVideoProgress(bookId, bookTaskId);
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region Category
|
||||||
|
|
||||||
|
ReloadVideoTaskInfo = async (bookTaskDetailId: string) => await this.bookImageTextToVideoCategory.ReloadVideoTaskInfo(bookTaskDetailId);
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
}
|
||||||