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*
|
||||
resources/scripts/db/book.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 { defineConfig, externalizeDepsPlugin, bytecodePlugin } from 'electron-vite'
|
||||
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({
|
||||
main: {
|
||||
plugins: [externalizeDepsPlugin(), bytecodePlugin()]
|
||||
plugins: [externalizeDepsPlugin(), bytecodePlugin(), tsconfigPaths()]
|
||||
},
|
||||
discord: {
|
||||
plugins: [externalizeDepsPlugin(), bytecodePlugin()]
|
||||
plugins: [externalizeDepsPlugin(), bytecodePlugin(), tsconfigPaths()]
|
||||
},
|
||||
preload: {
|
||||
plugins: [externalizeDepsPlugin(), bytecodePlugin()]
|
||||
plugins: [externalizeDepsPlugin(), bytecodePlugin(), tsconfigPaths()]
|
||||
},
|
||||
renderer: {
|
||||
resolve: {
|
||||
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",
|
||||
"version": "3.1.3",
|
||||
"version": "3.4.3",
|
||||
"description": "An AI tool for image processing, video processing, and other functions.",
|
||||
"main": "./out/main/index.js",
|
||||
"author": "laitool.cn",
|
||||
@@ -18,40 +18,37 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@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/utils": "^3.0.0",
|
||||
"@vicons/ionicons5": "^0.12.0",
|
||||
"@vitejs/plugin-vue-jsx": "^3.1.0",
|
||||
"@volcengine/openapi": "^1.16.0",
|
||||
"7zip-min": "^1.4.4",
|
||||
"artplayer": "^5.1.6",
|
||||
"awesome-js": "^2.0.0",
|
||||
"axios": "^1.6.5",
|
||||
"blob-to-buffer": "^1.2.9",
|
||||
"compressing": "^1.10.0",
|
||||
"crypto-js": "^4.2.0",
|
||||
"electron-store": "^9.0.0",
|
||||
"electron-updater": "^6.1.7",
|
||||
"fluent-ffmpeg": "^2.1.3",
|
||||
"form-data": "^4.0.1",
|
||||
"highlight.js": "^11.9.0",
|
||||
"install": "^0.13.0",
|
||||
"jieba-js": "^1.0.2",
|
||||
"https-proxy-agent": "^7.0.5",
|
||||
"jsdom": "^24.0.0",
|
||||
"lodash": "^4.17.21",
|
||||
"moment-timezone": "^0.5.45",
|
||||
"music-metadata": "^7.14.0",
|
||||
"node-edge-tts": "^1.2.3",
|
||||
"node-gyp": "^10.2.0",
|
||||
"node-edge-tts": "^1.2.7",
|
||||
"node-machine-id": "^1.1.12",
|
||||
"node-pre-gyp": "^0.17.0",
|
||||
"npm": "^10.7.0",
|
||||
"paddle": "^1.0.0",
|
||||
"pinia": "^2.1.7",
|
||||
"realm": "^12.9.0",
|
||||
"sharp": "^0.33.2",
|
||||
"systeminformation": "^5.22.10",
|
||||
"tencentcloud-sdk-nodejs": "^4.0.821",
|
||||
"unplugin-auto-import": "^19.1.2",
|
||||
"unplugin-vue-components": "^28.4.1",
|
||||
"uuid": "^9.0.1",
|
||||
"vite-tsconfig-paths": "^5.0.1",
|
||||
"vue-router": "^4.2.5",
|
||||
"wav-file-info": "^0.0.10",
|
||||
"winston": "^3.13.0",
|
||||
@@ -73,6 +70,8 @@
|
||||
"eslint-plugin-vue": "^9.19.2",
|
||||
"naive-ui": "^2.38.2",
|
||||
"prettier": "^3.1.1",
|
||||
"process": "^0.11.10",
|
||||
"util": "^0.12.5",
|
||||
"vite": "^5.0.11",
|
||||
"vue": "^3.4.5"
|
||||
},
|
||||
@@ -89,12 +88,19 @@
|
||||
"resources/image/style/**",
|
||||
"resources/image/zhanwei.png",
|
||||
"resources/scripts/model/**",
|
||||
"resources/scripts/Lai.exe",
|
||||
"resources/scripts/xiangbei_jianying_main.exe",
|
||||
"resources/scripts/discordScript.js",
|
||||
"resources/tmp/**",
|
||||
"resources/icon.ico"
|
||||
],
|
||||
"nsis": {
|
||||
"oneClick": false,
|
||||
"allowToChangeInstallationDirectory": true
|
||||
},
|
||||
"win": {
|
||||
"target": "nsis",
|
||||
"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 sys
|
||||
import clip
|
||||
import getgrame
|
||||
import Push_back_Prompt
|
||||
import public_tools
|
||||
import shotSplit
|
||||
@@ -17,9 +16,33 @@ if len(sys.argv) < 2:
|
||||
sys.argv = [
|
||||
"C:\\Users\\27698\\Desktop\\LAITool\\resources\\scripts\\Lai.exe",
|
||||
"-c",
|
||||
"D:/来推项目集/7.4/娱乐:江湖大哥退休,去拍电影/scripts/output_crop_00001.json",
|
||||
"NVIDIA",
|
||||
]
|
||||
"C:/Users/27698/Desktop/LAITool/project/73bca563-fd8f-42e3-b08b-e4b2ecbd0d71/scripts/output_00008_video_config.json",
|
||||
"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)
|
||||
|
||||
@@ -56,6 +79,8 @@ if sys.argv[1] == "-c":
|
||||
clip = clip.Clip(cript_directory, sys.argv[2], sys.argv[3])
|
||||
clip.MergeVideosAndClip()
|
||||
pass
|
||||
|
||||
|
||||
# 获取字体
|
||||
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:
|
||||
json.dump(data, file, ensure_ascii=False, indent=4)
|
||||
|
||||
# 反推提示词
|
||||
# 反推提示词(指定项目下面的input_crop文件夹)
|
||||
elif sys.argv[1] == "-p":
|
||||
Push_back_Prompt.init(sys.argv[2], sys.argv[3], sys.argv[4])
|
||||
pass
|
||||
|
||||
# 剪映抽帧
|
||||
elif sys.argv[1] == "-k":
|
||||
# print("")
|
||||
getgrame.init(sys.argv[2], sys.argv[3], sys.argv[4])
|
||||
# 反推指定的文件夹
|
||||
elif sys.argv[1] == "-pf":
|
||||
Push_back_Prompt.getAssignDir(sys.argv[2])
|
||||
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
|
||||
|
||||
elif sys.argv[1] == "-ka":
|
||||
shotSplit.get_fram(sys.argv[2], sys.argv[3], sys.argv[4])
|
||||
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])
|
||||
elif sys.argv[1] == "-df":
|
||||
shotSplit.get_fram(sys.argv[2], sys.argv[3], sys.argv[4])
|
||||
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 -*-
|
||||
|
||||
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(
|
||||
['Lai.py'],
|
||||
pathex=[],
|
||||
binaries=[],
|
||||
datas=datas,
|
||||
datas=[],
|
||||
hiddenimports=[],
|
||||
hookspath=[],
|
||||
hooksconfig={},
|
||||
runtime_hooks=[],
|
||||
excludes=[],
|
||||
noarchive=False,
|
||||
optimize=0,
|
||||
)
|
||||
pyz = PYZ(a.pure)
|
||||
|
||||
exe = EXE(
|
||||
pyz,
|
||||
a.scripts,
|
||||
a.binaries,
|
||||
a.datas,
|
||||
[],
|
||||
exclude_binaries=True,
|
||||
name='Lai',
|
||||
debug=False,
|
||||
bootloader_ignore_signals=False,
|
||||
strip=False,
|
||||
upx=True,
|
||||
upx_exclude=[],
|
||||
runtime_tmpdir=None,
|
||||
console=True,
|
||||
disable_windowed_traceback=False,
|
||||
argv_emulation=False,
|
||||
@@ -38,12 +36,3 @@ exe = EXE(
|
||||
codesign_identity=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 -*-
|
||||
|
||||
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(
|
||||
['lama_inpaint.py'],
|
||||
['Lai.py'],
|
||||
pathex=[],
|
||||
binaries=[],
|
||||
datas=[],
|
||||
datas=datas,
|
||||
hiddenimports=[],
|
||||
hookspath=[],
|
||||
hooksconfig={},
|
||||
@@ -20,7 +26,7 @@ exe = EXE(
|
||||
a.scripts,
|
||||
[],
|
||||
exclude_binaries=True,
|
||||
name='lama_inpaint',
|
||||
name='Lai',
|
||||
debug=False,
|
||||
bootloader_ignore_signals=False,
|
||||
strip=False,
|
||||
@@ -39,5 +45,5 @@ coll = COLLECT(
|
||||
strip=False,
|
||||
upx=True,
|
||||
upx_exclude=[],
|
||||
name='lama_inpaint',
|
||||
name='Lai',
|
||||
)
|
||||
@@ -148,10 +148,11 @@ class WaifuDiffusionInterrogator(Interrogator):
|
||||
Dict[str, float], Dict[str, float] # rating confidents # tag confidents
|
||||
]:
|
||||
# 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")
|
||||
tags_path = os.path.join(cript_directory, "model/tag/selected_tags.csv")
|
||||
from onnxruntime import InferenceSession
|
||||
|
||||
providers = ["CUDAExecutionProvider", "CPUExecutionProvider"]
|
||||
self.model = InferenceSession(str(model_path), providers=providers)
|
||||
print(f"从{model_path} 读取 {self.name}模型")
|
||||
@@ -223,7 +224,89 @@ def filter_action(tag_actions: [], 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:
|
||||
setting_json = public_tools.read_config(sd_setting, webui=False)
|
||||
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 json
|
||||
import subprocess
|
||||
from huggingface_hub import hf_hub_download
|
||||
from faster_whisper import WhisperModel
|
||||
# from huggingface_hub import hf_hub_download
|
||||
# from faster_whisper import WhisperModel
|
||||
import public_tools
|
||||
from pathlib import Path
|
||||
|
||||
@@ -174,111 +174,111 @@ def SplitAudio(video_out_folder, video_list):
|
||||
return mp3_list
|
||||
|
||||
|
||||
def GetText(out_folder, mp3_list):
|
||||
text = []
|
||||
# 先获取模型
|
||||
print("正在下载或加载模型")
|
||||
sys.stdout.flush()
|
||||
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="config.json",
|
||||
)
|
||||
hf_hub_download(
|
||||
repo_id="Systran/faster-whisper-large-v3",
|
||||
filename="preprocessor_config.json",
|
||||
)
|
||||
hf_hub_download(
|
||||
repo_id="Systran/faster-whisper-large-v3",
|
||||
filename="tokenizer.json",
|
||||
)
|
||||
hf_hub_download(
|
||||
repo_id="Systran/faster-whisper-large-v3",
|
||||
filename="vocabulary.json",
|
||||
)
|
||||
model = WhisperModel(
|
||||
model_size_or_path=os.path.dirname(model_path),
|
||||
device="auto",
|
||||
local_files_only=True,
|
||||
)
|
||||
print("模型加载成功,开始识别")
|
||||
sys.stdout.flush()
|
||||
for mp in mp3_list:
|
||||
segments, info = model.transcribe(
|
||||
mp,
|
||||
beam_size=5,
|
||||
language="zh",
|
||||
vad_filter=True,
|
||||
vad_parameters=dict(min_silence_duration_ms=1000),
|
||||
)
|
||||
tmp_text = ""
|
||||
for segment in segments:
|
||||
tmp_text += segment.text + "。"
|
||||
print(mp + "识别完成")
|
||||
sys.stdout.flush()
|
||||
text.append(tmp_text)
|
||||
# def GetText(out_folder, mp3_list):
|
||||
# text = []
|
||||
# # 先获取模型
|
||||
# print("正在下载或加载模型")
|
||||
# sys.stdout.flush()
|
||||
# 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="config.json",
|
||||
# )
|
||||
# hf_hub_download(
|
||||
# repo_id="Systran/faster-whisper-large-v3",
|
||||
# filename="preprocessor_config.json",
|
||||
# )
|
||||
# hf_hub_download(
|
||||
# repo_id="Systran/faster-whisper-large-v3",
|
||||
# filename="tokenizer.json",
|
||||
# )
|
||||
# hf_hub_download(
|
||||
# repo_id="Systran/faster-whisper-large-v3",
|
||||
# filename="vocabulary.json",
|
||||
# )
|
||||
# model = WhisperModel(
|
||||
# model_size_or_path=os.path.dirname(model_path),
|
||||
# device="auto",
|
||||
# local_files_only=True,
|
||||
# )
|
||||
# print("模型加载成功,开始识别")
|
||||
# sys.stdout.flush()
|
||||
# for mp in mp3_list:
|
||||
# segments, info = model.transcribe(
|
||||
# mp,
|
||||
# beam_size=5,
|
||||
# language="zh",
|
||||
# vad_filter=True,
|
||||
# vad_parameters=dict(min_silence_duration_ms=1000),
|
||||
# )
|
||||
# tmp_text = ""
|
||||
# for segment in segments:
|
||||
# tmp_text += segment.text + "。"
|
||||
# print(mp + "识别完成")
|
||||
# sys.stdout.flush()
|
||||
# text.append(tmp_text)
|
||||
|
||||
# 数据写出
|
||||
print("文本全部识别成功,正在写出")
|
||||
sys.stdout.flush()
|
||||
tools = public_tools.PublicTools()
|
||||
tools.write_to_file(text, os.path.join(out_folder, "文案.txt"))
|
||||
print("写出完成")
|
||||
sys.stdout.flush()
|
||||
# # 数据写出
|
||||
# print("文本全部识别成功,正在写出")
|
||||
# sys.stdout.flush()
|
||||
# tools = public_tools.PublicTools()
|
||||
# tools.write_to_file(text, os.path.join(out_folder, "文案.txt"))
|
||||
# print("写出完成")
|
||||
# sys.stdout.flush()
|
||||
|
||||
|
||||
def GetTextTask(out_folder, mp, name):
|
||||
text = []
|
||||
# 先获取模型
|
||||
print("正在下载或加载模型")
|
||||
sys.stdout.flush()
|
||||
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="config.json",
|
||||
)
|
||||
hf_hub_download(
|
||||
repo_id="Systran/faster-whisper-large-v3",
|
||||
filename="preprocessor_config.json",
|
||||
)
|
||||
hf_hub_download(
|
||||
repo_id="Systran/faster-whisper-large-v3",
|
||||
filename="tokenizer.json",
|
||||
)
|
||||
hf_hub_download(
|
||||
repo_id="Systran/faster-whisper-large-v3",
|
||||
filename="vocabulary.json",
|
||||
)
|
||||
model = WhisperModel(
|
||||
model_size_or_path=os.path.dirname(model_path),
|
||||
device="auto",
|
||||
local_files_only=True,
|
||||
)
|
||||
print("模型加载成功,开始识别")
|
||||
sys.stdout.flush()
|
||||
segments, info = model.transcribe(
|
||||
mp,
|
||||
beam_size=5,
|
||||
language="zh",
|
||||
vad_filter=True,
|
||||
vad_parameters=dict(min_silence_duration_ms=1000),
|
||||
)
|
||||
tmp_text = ""
|
||||
for segment in segments:
|
||||
tmp_text += segment.text + "。"
|
||||
print(mp + "识别完成")
|
||||
sys.stdout.flush()
|
||||
text.append(tmp_text)
|
||||
# def GetTextTask(out_folder, mp, name):
|
||||
# text = []
|
||||
# # 先获取模型
|
||||
# print("正在下载或加载模型")
|
||||
# sys.stdout.flush()
|
||||
# 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="config.json",
|
||||
# )
|
||||
# hf_hub_download(
|
||||
# repo_id="Systran/faster-whisper-large-v3",
|
||||
# filename="preprocessor_config.json",
|
||||
# )
|
||||
# hf_hub_download(
|
||||
# repo_id="Systran/faster-whisper-large-v3",
|
||||
# filename="tokenizer.json",
|
||||
# )
|
||||
# hf_hub_download(
|
||||
# repo_id="Systran/faster-whisper-large-v3",
|
||||
# filename="vocabulary.json",
|
||||
# )
|
||||
# model = WhisperModel(
|
||||
# model_size_or_path=os.path.dirname(model_path),
|
||||
# device="auto",
|
||||
# local_files_only=True,
|
||||
# )
|
||||
# print("模型加载成功,开始识别")
|
||||
# sys.stdout.flush()
|
||||
# segments, info = model.transcribe(
|
||||
# mp,
|
||||
# beam_size=5,
|
||||
# language="zh",
|
||||
# vad_filter=True,
|
||||
# vad_parameters=dict(min_silence_duration_ms=1000),
|
||||
# )
|
||||
# tmp_text = ""
|
||||
# for segment in segments:
|
||||
# tmp_text += segment.text + "。"
|
||||
# print(mp + "识别完成")
|
||||
# sys.stdout.flush()
|
||||
# text.append(tmp_text)
|
||||
|
||||
# 数据写出
|
||||
sys.stdout.flush()
|
||||
tools = public_tools.PublicTools()
|
||||
tools.write_to_file(text, os.path.join(out_folder, name + ".txt"))
|
||||
sys.stdout.flush()
|
||||
# # 数据写出
|
||||
# sys.stdout.flush()
|
||||
# tools = public_tools.PublicTools()
|
||||
# tools.write_to_file(text, os.path.join(out_folder, name + ".txt"))
|
||||
# sys.stdout.flush()
|
||||
|
||||
|
||||
def get_fram(video_path, out_path, sensitivity):
|
||||
@@ -297,12 +297,12 @@ def get_fram(video_path, out_path, sensitivity):
|
||||
exit(0)
|
||||
|
||||
|
||||
def init(video_path, video_out_folder, image_out_folder, sensitivity, gpu_type):
|
||||
v_l = ClipVideo(
|
||||
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(
|
||||
# video_path, video_out_folder, image_out_folder, sensitivity, gpu_type
|
||||
# )
|
||||
|
||||
# 开始分离音频
|
||||
m_l = SplitAudio(video_out_folder, v_l)
|
||||
# 开始识别字幕
|
||||
GetText(os.path.dirname(video_out_folder), m_l)
|
||||
# # 开始分离音频
|
||||
# m_l = SplitAudio(video_out_folder, v_l)
|
||||
# # 开始识别字幕
|
||||
# GetText(os.path.dirname(video_out_folder), m_l)
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
"translation_secret": "2234",
|
||||
"translation_auto": true,
|
||||
"theme": "light",
|
||||
"gpt_auto_inference": "storyFirst",
|
||||
"gpt_auto_inference": "laitoolStoryboardMasterGeneral",
|
||||
"webui_api_url": "你的SD地址(后面要加/)",
|
||||
"gpt_count": 8,
|
||||
"customize_gpt_prompt": "a93b693e-bb3f-406d-9730-cba43a6585a2",
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
|
||||
import { escapeRegExp, isEmpty } from "lodash";
|
||||
import axios from 'axios';
|
||||
//#region 检查字符串中是不是包含中文或者标点符号
|
||||
/**
|
||||
* 检查字符串中是不是包含中文或者标点符号
|
||||
* @param str 需要判断的字符串
|
||||
@@ -10,6 +12,9 @@ export function ContainsChineseOrPunctuation(str: string): boolean {
|
||||
)
|
||||
}
|
||||
|
||||
//#endregion
|
||||
|
||||
//#region 通用的失败重试函数
|
||||
/**
|
||||
* 通用的重试函数
|
||||
* @param fn 要执行的函数
|
||||
@@ -37,7 +42,9 @@ export async function RetryWithBackoff<T>(fn: () => Promise<T>, retries: number
|
||||
}
|
||||
throw new Error('所有重试失败'); // 理论上不会到达这里
|
||||
}
|
||||
//#endregion
|
||||
|
||||
//#region 并发执行任务(控制同时执行的任务数)
|
||||
/**
|
||||
* 并发执行任务(控制同时执行的任务数)
|
||||
* @param tasks 总的任务列表
|
||||
@@ -66,4 +73,119 @@ export async function ExecuteConcurrently(tasks: Array<() => Promise<any>>, conc
|
||||
}
|
||||
}
|
||||
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 文件或目录的路径
|
||||
* @returns true表示存在,false表示不存在
|
||||
*/
|
||||
export async function CheckFileOrDirExist(path) {
|
||||
export async function CheckFileOrDirExist(filePath) {
|
||||
try {
|
||||
await fspromises.access(path)
|
||||
await fspromises.access(filePath)
|
||||
return true // 文件或目录存在
|
||||
} catch (error) {
|
||||
return false // 文件或目录不存在
|
||||
|
||||
@@ -2,10 +2,12 @@ import * as image from './image';
|
||||
import * as common from './common';
|
||||
import * as file from './file'
|
||||
import * as validate from './validate';
|
||||
import * as write from './write';
|
||||
|
||||
export {
|
||||
image,
|
||||
common,
|
||||
file,
|
||||
validate
|
||||
validate,
|
||||
write
|
||||
};
|
||||
@@ -5,11 +5,32 @@
|
||||
* @returns 可以解析返回true,否则返回false
|
||||
*/
|
||||
export function ValidateJson(str: string): boolean {
|
||||
|
||||
try {
|
||||
if (str == null) {
|
||||
return false;
|
||||
}
|
||||
JSON.parse(str);
|
||||
return true
|
||||
} catch (e) {
|
||||
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
|
||||
endTime: number
|
||||
messageName?: string
|
||||
taskId?: string // 任务ID,可能是视频生成任务的ID
|
||||
taskMessage?: string // 任务消息,可能是视频生成任务的消息
|
||||
|
||||
static schema: ObjectSchema = {
|
||||
name: 'BookBackTaskList',
|
||||
@@ -33,7 +35,9 @@ export class BookBackTaskList extends Realm.Object<BookBackTaskList> {
|
||||
updateTime: 'date',
|
||||
startTime: 'int',
|
||||
endTime: 'int',
|
||||
messageName: 'string?'
|
||||
messageName: 'string?',
|
||||
taskId: 'string?', // 任务ID,可能是视频生成任务的ID
|
||||
taskMessage: 'string?', // 任务消息,可能是视频生成任务的消息
|
||||
},
|
||||
primaryKey: 'id'
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ export class BookModel extends Realm.Object<BookModel> {
|
||||
oldVideoPath: string | null
|
||||
srtPath: string | null
|
||||
audioPath: string | null
|
||||
draftDepend?: string // 草稿依赖
|
||||
draftSrtStyle: string | null // 草稿字幕样式
|
||||
backgroundMusic: string | null // 背景音乐ID
|
||||
friendlyReminder: string | null // 友情提示
|
||||
@@ -38,6 +39,7 @@ export class BookModel extends Realm.Object<BookModel> {
|
||||
oldVideoPath: 'string?',
|
||||
srtPath: 'string?',
|
||||
audioPath: 'string?',
|
||||
draftDepend: "string?",
|
||||
draftSrtStyle: 'string?',
|
||||
backgroundMusic: 'string?',
|
||||
friendlyReminder: 'string?',
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import Realm, { ObjectSchema } from 'realm'
|
||||
import { BookImageCategory, BookTaskStatus, BookType } from '../../../enum/bookEnum'
|
||||
import { ImageToVideoModels } from '@/define/enum/video'
|
||||
|
||||
export class ImageDefineModel extends Realm.Object<ImageDefineModel> {
|
||||
label: string
|
||||
@@ -43,12 +44,14 @@ export class BookTaskModel extends Realm.Object<BookTaskModel> {
|
||||
name: string
|
||||
generateVideoPath: string | null
|
||||
srtPath: string | null
|
||||
draftDepend?: string // 草稿依赖
|
||||
audioPath: string | null
|
||||
draftSrtStyle: string | null // 草稿字幕样式
|
||||
backgroundMusic: string | null // 背景音乐ID
|
||||
friendlyReminder: string | null // 友情提示
|
||||
imageFolder: string | null
|
||||
imageStyle: string[] | null // 软件内置的样式
|
||||
imageStyle: string | null // 软件内置的样式
|
||||
cacheImageList: string[] | null // 缓存的图片列表
|
||||
autoAnalyzeCharacter: string | null // 自动分析角色设置
|
||||
customizeImageStyle: string[] | null // 自定义的样式
|
||||
videoConfig: string | null // 合成视频设置
|
||||
@@ -58,6 +61,8 @@ export class BookTaskModel extends Realm.Object<BookTaskModel> {
|
||||
status: BookTaskStatus
|
||||
errorMsg: string | null
|
||||
isAuto: boolean // 是否自动
|
||||
openVideoGenerate: boolean | null // 是否开启视频生成
|
||||
videoCategory: ImageToVideoModels // 图转视频方式
|
||||
updateTime: Date
|
||||
createTime: Date
|
||||
imageCategory: BookImageCategory // 图片出图方式
|
||||
@@ -72,12 +77,14 @@ export class BookTaskModel extends Realm.Object<BookTaskModel> {
|
||||
name: 'string',
|
||||
generateVideoPath: 'string?',
|
||||
srtPath: 'string?',
|
||||
draftDepend: "string?",
|
||||
audioPath: 'string?',
|
||||
draftSrtStyle: 'string?',
|
||||
backgroundMusic: 'string?',
|
||||
friendlyReminder: 'string?',
|
||||
imageFolder: 'string?',
|
||||
subImageFolder: "string?[]",
|
||||
cacheImageList: 'string?[]',
|
||||
imageStyle: 'string?[]',
|
||||
autoAnalyzeCharacter: 'string?',
|
||||
customizeImageStyle: 'string?[]',
|
||||
@@ -85,11 +92,13 @@ export class BookTaskModel extends Realm.Object<BookTaskModel> {
|
||||
prefixPrompt: "string?",
|
||||
suffixPrompt: "string?",
|
||||
status: 'string',
|
||||
openVideoGenerate: 'bool?',
|
||||
errorMsg: 'string?',
|
||||
isAuto: 'bool',
|
||||
updateTime: 'date',
|
||||
createTime: 'date',
|
||||
imageCategory: 'string',
|
||||
videoCategory: "string",
|
||||
},
|
||||
// 主键为_id
|
||||
primaryKey: 'id'
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
import Realm, { ObjectSchema } from 'realm'
|
||||
import {
|
||||
BookBackTaskStatus,
|
||||
BookBackTaskType,
|
||||
BookTaskStatus,
|
||||
BookType,
|
||||
MJAction,
|
||||
} from '../../../enum/bookEnum'
|
||||
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> {
|
||||
sampler_name: string // 采样器名称
|
||||
negative_prompt: string // 负面提示
|
||||
@@ -132,6 +172,8 @@ export class BookTaskDetailModel extends Realm.Object<BookTaskDetailModel> {
|
||||
bookId: string
|
||||
bookTaskId: string
|
||||
videoPath: string | null // 视频地址
|
||||
generateVideoPath: string | null // 生成视频地址
|
||||
subVideoPath: string[] | null // 生成的批次视频的地址
|
||||
audioPath: string | null // 音频地址
|
||||
word: string | null // 文案
|
||||
oldImage: string | null // 旧图片(用于SD的图生图)
|
||||
@@ -144,6 +186,7 @@ export class BookTaskDetailModel extends Realm.Object<BookTaskDetailModel> {
|
||||
sceneTags: string[] | null // 场景标签
|
||||
gptPrompt: string | null // GPT提示词
|
||||
mjMessage: MJMessage | null // MJ消息
|
||||
videoMessage: VideoMessage | null // 视频消息
|
||||
outImagePath: string | null // 输出图片地址
|
||||
subImagePath: string[] | null // 子图片地址
|
||||
imageLock: boolean // 图片锁
|
||||
@@ -165,6 +208,8 @@ export class BookTaskDetailModel extends Realm.Object<BookTaskDetailModel> {
|
||||
bookId: { type: 'string', indexed: true },
|
||||
bookTaskId: { type: 'string', indexed: true },
|
||||
videoPath: 'string?',
|
||||
generateVideoPath: 'string?', // 生成视频地址
|
||||
subVideoPath : "string[]", // 生成的批次视频的地址
|
||||
audioPath: 'string?',
|
||||
word: 'string?',
|
||||
oldImage: 'string?',
|
||||
@@ -178,6 +223,7 @@ export class BookTaskDetailModel extends Realm.Object<BookTaskDetailModel> {
|
||||
sceneTags: 'string[]',
|
||||
gptPrompt: 'string?',
|
||||
mjMessage: 'MJMessage?',
|
||||
videoMessage: 'VideoMessage?',
|
||||
outImagePath: 'string?',
|
||||
subImagePath: 'string[]',
|
||||
imageLock: 'bool',
|
||||
|
||||
@@ -39,7 +39,7 @@ export class RemoteMJModel extends Realm.Object<RemoteMJModel> {
|
||||
accountId: string | null
|
||||
channelId: string
|
||||
coreSize: number
|
||||
guildId: string
|
||||
guildId: string
|
||||
enable: boolean // 是否启用
|
||||
mjBotChannelId: string | null
|
||||
nijiBotChannelId: string | null
|
||||
@@ -52,6 +52,8 @@ export class RemoteMJModel extends Realm.Object<RemoteMJModel> {
|
||||
createTime: Date
|
||||
updateTime: Date
|
||||
version: string
|
||||
blockMessage?: string
|
||||
type?: string
|
||||
static schema: ObjectSchema = {
|
||||
name: 'RemoteMJ',
|
||||
properties: {
|
||||
@@ -71,7 +73,9 @@ export class RemoteMJModel extends Realm.Object<RemoteMJModel> {
|
||||
userToken: 'string',
|
||||
createTime: 'date',
|
||||
updateTime: 'date',
|
||||
version: 'string'
|
||||
version: 'string',
|
||||
blockMessage: 'string?',
|
||||
type: "string?"
|
||||
},
|
||||
// 主键为_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 { OtherData } from '../../../enum/softwareEnum.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 { TaskModal } from '@/model/task.js'
|
||||
const { v4: uuidv4 } = require('uuid')
|
||||
|
||||
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 要添加的小说数据
|
||||
@@ -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
|
||||
* 上面的条件,至少要有一个
|
||||
|
||||
@@ -7,6 +7,7 @@ import path from 'path'
|
||||
import {
|
||||
BookTaskDetailModel,
|
||||
MJMessage,
|
||||
VideoMessage,
|
||||
ReversePrompt,
|
||||
SDConfig,
|
||||
Subtitle,
|
||||
@@ -176,6 +177,119 @@ const migration = (oldRealm: Realm, newRealm: Realm) => {
|
||||
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 {
|
||||
@@ -214,10 +328,11 @@ export class BaseRealmService extends BaseService {
|
||||
WebuiConfig,
|
||||
BookTaskModel,
|
||||
ReversePrompt,
|
||||
BookTaskDetailModel
|
||||
BookTaskDetailModel,
|
||||
VideoMessage
|
||||
],
|
||||
path: this.dbpath,
|
||||
schemaVersion: 24,
|
||||
schemaVersion: 44,
|
||||
migration: migration
|
||||
}
|
||||
this.realm = await Realm.open(config)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import Realm, { UpdateMode } from 'realm'
|
||||
import { BookModel } from '../../model/Book/book.js'
|
||||
import path from 'path'
|
||||
import { define } from '../../../define.js'
|
||||
import { define } from '../../../define'
|
||||
import { BookImageCategory, BookTaskStatus, BookType } from '../../../enum/bookEnum.js'
|
||||
import { successMessage } from '../../../../main/Public/generalTools'
|
||||
import { CheckFolderExistsOrCreate, CopyFileOrFolder } from '../../../Tools/file'
|
||||
@@ -10,8 +10,9 @@ import { BaseRealmService } from './bookBasic.js'
|
||||
import { isEmpty } from 'lodash'
|
||||
import { FfmpegOptions } from '../../../../main/Service/ffmpegOptions.js'
|
||||
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 { ImageToVideoModels } from '@/define/enum/video.js'
|
||||
|
||||
export class BookService extends BaseRealmService {
|
||||
static instance: BookService | null = null
|
||||
@@ -205,11 +206,13 @@ export class BookService extends BaseRealmService {
|
||||
} else if (book.type == BookType.MJ_REVERSE) {
|
||||
imageCategory = BookImageCategory.MJ
|
||||
} else if (book.type == BookType.ORIGINAL) {
|
||||
imageCategory = BookImageCategory.MJ
|
||||
imageCategory = global.config.defaultImageMode ?? BookImageCategory.MJ
|
||||
} else {
|
||||
throw new Error('未知的小说类型')
|
||||
}
|
||||
|
||||
let videoCategory = ImageToVideoModels.MJ_VIDEO;
|
||||
|
||||
this.realm.write(() => {
|
||||
book.version = version
|
||||
this.realm.create('Book', book)
|
||||
@@ -232,7 +235,9 @@ export class BookService extends BaseRealmService {
|
||||
updateTime: new Date(),
|
||||
createTime: new Date(),
|
||||
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 { BookTaskDetailModel, ReversePrompt } from '../../model/Book/bookTaskDetail.js'
|
||||
const { v4: uuidv4 } = require('uuid')
|
||||
import { Book } from "../../../../model/book"
|
||||
import { Book } from "../../../../model/book/book"
|
||||
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')
|
||||
|
||||
@@ -65,12 +67,29 @@ export class BookTaskDetailService extends BaseRealmService {
|
||||
let resObj = {
|
||||
...item,
|
||||
videoPath: JoinPath(define.project_path, item.videoPath),
|
||||
generateVideoPath: JoinPath(define.project_path, item.generateVideoPath),
|
||||
audioPath: JoinPath(define.project_path, item.audioPath),
|
||||
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) => {
|
||||
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,
|
||||
sceneTags: item.sceneTags ? item.sceneTags.map((tag) => tag) : null,
|
||||
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,
|
||||
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)
|
||||
})
|
||||
@@ -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获取指定的小说任务分镜详细数据
|
||||
* @param bookTaskDetailId
|
||||
@@ -144,7 +186,10 @@ export class BookTaskDetailService extends BaseRealmService {
|
||||
bookTaskDetail.imageLock = false
|
||||
bookTaskDetail.createTime = new Date()
|
||||
bookTaskDetail.updateTime = new Date()
|
||||
bookTaskDetail.adetailer = false // 先写死false
|
||||
|
||||
if (!bookTaskDetail.hasOwnProperty('adetailer')) {
|
||||
bookTaskDetail.adetailer = false; // 设置默认值
|
||||
}
|
||||
// 开始添加
|
||||
this.transaction(() => {
|
||||
this.realm.create('BookTaskDetail', bookTaskDetail)
|
||||
@@ -174,7 +219,16 @@ export class BookTaskDetailService extends BaseRealmService {
|
||||
}
|
||||
// 开始修改
|
||||
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()
|
||||
})
|
||||
@@ -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的反推提示词数据
|
||||
* @param bookTaskDetailId 分镜数据的ID
|
||||
@@ -241,7 +323,7 @@ export class BookTaskDetailService extends BaseRealmService {
|
||||
* 删除满足条件的对象吗,必传小说ID和小说任务ID
|
||||
* @param condition bookId,bookTaskId,name,id
|
||||
*/
|
||||
DeleteBookTaskDetail(condition) {
|
||||
DeleteBookTaskDetail(condition: Book.DeleteBookTaskDetailCondition) {
|
||||
try {
|
||||
if (isEmpty(condition.id) && isEmpty(condition.bookTaskId) && isEmpty(condition.bookId)) {
|
||||
throw new Error('删除小说分镜信息失败,没有必要参数')
|
||||
|
||||
@@ -8,11 +8,12 @@ import { BaseRealmService } from './bookBasic'
|
||||
import { JoinPath } from '../../../Tools/file'
|
||||
import { BookBackTaskList } from '../../model/Book/BookBackTaskListModel.js'
|
||||
const { v4: uuidv4 } = require('uuid')
|
||||
import { Book } from '../../../../model/book'
|
||||
import { Book } from '../../../../model/book/book'
|
||||
import { TagDefine } from '../../../tagDefine.js'
|
||||
import { ImageStyleDefine } from "../../../../define/iamgeStyleDefine"
|
||||
import { cloneDeep } from 'lodash'
|
||||
import { GeneralResponse } from '../../../../model/generalResponse'
|
||||
import { ImageToVideoModels } from '@/define/enum/video'
|
||||
|
||||
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),
|
||||
audioPath: JoinPath(define.project_path, bookTask.audioPath),
|
||||
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出图
|
||||
videoCategory : bookTask.videoCategory ? bookTask.videoCategory : ImageToVideoModels.MJ_VIDEO
|
||||
} as Book.SelectBookTask;
|
||||
})
|
||||
|
||||
|
||||
@@ -1,16 +1,15 @@
|
||||
import Realm, { UpdateMode } from 'realm'
|
||||
import path from 'path'
|
||||
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 { successMessage } from '../../../../main/Public/generalTools'
|
||||
import { BaseSoftWareService } from './softwareBasic.js'
|
||||
import { isEmpty, isNumber } from 'lodash'
|
||||
import { cloneDeep, isEmpty } from 'lodash'
|
||||
const { v4: uuidv4 } = require('uuid')
|
||||
import { version } from '../../../../../package.json'
|
||||
import { GeneralResponse } from '../../../../model/generalResponse'
|
||||
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 {
|
||||
static instance: MJSettingService | null = null
|
||||
@@ -32,6 +31,7 @@ export class MJSettingService extends BaseSoftWareService {
|
||||
return MJSettingService.instance
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 初始化数据
|
||||
*/
|
||||
@@ -300,6 +300,12 @@ export class MJSettingService extends BaseSoftWareService {
|
||||
if (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) => {
|
||||
return {
|
||||
...remoteMj
|
||||
@@ -348,9 +354,12 @@ export class MJSettingService extends BaseSoftWareService {
|
||||
remoteMjSetting.createTime = new Date()
|
||||
remoteMjSetting.updateTime = new Date()
|
||||
remoteMjSetting.version = version
|
||||
remoteMjSetting.enable = true
|
||||
remoteMjSetting.remark = global.machineId
|
||||
|
||||
if (remoteMjSetting.hasOwnProperty('enable') == false) {
|
||||
remoteMjSetting.enable = true
|
||||
}
|
||||
|
||||
// 判断当前this.relam 是不是已经处于一个事务中
|
||||
if (this.realm.isInTransaction) {
|
||||
this.realm.create('RemoteMJ', remoteMjSetting)
|
||||
@@ -456,21 +465,28 @@ export class MJSettingService extends BaseSoftWareService {
|
||||
* @param mjSettingQuery 查询的条件 Id ,null 返回全部
|
||||
* @returns
|
||||
*/
|
||||
GetMjSetting(mjSettingQuery) {
|
||||
GetMjSetting() {
|
||||
try {
|
||||
let mjSettings = this.realm.objects('MjSetting')
|
||||
let res = this.realm.objects('Options').filtered(`key = "${OptionKeyName.MJ_GlobalSetting}"`);
|
||||
|
||||
if (mjSettingQuery?.id) {
|
||||
mjSettings = this.realm.objects('MjSetting').filtered('id = $0', mjSettingQuery.id)
|
||||
}
|
||||
let mjSetting: OptionModel.OptionItem | null = null;
|
||||
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) => {
|
||||
return {
|
||||
...mjSetting
|
||||
if (!ValidateJson(mjSetting.value)) {
|
||||
throw new Error('MJ设置的数据格式不正确,请检查数据格式')
|
||||
}
|
||||
})
|
||||
return JSON.parse(mjSetting.value)?.mj_simpleSetting
|
||||
|
||||
return successMessage(resMjSetting, '获取MJ基础设置成功', 'MJSettingService_getMjSetting')
|
||||
} else {
|
||||
throw new Error('没有找到MJ的设置信息,请检查')
|
||||
}
|
||||
} catch (error) {
|
||||
throw error
|
||||
}
|
||||
@@ -576,11 +592,14 @@ export class MJSettingService extends BaseSoftWareService {
|
||||
GetMJSettingTreeData() {
|
||||
try {
|
||||
// 获取MJ的基础配置信息
|
||||
let mjSettings = this.GetMjSetting(null)
|
||||
if (mjSettings.data.length <= 0) {
|
||||
this.InitData();
|
||||
mjSettings = this.GetMjSetting(null)
|
||||
let mjSettings = this.GetMjSetting()
|
||||
// if (mjSettings.data.length <= 0) {
|
||||
// this.InitData();
|
||||
// mjSettings = this.GetMjSetting(null)
|
||||
|
||||
// }
|
||||
if (mjSettings == null) {
|
||||
throw new Error('未找到MJ的设置信息,请检查');
|
||||
}
|
||||
// 获取API的配置信息
|
||||
let apiSettings = this.GetAPIMjSetting(null)
|
||||
@@ -588,7 +607,7 @@ export class MJSettingService extends BaseSoftWareService {
|
||||
let remoteSettings = this.GetRemoteMJSettings(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.remoteSetting = remoteSettings.data.length > 0 ? remoteSettings.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'
|
||||
import { MJImageType, MJRobotType } from '../../../enum/mjEnum'
|
||||
import { PresetModel } from '../../model/SoftWare/preset'
|
||||
import { OptionsModel } from '../../model/SoftWare/options'
|
||||
const { v4: uuidv4 } = require('uuid')
|
||||
|
||||
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 < 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 {
|
||||
@@ -195,10 +214,11 @@ export class BaseSoftWareService extends BaseService {
|
||||
RemoteMJModel,
|
||||
APIMjModel,
|
||||
MjSettingModel,
|
||||
PresetModel
|
||||
PresetModel,
|
||||
OptionsModel
|
||||
],
|
||||
path: dbPath,
|
||||
schemaVersion: 23, // 当前版本号
|
||||
schemaVersion: 26, // 当前版本号
|
||||
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 = {
|
||||
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_MAIN_NOTIFICATION: 'SHOW_GLOBAL_MAIN_NOTIFICATION',
|
||||
OPEN_DEV_TOOLS_PASSWORD: 'OPEN_DEV_TOOLS_PASSWORD',
|
||||
@@ -81,7 +100,6 @@ export const DEFINE_STRING = {
|
||||
GET_ADETAILER_LIST: 'GET_ADETAILER_LIST',
|
||||
SAVE_DETAILER_CONFIG: 'SAVE_DETAILER_CONFIG',
|
||||
OPEN_URL: 'OPEN_URL',
|
||||
GET_VERSION: 'GET_VERSION',
|
||||
GET_FRAME_RETUN: 'GET_FRAME_RETUN',
|
||||
DOWNLOAD_MODEL: 'DOWNLOAD_MODEL',
|
||||
START_STORY_BOARDING: 'START_STORY_BOARDING',
|
||||
@@ -217,140 +235,6 @@ export const DEFINE_STRING = {
|
||||
BATCH_PROCESS_IMAGE_RESULT: 'BATCH_PROCESS_IMAGE_RESULT',
|
||||
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: {
|
||||
GET_SORT_OPTIONS: 'GET_SORT_OPTIONS',
|
||||
SAVE_PROMPT_SORT_DATA: 'SAVE_PROMPT_SORT_DATA',
|
||||
@@ -369,41 +253,5 @@ export const DEFINE_STRING = {
|
||||
* 获取场景的预设(只获取 label 和 id)
|
||||
*/
|
||||
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 {
|
||||
// 原创
|
||||
ORIGINAL = 'original',
|
||||
@@ -15,6 +17,8 @@ export enum BookImageCategory {
|
||||
MJ = 'mj',
|
||||
// SD
|
||||
SD = 'sd',
|
||||
// ComfyUI
|
||||
ComfyUI = "comfyui",
|
||||
// D3
|
||||
D3 = 'd3',
|
||||
// FLUX API
|
||||
@@ -73,6 +77,8 @@ export enum BookBackTaskType {
|
||||
MJ_IMAGE = 'mj_image',
|
||||
// SD 生成图片
|
||||
SD_IMAGE = 'sd_image',
|
||||
// ComfyUI 生成图片
|
||||
ComfyUI_IMAGE = 'comfyui_image',
|
||||
// flux forge 生成图片
|
||||
FLUX_FORGE_IMAGE = 'flux_forge_image',
|
||||
// flux api 生成图片
|
||||
@@ -86,7 +92,19 @@ export enum BookBackTaskType {
|
||||
// 推理
|
||||
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 {
|
||||
@@ -208,7 +226,16 @@ export enum BookTaskStatus {
|
||||
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 {
|
||||
@@ -232,7 +259,8 @@ export enum OperateBookType {
|
||||
BOOK = 'book', // 这个小说的所有批次
|
||||
BOOKTASK = 'bookTask', // 整个小说批次分镜合并
|
||||
BOOKTASKDETAIL = 'bookTaskDetail', // 单个分镜合并
|
||||
UNDERBOOKTASK = 'underBookTask' // 执行小说批次任务的指定ID以及后面的所有的东西
|
||||
UNDERBOOKTASK = 'underBookTask', // 执行小说批次任务的指定ID以及后面的所有的东西
|
||||
ASSIGNBOOKTASK = 'assignBookTask' // 指定小说批次任务
|
||||
}
|
||||
|
||||
export enum CopyImageType {
|
||||
@@ -276,3 +304,357 @@ export enum BookTagSelectType {
|
||||
// 标签
|
||||
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 {
|
||||
// 角色
|
||||
|
||||
@@ -8,12 +8,17 @@ export enum MJImageType {
|
||||
// 浏览器模式
|
||||
BROWSER_MJ = 'browser_mj',
|
||||
|
||||
// MJ生图包
|
||||
PACKAGE_MJ = 'package_mj',
|
||||
|
||||
// API模式
|
||||
API_MJ = 'api_mj',
|
||||
|
||||
// 本地 SD
|
||||
LOCAL_SD = 'local_sd',
|
||||
|
||||
// ComfyUI
|
||||
ComfyUI = 'comfyui',
|
||||
// flux-api
|
||||
FLUX_API = 'flux-api',
|
||||
|
||||
@@ -35,10 +40,10 @@ export enum MJRobotType {
|
||||
|
||||
export enum MJSpeed {
|
||||
// 快速
|
||||
FAST = 'fast',
|
||||
FAST = 'FAST',
|
||||
|
||||
// 休闲
|
||||
RELAX = 'relaxed'
|
||||
RELAX = 'RELAXED'
|
||||
}
|
||||
|
||||
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', // 获取文案
|
||||
REMOVE_WATERMARK = "REMOVE_WATERMARK",// 删除水印
|
||||
MJ_REVERSE = 'MJ_REVERSE',// MJ反推,返回反推结果
|
||||
SD_REVERSE = 'SD_REVERSE',// MJ反推,返回反推结果
|
||||
REVERSE_PROMPT_TRANSLATE = 'REVERSE_PROMPT_TRANSLATE',// 反推提示词翻译
|
||||
GPT_PROMPT_TRANSLATE = 'GPT_PROMPT_TRANSLATE', // GPT提示词翻译
|
||||
MJ_IMAGE = 'MJ_IMAGE',// MJ 生成图片
|
||||
ComfyUI_IMAGE = 'ComfyUI_IMAGE',// ComfyUI 生成图片
|
||||
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 {
|
||||
|
||||
@@ -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 {
|
||||
code: 1,
|
||||
data: [
|
||||
{
|
||||
label: 'MJ',
|
||||
value: 'mj'
|
||||
},
|
||||
{
|
||||
label: 'SD',
|
||||
value: 'sd'
|
||||
},
|
||||
{
|
||||
label: 'MJ',
|
||||
value: 'mj'
|
||||
label: 'ComfyUI',
|
||||
value: 'comfyui'
|
||||
},
|
||||
{
|
||||
label: 'D3',
|
||||
|
||||
@@ -11,6 +11,9 @@ export function GetTTSSelect() {
|
||||
* 获取当前 edge-tts 支持的角色,返回一个数组
|
||||
*/
|
||||
export function GetEdgeTTSRole() {
|
||||
|
||||
//
|
||||
|
||||
return [
|
||||
{
|
||||
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 { BookGeneral } from '../Service/Book/bookGeneral'
|
||||
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 basicReverse = new BasicReverse()
|
||||
let subtitle = new Subtitle()
|
||||
@@ -29,6 +31,8 @@ let subtitleService = new SubtitleService()
|
||||
let bookFrame = new BookFrame()
|
||||
let bookPrompt = new BookPrompt();
|
||||
let bookGeneral = new BookGeneral()
|
||||
let videoGlobal = new VideoGlobal()
|
||||
let bookImageTextToVideoIndex = new BookImageTextToVideoIndex();
|
||||
|
||||
export function BookIpc() {
|
||||
// 获取样式图片的子列表
|
||||
@@ -92,10 +96,11 @@ export function BookIpc() {
|
||||
|
||||
//#endregion
|
||||
|
||||
//#region 小说通用操作
|
||||
//#region 小说详情通用操作
|
||||
|
||||
ipcMain.handle(DEFINE_STRING.BOOK.REPLACE_BOOK_DATA, async (event, bookTaskId, replaceData) => await bookGeneral.ReplaceBookData(bookTaskId, replaceData))
|
||||
|
||||
|
||||
//#endregion
|
||||
|
||||
//#region 分镜相关
|
||||
@@ -116,6 +121,9 @@ export function BookIpc() {
|
||||
await bookFrame.ReplaceVideoCurrentFrame(bookTaskDetailId, currentTime)
|
||||
)
|
||||
|
||||
// 剪映抽帧,并判断是不是切割视频
|
||||
ipcMain.handle(DEFINE_STRING.BOOK.JIANYING_FRAME, async (event, bookTaskId, draftName) => await bookFrame.JianyingFrame(bookTaskId, draftName))
|
||||
|
||||
//#endregion
|
||||
|
||||
//#region 提示词相关
|
||||
@@ -154,6 +162,12 @@ export function BookIpc() {
|
||||
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
|
||||
|
||||
//#region 文案相关
|
||||
@@ -241,14 +255,14 @@ export function BookIpc() {
|
||||
// 高清图片前检查,主要是检查图片大小
|
||||
ipcMain.handle(
|
||||
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)
|
||||
)
|
||||
|
||||
// 开始执行高清图片
|
||||
ipcMain.handle(
|
||||
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)
|
||||
)
|
||||
|
||||
// 获取图片的URL并且下载
|
||||
ipcMain.handle(
|
||||
DEFINE_STRING.BOOK.GET_IMAGE_URL_AND_DOWNLOAD,
|
||||
async (event, id: string, operateBookType: OperateBookType, coverData: boolean) =>
|
||||
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
|
||||
|
||||
|
||||
// 一拆四,将一个任务拆分成四个任务,并且复制对应的图片
|
||||
ipcMain.handle(
|
||||
DEFINE_STRING.BOOK.ONE_TO_FOUR_BOOK_TASK,
|
||||
async (event, bookTaskDetailId) => await bookTask.OneToFourBookTask(bookTaskDetailId)
|
||||
)
|
||||
|
||||
//#region 小说相关
|
||||
|
||||
// 重置小说数据
|
||||
@@ -284,19 +322,25 @@ export function BookIpc() {
|
||||
|
||||
//#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.RESET_BOOK_TASK,
|
||||
async (event, bookTaskId) => await bookTask.ReSetBookTask(bookTaskId)
|
||||
async (event, bookTaskId, operateBookType) => await bookTask.ReSetBookTask(bookTaskId, operateBookType)
|
||||
)
|
||||
|
||||
// 删除小说批次数据
|
||||
ipcMain.handle(
|
||||
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(
|
||||
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
|
||||
|
||||
//#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 { DEFINE_STRING } from '../../define/define_string'
|
||||
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 { BookTaskDetailService } from '../../define/db/service/Book/bookTaskDetailService'
|
||||
import { BookService } from '../../define/db/service/Book/bookService'
|
||||
import { SoftWareServiceBasic } from '../Service/ServiceBasic/softwareServiceBasic'
|
||||
import { BookServiceBasic } from '../Service/ServiceBasic/bookServiceBasic'
|
||||
|
||||
|
||||
async function DBIpc() {
|
||||
@@ -13,6 +14,7 @@ async function DBIpc() {
|
||||
let bookTaskDetailService = await BookTaskDetailService.getInstance()
|
||||
let bookService = await BookService.getInstance()
|
||||
let softWareServiceBasic = new SoftWareServiceBasic()
|
||||
let bookServiceBasic = new BookServiceBasic()
|
||||
//#region 小说相关的修改
|
||||
|
||||
// 修改小说任务的数据
|
||||
@@ -49,6 +51,19 @@ async function DBIpc() {
|
||||
|
||||
//#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 软件设置的修改
|
||||
|
||||
|
||||
@@ -1,22 +1,24 @@
|
||||
import { PromptIpc } from './promptIpc'
|
||||
import { SettingIpc } from './settingIpc.js'
|
||||
import { ImageGenerateIpc } from './imageGenerateIpc.js'
|
||||
import { WritingIpc } from './writingIpc.js'
|
||||
import { SettingIpc } from './settingIpc'
|
||||
import { ImageGenerateIpc } from './imageGenerateIpc'
|
||||
import { WritingIpc } from './writingIpc'
|
||||
import { VideoGenerateIpc } from './videoGenerateIpc'
|
||||
import { TranslateIpc } from './translateIpc.js'
|
||||
import { GptIpc } from './gptIpc.js'
|
||||
import { MjIpc } from './mjIpc.js'
|
||||
import { TranslateIpc } from './translateIpc'
|
||||
import { GptIpc } from './gptIpc'
|
||||
import { MjIpc } from './mjIpc'
|
||||
import { OriginalImageGenerateIpc } from './originalImageGenerateIpc'
|
||||
import { SdIpc } from './sdIpc.js'
|
||||
import { MainIpc } from './mainIpc.js'
|
||||
import { GlobalIpc } from './globalIpc.js'
|
||||
import { ImageIpc } from './imageIpc.js'
|
||||
import { SystemIpc } from './systemIpc.js'
|
||||
import { SdIpc } from './sdIpc'
|
||||
import { MainIpc } from './mainIpc'
|
||||
import { GlobalIpc } from './globalIpc'
|
||||
import { ImageIpc } from './imageIpc'
|
||||
import { SystemIpc } from './systemIpc'
|
||||
import { BookIpc } from './bookIpc'
|
||||
import { TTSIpc } from './ttsIpc.js'
|
||||
import { TTSIpc } from './ttsIpc'
|
||||
import { DBIpc } from './dbIpc'
|
||||
import { PresetIpc } from './presetIpc'
|
||||
import { TaskIpc } from './taskIpc'
|
||||
import { OptionsIpc } from './optionsIpc'
|
||||
import AxiosIpc from './axiosIpc'
|
||||
|
||||
export async function RegisterIpc(createWindow) {
|
||||
PromptIpc()
|
||||
@@ -38,4 +40,6 @@ export async function RegisterIpc(createWindow) {
|
||||
SystemIpc()
|
||||
BookIpc()
|
||||
TTSIpc()
|
||||
OptionsIpc()
|
||||
AxiosIpc()
|
||||
}
|
||||
@@ -60,7 +60,6 @@ function MjIpc() {
|
||||
)
|
||||
|
||||
// 获取MJ生图的方式
|
||||
// GetMJGenerateCategory: async (callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.MJ.GET_MJ_GENERATE_CATEGORY)),
|
||||
ipcMain.handle(
|
||||
DEFINE_STRING.MJ.GET_MJ_GENERATE_CATEGORY,
|
||||
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'
|
||||
let watermark = new Watermark()
|
||||
|
||||
import { SoftWareServiceBasic } from '../Service/ServiceBasic/softwareServiceBasic'
|
||||
let softWareServiceBasic = new SoftWareServiceBasic()
|
||||
|
||||
async function SettingIpc() {
|
||||
// 获取背景音乐配置列表
|
||||
ipcMain.handle(
|
||||
@@ -179,12 +182,6 @@ async function SettingIpc() {
|
||||
async (event, value) => await mjSetting.GetMJSetting(value)
|
||||
)
|
||||
|
||||
// 保存MJ的基础设置信息
|
||||
ipcMain.handle(
|
||||
DEFINE_STRING.SETTING.UPDATE_MJ_SETTING,
|
||||
async (event, value) => await mjSetting.UpdateMJSetting(value)
|
||||
)
|
||||
|
||||
// 获取MJ的所有设置
|
||||
ipcMain.handle(
|
||||
DEFINE_STRING.SETTING.GET_MJ_SETTING_TREE_DATA,
|
||||
@@ -200,25 +197,31 @@ async function SettingIpc() {
|
||||
// 获取所有的代理MJ信息
|
||||
ipcMain.handle(
|
||||
DEFINE_STRING.SETTING.GET_REMOTE_MJ_SETTINGS,
|
||||
async (event) => await mjSetting.GetRemoteMJSettings()
|
||||
async (event, type: string) => await mjSetting.GetRemoteMJSettings(type)
|
||||
)
|
||||
|
||||
// 创建新的代理MJ信息
|
||||
ipcMain.handle(
|
||||
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账号并重连
|
||||
ipcMain.handle(
|
||||
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账号
|
||||
ipcMain.handle(
|
||||
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
|
||||
@@ -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 { DEFINE_STRING } from "../../define/define_string";
|
||||
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();
|
||||
import BackTaskService from '../Service/task/backTaskService'
|
||||
import { TaskModal } from "@/model/task";
|
||||
import { Book } from "@/model/book/book";
|
||||
const backTaskService = new BackTaskService()
|
||||
|
||||
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')
|
||||
}
|
||||
})
|
||||
|
||||
/** 获取指定状态的任务数量 */
|
||||
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 }
|
||||
@@ -5,19 +5,11 @@ import { TTS } from '../Service/tts'
|
||||
const tts = new TTS()
|
||||
|
||||
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(
|
||||
DEFINE_STRING.TTS.GENERATE_AUDIO,
|
||||
async (event, text) => await tts.GenerateAudio(text)
|
||||
async (event) => await tts.GenerateAudio()
|
||||
)
|
||||
|
||||
// 生成SRT字幕文件
|
||||
@@ -37,4 +29,7 @@ export function TTSIpc() {
|
||||
DEFINE_STRING.TTS.GET_TTS_HISTORY_DATA,
|
||||
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'
|
||||
let writingSetting = new WritingSetting()
|
||||
import { SubtitleService } from '../Service/Subtitle/subtitleService'
|
||||
import { BookPrompt } from '../Service/Book/bookPrompt'
|
||||
let subtitleService = new SubtitleService()
|
||||
const bookPrompt = new BookPrompt();
|
||||
|
||||
import CopyWritingService from '@/main/Service/copywriting/index'
|
||||
|
||||
function WritingIpc() {
|
||||
// 监听分镜时间的保存
|
||||
@@ -67,9 +71,25 @@ function WritingIpc() {
|
||||
async (event, subtitleSetting) => await subtitleService.SaveSubtitleSetting(subtitleSetting)
|
||||
)
|
||||
|
||||
//#region 文案处理
|
||||
|
||||
/**
|
||||
* AI处理文案
|
||||
*/
|
||||
ipcMain.handle(
|
||||
DEFINE_STRING.WRITE.ACTION_START,
|
||||
async (event, aiSetting, word) => await writing.ActionStart(aiSetting, word)
|
||||
DEFINE_STRING.WRITE.COPY_WRITING_AI_GENERATION,
|
||||
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 }
|
||||
@@ -4,7 +4,6 @@ import { DEFINE_STRING } from '../../define/define_string'
|
||||
import { define } from '../../define/define'
|
||||
let fspromises = require('fs').promises
|
||||
import { gptDefine } from '../../define/gptDefine'
|
||||
import { apiUrl } from '../../define/api/apiUrlDefine'
|
||||
import { successMessage } from '../Public/generalTools'
|
||||
import { RetryWithBackoff } from '../../define/Tools/common'
|
||||
|
||||
@@ -354,7 +353,7 @@ export class GPT {
|
||||
},
|
||||
{
|
||||
role: 'user',
|
||||
content: gptDefine.getUserContentByType('character', {})
|
||||
content: gptDefine.getUserContentByType('character', {textContent: value})
|
||||
}
|
||||
]
|
||||
let content = await RetryWithBackoff(
|
||||
|
||||
@@ -351,27 +351,59 @@ export class Translate {
|
||||
content: translateData
|
||||
})
|
||||
|
||||
let config = {
|
||||
method: 'post',
|
||||
maxBodyLength: Infinity,
|
||||
url: this.translationBusiness,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
Authorization: `Bearer ${token}`
|
||||
},
|
||||
data: JSON.stringify(data)
|
||||
let content = ''
|
||||
// 判断整体是不是需要LMS转发
|
||||
if (global.config.useTransfer) {
|
||||
let url = define.lms + '/lms/Forward/SimpleTransfer'
|
||||
let config = {
|
||||
method: 'post',
|
||||
url: url,
|
||||
maxBodyLength: Infinity,
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
data: JSON.stringify({
|
||||
url: this.translationBusiness,
|
||||
apiKey: token,
|
||||
dataString: JSON.stringify(data)
|
||||
})
|
||||
}
|
||||
// 重试机制
|
||||
let res = await RetryWithBackoff(
|
||||
async () => {
|
||||
return await axios.request(config)
|
||||
},
|
||||
5,
|
||||
2000
|
||||
)
|
||||
|
||||
if (res.data.code != 1) {
|
||||
throw new Error(res.data.message)
|
||||
}
|
||||
content = GetOpenAISuccessResponse(res.data.data)
|
||||
} else {
|
||||
let config = {
|
||||
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 content = GetOpenAISuccessResponse(res.data)
|
||||
|
||||
if (to == 'zh') {
|
||||
res_data.push({
|
||||
|
||||
@@ -773,8 +773,8 @@ export class ClipDraft {
|
||||
// 计算方式和上面的不同
|
||||
let sub_total = Math.abs(up_pos - down_pos);
|
||||
let currwnt_rate = sub_total * (1 - time_rate);
|
||||
up_pos = up_pos + currwnt_rate / 2;
|
||||
down_pos = down_pos - currwnt_rate / 2;
|
||||
up_pos = up_pos - (up_pos * (currwnt_rate / up_pos)) / 2;
|
||||
down_pos = down_pos + (down_pos * (currwnt_rate / down_pos)) / 2;
|
||||
}
|
||||
|
||||
// 修改上面的数据,添加Y轴缩放
|
||||
|
||||
@@ -1,335 +1,370 @@
|
||||
import path from "path";
|
||||
import { define } from "../../define/define";
|
||||
import { Tools } from "../tools";
|
||||
import { DEFINE_STRING } from "../../define/define_string";
|
||||
import { get, has } from "lodash";
|
||||
const util = require('util');
|
||||
const { spawn, exec } = require('child_process');
|
||||
const execAsync = util.promisify(exec);
|
||||
const fspromises = require("fs").promises;
|
||||
import path from 'path'
|
||||
import { define } from '../../define/define'
|
||||
import { Tools } from '../tools'
|
||||
import { DEFINE_STRING } from '../../define/define_string'
|
||||
import { get, has } from 'lodash'
|
||||
const util = require('util')
|
||||
const { spawn, exec } = require('child_process')
|
||||
const execAsync = util.promisify(exec)
|
||||
const fspromises = require('fs').promises
|
||||
|
||||
export class PublicMethod {
|
||||
constructor(global) {
|
||||
this.global = global;
|
||||
this.tools = new Tools();
|
||||
constructor(global) {
|
||||
this.global = global
|
||||
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文件中的指定的属性
|
||||
* @param {*} value 0: 要修改的数据 1: 要修改的属性 2: 是否需要解析
|
||||
* @returns
|
||||
*/
|
||||
async SaveConfigJsonProperty(value) {
|
||||
/**
|
||||
* 返回当前项目的config.json文件中的指定的属性信息,若是没有传入属性,则返回所有的信息
|
||||
* @param {Array} value 0 要获取的属性 1 返回的默认值
|
||||
* @param {Boolean} ckeck 是否需要校验属性不存在
|
||||
* @returns
|
||||
*/
|
||||
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 {
|
||||
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
|
||||
}
|
||||
let task_list_path = path.join(this.global.config.project_path, 'scripts/task_list.json')
|
||||
let isE = await this.tools.checkExists(task_list_path)
|
||||
if (!isE) {
|
||||
throw new Error('任务队列文件不存在。请先添加 批次任务')
|
||||
}
|
||||
let task_list_json = JSON.parse(await fspromises.readFile(task_list_path, 'utf-8'))
|
||||
// 循环循环数据。修改
|
||||
for (let i = 0; i < value.length; i++) {
|
||||
const element = value[i]
|
||||
let index = task_list_json.task_list.findIndex((item) => item.id == element.id)
|
||||
task_list_json.task_list[index] = element
|
||||
}
|
||||
await fspromises.writeFile(task_list_path, JSON.stringify(task_list_json))
|
||||
} catch (error) {
|
||||
throw error;
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回当前项目的config.json文件中的指定的属性信息,若是没有传入属性,则返回所有的信息
|
||||
* @param {Array} value 0 要获取的属性 1 返回的默认值
|
||||
* @param {Boolean} ckeck 是否需要校验属性不存在
|
||||
* @returns
|
||||
*/
|
||||
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;
|
||||
},
|
||||
'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
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* 高清指定的文件夹
|
||||
* @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
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改生成图片的任务队列数据
|
||||
* @param {传入的要修改的数据数组} value
|
||||
*/
|
||||
async ModifyImageTaskList(value) {
|
||||
this.global.fileQueue.enqueue(async () => {
|
||||
try {
|
||||
let task_list_path = path.join(this.global.config.project_path, "scripts/task_list.json");
|
||||
let isE = await this.tools.checkExists(task_list_path);
|
||||
if (!isE) {
|
||||
throw new Error("任务队列文件不存在。请先添加 批次任务");
|
||||
}
|
||||
let task_list_json = JSON.parse(await fspromises.readFile(task_list_path, "utf-8"));
|
||||
// 循环循环数据。修改
|
||||
for (let i = 0; i < value.length; i++) {
|
||||
const element = value[i];
|
||||
let index = task_list_json.task_list.findIndex(item => item.id == element.id);
|
||||
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;
|
||||
})
|
||||
}
|
||||
/**
|
||||
* 生成SD相对的JSON文件。删除反推的txt文件
|
||||
*/
|
||||
async AddWebuiJson() {
|
||||
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'
|
||||
)
|
||||
|
||||
|
||||
/**
|
||||
* 高清指定的文件夹
|
||||
* @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}"`;
|
||||
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;
|
||||
// json 已经存在,不做后续处理
|
||||
if (image.length == promptJson.length) {
|
||||
return {
|
||||
code: 1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成SD相对的JSON文件。删除反推的txt文件
|
||||
*/
|
||||
async AddWebuiJson() {
|
||||
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');
|
||||
if (txtfile.length != image.length) {
|
||||
throw new Error('关键词文件和图片数量对不上,请检查!!')
|
||||
}
|
||||
let sd_config = JSON.parse(await fspromises.readFile(define.sd_setting, 'utf-8'))
|
||||
|
||||
// json 已经存在,不做后续处理
|
||||
if (image.length == promptJson.length) {
|
||||
return {
|
||||
code: 1,
|
||||
}
|
||||
}
|
||||
|
||||
if (txtfile.length != image.length) {
|
||||
throw new Error("关键词文件和图片数量对不上,请检查!!")
|
||||
}
|
||||
let sd_config = JSON.parse(await fspromises.readFile(define.sd_setting, 'utf-8'));
|
||||
|
||||
for (let i = 0; i < image.length; i++) {
|
||||
const element = image[i];
|
||||
let txtpath = element.split('.png')[0] + '.txt';
|
||||
let prompt = await fspromises.readFile(txtpath, 'utf-8');
|
||||
// console.log(txtpath)
|
||||
let obj = {}
|
||||
obj.model = sd_config.setting.type;
|
||||
obj.api = sd_config.setting.webui_api_url + 'sdapi/v1/img2img';
|
||||
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;
|
||||
for (let i = 0; i < image.length; i++) {
|
||||
const element = image[i]
|
||||
let txtpath = element.split('.png')[0] + '.txt'
|
||||
let prompt = await fspromises.readFile(txtpath, 'utf-8')
|
||||
// console.log(txtpath)
|
||||
let obj = {}
|
||||
obj.model = sd_config.setting.type
|
||||
obj.api = sd_config.setting.webui_api_url + 'sdapi/v1/img2img'
|
||||
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
|
||||
|
||||
/**
|
||||
* 获取当前项目的生图任务列表
|
||||
*/
|
||||
async GetImageTask() {
|
||||
try {
|
||||
let json_path = path.join(this.global.config.project_path, "scripts/task_list.json");
|
||||
let isExit = await this.tools.checkExists(json_path);
|
||||
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
|
||||
}
|
||||
// 写入
|
||||
await fspromises.writeFile(element + '.json', JSON.stringify(obj))
|
||||
// 删除对应的txt文件
|
||||
await fspromises.unlink(txtpath)
|
||||
}
|
||||
|
||||
return {
|
||||
code: 1
|
||||
}
|
||||
} catch (error) {
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前项目的生图任务列表
|
||||
*/
|
||||
async GetImageTask() {
|
||||
try {
|
||||
let json_path = path.join(this.global.config.project_path, 'scripts/task_list.json')
|
||||
let isExit = await this.tools.checkExists(json_path)
|
||||
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
|
||||
* @param {新的状态} newStatus
|
||||
*/
|
||||
async ModifyTaskStatus(type, id, newStatus) {
|
||||
this.global.fileQueue.enqueue(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) {
|
||||
/**
|
||||
* 修改任务的状态
|
||||
* @param {查找的类型 id out_folder} type
|
||||
* @param {查找的类型} id
|
||||
* @param {新的状态} newStatus
|
||||
*/
|
||||
async ModifyTaskStatus(type, id, newStatus) {
|
||||
this.global.fileQueue.enqueue(
|
||||
async () => {
|
||||
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));
|
||||
// 将修改数据写入到一个并发为 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 {
|
||||
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) {
|
||||
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 { BookService } from '../../../define/db/service/Book/bookService'
|
||||
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 { BookServiceBasic } from '../ServiceBasic/bookServiceBasic'
|
||||
import { BookTask } from './bookTask'
|
||||
import fs from 'fs'
|
||||
import { Book } from '../../../model/book'
|
||||
import { Book } from '../../../model/book/book'
|
||||
|
||||
export class BookBasic {
|
||||
bookServiceBasic: BookServiceBasic
|
||||
@@ -101,9 +100,14 @@ export class BookBasic {
|
||||
try {
|
||||
let book = await this.bookServiceBasic.GetBookDataById(bookId)
|
||||
// 获取所有的小说批次
|
||||
let bookTasks = (await this.bookServiceBasic.GetBookTaskData({
|
||||
let bookTasksObj = (await this.bookServiceBasic.GetBookTaskData({
|
||||
bookId: bookId
|
||||
})).bookTasks;
|
||||
}, true));
|
||||
// 删除之前判断是不是有子批次 没有直接退出
|
||||
let bookTasks = bookTasksObj.bookTasks;
|
||||
if (bookTasks.length == 0) {
|
||||
return successMessage('未找到小说批次数据,正常退出', 'BookBasic_ResetBookData');
|
||||
}
|
||||
// 重置批次任务
|
||||
for (let i = 0; i < bookTasks.length; i++) {
|
||||
const element = bookTasks[i];
|
||||
@@ -179,13 +183,18 @@ export class BookBasic {
|
||||
if (resetRes.code == 0) {
|
||||
throw new Error(resetRes.message)
|
||||
}
|
||||
let bookTasks = (await this.bookServiceBasic.GetBookTaskData({
|
||||
let bookTasksObj = (await this.bookServiceBasic.GetBookTaskData({
|
||||
bookId: bookId
|
||||
})).bookTasks;
|
||||
// 删除遗留重置的小说批次任务
|
||||
for (let i = 0; i < bookTasks.length; i++) {
|
||||
const element = bookTasks[i];
|
||||
await this.bookServiceBasic.DeleteBookTaskData(element.id);
|
||||
}, true))
|
||||
let bookTasks = bookTasksObj.bookTasks;
|
||||
|
||||
// 有数据才删除
|
||||
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
|
||||
|
||||
}
|
||||