commit 74009113fac762173f22d005b585379f44048584 Author: lq1405 <2769838458@qq.com> Date: Wed May 15 12:57:15 2024 +0800 Initial commit 添加MJ功能 diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..3dce414 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true \ No newline at end of file diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..a6f34fe --- /dev/null +++ b/.eslintignore @@ -0,0 +1,4 @@ +node_modules +dist +out +.gitignore diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..55db58d --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,15 @@ +/* eslint-env node */ +require('@rushstack/eslint-patch/modern-module-resolution') + +module.exports = { + extends: [ + 'eslint:recommended', + 'plugin:vue/vue3-recommended', + '@electron-toolkit', + '@vue/eslint-config-prettier' + ], + rules: { + 'vue/require-default-prop': 'off', + 'vue/multi-word-component-names': 'off' + } +} diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..a7b89d2 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +resources/package/resources/package/ffmpeg-2023-12-07-git-f89cff96d0-full_build/bin/ffmpeg.exe filter=lfs diff=lfs merge=lfs -text +resources/package/resources/package/ffmpeg-2023-12-07-git-f89cff96d0-full_build/bin/ffplay.exe filter=lfs diff=lfs merge=lfs -text +resources/package/resources/package/ffmpeg-2023-12-07-git-f89cff96d0-full_build/bin/ffprobe.exe filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..210c838 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +node_modules +dist +out +resources/scripts/build* +resources/scripts/dist +resources/scripts/model +resources/scripts/Temp +resources/package/ffmpeg* +resources/config* +*Lai.exe* +.DS_Store +*.log* diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..fdc1a98 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..9c6b791 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,6 @@ +out +dist +pnpm-lock.yaml +LICENSE.md +tsconfig.json +tsconfig.*.json diff --git a/.prettierrc.yaml b/.prettierrc.yaml new file mode 100644 index 0000000..35893b3 --- /dev/null +++ b/.prettierrc.yaml @@ -0,0 +1,4 @@ +singleQuote: true +semi: false +printWidth: 100 +trailingComma: none diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..940260d --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["dbaeumer.vscode-eslint"] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..0b6b9a6 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,39 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Debug Main Process", + "type": "node", + "request": "launch", + "cwd": "${workspaceRoot}", + "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron-vite", + "windows": { + "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron-vite.cmd" + }, + "runtimeArgs": ["--sourcemap"], + "env": { + "REMOTE_DEBUGGING_PORT": "9222" + } + }, + { + "name": "Debug Renderer Process", + "port": 9222, + "request": "attach", + "type": "chrome", + "webRoot": "${workspaceFolder}/src/renderer", + "timeout": 60000, + "presentation": { + "hidden": true + } + } + ], + "compounds": [ + { + "name": "Debug All", + "configurations": ["Debug Main Process", "Debug Renderer Process"], + "presentation": { + "order": 1 + } + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..97685ce --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,16 @@ +{ + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[javascript]": { + "editor.defaultFormatter": "vscode.typescript-language-features" + }, + "[json]": { + "editor.defaultFormatter": "vscode.json-language-features" + }, + "python.analysis.extraPaths": [ + "./resources/scripts/000_", + "./resources/scripts/000_" + ], + "vue3snippets.enable-compile-vue-file-on-did-save-code": false +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..1dfbd67 --- /dev/null +++ b/README.md @@ -0,0 +1,34 @@ +# laitool + +An Electron application with Vue + +## Recommended IDE Setup + +- [VSCode](https://code.visualstudio.com/) + [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) + [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) + +## Project Setup + +### Install + +```bash +$ npm install +``` + +### Development + +```bash +$ npm run dev +``` + +### Build + +```bash +# For windows +$ npm run build:win + +# For macOS +$ npm run build:mac + +# For Linux +$ npm run build:linux +``` diff --git a/build/entitlements.mac.plist b/build/entitlements.mac.plist new file mode 100644 index 0000000..38c887b --- /dev/null +++ b/build/entitlements.mac.plist @@ -0,0 +1,12 @@ + + + + + com.apple.security.cs.allow-jit + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.cs.allow-dyld-environment-variables + + + diff --git a/build/icon.icns b/build/icon.icns new file mode 100644 index 0000000..28644aa Binary files /dev/null and b/build/icon.icns differ diff --git a/build/icon.ico b/build/icon.ico new file mode 100644 index 0000000..72c391e Binary files /dev/null and b/build/icon.ico differ diff --git a/build/icon.png b/build/icon.png new file mode 100644 index 0000000..cf9e8b2 Binary files /dev/null and b/build/icon.png differ diff --git a/build/icon.svg b/build/icon.svg new file mode 100644 index 0000000..c940ccf --- /dev/null +++ b/build/icon.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dev-app-update.yml b/dev-app-update.yml new file mode 100644 index 0000000..22fd2eb --- /dev/null +++ b/dev-app-update.yml @@ -0,0 +1,3 @@ +provider: generic +url: https://example.com/auto-updates +updaterCacheDirName: laitool-updater diff --git a/electron-builder.yml b/electron-builder.yml new file mode 100644 index 0000000..abee87d --- /dev/null +++ b/electron-builder.yml @@ -0,0 +1,42 @@ +appId: com.electron.app +productName: laitool +directories: + buildResources: build +files: + - '!**/.vscode/*' + - '!src/*' + - '!electron.vite.config.{js,ts,mjs,cjs}' + - '!{.eslintignore,.eslintrc.cjs,.prettierignore,.prettierrc.yaml,dev-app-update.yml,CHANGELOG.md,README.md}' + - '!{.env,.env.*,.npmrc,pnpm-lock.yaml}' +asarUnpack: + - resources/** +win: + executableName: laitool +nsis: + artifactName: ${name}-${version}-setup.${ext} + shortcutName: ${productName} + uninstallDisplayName: ${productName} + createDesktopShortcut: always +mac: + entitlementsInherit: build/entitlements.mac.plist + extendInfo: + - NSCameraUsageDescription: Application requests access to the device's camera. + - NSMicrophoneUsageDescription: Application requests access to the device's microphone. + - NSDocumentsFolderUsageDescription: Application requests access to the user's Documents folder. + - NSDownloadsFolderUsageDescription: Application requests access to the user's Downloads folder. + notarize: false +dmg: + artifactName: ${name}-${version}.${ext} +linux: + target: + - AppImage + - snap + - deb + maintainer: electronjs.org + category: Utility +appImage: + artifactName: ${name}-${version}.${ext} +npmRebuild: false +publish: + provider: generic + url: https://example.com/auto-updates diff --git a/electron.vite.config.1710168376515.mjs b/electron.vite.config.1710168376515.mjs new file mode 100644 index 0000000..fdf9f40 --- /dev/null +++ b/electron.vite.config.1710168376515.mjs @@ -0,0 +1,24 @@ +// electron.vite.config.mjs +import { resolve } from "path"; +import { defineConfig, externalizeDepsPlugin } from "electron-vite"; +import vue from "@vitejs/plugin-vue"; +import Jsx from "@vitejs/plugin-vue-jsx"; +var electron_vite_config_default = defineConfig({ + main: { + plugins: [externalizeDepsPlugin()] + }, + preload: { + plugins: [externalizeDepsPlugin()] + }, + renderer: { + resolve: { + alias: { + "@renderer": resolve("src/renderer/src") + } + }, + plugins: [vue()] + } +}); +export { + electron_vite_config_default as default +}; diff --git a/electron.vite.config.mjs b/electron.vite.config.mjs new file mode 100644 index 0000000..b972453 --- /dev/null +++ b/electron.vite.config.mjs @@ -0,0 +1,26 @@ +import { resolve } from 'path' +import { defineConfig, externalizeDepsPlugin, bytecodePlugin } from 'electron-vite' +import vue from '@vitejs/plugin-vue' +import Jsx from '@vitejs/plugin-vue-jsx' + +export default defineConfig({ + main: { + plugins: [externalizeDepsPlugin(), bytecodePlugin({ + exclude: ['src/main/discord/discordScript.js'] + })] + }, + discord: { + plugins: [externalizeDepsPlugin(), bytecodePlugin()] + }, + preload: { + plugins: [externalizeDepsPlugin(), bytecodePlugin()] + }, + renderer: { + resolve: { + alias: { + '@renderer': resolve('src/renderer/src') + } + }, + plugins: [vue()] + } +}) diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..e87ff94 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,10610 @@ +{ + "name": "laitool", + "version": "2.2.2", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "laitool", + "version": "2.2.2", + "hasInstallScript": true, + "dependencies": { + "@alicloud/alimt20181012": "^1.2.0", + "@electron-toolkit/preload": "^3.0.0", + "@electron-toolkit/utils": "^3.0.0", + "@skit/x.naive-ui": "^0.15.0", + "@vicons/ionicons5": "^0.12.0", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "@volcengine/openapi": "^1.16.0", + "7zip-min": "^1.4.4", + "awesome-js": "^2.0.0", + "axios": "^1.6.5", + "compressing": "^1.10.0", + "crypto-js": "^4.2.0", + "electron-updater": "^6.1.7", + "fluent-ffmpeg": "^2.1.2", + "highlight.js": "^11.9.0", + "install": "^0.13.0", + "jimp": "^0.22.10", + "jsdom": "^24.0.0", + "lodash": "^4.17.21", + "music-metadata": "^7.14.0", + "node-machine-id": "^1.1.12", + "node-reg": "^0.2.4", + "npm": "^10.7.0", + "sharp": "^0.33.2", + "tencentcloud-sdk-nodejs": "^4.0.821", + "uuid": "^9.0.1", + "vue-router": "^4.2.5", + "wav-file-info": "^0.0.10", + "winreg": "^1.2.5" + }, + "devDependencies": { + "@electron-toolkit/eslint-config": "^1.0.1", + "@rushstack/eslint-patch": "^1.6.1", + "@vitejs/plugin-vue": "^5.0.2", + "@vue/eslint-config-prettier": "^9.0.0", + "electron": "^28.1.1", + "electron-builder": "^24.13.3", + "electron-vite": "^2.0.0", + "eslint": "^8.56.0", + "eslint-plugin-vue": "^9.19.2", + "less": "^4.2.0", + "naive-ui": "^2.37.3", + "prettier": "^3.1.1", + "vfonts": "^0.0.3", + "vite": "^5.0.11", + "vue": "^3.4.5" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@alicloud/alimt20181012": { + "version": "1.2.0", + "license": "Apache-2.0", + "dependencies": { + "@alicloud/endpoint-util": "^0.0.1", + "@alicloud/openapi-client": "^0.4.4", + "@alicloud/openapi-util": "^0.3.2", + "@alicloud/openplatform20191219": "2.0.0", + "@alicloud/oss-client": "^1.1.2", + "@alicloud/oss-util": "0.0.1", + "@alicloud/tea-fileform": "^1.0.0", + "@alicloud/tea-typescript": "^1.7.1", + "@alicloud/tea-util": "^1.4.7" + } + }, + "node_modules/@alicloud/credentials": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "@alicloud/tea-typescript": "^1.5.3", + "httpx": "^2.2.0", + "ini": "^1.3.5", + "kitx": "^2.0.0" + } + }, + "node_modules/@alicloud/endpoint-util": { + "version": "0.0.1", + "license": "Apache-2.0", + "dependencies": { + "@alicloud/tea-typescript": "^1.5.1", + "kitx": "^2.0.0" + } + }, + "node_modules/@alicloud/gateway-spi": { + "version": "0.0.8", + "license": "ISC", + "dependencies": { + "@alicloud/credentials": "^2", + "@alicloud/tea-typescript": "^1.7.1" + } + }, + "node_modules/@alicloud/http-core-sdk": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "httpx": "^2.1.3" + } + }, + "node_modules/@alicloud/openapi-client": { + "version": "0.4.8", + "license": "ISC", + "dependencies": { + "@alicloud/credentials": "^2", + "@alicloud/gateway-spi": "^0.0.8", + "@alicloud/openapi-util": "^0.3.2", + "@alicloud/tea-typescript": "^1.7.1", + "@alicloud/tea-util": "^1.4.7", + "@alicloud/tea-xml": "0.0.3" + } + }, + "node_modules/@alicloud/openapi-util": { + "version": "0.3.2", + "license": "ISC", + "dependencies": { + "@alicloud/tea-typescript": "^1.7.1", + "@alicloud/tea-util": "^1.3.0", + "kitx": "^2.1.0", + "sm3": "^1.0.3" + } + }, + "node_modules/@alicloud/openplatform20191219": { + "version": "2.0.0", + "license": "Apache-2.0", + "dependencies": { + "@alicloud/endpoint-util": "^0.0.1", + "@alicloud/openapi-client": "^0.4.1", + "@alicloud/openapi-util": "^0.2.9", + "@alicloud/tea-typescript": "^1.7.1", + "@alicloud/tea-util": "^1.4.4" + } + }, + "node_modules/@alicloud/openplatform20191219/node_modules/@alicloud/openapi-util": { + "version": "0.2.9", + "license": "ISC", + "dependencies": { + "@alicloud/tea-typescript": "^1.7.1", + "@alicloud/tea-util": "^1.3.0", + "kitx": "^2.1.0", + "sm3": "^1.0.3" + } + }, + "node_modules/@alicloud/oss-baseclient": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "@alicloud/credentials": "^1.0.0", + "@alicloud/tea-typescript": "^1.5.0", + "@types/mime": "^2.0.1", + "@types/xml2js": "^0.4.5", + "int64-buffer": "^0.99.1007", + "kitx": "^2.0.0", + "mime": "^2.4.4", + "xml2js": "^0.4.22" + } + }, + "node_modules/@alicloud/oss-baseclient/node_modules/@alicloud/credentials": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "@alicloud/sts-sdk": "^1.0.0", + "httpx": "^2.2.0", + "ini": "^1.3.5", + "json-bigint": "^0.2.3", + "kitx": "^1.2.1" + } + }, + "node_modules/@alicloud/oss-baseclient/node_modules/@alicloud/credentials/node_modules/kitx": { + "version": "1.3.0", + "license": "MIT" + }, + "node_modules/@alicloud/oss-baseclient/node_modules/bignumber.js": { + "version": "4.1.0", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@alicloud/oss-baseclient/node_modules/json-bigint": { + "version": "0.2.3", + "license": "MIT", + "dependencies": { + "bignumber.js": "^4.0.0" + } + }, + "node_modules/@alicloud/oss-client": { + "version": "1.1.3", + "license": "Apache-2.0", + "dependencies": { + "@alicloud/credentials": "^2", + "@alicloud/oss-baseclient": "^1.2.0", + "@alicloud/oss-util": "^0.0.3", + "@alicloud/rpc-util": "^0.0.1", + "@alicloud/tea-fileform": "^1.0.0", + "@alicloud/tea-typescript": "^1.2.0", + "@alicloud/tea-util": "^1.2.6", + "@alicloud/tea-xml": "^0.0.1" + } + }, + "node_modules/@alicloud/oss-client/node_modules/@alicloud/oss-util": { + "version": "0.0.3", + "license": "Apache-2.0", + "dependencies": { + "@alicloud/tea-typescript": "^1.5.0", + "@types/mime": "^2.0.1", + "@types/xml2js": "^0.4.5", + "int64-buffer": "^0.99.1007", + "kitx": "^2.0.0", + "mime": "^2.4.4", + "xml2js": "^0.4.22" + } + }, + "node_modules/@alicloud/oss-client/node_modules/@alicloud/tea-xml": { + "version": "0.0.1", + "license": "Apache-2.0", + "dependencies": { + "@alicloud/tea-typescript": "^1", + "@types/xml2js": "^0.4.5", + "xml2js": "^0.4.22" + } + }, + "node_modules/@alicloud/oss-util": { + "version": "0.0.1", + "license": "Apache-2.0", + "dependencies": { + "@alicloud/tea-typescript": "^1.5.0", + "@types/mime": "^2.0.1", + "@types/xml2js": "^0.4.5", + "int64-buffer": "^0.99.1007", + "kitx": "^2.0.0", + "mime": "^2.4.4", + "xml2js": "^0.4.22" + } + }, + "node_modules/@alicloud/rpc-util": { + "version": "0.0.1", + "license": "MIT", + "dependencies": { + "@alicloud/tea-typescript": "^1", + "@types/xml2js": "^0.4.5", + "kitx": "^2.0.0", + "xml2js": "^0.4.22" + } + }, + "node_modules/@alicloud/sts-sdk": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "@alicloud/http-core-sdk": "^1.0.0", + "uuid": "^3.3.2" + } + }, + "node_modules/@alicloud/sts-sdk/node_modules/uuid": { + "version": "3.4.0", + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/@alicloud/tea-fileform": { + "version": "1.2.0", + "license": "Apache-2.0", + "dependencies": { + "@alicloud/tea-typescript": "^1" + } + }, + "node_modules/@alicloud/tea-typescript": { + "version": "1.8.0", + "license": "ISC", + "dependencies": { + "@types/node": "^12.0.2", + "httpx": "^2.2.6" + } + }, + "node_modules/@alicloud/tea-typescript/node_modules/@types/node": { + "version": "12.20.55", + "license": "MIT" + }, + "node_modules/@alicloud/tea-util": { + "version": "1.4.7", + "license": "Apache-2.0", + "dependencies": { + "@alicloud/tea-typescript": "^1.5.1", + "kitx": "^2.0.0" + } + }, + "node_modules/@alicloud/tea-xml": { + "version": "0.0.3", + "license": "Apache-2.0", + "dependencies": { + "@alicloud/tea-typescript": "^1", + "@types/xml2js": "^0.4.5", + "xml2js": "^0.6.0" + } + }, + "node_modules/@alicloud/tea-xml/node_modules/xml2js": { + "version": "0.6.2", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@alicloud/tea-xml/node_modules/xmlbuilder": { + "version": "11.0.1", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.7", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.7", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.23.9", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.8", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.6", + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.23.6", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.8", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.7", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.6", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@css-render/plugin-bem": { + "version": "0.15.12", + "license": "MIT", + "peerDependencies": { + "css-render": "~0.15.12" + } + }, + "node_modules/@css-render/vue3-ssr": { + "version": "0.15.12", + "license": "MIT", + "peerDependencies": { + "vue": "^3.0.11" + } + }, + "node_modules/@develar/schema-utils": { + "version": "2.6.5", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@eggjs/yauzl": { + "version": "2.11.0", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer2": "^1.2.0" + } + }, + "node_modules/@electron-toolkit/eslint-config": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">= 8.0.0" + } + }, + "node_modules/@electron-toolkit/preload": { + "version": "3.0.0", + "license": "MIT", + "peerDependencies": { + "electron": ">=13.0.0" + } + }, + "node_modules/@electron-toolkit/utils": { + "version": "3.0.0", + "license": "MIT", + "peerDependencies": { + "electron": ">=13.0.0" + } + }, + "node_modules/@electron/asar": { + "version": "3.2.9", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/asar/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@electron/asar/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@electron/get": { + "version": "2.0.3", + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@electron/notarize": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/notarize/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/notarize/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.0.5", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { + "version": "4.0.10", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@electron/osx-sign/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/osx-sign/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/universal": { + "version": "1.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "^3.2.1", + "@malept/cross-spawn-promise": "^1.1.0", + "debug": "^4.3.1", + "dir-compare": "^3.0.0", + "fs-extra": "^9.0.1", + "minimatch": "^3.0.4", + "plist": "^3.0.4" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@electron/universal/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/universal/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/universal/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@electron/universal/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "license": "MIT" + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.11", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.56.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.2", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@jimp/bmp": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10", + "bmp-js": "^0.1.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/core": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10", + "any-base": "^1.1.0", + "buffer": "^5.2.0", + "exif-parser": "^0.1.12", + "file-type": "^16.5.4", + "isomorphic-fetch": "^3.0.0", + "pixelmatch": "^4.0.2", + "tinycolor2": "^1.6.0" + } + }, + "node_modules/@jimp/custom": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/core": "^0.22.10" + } + }, + "node_modules/@jimp/gif": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10", + "gifwrap": "^0.10.1", + "omggif": "^1.0.9" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/jpeg": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10", + "jpeg-js": "^0.4.4" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-blit": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-blur": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-circle": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-color": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10", + "tinycolor2": "^1.6.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-contain": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5", + "@jimp/plugin-scale": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-cover": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-crop": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5", + "@jimp/plugin-scale": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-crop": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-displace": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-dither": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-fisheye": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-flip": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-rotate": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-gaussian": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-invert": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-mask": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-normalize": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-print": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10", + "load-bmfont": "^1.4.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-resize": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-rotate": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5", + "@jimp/plugin-crop": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-scale": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-shadow": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blur": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-threshold": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-color": ">=0.8.0", + "@jimp/plugin-resize": ">=0.8.0" + } + }, + "node_modules/@jimp/plugins": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/plugin-blit": "^0.22.10", + "@jimp/plugin-blur": "^0.22.10", + "@jimp/plugin-circle": "^0.22.10", + "@jimp/plugin-color": "^0.22.10", + "@jimp/plugin-contain": "^0.22.10", + "@jimp/plugin-cover": "^0.22.10", + "@jimp/plugin-crop": "^0.22.10", + "@jimp/plugin-displace": "^0.22.10", + "@jimp/plugin-dither": "^0.22.10", + "@jimp/plugin-fisheye": "^0.22.10", + "@jimp/plugin-flip": "^0.22.10", + "@jimp/plugin-gaussian": "^0.22.10", + "@jimp/plugin-invert": "^0.22.10", + "@jimp/plugin-mask": "^0.22.10", + "@jimp/plugin-normalize": "^0.22.10", + "@jimp/plugin-print": "^0.22.10", + "@jimp/plugin-resize": "^0.22.10", + "@jimp/plugin-rotate": "^0.22.10", + "@jimp/plugin-scale": "^0.22.10", + "@jimp/plugin-shadow": "^0.22.10", + "@jimp/plugin-threshold": "^0.22.10", + "timm": "^1.6.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/png": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.10", + "pngjs": "^6.0.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/tiff": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "utif2": "^4.0.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/types": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/bmp": "^0.22.10", + "@jimp/gif": "^0.22.10", + "@jimp/jpeg": "^0.22.10", + "@jimp/png": "^0.22.10", + "@jimp/tiff": "^0.22.10", + "timm": "^1.6.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/utils": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.13.3" + } + }, + "node_modules/@jimp/utils/node_modules/regenerator-runtime": { + "version": "0.13.11", + "license": "MIT" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@juggle/resize-observer": { + "version": "3.4.0", + "license": "Apache-2.0" + }, + "node_modules/@malept/cross-spawn-promise": { + "version": "1.1.1", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@malept/flatpak-bundler": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir": { + "version": "3.1.0", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.6.0", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC", + "optional": true, + "peer": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.9.4", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.6.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@skit/x.naive-ui": { + "version": "0.15.0", + "license": "MIT", + "engines": { + "node": ">=18.12", + "npm": ">=8", + "pnpm": ">=8" + }, + "peerDependencies": { + "naive-ui": "^2.37.0", + "vue": "^3.2.0" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "license": "MIT" + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "license": "MIT" + }, + "node_modules/@types/katex": { + "version": "0.16.7", + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/lodash": { + "version": "4.14.202", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/mime": { + "version": "2.0.3", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "18.19.6", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/xml2js": { + "version": "0.4.14", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@vicons/ionicons5": { + "version": "0.12.0", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitejs/plugin-vue-jsx": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.3", + "@babel/plugin-transform-typescript": "^7.23.3", + "@vue/babel-plugin-jsx": "^1.1.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0 || ^5.0.0", + "vue": "^3.0.0" + } + }, + "node_modules/@volcengine/openapi": { + "version": "1.16.0", + "license": "Apache-2.0", + "dependencies": { + "axios": "^0.21.1", + "crc": "^4.1.0", + "crypto-js": "^4.0.0", + "dayjs": "^1.11.5", + "debug": "^4.3.1", + "form-data": "^3.0.0", + "lodash.get": "^4.4.2", + "p-limit": "^3.0.0", + "protobufjs": "7.2.4", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@volcengine/openapi/node_modules/axios": { + "version": "0.21.4", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/@volcengine/openapi/node_modules/buffer": { + "version": "6.0.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/@volcengine/openapi/node_modules/crc": { + "version": "4.3.2", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "buffer": ">=6.0.3" + }, + "peerDependenciesMeta": { + "buffer": { + "optional": true + } + } + }, + "node_modules/@volcengine/openapi/node_modules/form-data": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@volcengine/openapi/node_modules/uuid": { + "version": "8.3.2", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.2.1", + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6", + "@vue/babel-helper-vue-transform-on": "1.2.1", + "@vue/babel-plugin-resolve-type": "1.2.1", + "camelcase": "^6.3.0", + "html-tags": "^3.3.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/parser": "^7.23.6", + "@vue/compiler-sfc": "^3.4.15" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-core": { + "version": "3.4.15", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.23.6", + "@vue/shared": "3.4.15", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-dom": { + "version": "3.4.15", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.4.15", + "@vue/shared": "3.4.15" + } + }, + "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-sfc": { + "version": "3.4.15", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.23.6", + "@vue/compiler-core": "3.4.15", + "@vue/compiler-dom": "3.4.15", + "@vue/compiler-ssr": "3.4.15", + "@vue/shared": "3.4.15", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.5", + "postcss": "^8.4.33", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-ssr": { + "version": "3.4.15", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.4.15", + "@vue/shared": "3.4.15" + } + }, + "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/shared": { + "version": "3.4.15", + "license": "MIT" + }, + "node_modules/@vue/compiler-core": { + "version": "3.4.10", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.23.6", + "@vue/shared": "3.4.10", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.4.10", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.4.10", + "@vue/shared": "3.4.10" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.4.10", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.23.6", + "@vue/compiler-core": "3.4.10", + "@vue/compiler-dom": "3.4.10", + "@vue/compiler-ssr": "3.4.10", + "@vue/shared": "3.4.10", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.5", + "postcss": "^8.4.32", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.4.10", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.4.10", + "@vue/shared": "3.4.10" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.1", + "license": "MIT" + }, + "node_modules/@vue/eslint-config-prettier": { + "version": "9.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-prettier": "^5.0.0" + }, + "peerDependencies": { + "eslint": ">= 8.0.0", + "prettier": ">= 3.0.0" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.4.10", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.4.10" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.4.10", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.4.10", + "@vue/shared": "3.4.10" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.4.10", + "license": "MIT", + "dependencies": { + "@vue/runtime-core": "3.4.10", + "@vue/shared": "3.4.10", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.4.10", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.4.10", + "@vue/shared": "3.4.10" + }, + "peerDependencies": { + "vue": "3.4.10" + } + }, + "node_modules/@vue/shared": { + "version": "3.4.10", + "license": "MIT" + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/7zip-bin": { + "version": "5.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/7zip-min": { + "version": "1.4.4", + "license": "MIT", + "dependencies": { + "7zip-bin": "5.1.1" + } + }, + "node_modules/7zip-min/node_modules/7zip-bin": { + "version": "5.1.1", + "license": "MIT" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.11.3", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-base": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/app-builder-bin": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/app-builder-lib": { + "version": "24.13.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@develar/schema-utils": "~2.6.5", + "@electron/notarize": "2.2.1", + "@electron/osx-sign": "1.0.5", + "@electron/universal": "1.5.1", + "@malept/flatpak-bundler": "^0.4.0", + "@types/fs-extra": "9.0.13", + "async-exit-hook": "^2.0.1", + "bluebird-lst": "^1.0.9", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", + "chromium-pickle-js": "^0.2.0", + "debug": "^4.3.4", + "ejs": "^3.1.8", + "electron-publish": "24.13.1", + "form-data": "^4.0.0", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "is-ci": "^3.0.0", + "isbinaryfile": "^5.0.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "minimatch": "^5.1.1", + "read-config-file": "6.3.2", + "sanitize-filename": "^1.6.3", + "semver": "^7.3.8", + "tar": "^6.1.12", + "temp-file": "^3.4.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "dmg-builder": "24.13.3", + "electron-builder-squirrel-windows": "24.13.3" + } + }, + "node_modules/app-builder-lib/node_modules/builder-util-runtime": { + "version": "9.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/app-builder-lib/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/app-builder-lib/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/app-builder-lib/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/app-builder-lib/node_modules/semver": { + "version": "7.6.0", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/app-builder-lib/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/app-builder-lib/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/aproba": { + "version": "2.0.0", + "license": "ISC", + "optional": true, + "peer": true + }, + "node_modules/archiver": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/archiver/node_modules/bl": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/archiver/node_modules/tar-stream": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "node_modules/async": { + "version": "3.2.5", + "license": "MIT" + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/async-validator": { + "version": "4.2.5", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/awesome-js": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/awesome-js/-/awesome-js-2.0.0.tgz", + "integrity": "sha512-lYnJYTkM6rNcQi6atTKFXRix+kc8iEFCjRPA9EiylIVbtKzezwV3zww17eF4tijuhvXw89CVohVZZWISAyMJQw==", + "dependencies": { + "big.js": "^6.2.1", + "lodash.throttle": "^4.1.1" + } + }, + "node_modules/axios": { + "version": "1.6.5", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/big.js": { + "version": "6.2.1", + "resolved": "https://registry.npmmirror.com/big.js/-/big.js-6.2.1.tgz", + "integrity": "sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==", + "engines": { + "node": "*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bigjs" + } + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/bl": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "2.3.8", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/bl/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "dev": true, + "license": "MIT" + }, + "node_modules/bluebird-lst": { + "version": "1.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "^3.5.5" + } + }, + "node_modules/bmp-js": { + "version": "0.1.0", + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/boolean": { + "version": "3.2.0", + "license": "MIT", + "optional": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/browserslist": { + "version": "4.22.2", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/builder-util": { + "version": "24.13.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/debug": "^4.1.6", + "7zip-bin": "~5.2.0", + "app-builder-bin": "4.0.0", + "bluebird-lst": "^1.0.9", + "builder-util-runtime": "9.2.4", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-ci": "^3.0.0", + "js-yaml": "^4.1.0", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0" + } + }, + "node_modules/builder-util-runtime": { + "version": "9.2.3", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/builder-util/node_modules/builder-util-runtime": { + "version": "9.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/builder-util/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/builder-util/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/builder-util/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001576", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/canvas": { + "version": "2.11.2", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.17.0", + "simple-get": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ci-info": { + "version": "3.9.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/compare-version": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/compress-commons": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/compressing": { + "version": "1.10.0", + "license": "MIT", + "dependencies": { + "@eggjs/yauzl": "^2.11.0", + "flushwritable": "^1.0.0", + "get-ready": "^1.0.0", + "iconv-lite": "^0.5.0", + "mkdirp": "^0.5.1", + "pump": "^3.0.0", + "streamifier": "^0.1.1", + "tar-stream": "^1.5.2", + "yazl": "^2.4.2" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/compressing/node_modules/iconv-lite": { + "version": "0.5.2", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/compressing/node_modules/mkdirp": { + "version": "0.5.6", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/config-file-ts": { + "version": "0.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^10.3.10", + "typescript": "^5.3.3" + } + }, + "node_modules/config-file-ts/node_modules/glob": { + "version": "10.3.10", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "license": "ISC", + "optional": true, + "peer": true + }, + "node_modules/content-type": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "devOptional": true, + "license": "MIT", + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-js": { + "version": "4.2.0", + "license": "MIT" + }, + "node_modules/css-render": { + "version": "0.15.12", + "license": "MIT", + "dependencies": { + "@emotion/hash": "~0.8.0", + "csstype": "~3.0.5" + } + }, + "node_modules/css-render/node_modules/csstype": { + "version": "3.0.11", + "license": "MIT" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssstyle": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "7.0.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "14.0.0", + "license": "MIT", + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/date-fns-tz": { + "version": "2.0.0", + "license": "MIT", + "peerDependencies": { + "date-fns": ">=2.0.0" + } + }, + "node_modules/dayjs": { + "version": "1.11.10", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "license": "MIT" + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "license": "MIT", + "optional": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "license": "MIT", + "optional": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "license": "MIT", + "optional": true + }, + "node_modules/dir-compare": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-equal": "^1.0.0", + "minimatch": "^3.0.4" + } + }, + "node_modules/dir-compare/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/dir-compare/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dmg-builder": { + "version": "24.13.3", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "24.13.3", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", + "fs-extra": "^10.1.0", + "iconv-lite": "^0.6.2", + "js-yaml": "^4.1.0" + }, + "optionalDependencies": { + "dmg-license": "^1.0.11" + } + }, + "node_modules/dmg-builder/node_modules/builder-util-runtime": { + "version": "9.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/dmg-builder/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dmg-builder/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/dmg-builder/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2" + }, + "node_modules/dotenv": { + "version": "9.0.2", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.9", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron": { + "version": "28.1.3", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@electron/get": "^2.0.0", + "@types/node": "^18.11.18", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 12.20.55" + } + }, + "node_modules/electron-builder": { + "version": "24.13.3", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "24.13.3", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", + "chalk": "^4.1.2", + "dmg-builder": "24.13.3", + "fs-extra": "^10.1.0", + "is-ci": "^3.0.0", + "lazy-val": "^1.0.5", + "read-config-file": "6.3.2", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "electron-builder": "cli.js", + "install-app-deps": "install-app-deps.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/electron-builder-squirrel-windows": { + "version": "24.13.3", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "app-builder-lib": "24.13.3", + "archiver": "^5.3.1", + "builder-util": "24.13.1", + "fs-extra": "^10.1.0" + } + }, + "node_modules/electron-builder-squirrel-windows/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-builder-squirrel-windows/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-builder-squirrel-windows/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-builder/node_modules/builder-util-runtime": { + "version": "9.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/electron-builder/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-builder/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-builder/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-publish": { + "version": "24.13.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/fs-extra": "^9.0.11", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", + "chalk": "^4.1.2", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" + } + }, + "node_modules/electron-publish/node_modules/builder-util-runtime": { + "version": "9.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/electron-publish/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-publish/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-publish/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.628", + "license": "ISC" + }, + "node_modules/electron-updater": { + "version": "6.1.7", + "license": "MIT", + "dependencies": { + "builder-util-runtime": "9.2.3", + "fs-extra": "^10.1.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "lodash.escaperegexp": "^4.1.2", + "lodash.isequal": "^4.5.0", + "semver": "^7.3.8", + "tiny-typed-emitter": "^2.1.0" + } + }, + "node_modules/electron-updater/node_modules/fs-extra": { + "version": "10.1.0", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-updater/node_modules/jsonfile": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-updater/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-updater/node_modules/semver": { + "version": "7.5.4", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-updater/node_modules/universalify": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-updater/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/electron-vite": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.5", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "cac": "^6.7.14", + "esbuild": "^0.19.8", + "magic-string": "^0.30.5", + "picocolors": "^1.0.0" + }, + "bin": { + "electron-vite": "bin/electron-vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@swc/core": "^1.0.0", + "vite": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + } + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "devOptional": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/errno": { + "version": "0.1.8", + "license": "MIT", + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "license": "MIT", + "optional": true + }, + "node_modules/esbuild": { + "version": "0.19.11", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.11", + "@esbuild/android-arm": "0.19.11", + "@esbuild/android-arm64": "0.19.11", + "@esbuild/android-x64": "0.19.11", + "@esbuild/darwin-arm64": "0.19.11", + "@esbuild/darwin-x64": "0.19.11", + "@esbuild/freebsd-arm64": "0.19.11", + "@esbuild/freebsd-x64": "0.19.11", + "@esbuild/linux-arm": "0.19.11", + "@esbuild/linux-arm64": "0.19.11", + "@esbuild/linux-ia32": "0.19.11", + "@esbuild/linux-loong64": "0.19.11", + "@esbuild/linux-mips64el": "0.19.11", + "@esbuild/linux-ppc64": "0.19.11", + "@esbuild/linux-riscv64": "0.19.11", + "@esbuild/linux-s390x": "0.19.11", + "@esbuild/linux-x64": "0.19.11", + "@esbuild/netbsd-x64": "0.19.11", + "@esbuild/openbsd-x64": "0.19.11", + "@esbuild/sunos-x64": "0.19.11", + "@esbuild/win32-arm64": "0.19.11", + "@esbuild/win32-ia32": "0.19.11", + "@esbuild/win32-x64": "0.19.11" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.56.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-vue": { + "version": "9.20.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.13", + "semver": "^7.5.4", + "vue-eslint-parser": "^9.4.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-vue/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-vue/node_modules/semver": { + "version": "7.5.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-vue/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/evtd": { + "version": "0.2.4", + "license": "MIT" + }, + "node_modules/exif-parser": { + "version": "0.1.12" + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.16.0", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fd-slicer2": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "pend": "^1.2.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-type": { + "version": "16.5.4", + "license": "MIT", + "dependencies": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.1.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "dev": true, + "license": "ISC" + }, + "node_modules/fluent-ffmpeg": { + "version": "2.1.2", + "license": "MIT", + "dependencies": { + "async": ">=0.2.9", + "which": "^1.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fluent-ffmpeg/node_modules/which": { + "version": "1.3.1", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/flushwritable": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "optional": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "3.0.2", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gauge/node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC", + "optional": true, + "peer": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "license": "MIT", + "optional": true, + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-ready": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/get-stream": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gifwrap": { + "version": "0.10.1", + "license": "MIT", + "dependencies": { + "image-q": "^4.0.0", + "omggif": "^1.0.10" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/global": { + "version": "4.4.0", + "license": "MIT", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/global-agent/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/global-agent/node_modules/semver": { + "version": "7.5.4", + "license": "ISC", + "optional": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/global-agent/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC", + "optional": true + }, + "node_modules/globals": { + "version": "11.12.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "license": "MIT", + "optional": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "license": "MIT", + "optional": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "license": "MIT", + "optional": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "license": "ISC", + "optional": true, + "peer": true + }, + "node_modules/hasown": { + "version": "2.0.0", + "license": "MIT", + "optional": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/highlight.js": { + "version": "11.9.0", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/httpx": { + "version": "2.3.2", + "license": "MIT", + "dependencies": { + "@types/node": "^20", + "debug": "^4.1.1" + } + }, + "node_modules/httpx/node_modules/@types/node": { + "version": "20.11.30", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-q": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/node": "16.9.1" + } + }, + "node_modules/image-q/node_modules/@types/node": { + "version": "16.9.1", + "license": "MIT" + }, + "node_modules/image-size": { + "version": "0.5.5", + "license": "MIT", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "license": "ISC" + }, + "node_modules/install": { + "version": "0.13.0", + "resolved": "https://registry.npmmirror.com/install/-/install-0.13.0.tgz", + "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/int64-buffer": { + "version": "0.99.1007", + "license": "MIT", + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "license": "MIT" + }, + "node_modules/is-ci": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-function": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "devOptional": true, + "license": "MIT" + }, + "node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/isbinaryfile": { + "version": "5.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/isomorphic-fetch": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.6.1", + "whatwg-fetch": "^3.4.1" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.8.7", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jimp": { + "version": "0.22.10", + "license": "MIT", + "dependencies": { + "@jimp/custom": "^0.22.10", + "@jimp/plugins": "^0.22.10", + "@jimp/types": "^0.22.10", + "regenerator-runtime": "^0.13.3" + } + }, + "node_modules/jimp/node_modules/regenerator-runtime": { + "version": "0.13.11", + "license": "MIT" + }, + "node_modules/jpeg-js": { + "version": "0.4.4", + "license": "BSD-3-Clause" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "24.0.0", + "license": "MIT", + "dependencies": { + "cssstyle": "^4.0.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.7", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.3", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.16.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/agent-base": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/jsdom/node_modules/http-proxy-agent": { + "version": "7.0.2", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/jsdom/node_modules/https-proxy-agent": { + "version": "7.0.4", + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/jsdom/node_modules/tr46": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "7.0.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "14.0.0", + "license": "MIT", + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/jsdom/node_modules/xml-name-validator": { + "version": "5.0.0", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "license": "ISC", + "optional": true + }, + "node_modules/json5": { + "version": "2.2.3", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kitx": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "@types/node": "^12.0.2" + } + }, + "node_modules/kitx/node_modules/@types/node": { + "version": "12.20.55", + "license": "MIT" + }, + "node_modules/lazy-val": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/lazystream": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/less": { + "version": "4.2.0", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less/node_modules/mime": { + "version": "1.6.0", + "license": "MIT", + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/load-bmfont": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "buffer-equal": "0.0.1", + "mime": "^1.3.4", + "parse-bmfont-ascii": "^1.0.3", + "parse-bmfont-binary": "^1.0.5", + "parse-bmfont-xml": "^1.1.4", + "phin": "^2.9.1", + "xhr": "^2.0.1", + "xtend": "^4.0.0" + } + }, + "node_modules/load-bmfont/node_modules/buffer-equal": { + "version": "0.0.1", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/load-bmfont/node_modules/mime": { + "version": "1.6.0", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "license": "MIT" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/long": { + "version": "5.2.3", + "license": "Apache-2.0" + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.5", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "license": "MIT", + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/minimatch": { + "version": "5.1.6", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/music-metadata": { + "version": "7.14.0", + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "content-type": "^1.0.5", + "debug": "^4.3.4", + "file-type": "^16.5.4", + "media-typer": "^1.1.0", + "strtok3": "^6.3.0", + "token-types": "^4.2.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/naive-ui": { + "version": "2.37.3", + "license": "MIT", + "dependencies": { + "@css-render/plugin-bem": "^0.15.12", + "@css-render/vue3-ssr": "^0.15.12", + "@types/katex": "^0.16.2", + "@types/lodash": "^4.14.198", + "@types/lodash-es": "^4.17.9", + "async-validator": "^4.2.5", + "css-render": "^0.15.12", + "csstype": "^3.1.3", + "date-fns": "^2.30.0", + "date-fns-tz": "^2.0.0", + "evtd": "^0.2.4", + "highlight.js": "^11.8.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "seemly": "^0.3.8", + "treemate": "^0.3.11", + "vdirs": "^0.1.8", + "vooks": "^0.2.12", + "vueuc": "^0.4.58" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/nan": { + "version": "2.19.0", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/needle": { + "version": "3.3.1", + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-machine-id": { + "version": "1.1.12", + "license": "MIT" + }, + "node_modules/node-reg": { + "version": "0.2.4", + "license": "ISC", + "dependencies": { + "q": "^1.4.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "license": "MIT" + }, + "node_modules/nopt": { + "version": "5.0.0", + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm": { + "version": "10.7.0", + "resolved": "https://registry.npmmirror.com/npm/-/npm-10.7.0.tgz", + "integrity": "sha512-FXylyYSXNjgXx3l82BT8RSQvCoGIQ3h8YdRFGKNvo3Pv/bKscK4pdWkx/onwTpHDqGw+oeLf4Rxln9WVyxAxlQ==", + "bundleDependencies": [ + "@isaacs/string-locale-compare", + "@npmcli/arborist", + "@npmcli/config", + "@npmcli/fs", + "@npmcli/map-workspaces", + "@npmcli/package-json", + "@npmcli/promise-spawn", + "@npmcli/redact", + "@npmcli/run-script", + "@sigstore/tuf", + "abbrev", + "archy", + "cacache", + "chalk", + "ci-info", + "cli-columns", + "fastest-levenshtein", + "fs-minipass", + "glob", + "graceful-fs", + "hosted-git-info", + "ini", + "init-package-json", + "is-cidr", + "json-parse-even-better-errors", + "libnpmaccess", + "libnpmdiff", + "libnpmexec", + "libnpmfund", + "libnpmhook", + "libnpmorg", + "libnpmpack", + "libnpmpublish", + "libnpmsearch", + "libnpmteam", + "libnpmversion", + "make-fetch-happen", + "minimatch", + "minipass", + "minipass-pipeline", + "ms", + "node-gyp", + "nopt", + "normalize-package-data", + "npm-audit-report", + "npm-install-checks", + "npm-package-arg", + "npm-pick-manifest", + "npm-profile", + "npm-registry-fetch", + "npm-user-validate", + "p-map", + "pacote", + "parse-conflict-json", + "proc-log", + "qrcode-terminal", + "read", + "semver", + "spdx-expression-parse", + "ssri", + "supports-color", + "tar", + "text-table", + "tiny-relative-date", + "treeverse", + "validate-npm-package-name", + "which", + "write-file-atomic" + ], + "workspaces": [ + "docs", + "smoke-tests", + "mock-globals", + "mock-registry", + "workspaces/*" + ], + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^7.2.1", + "@npmcli/config": "^8.0.2", + "@npmcli/fs": "^3.1.0", + "@npmcli/map-workspaces": "^3.0.6", + "@npmcli/package-json": "^5.1.0", + "@npmcli/promise-spawn": "^7.0.1", + "@npmcli/redact": "^2.0.0", + "@npmcli/run-script": "^8.1.0", + "@sigstore/tuf": "^2.3.2", + "abbrev": "^2.0.0", + "archy": "~1.0.0", + "cacache": "^18.0.2", + "chalk": "^5.3.0", + "ci-info": "^4.0.0", + "cli-columns": "^4.0.0", + "fastest-levenshtein": "^1.0.16", + "fs-minipass": "^3.0.3", + "glob": "^10.3.12", + "graceful-fs": "^4.2.11", + "hosted-git-info": "^7.0.1", + "ini": "^4.1.2", + "init-package-json": "^6.0.2", + "is-cidr": "^5.0.5", + "json-parse-even-better-errors": "^3.0.1", + "libnpmaccess": "^8.0.1", + "libnpmdiff": "^6.0.3", + "libnpmexec": "^8.0.0", + "libnpmfund": "^5.0.1", + "libnpmhook": "^10.0.0", + "libnpmorg": "^6.0.1", + "libnpmpack": "^7.0.0", + "libnpmpublish": "^9.0.2", + "libnpmsearch": "^7.0.0", + "libnpmteam": "^6.0.0", + "libnpmversion": "^6.0.0", + "make-fetch-happen": "^13.0.1", + "minimatch": "^9.0.4", + "minipass": "^7.0.4", + "minipass-pipeline": "^1.2.4", + "ms": "^2.1.2", + "node-gyp": "^10.1.0", + "nopt": "^7.2.0", + "normalize-package-data": "^6.0.0", + "npm-audit-report": "^5.0.0", + "npm-install-checks": "^6.3.0", + "npm-package-arg": "^11.0.2", + "npm-pick-manifest": "^9.0.0", + "npm-profile": "^9.0.2", + "npm-registry-fetch": "^17.0.0", + "npm-user-validate": "^2.0.0", + "p-map": "^4.0.0", + "pacote": "^18.0.3", + "parse-conflict-json": "^3.0.1", + "proc-log": "^4.2.0", + "qrcode-terminal": "^0.12.0", + "read": "^3.0.1", + "semver": "^7.6.0", + "spdx-expression-parse": "^4.0.0", + "ssri": "^10.0.5", + "supports-color": "^9.4.0", + "tar": "^6.2.1", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^3.0.0", + "validate-npm-package-name": "^5.0.0", + "which": "^4.0.0", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "npm": "bin/npm-cli.js", + "npx": "bin/npx-cli.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui": { + "version": "8.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/@npmcli/agent": { + "version": "2.2.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/arborist": { + "version": "7.5.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^3.1.0", + "@npmcli/installed-package-contents": "^2.1.0", + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/metavuln-calculator": "^7.1.0", + "@npmcli/name-from-folder": "^2.0.0", + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.1.0", + "@npmcli/query": "^3.1.0", + "@npmcli/redact": "^2.0.0", + "@npmcli/run-script": "^8.1.0", + "bin-links": "^4.0.1", + "cacache": "^18.0.0", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^7.0.1", + "json-parse-even-better-errors": "^3.0.0", + "json-stringify-nice": "^1.1.4", + "minimatch": "^9.0.4", + "nopt": "^7.0.0", + "npm-install-checks": "^6.2.0", + "npm-package-arg": "^11.0.2", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^17.0.0", + "pacote": "^18.0.1", + "parse-conflict-json": "^3.0.0", + "proc-log": "^4.2.0", + "proggy": "^2.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^3.0.1", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^10.0.5", + "treeverse": "^3.0.0", + "walk-up-path": "^3.0.1" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/config": { + "version": "8.3.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/map-workspaces": "^3.0.2", + "ci-info": "^4.0.0", + "ini": "^4.1.2", + "nopt": "^7.0.0", + "proc-log": "^4.2.0", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.5", + "walk-up-path": "^3.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/fs": { + "version": "3.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/git": { + "version": "5.0.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^7.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^4.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/installed-package-contents": { + "version": "2.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/map-workspaces": { + "version": "3.0.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^2.0.0", + "glob": "^10.2.2", + "minimatch": "^9.0.0", + "read-package-json-fast": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { + "version": "7.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "cacache": "^18.0.0", + "json-parse-even-better-errors": "^3.0.0", + "pacote": "^18.0.0", + "proc-log": "^4.1.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/package-json": { + "version": "5.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^4.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "7.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/query": { + "version": "3.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/redact": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/run-script": { + "version": "8.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "proc-log": "^4.0.0", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm/node_modules/@sigstore/bundle": { + "version": "2.3.1", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/core": { + "version": "1.1.0", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/protobuf-specs": { + "version": "0.3.1", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign": { + "version": "2.3.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.0", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.1", + "make-fetch-happen": "^13.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/tuf": { + "version": "2.3.2", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.0", + "tuf-js": "^2.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/verify": { + "version": "1.2.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.1", + "@sigstore/core": "^1.1.0", + "@sigstore/protobuf-specs": "^0.3.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@tufjs/models": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/abbrev": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/agent-base": { + "version": "7.1.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/aggregate-error": { + "version": "3.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ansi-styles": { + "version": "6.2.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm/node_modules/aproba": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/balanced-match": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/bin-links": { + "version": "4.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "cmd-shim": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "read-cmd-shim": "^4.0.0", + "write-file-atomic": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/binary-extensions": { + "version": "2.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/brace-expansion": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm/node_modules/builtins": { + "version": "5.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/npm/node_modules/cacache": { + "version": "18.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/chalk": { + "version": "5.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/npm/node_modules/chownr": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/ci-info": { + "version": "4.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cidr-regex": { + "version": "4.0.5", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "ip-regex": "^5.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm/node_modules/clean-stack": { + "version": "2.2.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/cli-columns": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/cmd-shim": { + "version": "6.0.2", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/color-convert": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/npm/node_modules/color-name": { + "version": "1.1.4", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/common-ancestor-path": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/cross-spawn": { + "version": "7.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/cssesc": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/debug": { + "version": "4.3.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/npm/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/diff": { + "version": "5.2.0", + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/npm/node_modules/eastasianwidth": { + "version": "0.2.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/emoji-regex": { + "version": "8.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/encoding": { + "version": "0.1.13", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/npm/node_modules/env-paths": { + "version": "2.2.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/err-code": { + "version": "2.0.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/exponential-backoff": { + "version": "3.1.1", + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.16", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/npm/node_modules/foreground-child": { + "version": "3.1.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/fs-minipass": { + "version": "3.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/function-bind": { + "version": "1.1.2", + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/npm/node_modules/glob": { + "version": "10.3.12", + "inBundle": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/graceful-fs": { + "version": "4.2.11", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/hasown": { + "version": "2.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/npm/node_modules/hosted-git-info": { + "version": "7.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/http-cache-semantics": { + "version": "4.1.1", + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/npm/node_modules/http-proxy-agent": { + "version": "7.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/https-proxy-agent": { + "version": "7.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/iconv-lite": { + "version": "0.6.3", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/ignore-walk": { + "version": "6.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/imurmurhash": { + "version": "0.1.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/npm/node_modules/indent-string": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ini": { + "version": "4.1.2", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/init-package-json": { + "version": "6.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/package-json": "^5.0.0", + "npm-package-arg": "^11.0.0", + "promzard": "^1.0.0", + "read": "^3.0.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/ip-address": { + "version": "9.0.5", + "inBundle": true, + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/npm/node_modules/ip-regex": { + "version": "5.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/is-cidr": { + "version": "5.0.5", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "cidr-regex": "^4.0.4" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm/node_modules/is-core-module": { + "version": "2.13.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/npm/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/is-lambda": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/isexe": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/jackspeak": { + "version": "2.3.6", + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/npm/node_modules/jsbn": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/json-parse-even-better-errors": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/json-stringify-nice": { + "version": "1.1.4", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/jsonparse": { + "version": "1.3.1", + "engines": [ + "node >= 0.2.0" + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff": { + "version": "6.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff-apply": { + "version": "5.5.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/libnpmaccess": { + "version": "8.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^11.0.2", + "npm-registry-fetch": "^17.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmdiff": { + "version": "6.1.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.2.1", + "@npmcli/installed-package-contents": "^2.1.0", + "binary-extensions": "^2.3.0", + "diff": "^5.1.0", + "minimatch": "^9.0.4", + "npm-package-arg": "^11.0.2", + "pacote": "^18.0.1", + "tar": "^6.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmexec": { + "version": "8.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.2.1", + "@npmcli/run-script": "^8.1.0", + "ci-info": "^4.0.0", + "npm-package-arg": "^11.0.2", + "pacote": "^18.0.1", + "proc-log": "^4.2.0", + "read": "^3.0.1", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "walk-up-path": "^3.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmfund": { + "version": "5.0.9", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmhook": { + "version": "10.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^17.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmorg": { + "version": "6.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^17.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmpack": { + "version": "7.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.2.1", + "@npmcli/run-script": "^8.1.0", + "npm-package-arg": "^11.0.2", + "pacote": "^18.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmpublish": { + "version": "9.0.7", + "inBundle": true, + "license": "ISC", + "dependencies": { + "ci-info": "^4.0.0", + "normalize-package-data": "^6.0.0", + "npm-package-arg": "^11.0.2", + "npm-registry-fetch": "^17.0.0", + "proc-log": "^4.2.0", + "semver": "^7.3.7", + "sigstore": "^2.2.0", + "ssri": "^10.0.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmsearch": { + "version": "7.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^17.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmteam": { + "version": "6.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^17.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmversion": { + "version": "6.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.6", + "@npmcli/run-script": "^8.1.0", + "json-parse-even-better-errors": "^3.0.0", + "proc-log": "^4.2.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/lru-cache": { + "version": "10.2.2", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/npm/node_modules/make-fetch-happen": { + "version": "13.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/minimatch": { + "version": "9.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/minipass": { + "version": "7.0.4", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/npm/node_modules/minipass-collect": { + "version": "2.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/npm/node_modules/minipass-fetch": { + "version": "3.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-json-stream": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-pipeline": { + "version": "1.2.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-sized": { + "version": "1.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minizlib": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/mkdirp": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/ms": { + "version": "2.1.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/mute-stream": { + "version": "1.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/negotiator": { + "version": "0.6.3", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm/node_modules/node-gyp": { + "version": "10.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/proc-log": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/nopt": { + "version": "7.2.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/normalize-package-data": { + "version": "6.0.0", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-audit-report": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-bundled": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-install-checks": { + "version": "6.3.0", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-package-arg": { + "version": "11.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-packlist": { + "version": "8.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^6.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-pick-manifest": { + "version": "9.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-profile": { + "version": "9.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^17.0.0", + "proc-log": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-registry-fetch": { + "version": "17.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^2.0.0", + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-user-validate": { + "version": "2.0.0", + "inBundle": true, + "license": "BSD-2-Clause", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/p-map": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/pacote": { + "version": "18.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/package-json": "^5.1.0", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^8.0.0", + "cacache": "^18.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^17.0.0", + "proc-log": "^4.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^2.2.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/parse-conflict-json": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/path-key": { + "version": "3.1.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/path-scurry": { + "version": "1.10.2", + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/postcss-selector-parser": { + "version": "6.0.16", + "inBundle": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/proc-log": { + "version": "4.2.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/proggy": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-call-limit": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-inflight": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/promise-retry": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/promzard": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "read": "^3.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", + "inBundle": true, + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/npm/node_modules/read": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-cmd-shim": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-package-json-fast": { + "version": "3.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/retry": { + "version": "0.12.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/npm/node_modules/semver": { + "version": "7.6.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/shebang-command": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/shebang-regex": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/signal-exit": { + "version": "4.1.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/sigstore": { + "version": "2.3.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.1", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.1", + "@sigstore/sign": "^2.3.0", + "@sigstore/tuf": "^2.3.1", + "@sigstore/verify": "^1.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks": { + "version": "2.8.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks-proxy-agent": { + "version": "8.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/spdx-correct": { + "version": "3.2.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.5.0", + "inBundle": true, + "license": "CC-BY-3.0" + }, + "node_modules/npm/node_modules/spdx-expression-parse": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.17", + "inBundle": true, + "license": "CC0-1.0" + }, + "node_modules/npm/node_modules/sprintf-js": { + "version": "1.1.3", + "inBundle": true, + "license": "BSD-3-Clause" + }, + "node_modules/npm/node_modules/ssri": { + "version": "10.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/string-width": { + "version": "4.2.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/supports-color": { + "version": "9.4.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/npm/node_modules/tar": { + "version": "6.2.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/text-table": { + "version": "0.2.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/tiny-relative-date": { + "version": "1.3.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/treeverse": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/tuf-js": { + "version": "2.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "2.0.0", + "debug": "^4.3.4", + "make-fetch-happen": "^13.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/unique-filename": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/unique-slug": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/util-deprecate": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/validate-npm-package-license": { + "version": "3.0.4", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/validate-npm-package-name": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/walk-up-path": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/which": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/which/node_modules/isexe": { + "version": "3.1.1", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/npm/node_modules/wrap-ansi": { + "version": "8.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/write-file-atomic": { + "version": "5.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npmlog": { + "version": "5.0.1", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.7", + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/omggif": { + "version": "1.0.10", + "license": "MIT" + }, + "node_modules/once": { + "version": "1.4.0", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "license": "(MIT AND Zlib)" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-bmfont-ascii": { + "version": "1.0.6", + "license": "MIT" + }, + "node_modules/parse-bmfont-binary": { + "version": "1.0.6", + "license": "MIT" + }, + "node_modules/parse-bmfont-xml": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "xml-parse-from-string": "^1.0.0", + "xml2js": "^0.4.5" + } + }, + "node_modules/parse-headers": { + "version": "2.0.5", + "license": "MIT" + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "license": "MIT", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/peek-readable": { + "version": "4.1.0", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "license": "MIT" + }, + "node_modules/phin": { + "version": "2.9.3", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/pify": { + "version": "4.0.1", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pixelmatch": { + "version": "4.0.2", + "license": "ISC", + "dependencies": { + "pngjs": "^3.0.0" + }, + "bin": { + "pixelmatch": "bin/pixelmatch" + } + }, + "node_modules/pixelmatch/node_modules/pngjs": { + "version": "3.4.0", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/pngjs": { + "version": "6.0.0", + "license": "MIT", + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/postcss": { + "version": "8.4.33", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.15", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/protobufjs": { + "version": "7.2.4", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/prr": { + "version": "1.0.1", + "license": "MIT", + "optional": true + }, + "node_modules/psl": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-config-file": { + "version": "6.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "config-file-ts": "^0.2.4", + "dotenv": "^9.0.2", + "dotenv-expand": "^5.1.0", + "js-yaml": "^4.1.0", + "json5": "^2.2.0", + "lazy-val": "^1.0.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/responselike": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "devOptional": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/rollup": { + "version": "4.9.4", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.9.4", + "@rollup/rollup-android-arm64": "4.9.4", + "@rollup/rollup-darwin-arm64": "4.9.4", + "@rollup/rollup-darwin-x64": "4.9.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.9.4", + "@rollup/rollup-linux-arm64-gnu": "4.9.4", + "@rollup/rollup-linux-arm64-musl": "4.9.4", + "@rollup/rollup-linux-riscv64-gnu": "4.9.4", + "@rollup/rollup-linux-x64-gnu": "4.9.4", + "@rollup/rollup-linux-x64-musl": "4.9.4", + "@rollup/rollup-win32-arm64-msvc": "4.9.4", + "@rollup/rollup-win32-ia32-msvc": "4.9.4", + "@rollup/rollup-win32-x64-msvc": "4.9.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.6.0", + "license": "MIT" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/sanitize-filename": { + "version": "1.6.3", + "dev": true, + "license": "WTFPL OR ISC", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sax": { + "version": "1.3.0", + "license": "ISC" + }, + "node_modules/saxes": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/seemly": { + "version": "0.3.8", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "license": "MIT", + "optional": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "license": "ISC", + "optional": true, + "peer": true + }, + "node_modules/sharp": { + "version": "0.33.2", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "semver": "^7.5.4" + }, + "engines": { + "libvips": ">=8.15.1", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.2", + "@img/sharp-darwin-x64": "0.33.2", + "@img/sharp-libvips-darwin-arm64": "1.0.1", + "@img/sharp-libvips-darwin-x64": "1.0.1", + "@img/sharp-libvips-linux-arm": "1.0.1", + "@img/sharp-libvips-linux-arm64": "1.0.1", + "@img/sharp-libvips-linux-s390x": "1.0.1", + "@img/sharp-libvips-linux-x64": "1.0.1", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.1", + "@img/sharp-libvips-linuxmusl-x64": "1.0.1", + "@img/sharp-linux-arm": "0.33.2", + "@img/sharp-linux-arm64": "0.33.2", + "@img/sharp-linux-s390x": "0.33.2", + "@img/sharp-linux-x64": "0.33.2", + "@img/sharp-linuxmusl-arm64": "0.33.2", + "@img/sharp-linuxmusl-x64": "0.33.2", + "@img/sharp-wasm32": "0.33.2", + "@img/sharp-win32-ia32": "0.33.2", + "@img/sharp-win32-x64": "0.33.2" + } + }, + "node_modules/sharp/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.5.4", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/simple-get": { + "version": "3.1.1", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-get/node_modules/decompress-response": { + "version": "4.2.1", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/simple-get/node_modules/mimic-response": { + "version": "2.1.0", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.5.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/sm3": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.6.1", + "devOptional": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/stat-mode": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/streamifier": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "devOptional": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strtok3": { + "version": "6.3.0", + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^4.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0" + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "license": "MIT" + }, + "node_modules/synckit": { + "version": "0.8.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/tar": { + "version": "6.2.0", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-stream": { + "version": "1.6.2", + "license": "MIT", + "dependencies": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "2.3.8", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/tar-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/tar-stream/node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/temp-file": { + "version": "3.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + } + }, + "node_modules/temp-file/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/temp-file/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/temp-file/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/tencentcloud-sdk-nodejs": { + "version": "4.0.821", + "license": "Apache-2.0", + "dependencies": { + "form-data": "^3.0.0", + "get-stream": "^6.0.0", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "json-bigint": "^1.0.0", + "node-fetch": "^2.2.0", + "tslib": "1.13.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tencentcloud-sdk-nodejs/node_modules/form-data": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tencentcloud-sdk-nodejs/node_modules/get-stream": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tencentcloud-sdk-nodejs/node_modules/tslib": { + "version": "1.13.0", + "license": "0BSD" + }, + "node_modules/text-table": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/timm": { + "version": "1.7.1", + "license": "MIT" + }, + "node_modules/tiny-typed-emitter": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/tinycolor2": { + "version": "1.6.0", + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/to-buffer": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/token-types": { + "version": "4.2.1", + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/treemate": { + "version": "0.3.11", + "license": "MIT" + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "dev": true, + "license": "WTFPL", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "devOptional": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.13.1", + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.3.3", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "license": "MIT" + }, + "node_modules/universalify": { + "version": "0.1.2", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/utf8-byte-length": { + "version": "1.0.4", + "dev": true, + "license": "WTFPL" + }, + "node_modules/utif2": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "pako": "^1.0.11" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "9.0.1", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vdirs": { + "version": "0.1.8", + "license": "MIT", + "dependencies": { + "evtd": "^0.2.2" + }, + "peerDependencies": { + "vue": "^3.0.11" + } + }, + "node_modules/vfonts": { + "version": "0.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "5.0.11", + "license": "MIT", + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.32", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vooks": { + "version": "0.2.12", + "license": "MIT", + "dependencies": { + "evtd": "^0.2.2" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vue": { + "version": "3.4.10", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.4.10", + "@vue/compiler-sfc": "3.4.10", + "@vue/runtime-dom": "3.4.10", + "@vue/server-renderer": "3.4.10", + "@vue/shared": "3.4.10" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-eslint-parser": { + "version": "9.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue-eslint-parser/node_modules/semver": { + "version": "7.5.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue-eslint-parser/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/vue-router": { + "version": "4.2.5", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.5.0" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vueuc": { + "version": "0.4.58", + "license": "MIT", + "dependencies": { + "@css-render/vue3-ssr": "^0.15.10", + "@juggle/resize-observer": "^3.3.1", + "css-render": "^0.15.10", + "evtd": "^0.2.4", + "seemly": "^0.3.6", + "vdirs": "^0.1.4", + "vooks": "^0.2.4" + }, + "peerDependencies": { + "vue": "^3.0.11" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/w3c-xmlserializer/node_modules/xml-name-validator": { + "version": "5.0.0", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/wav-file-info": { + "version": "0.0.10", + "license": "ISC" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "license": "MIT" + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/winreg": { + "version": "1.2.5", + "license": "BSD-2-Clause" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.16.0", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xhr": { + "version": "2.6.0", + "license": "MIT", + "dependencies": { + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xml-parse-from-string": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/xml2js": { + "version": "0.4.23", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "license": "MIT" + }, + "node_modules/xtend": { + "version": "4.0.2", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yazl": { + "version": "2.5.1", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zip-stream": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/archiver-utils": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "glob": "^7.2.3", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..1f34f1a --- /dev/null +++ b/package.json @@ -0,0 +1,86 @@ +{ + "name": "laitool", + "version": "2.2.2", + "description": "An Electron application with Vue", + "main": "./out/main/index.js", + "author": "example.com", + "homepage": "https://electron-vite.org", + "scripts": { + "format": "prettier --write .", + "lint": "eslint . --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix", + "start": "electron-vite preview", + "dev": "electron-vite dev --watch", + "build": "electron-vite build", + "postinstall": "electron-builder install-app-deps", + "build:win": "npm run build && electron-builder --win --config", + "build:mac": "npm run build && electron-builder --mac --config", + "build:linux": "npm run build && electron-builder --linux --config" + }, + "dependencies": { + "@alicloud/alimt20181012": "^1.2.0", + "@electron-toolkit/preload": "^3.0.0", + "@electron-toolkit/utils": "^3.0.0", + "@skit/x.naive-ui": "^0.15.0", + "@vicons/ionicons5": "^0.12.0", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "@volcengine/openapi": "^1.16.0", + "7zip-min": "^1.4.4", + "awesome-js": "^2.0.0", + "axios": "^1.6.5", + "compressing": "^1.10.0", + "crypto-js": "^4.2.0", + "electron-updater": "^6.1.7", + "fluent-ffmpeg": "^2.1.2", + "highlight.js": "^11.9.0", + "install": "^0.13.0", + "jimp": "^0.22.10", + "jsdom": "^24.0.0", + "lodash": "^4.17.21", + "music-metadata": "^7.14.0", + "node-machine-id": "^1.1.12", + "node-reg": "^0.2.4", + "npm": "^10.7.0", + "sharp": "^0.33.2", + "tencentcloud-sdk-nodejs": "^4.0.821", + "uuid": "^9.0.1", + "vue-router": "^4.2.5", + "wav-file-info": "^0.0.10", + "winreg": "^1.2.5" + }, + "devDependencies": { + "@electron-toolkit/eslint-config": "^1.0.1", + "@rushstack/eslint-patch": "^1.6.1", + "@vitejs/plugin-vue": "^5.0.2", + "@vue/eslint-config-prettier": "^9.0.0", + "electron": "^28.1.1", + "electron-builder": "^24.13.3", + "electron-vite": "^2.0.0", + "eslint": "^8.56.0", + "eslint-plugin-vue": "^9.19.2", + "less": "^4.2.0", + "naive-ui": "^2.37.3", + "prettier": "^3.1.1", + "vfonts": "^0.0.3", + "vite": "^5.0.11", + "vue": "^3.4.5" + }, + "build": { + "asar": true, + "files": [ + "out/**/*", + "!resources/" + ], + "extraResources": [ + "resources/package/**", + "resources/image/**", + "resources/scripts/model/**", + "resources/scripts/Lai.exe", + "resources/scripts/discordScript.js", + "resources/tmp/**", + "resources/icon.ico" + ], + "win": { + "icon": "./resources/icon.ico" + } + } +} \ No newline at end of file diff --git a/resources/icon.ico b/resources/icon.ico new file mode 100644 index 0000000..f064692 Binary files /dev/null and b/resources/icon.ico differ diff --git a/resources/icon.png b/resources/icon.png new file mode 100644 index 0000000..f643538 Binary files /dev/null and b/resources/icon.png differ diff --git a/resources/icon.svg b/resources/icon.svg new file mode 100644 index 0000000..4b998fc --- /dev/null +++ b/resources/icon.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/icon11.ico b/resources/icon11.ico new file mode 100644 index 0000000..5ee79c4 Binary files /dev/null and b/resources/icon11.ico differ diff --git a/resources/icon_1.png b/resources/icon_1.png new file mode 100644 index 0000000..cf9e8b2 Binary files /dev/null and b/resources/icon_1.png differ diff --git a/resources/icon_2.png b/resources/icon_2.png new file mode 100644 index 0000000..5cf687d Binary files /dev/null and b/resources/icon_2.png differ diff --git a/resources/image/style/image1.jpeg b/resources/image/style/image1.jpeg new file mode 100644 index 0000000..956a2b1 Binary files /dev/null and b/resources/image/style/image1.jpeg differ diff --git a/resources/image/style/image10.jpeg b/resources/image/style/image10.jpeg new file mode 100644 index 0000000..b64918c Binary files /dev/null and b/resources/image/style/image10.jpeg differ diff --git a/resources/image/style/image100.jpeg b/resources/image/style/image100.jpeg new file mode 100644 index 0000000..d792656 Binary files /dev/null and b/resources/image/style/image100.jpeg differ diff --git a/resources/image/style/image101.jpeg b/resources/image/style/image101.jpeg new file mode 100644 index 0000000..bfaafb8 Binary files /dev/null and b/resources/image/style/image101.jpeg differ diff --git a/resources/image/style/image102.jpeg b/resources/image/style/image102.jpeg new file mode 100644 index 0000000..e97ebbc Binary files /dev/null and b/resources/image/style/image102.jpeg differ diff --git a/resources/image/style/image103.jpeg b/resources/image/style/image103.jpeg new file mode 100644 index 0000000..0c1cd74 Binary files /dev/null and b/resources/image/style/image103.jpeg differ diff --git a/resources/image/style/image104.jpeg b/resources/image/style/image104.jpeg new file mode 100644 index 0000000..803bbfb Binary files /dev/null and b/resources/image/style/image104.jpeg differ diff --git a/resources/image/style/image105.jpeg b/resources/image/style/image105.jpeg new file mode 100644 index 0000000..97943f9 Binary files /dev/null and b/resources/image/style/image105.jpeg differ diff --git a/resources/image/style/image106.jpeg b/resources/image/style/image106.jpeg new file mode 100644 index 0000000..4ef16c9 Binary files /dev/null and b/resources/image/style/image106.jpeg differ diff --git a/resources/image/style/image107.jpeg b/resources/image/style/image107.jpeg new file mode 100644 index 0000000..f66b75c Binary files /dev/null and b/resources/image/style/image107.jpeg differ diff --git a/resources/image/style/image108.jpeg b/resources/image/style/image108.jpeg new file mode 100644 index 0000000..5618be1 Binary files /dev/null and b/resources/image/style/image108.jpeg differ diff --git a/resources/image/style/image109.jpeg b/resources/image/style/image109.jpeg new file mode 100644 index 0000000..b6cd90e Binary files /dev/null and b/resources/image/style/image109.jpeg differ diff --git a/resources/image/style/image11.jpeg b/resources/image/style/image11.jpeg new file mode 100644 index 0000000..221adb8 Binary files /dev/null and b/resources/image/style/image11.jpeg differ diff --git a/resources/image/style/image110.jpeg b/resources/image/style/image110.jpeg new file mode 100644 index 0000000..73a4ad5 Binary files /dev/null and b/resources/image/style/image110.jpeg differ diff --git a/resources/image/style/image111.jpeg b/resources/image/style/image111.jpeg new file mode 100644 index 0000000..0cb6a41 Binary files /dev/null and b/resources/image/style/image111.jpeg differ diff --git a/resources/image/style/image112.jpeg b/resources/image/style/image112.jpeg new file mode 100644 index 0000000..27dab3d Binary files /dev/null and b/resources/image/style/image112.jpeg differ diff --git a/resources/image/style/image113.jpeg b/resources/image/style/image113.jpeg new file mode 100644 index 0000000..f2f1d6d Binary files /dev/null and b/resources/image/style/image113.jpeg differ diff --git a/resources/image/style/image114.jpeg b/resources/image/style/image114.jpeg new file mode 100644 index 0000000..fcd90c5 Binary files /dev/null and b/resources/image/style/image114.jpeg differ diff --git a/resources/image/style/image115.jpeg b/resources/image/style/image115.jpeg new file mode 100644 index 0000000..918c8e1 Binary files /dev/null and b/resources/image/style/image115.jpeg differ diff --git a/resources/image/style/image116.jpeg b/resources/image/style/image116.jpeg new file mode 100644 index 0000000..9d6ca47 Binary files /dev/null and b/resources/image/style/image116.jpeg differ diff --git a/resources/image/style/image117.jpeg b/resources/image/style/image117.jpeg new file mode 100644 index 0000000..70cd752 Binary files /dev/null and b/resources/image/style/image117.jpeg differ diff --git a/resources/image/style/image118.jpeg b/resources/image/style/image118.jpeg new file mode 100644 index 0000000..15f7dd3 Binary files /dev/null and b/resources/image/style/image118.jpeg differ diff --git a/resources/image/style/image119.jpeg b/resources/image/style/image119.jpeg new file mode 100644 index 0000000..7cffa68 Binary files /dev/null and b/resources/image/style/image119.jpeg differ diff --git a/resources/image/style/image12.jpeg b/resources/image/style/image12.jpeg new file mode 100644 index 0000000..9d138bd Binary files /dev/null and b/resources/image/style/image12.jpeg differ diff --git a/resources/image/style/image120.jpeg b/resources/image/style/image120.jpeg new file mode 100644 index 0000000..e998eb6 Binary files /dev/null and b/resources/image/style/image120.jpeg differ diff --git a/resources/image/style/image121.jpeg b/resources/image/style/image121.jpeg new file mode 100644 index 0000000..7b1afbc Binary files /dev/null and b/resources/image/style/image121.jpeg differ diff --git a/resources/image/style/image122.jpeg b/resources/image/style/image122.jpeg new file mode 100644 index 0000000..1af0ba2 Binary files /dev/null and b/resources/image/style/image122.jpeg differ diff --git a/resources/image/style/image123.jpeg b/resources/image/style/image123.jpeg new file mode 100644 index 0000000..34de56d Binary files /dev/null and b/resources/image/style/image123.jpeg differ diff --git a/resources/image/style/image124.jpeg b/resources/image/style/image124.jpeg new file mode 100644 index 0000000..f0d955d Binary files /dev/null and b/resources/image/style/image124.jpeg differ diff --git a/resources/image/style/image125.jpeg b/resources/image/style/image125.jpeg new file mode 100644 index 0000000..e8f06a6 Binary files /dev/null and b/resources/image/style/image125.jpeg differ diff --git a/resources/image/style/image126.jpeg b/resources/image/style/image126.jpeg new file mode 100644 index 0000000..cd8db8f Binary files /dev/null and b/resources/image/style/image126.jpeg differ diff --git a/resources/image/style/image127.jpeg b/resources/image/style/image127.jpeg new file mode 100644 index 0000000..5f29f14 Binary files /dev/null and b/resources/image/style/image127.jpeg differ diff --git a/resources/image/style/image128.jpeg b/resources/image/style/image128.jpeg new file mode 100644 index 0000000..3371ff6 Binary files /dev/null and b/resources/image/style/image128.jpeg differ diff --git a/resources/image/style/image129.jpeg b/resources/image/style/image129.jpeg new file mode 100644 index 0000000..313fbec Binary files /dev/null and b/resources/image/style/image129.jpeg differ diff --git a/resources/image/style/image13.jpeg b/resources/image/style/image13.jpeg new file mode 100644 index 0000000..fa33bbf Binary files /dev/null and b/resources/image/style/image13.jpeg differ diff --git a/resources/image/style/image130.jpeg b/resources/image/style/image130.jpeg new file mode 100644 index 0000000..0384e9d Binary files /dev/null and b/resources/image/style/image130.jpeg differ diff --git a/resources/image/style/image131.jpeg b/resources/image/style/image131.jpeg new file mode 100644 index 0000000..6294a24 Binary files /dev/null and b/resources/image/style/image131.jpeg differ diff --git a/resources/image/style/image132.jpeg b/resources/image/style/image132.jpeg new file mode 100644 index 0000000..fd9cdb3 Binary files /dev/null and b/resources/image/style/image132.jpeg differ diff --git a/resources/image/style/image133.jpeg b/resources/image/style/image133.jpeg new file mode 100644 index 0000000..b39b320 Binary files /dev/null and b/resources/image/style/image133.jpeg differ diff --git a/resources/image/style/image134.jpeg b/resources/image/style/image134.jpeg new file mode 100644 index 0000000..55b6fe4 Binary files /dev/null and b/resources/image/style/image134.jpeg differ diff --git a/resources/image/style/image135.jpeg b/resources/image/style/image135.jpeg new file mode 100644 index 0000000..49afe11 Binary files /dev/null and b/resources/image/style/image135.jpeg differ diff --git a/resources/image/style/image136.jpeg b/resources/image/style/image136.jpeg new file mode 100644 index 0000000..67a7fa9 Binary files /dev/null and b/resources/image/style/image136.jpeg differ diff --git a/resources/image/style/image137.jpeg b/resources/image/style/image137.jpeg new file mode 100644 index 0000000..bf55ab5 Binary files /dev/null and b/resources/image/style/image137.jpeg differ diff --git a/resources/image/style/image138.jpeg b/resources/image/style/image138.jpeg new file mode 100644 index 0000000..f6990aa Binary files /dev/null and b/resources/image/style/image138.jpeg differ diff --git a/resources/image/style/image139.jpeg b/resources/image/style/image139.jpeg new file mode 100644 index 0000000..87c357d Binary files /dev/null and b/resources/image/style/image139.jpeg differ diff --git a/resources/image/style/image14.jpeg b/resources/image/style/image14.jpeg new file mode 100644 index 0000000..044f67a Binary files /dev/null and b/resources/image/style/image14.jpeg differ diff --git a/resources/image/style/image140.jpeg b/resources/image/style/image140.jpeg new file mode 100644 index 0000000..ae18e93 Binary files /dev/null and b/resources/image/style/image140.jpeg differ diff --git a/resources/image/style/image141.jpeg b/resources/image/style/image141.jpeg new file mode 100644 index 0000000..6eb3a50 Binary files /dev/null and b/resources/image/style/image141.jpeg differ diff --git a/resources/image/style/image142.jpeg b/resources/image/style/image142.jpeg new file mode 100644 index 0000000..406be73 Binary files /dev/null and b/resources/image/style/image142.jpeg differ diff --git a/resources/image/style/image143.jpeg b/resources/image/style/image143.jpeg new file mode 100644 index 0000000..e0d00f4 Binary files /dev/null and b/resources/image/style/image143.jpeg differ diff --git a/resources/image/style/image144.jpeg b/resources/image/style/image144.jpeg new file mode 100644 index 0000000..b4da637 Binary files /dev/null and b/resources/image/style/image144.jpeg differ diff --git a/resources/image/style/image145.jpeg b/resources/image/style/image145.jpeg new file mode 100644 index 0000000..cc4b128 Binary files /dev/null and b/resources/image/style/image145.jpeg differ diff --git a/resources/image/style/image146.jpeg b/resources/image/style/image146.jpeg new file mode 100644 index 0000000..d3a3901 Binary files /dev/null and b/resources/image/style/image146.jpeg differ diff --git a/resources/image/style/image147.jpeg b/resources/image/style/image147.jpeg new file mode 100644 index 0000000..ffdc2fc Binary files /dev/null and b/resources/image/style/image147.jpeg differ diff --git a/resources/image/style/image148.jpeg b/resources/image/style/image148.jpeg new file mode 100644 index 0000000..95a3e5e Binary files /dev/null and b/resources/image/style/image148.jpeg differ diff --git a/resources/image/style/image149.jpeg b/resources/image/style/image149.jpeg new file mode 100644 index 0000000..4b3911f Binary files /dev/null and b/resources/image/style/image149.jpeg differ diff --git a/resources/image/style/image15.jpeg b/resources/image/style/image15.jpeg new file mode 100644 index 0000000..0d24126 Binary files /dev/null and b/resources/image/style/image15.jpeg differ diff --git a/resources/image/style/image150.jpeg b/resources/image/style/image150.jpeg new file mode 100644 index 0000000..fbf3acf Binary files /dev/null and b/resources/image/style/image150.jpeg differ diff --git a/resources/image/style/image151.jpeg b/resources/image/style/image151.jpeg new file mode 100644 index 0000000..beedb3c Binary files /dev/null and b/resources/image/style/image151.jpeg differ diff --git a/resources/image/style/image152.jpeg b/resources/image/style/image152.jpeg new file mode 100644 index 0000000..66f4d81 Binary files /dev/null and b/resources/image/style/image152.jpeg differ diff --git a/resources/image/style/image153.jpeg b/resources/image/style/image153.jpeg new file mode 100644 index 0000000..30e00ce Binary files /dev/null and b/resources/image/style/image153.jpeg differ diff --git a/resources/image/style/image154.jpeg b/resources/image/style/image154.jpeg new file mode 100644 index 0000000..1895355 Binary files /dev/null and b/resources/image/style/image154.jpeg differ diff --git a/resources/image/style/image155.jpeg b/resources/image/style/image155.jpeg new file mode 100644 index 0000000..83cfd21 Binary files /dev/null and b/resources/image/style/image155.jpeg differ diff --git a/resources/image/style/image156.jpeg b/resources/image/style/image156.jpeg new file mode 100644 index 0000000..4b8d02d Binary files /dev/null and b/resources/image/style/image156.jpeg differ diff --git a/resources/image/style/image157.jpeg b/resources/image/style/image157.jpeg new file mode 100644 index 0000000..61ce5da Binary files /dev/null and b/resources/image/style/image157.jpeg differ diff --git a/resources/image/style/image158.jpeg b/resources/image/style/image158.jpeg new file mode 100644 index 0000000..b8961a4 Binary files /dev/null and b/resources/image/style/image158.jpeg differ diff --git a/resources/image/style/image159.jpeg b/resources/image/style/image159.jpeg new file mode 100644 index 0000000..5a06380 Binary files /dev/null and b/resources/image/style/image159.jpeg differ diff --git a/resources/image/style/image16.jpeg b/resources/image/style/image16.jpeg new file mode 100644 index 0000000..e225686 Binary files /dev/null and b/resources/image/style/image16.jpeg differ diff --git a/resources/image/style/image160.jpeg b/resources/image/style/image160.jpeg new file mode 100644 index 0000000..c908aa6 Binary files /dev/null and b/resources/image/style/image160.jpeg differ diff --git a/resources/image/style/image161.jpeg b/resources/image/style/image161.jpeg new file mode 100644 index 0000000..ea6c882 Binary files /dev/null and b/resources/image/style/image161.jpeg differ diff --git a/resources/image/style/image162.jpeg b/resources/image/style/image162.jpeg new file mode 100644 index 0000000..c2789f7 Binary files /dev/null and b/resources/image/style/image162.jpeg differ diff --git a/resources/image/style/image163.jpeg b/resources/image/style/image163.jpeg new file mode 100644 index 0000000..3e3a0a4 Binary files /dev/null and b/resources/image/style/image163.jpeg differ diff --git a/resources/image/style/image164.jpeg b/resources/image/style/image164.jpeg new file mode 100644 index 0000000..977e7f0 Binary files /dev/null and b/resources/image/style/image164.jpeg differ diff --git a/resources/image/style/image165.jpeg b/resources/image/style/image165.jpeg new file mode 100644 index 0000000..12df494 Binary files /dev/null and b/resources/image/style/image165.jpeg differ diff --git a/resources/image/style/image166.jpeg b/resources/image/style/image166.jpeg new file mode 100644 index 0000000..61d3a9e Binary files /dev/null and b/resources/image/style/image166.jpeg differ diff --git a/resources/image/style/image167.jpeg b/resources/image/style/image167.jpeg new file mode 100644 index 0000000..b467a8d Binary files /dev/null and b/resources/image/style/image167.jpeg differ diff --git a/resources/image/style/image168.jpeg b/resources/image/style/image168.jpeg new file mode 100644 index 0000000..fab586b Binary files /dev/null and b/resources/image/style/image168.jpeg differ diff --git a/resources/image/style/image169.jpeg b/resources/image/style/image169.jpeg new file mode 100644 index 0000000..49c7aa1 Binary files /dev/null and b/resources/image/style/image169.jpeg differ diff --git a/resources/image/style/image17.jpeg b/resources/image/style/image17.jpeg new file mode 100644 index 0000000..b6ff95f Binary files /dev/null and b/resources/image/style/image17.jpeg differ diff --git a/resources/image/style/image170.jpeg b/resources/image/style/image170.jpeg new file mode 100644 index 0000000..40a0971 Binary files /dev/null and b/resources/image/style/image170.jpeg differ diff --git a/resources/image/style/image171.jpeg b/resources/image/style/image171.jpeg new file mode 100644 index 0000000..47c5edf Binary files /dev/null and b/resources/image/style/image171.jpeg differ diff --git a/resources/image/style/image172.jpeg b/resources/image/style/image172.jpeg new file mode 100644 index 0000000..8bc7923 Binary files /dev/null and b/resources/image/style/image172.jpeg differ diff --git a/resources/image/style/image173.jpeg b/resources/image/style/image173.jpeg new file mode 100644 index 0000000..6711149 Binary files /dev/null and b/resources/image/style/image173.jpeg differ diff --git a/resources/image/style/image174.jpeg b/resources/image/style/image174.jpeg new file mode 100644 index 0000000..609402b Binary files /dev/null and b/resources/image/style/image174.jpeg differ diff --git a/resources/image/style/image175.jpeg b/resources/image/style/image175.jpeg new file mode 100644 index 0000000..402a0c9 Binary files /dev/null and b/resources/image/style/image175.jpeg differ diff --git a/resources/image/style/image176.jpeg b/resources/image/style/image176.jpeg new file mode 100644 index 0000000..c568983 Binary files /dev/null and b/resources/image/style/image176.jpeg differ diff --git a/resources/image/style/image177.jpeg b/resources/image/style/image177.jpeg new file mode 100644 index 0000000..b168786 Binary files /dev/null and b/resources/image/style/image177.jpeg differ diff --git a/resources/image/style/image178.jpeg b/resources/image/style/image178.jpeg new file mode 100644 index 0000000..1b32481 Binary files /dev/null and b/resources/image/style/image178.jpeg differ diff --git a/resources/image/style/image179.jpeg b/resources/image/style/image179.jpeg new file mode 100644 index 0000000..7cd4701 Binary files /dev/null and b/resources/image/style/image179.jpeg differ diff --git a/resources/image/style/image18.jpeg b/resources/image/style/image18.jpeg new file mode 100644 index 0000000..8221224 Binary files /dev/null and b/resources/image/style/image18.jpeg differ diff --git a/resources/image/style/image180.jpeg b/resources/image/style/image180.jpeg new file mode 100644 index 0000000..63f0e04 Binary files /dev/null and b/resources/image/style/image180.jpeg differ diff --git a/resources/image/style/image181.jpeg b/resources/image/style/image181.jpeg new file mode 100644 index 0000000..bce06ca Binary files /dev/null and b/resources/image/style/image181.jpeg differ diff --git a/resources/image/style/image182.jpeg b/resources/image/style/image182.jpeg new file mode 100644 index 0000000..556955e Binary files /dev/null and b/resources/image/style/image182.jpeg differ diff --git a/resources/image/style/image183.jpeg b/resources/image/style/image183.jpeg new file mode 100644 index 0000000..c6bda91 Binary files /dev/null and b/resources/image/style/image183.jpeg differ diff --git a/resources/image/style/image184.jpeg b/resources/image/style/image184.jpeg new file mode 100644 index 0000000..787adab Binary files /dev/null and b/resources/image/style/image184.jpeg differ diff --git a/resources/image/style/image185.jpeg b/resources/image/style/image185.jpeg new file mode 100644 index 0000000..ba4e739 Binary files /dev/null and b/resources/image/style/image185.jpeg differ diff --git a/resources/image/style/image186.jpeg b/resources/image/style/image186.jpeg new file mode 100644 index 0000000..078bf66 Binary files /dev/null and b/resources/image/style/image186.jpeg differ diff --git a/resources/image/style/image187.jpeg b/resources/image/style/image187.jpeg new file mode 100644 index 0000000..b63304c Binary files /dev/null and b/resources/image/style/image187.jpeg differ diff --git a/resources/image/style/image188.jpeg b/resources/image/style/image188.jpeg new file mode 100644 index 0000000..c0406dd Binary files /dev/null and b/resources/image/style/image188.jpeg differ diff --git a/resources/image/style/image189.jpeg b/resources/image/style/image189.jpeg new file mode 100644 index 0000000..19ec39b Binary files /dev/null and b/resources/image/style/image189.jpeg differ diff --git a/resources/image/style/image19.jpeg b/resources/image/style/image19.jpeg new file mode 100644 index 0000000..80a7bee Binary files /dev/null and b/resources/image/style/image19.jpeg differ diff --git a/resources/image/style/image190.jpeg b/resources/image/style/image190.jpeg new file mode 100644 index 0000000..63d245d Binary files /dev/null and b/resources/image/style/image190.jpeg differ diff --git a/resources/image/style/image191.jpeg b/resources/image/style/image191.jpeg new file mode 100644 index 0000000..f1a842d Binary files /dev/null and b/resources/image/style/image191.jpeg differ diff --git a/resources/image/style/image192.jpeg b/resources/image/style/image192.jpeg new file mode 100644 index 0000000..1a9b7ce Binary files /dev/null and b/resources/image/style/image192.jpeg differ diff --git a/resources/image/style/image193.jpeg b/resources/image/style/image193.jpeg new file mode 100644 index 0000000..a35d965 Binary files /dev/null and b/resources/image/style/image193.jpeg differ diff --git a/resources/image/style/image194.jpeg b/resources/image/style/image194.jpeg new file mode 100644 index 0000000..66ccde4 Binary files /dev/null and b/resources/image/style/image194.jpeg differ diff --git a/resources/image/style/image195.jpeg b/resources/image/style/image195.jpeg new file mode 100644 index 0000000..f6185c4 Binary files /dev/null and b/resources/image/style/image195.jpeg differ diff --git a/resources/image/style/image196.jpeg b/resources/image/style/image196.jpeg new file mode 100644 index 0000000..88305d2 Binary files /dev/null and b/resources/image/style/image196.jpeg differ diff --git a/resources/image/style/image197.jpeg b/resources/image/style/image197.jpeg new file mode 100644 index 0000000..53e8e8b Binary files /dev/null and b/resources/image/style/image197.jpeg differ diff --git a/resources/image/style/image198.jpeg b/resources/image/style/image198.jpeg new file mode 100644 index 0000000..571cd3b Binary files /dev/null and b/resources/image/style/image198.jpeg differ diff --git a/resources/image/style/image199.jpeg b/resources/image/style/image199.jpeg new file mode 100644 index 0000000..aa4f2ec Binary files /dev/null and b/resources/image/style/image199.jpeg differ diff --git a/resources/image/style/image2.jpeg b/resources/image/style/image2.jpeg new file mode 100644 index 0000000..4aaae81 Binary files /dev/null and b/resources/image/style/image2.jpeg differ diff --git a/resources/image/style/image20.jpeg b/resources/image/style/image20.jpeg new file mode 100644 index 0000000..20aaad2 Binary files /dev/null and b/resources/image/style/image20.jpeg differ diff --git a/resources/image/style/image200.jpeg b/resources/image/style/image200.jpeg new file mode 100644 index 0000000..af68503 Binary files /dev/null and b/resources/image/style/image200.jpeg differ diff --git a/resources/image/style/image201.jpeg b/resources/image/style/image201.jpeg new file mode 100644 index 0000000..1152292 Binary files /dev/null and b/resources/image/style/image201.jpeg differ diff --git a/resources/image/style/image202.jpeg b/resources/image/style/image202.jpeg new file mode 100644 index 0000000..e26b5c3 Binary files /dev/null and b/resources/image/style/image202.jpeg differ diff --git a/resources/image/style/image203.jpeg b/resources/image/style/image203.jpeg new file mode 100644 index 0000000..a75dade Binary files /dev/null and b/resources/image/style/image203.jpeg differ diff --git a/resources/image/style/image204.jpeg b/resources/image/style/image204.jpeg new file mode 100644 index 0000000..3617498 Binary files /dev/null and b/resources/image/style/image204.jpeg differ diff --git a/resources/image/style/image205.jpeg b/resources/image/style/image205.jpeg new file mode 100644 index 0000000..78a8e39 Binary files /dev/null and b/resources/image/style/image205.jpeg differ diff --git a/resources/image/style/image206.jpeg b/resources/image/style/image206.jpeg new file mode 100644 index 0000000..2b0ea5f Binary files /dev/null and b/resources/image/style/image206.jpeg differ diff --git a/resources/image/style/image207.jpeg b/resources/image/style/image207.jpeg new file mode 100644 index 0000000..8af92f1 Binary files /dev/null and b/resources/image/style/image207.jpeg differ diff --git a/resources/image/style/image208.jpeg b/resources/image/style/image208.jpeg new file mode 100644 index 0000000..44d5fc6 Binary files /dev/null and b/resources/image/style/image208.jpeg differ diff --git a/resources/image/style/image209.jpeg b/resources/image/style/image209.jpeg new file mode 100644 index 0000000..a1008ae Binary files /dev/null and b/resources/image/style/image209.jpeg differ diff --git a/resources/image/style/image21.jpeg b/resources/image/style/image21.jpeg new file mode 100644 index 0000000..21af230 Binary files /dev/null and b/resources/image/style/image21.jpeg differ diff --git a/resources/image/style/image210.jpeg b/resources/image/style/image210.jpeg new file mode 100644 index 0000000..d2c8493 Binary files /dev/null and b/resources/image/style/image210.jpeg differ diff --git a/resources/image/style/image211.jpeg b/resources/image/style/image211.jpeg new file mode 100644 index 0000000..1a59bf6 Binary files /dev/null and b/resources/image/style/image211.jpeg differ diff --git a/resources/image/style/image212.jpeg b/resources/image/style/image212.jpeg new file mode 100644 index 0000000..c7426b8 Binary files /dev/null and b/resources/image/style/image212.jpeg differ diff --git a/resources/image/style/image213.jpeg b/resources/image/style/image213.jpeg new file mode 100644 index 0000000..436baa2 Binary files /dev/null and b/resources/image/style/image213.jpeg differ diff --git a/resources/image/style/image214.jpeg b/resources/image/style/image214.jpeg new file mode 100644 index 0000000..e356be9 Binary files /dev/null and b/resources/image/style/image214.jpeg differ diff --git a/resources/image/style/image215.jpeg b/resources/image/style/image215.jpeg new file mode 100644 index 0000000..5a1a26d Binary files /dev/null and b/resources/image/style/image215.jpeg differ diff --git a/resources/image/style/image216.jpeg b/resources/image/style/image216.jpeg new file mode 100644 index 0000000..dbedef0 Binary files /dev/null and b/resources/image/style/image216.jpeg differ diff --git a/resources/image/style/image217.jpeg b/resources/image/style/image217.jpeg new file mode 100644 index 0000000..af71622 Binary files /dev/null and b/resources/image/style/image217.jpeg differ diff --git a/resources/image/style/image218.jpeg b/resources/image/style/image218.jpeg new file mode 100644 index 0000000..cbd16ce Binary files /dev/null and b/resources/image/style/image218.jpeg differ diff --git a/resources/image/style/image219.jpeg b/resources/image/style/image219.jpeg new file mode 100644 index 0000000..3117ceb Binary files /dev/null and b/resources/image/style/image219.jpeg differ diff --git a/resources/image/style/image22.jpeg b/resources/image/style/image22.jpeg new file mode 100644 index 0000000..0bf12b3 Binary files /dev/null and b/resources/image/style/image22.jpeg differ diff --git a/resources/image/style/image220.jpeg b/resources/image/style/image220.jpeg new file mode 100644 index 0000000..bd587e5 Binary files /dev/null and b/resources/image/style/image220.jpeg differ diff --git a/resources/image/style/image221.jpeg b/resources/image/style/image221.jpeg new file mode 100644 index 0000000..9819969 Binary files /dev/null and b/resources/image/style/image221.jpeg differ diff --git a/resources/image/style/image222.jpeg b/resources/image/style/image222.jpeg new file mode 100644 index 0000000..410ed82 Binary files /dev/null and b/resources/image/style/image222.jpeg differ diff --git a/resources/image/style/image223.jpeg b/resources/image/style/image223.jpeg new file mode 100644 index 0000000..587b459 Binary files /dev/null and b/resources/image/style/image223.jpeg differ diff --git a/resources/image/style/image224.jpeg b/resources/image/style/image224.jpeg new file mode 100644 index 0000000..6d6d70a Binary files /dev/null and b/resources/image/style/image224.jpeg differ diff --git a/resources/image/style/image225.jpeg b/resources/image/style/image225.jpeg new file mode 100644 index 0000000..e26341b Binary files /dev/null and b/resources/image/style/image225.jpeg differ diff --git a/resources/image/style/image226.jpeg b/resources/image/style/image226.jpeg new file mode 100644 index 0000000..c9b9ef0 Binary files /dev/null and b/resources/image/style/image226.jpeg differ diff --git a/resources/image/style/image227.jpeg b/resources/image/style/image227.jpeg new file mode 100644 index 0000000..906f47e Binary files /dev/null and b/resources/image/style/image227.jpeg differ diff --git a/resources/image/style/image228.jpeg b/resources/image/style/image228.jpeg new file mode 100644 index 0000000..3fab7cd Binary files /dev/null and b/resources/image/style/image228.jpeg differ diff --git a/resources/image/style/image229.jpeg b/resources/image/style/image229.jpeg new file mode 100644 index 0000000..4475f3e Binary files /dev/null and b/resources/image/style/image229.jpeg differ diff --git a/resources/image/style/image23.jpeg b/resources/image/style/image23.jpeg new file mode 100644 index 0000000..6873f9f Binary files /dev/null and b/resources/image/style/image23.jpeg differ diff --git a/resources/image/style/image230.jpeg b/resources/image/style/image230.jpeg new file mode 100644 index 0000000..48e5873 Binary files /dev/null and b/resources/image/style/image230.jpeg differ diff --git a/resources/image/style/image231.jpeg b/resources/image/style/image231.jpeg new file mode 100644 index 0000000..465fb41 Binary files /dev/null and b/resources/image/style/image231.jpeg differ diff --git a/resources/image/style/image232.jpeg b/resources/image/style/image232.jpeg new file mode 100644 index 0000000..da0fb97 Binary files /dev/null and b/resources/image/style/image232.jpeg differ diff --git a/resources/image/style/image233.jpeg b/resources/image/style/image233.jpeg new file mode 100644 index 0000000..4acc18c Binary files /dev/null and b/resources/image/style/image233.jpeg differ diff --git a/resources/image/style/image234.jpeg b/resources/image/style/image234.jpeg new file mode 100644 index 0000000..d35b2a2 Binary files /dev/null and b/resources/image/style/image234.jpeg differ diff --git a/resources/image/style/image235.jpeg b/resources/image/style/image235.jpeg new file mode 100644 index 0000000..32043a6 Binary files /dev/null and b/resources/image/style/image235.jpeg differ diff --git a/resources/image/style/image236.jpeg b/resources/image/style/image236.jpeg new file mode 100644 index 0000000..2068a87 Binary files /dev/null and b/resources/image/style/image236.jpeg differ diff --git a/resources/image/style/image237.jpeg b/resources/image/style/image237.jpeg new file mode 100644 index 0000000..98fe940 Binary files /dev/null and b/resources/image/style/image237.jpeg differ diff --git a/resources/image/style/image238.jpeg b/resources/image/style/image238.jpeg new file mode 100644 index 0000000..9cb3f7d Binary files /dev/null and b/resources/image/style/image238.jpeg differ diff --git a/resources/image/style/image239.jpeg b/resources/image/style/image239.jpeg new file mode 100644 index 0000000..5b61b58 Binary files /dev/null and b/resources/image/style/image239.jpeg differ diff --git a/resources/image/style/image24.jpeg b/resources/image/style/image24.jpeg new file mode 100644 index 0000000..38e9d29 Binary files /dev/null and b/resources/image/style/image24.jpeg differ diff --git a/resources/image/style/image240.jpeg b/resources/image/style/image240.jpeg new file mode 100644 index 0000000..d9fc98f Binary files /dev/null and b/resources/image/style/image240.jpeg differ diff --git a/resources/image/style/image241.jpeg b/resources/image/style/image241.jpeg new file mode 100644 index 0000000..56ab410 Binary files /dev/null and b/resources/image/style/image241.jpeg differ diff --git a/resources/image/style/image242.jpeg b/resources/image/style/image242.jpeg new file mode 100644 index 0000000..b153f2b Binary files /dev/null and b/resources/image/style/image242.jpeg differ diff --git a/resources/image/style/image243.jpeg b/resources/image/style/image243.jpeg new file mode 100644 index 0000000..827ff52 Binary files /dev/null and b/resources/image/style/image243.jpeg differ diff --git a/resources/image/style/image244.jpeg b/resources/image/style/image244.jpeg new file mode 100644 index 0000000..5a1b72f Binary files /dev/null and b/resources/image/style/image244.jpeg differ diff --git a/resources/image/style/image245.jpeg b/resources/image/style/image245.jpeg new file mode 100644 index 0000000..32356f0 Binary files /dev/null and b/resources/image/style/image245.jpeg differ diff --git a/resources/image/style/image246.jpeg b/resources/image/style/image246.jpeg new file mode 100644 index 0000000..dff78c7 Binary files /dev/null and b/resources/image/style/image246.jpeg differ diff --git a/resources/image/style/image247.jpeg b/resources/image/style/image247.jpeg new file mode 100644 index 0000000..96aa323 Binary files /dev/null and b/resources/image/style/image247.jpeg differ diff --git a/resources/image/style/image248.jpeg b/resources/image/style/image248.jpeg new file mode 100644 index 0000000..989fb95 Binary files /dev/null and b/resources/image/style/image248.jpeg differ diff --git a/resources/image/style/image249.jpeg b/resources/image/style/image249.jpeg new file mode 100644 index 0000000..e3c5129 Binary files /dev/null and b/resources/image/style/image249.jpeg differ diff --git a/resources/image/style/image25.jpeg b/resources/image/style/image25.jpeg new file mode 100644 index 0000000..b51a486 Binary files /dev/null and b/resources/image/style/image25.jpeg differ diff --git a/resources/image/style/image250.jpeg b/resources/image/style/image250.jpeg new file mode 100644 index 0000000..da48909 Binary files /dev/null and b/resources/image/style/image250.jpeg differ diff --git a/resources/image/style/image251.jpeg b/resources/image/style/image251.jpeg new file mode 100644 index 0000000..a05f0f6 Binary files /dev/null and b/resources/image/style/image251.jpeg differ diff --git a/resources/image/style/image252.jpeg b/resources/image/style/image252.jpeg new file mode 100644 index 0000000..4fb1022 Binary files /dev/null and b/resources/image/style/image252.jpeg differ diff --git a/resources/image/style/image253.jpeg b/resources/image/style/image253.jpeg new file mode 100644 index 0000000..a559cb2 Binary files /dev/null and b/resources/image/style/image253.jpeg differ diff --git a/resources/image/style/image254.jpeg b/resources/image/style/image254.jpeg new file mode 100644 index 0000000..b877793 Binary files /dev/null and b/resources/image/style/image254.jpeg differ diff --git a/resources/image/style/image255.jpeg b/resources/image/style/image255.jpeg new file mode 100644 index 0000000..16dc310 Binary files /dev/null and b/resources/image/style/image255.jpeg differ diff --git a/resources/image/style/image256.jpeg b/resources/image/style/image256.jpeg new file mode 100644 index 0000000..46c3250 Binary files /dev/null and b/resources/image/style/image256.jpeg differ diff --git a/resources/image/style/image257.jpeg b/resources/image/style/image257.jpeg new file mode 100644 index 0000000..585a4f2 Binary files /dev/null and b/resources/image/style/image257.jpeg differ diff --git a/resources/image/style/image258.jpeg b/resources/image/style/image258.jpeg new file mode 100644 index 0000000..163bbf8 Binary files /dev/null and b/resources/image/style/image258.jpeg differ diff --git a/resources/image/style/image259.jpeg b/resources/image/style/image259.jpeg new file mode 100644 index 0000000..1768db5 Binary files /dev/null and b/resources/image/style/image259.jpeg differ diff --git a/resources/image/style/image26.jpeg b/resources/image/style/image26.jpeg new file mode 100644 index 0000000..d7bd0fe Binary files /dev/null and b/resources/image/style/image26.jpeg differ diff --git a/resources/image/style/image260.jpeg b/resources/image/style/image260.jpeg new file mode 100644 index 0000000..d42e5fe Binary files /dev/null and b/resources/image/style/image260.jpeg differ diff --git a/resources/image/style/image261.jpeg b/resources/image/style/image261.jpeg new file mode 100644 index 0000000..50b771e Binary files /dev/null and b/resources/image/style/image261.jpeg differ diff --git a/resources/image/style/image262.jpeg b/resources/image/style/image262.jpeg new file mode 100644 index 0000000..674ad95 Binary files /dev/null and b/resources/image/style/image262.jpeg differ diff --git a/resources/image/style/image263.jpeg b/resources/image/style/image263.jpeg new file mode 100644 index 0000000..08796dc Binary files /dev/null and b/resources/image/style/image263.jpeg differ diff --git a/resources/image/style/image264.jpeg b/resources/image/style/image264.jpeg new file mode 100644 index 0000000..1811e57 Binary files /dev/null and b/resources/image/style/image264.jpeg differ diff --git a/resources/image/style/image265.jpeg b/resources/image/style/image265.jpeg new file mode 100644 index 0000000..106832f Binary files /dev/null and b/resources/image/style/image265.jpeg differ diff --git a/resources/image/style/image266.jpeg b/resources/image/style/image266.jpeg new file mode 100644 index 0000000..b1225b2 Binary files /dev/null and b/resources/image/style/image266.jpeg differ diff --git a/resources/image/style/image267.jpeg b/resources/image/style/image267.jpeg new file mode 100644 index 0000000..062d1bb Binary files /dev/null and b/resources/image/style/image267.jpeg differ diff --git a/resources/image/style/image268.jpeg b/resources/image/style/image268.jpeg new file mode 100644 index 0000000..88bc661 Binary files /dev/null and b/resources/image/style/image268.jpeg differ diff --git a/resources/image/style/image269.jpeg b/resources/image/style/image269.jpeg new file mode 100644 index 0000000..d1c2016 Binary files /dev/null and b/resources/image/style/image269.jpeg differ diff --git a/resources/image/style/image27.jpeg b/resources/image/style/image27.jpeg new file mode 100644 index 0000000..62d7329 Binary files /dev/null and b/resources/image/style/image27.jpeg differ diff --git a/resources/image/style/image270.jpeg b/resources/image/style/image270.jpeg new file mode 100644 index 0000000..15d34b5 Binary files /dev/null and b/resources/image/style/image270.jpeg differ diff --git a/resources/image/style/image271.jpeg b/resources/image/style/image271.jpeg new file mode 100644 index 0000000..498117b Binary files /dev/null and b/resources/image/style/image271.jpeg differ diff --git a/resources/image/style/image272.jpeg b/resources/image/style/image272.jpeg new file mode 100644 index 0000000..feb1ee1 Binary files /dev/null and b/resources/image/style/image272.jpeg differ diff --git a/resources/image/style/image273.jpeg b/resources/image/style/image273.jpeg new file mode 100644 index 0000000..faf5f45 Binary files /dev/null and b/resources/image/style/image273.jpeg differ diff --git a/resources/image/style/image274.jpeg b/resources/image/style/image274.jpeg new file mode 100644 index 0000000..b66232b Binary files /dev/null and b/resources/image/style/image274.jpeg differ diff --git a/resources/image/style/image275.jpeg b/resources/image/style/image275.jpeg new file mode 100644 index 0000000..fff76d3 Binary files /dev/null and b/resources/image/style/image275.jpeg differ diff --git a/resources/image/style/image276.jpeg b/resources/image/style/image276.jpeg new file mode 100644 index 0000000..2fa1290 Binary files /dev/null and b/resources/image/style/image276.jpeg differ diff --git a/resources/image/style/image277.jpeg b/resources/image/style/image277.jpeg new file mode 100644 index 0000000..25f0732 Binary files /dev/null and b/resources/image/style/image277.jpeg differ diff --git a/resources/image/style/image278.jpeg b/resources/image/style/image278.jpeg new file mode 100644 index 0000000..69bd7f8 Binary files /dev/null and b/resources/image/style/image278.jpeg differ diff --git a/resources/image/style/image279.jpeg b/resources/image/style/image279.jpeg new file mode 100644 index 0000000..087653f Binary files /dev/null and b/resources/image/style/image279.jpeg differ diff --git a/resources/image/style/image28.jpeg b/resources/image/style/image28.jpeg new file mode 100644 index 0000000..c8fe272 Binary files /dev/null and b/resources/image/style/image28.jpeg differ diff --git a/resources/image/style/image280.jpeg b/resources/image/style/image280.jpeg new file mode 100644 index 0000000..7a28483 Binary files /dev/null and b/resources/image/style/image280.jpeg differ diff --git a/resources/image/style/image281.jpeg b/resources/image/style/image281.jpeg new file mode 100644 index 0000000..2e43b45 Binary files /dev/null and b/resources/image/style/image281.jpeg differ diff --git a/resources/image/style/image282.jpeg b/resources/image/style/image282.jpeg new file mode 100644 index 0000000..8368c65 Binary files /dev/null and b/resources/image/style/image282.jpeg differ diff --git a/resources/image/style/image283.jpeg b/resources/image/style/image283.jpeg new file mode 100644 index 0000000..f9f28dc Binary files /dev/null and b/resources/image/style/image283.jpeg differ diff --git a/resources/image/style/image284.jpeg b/resources/image/style/image284.jpeg new file mode 100644 index 0000000..449ba45 Binary files /dev/null and b/resources/image/style/image284.jpeg differ diff --git a/resources/image/style/image285.jpeg b/resources/image/style/image285.jpeg new file mode 100644 index 0000000..a7e6a2e Binary files /dev/null and b/resources/image/style/image285.jpeg differ diff --git a/resources/image/style/image286.jpeg b/resources/image/style/image286.jpeg new file mode 100644 index 0000000..a20ceeb Binary files /dev/null and b/resources/image/style/image286.jpeg differ diff --git a/resources/image/style/image287.jpeg b/resources/image/style/image287.jpeg new file mode 100644 index 0000000..fb7f1f3 Binary files /dev/null and b/resources/image/style/image287.jpeg differ diff --git a/resources/image/style/image288.jpeg b/resources/image/style/image288.jpeg new file mode 100644 index 0000000..0c929b0 Binary files /dev/null and b/resources/image/style/image288.jpeg differ diff --git a/resources/image/style/image289.jpeg b/resources/image/style/image289.jpeg new file mode 100644 index 0000000..76d9a75 Binary files /dev/null and b/resources/image/style/image289.jpeg differ diff --git a/resources/image/style/image29.jpeg b/resources/image/style/image29.jpeg new file mode 100644 index 0000000..2ebb4bb Binary files /dev/null and b/resources/image/style/image29.jpeg differ diff --git a/resources/image/style/image290.jpeg b/resources/image/style/image290.jpeg new file mode 100644 index 0000000..4045676 Binary files /dev/null and b/resources/image/style/image290.jpeg differ diff --git a/resources/image/style/image291.jpeg b/resources/image/style/image291.jpeg new file mode 100644 index 0000000..9f09c0d Binary files /dev/null and b/resources/image/style/image291.jpeg differ diff --git a/resources/image/style/image292.jpeg b/resources/image/style/image292.jpeg new file mode 100644 index 0000000..3a87603 Binary files /dev/null and b/resources/image/style/image292.jpeg differ diff --git a/resources/image/style/image293.jpeg b/resources/image/style/image293.jpeg new file mode 100644 index 0000000..3e7ce2e Binary files /dev/null and b/resources/image/style/image293.jpeg differ diff --git a/resources/image/style/image294.jpeg b/resources/image/style/image294.jpeg new file mode 100644 index 0000000..7658d2f Binary files /dev/null and b/resources/image/style/image294.jpeg differ diff --git a/resources/image/style/image295.jpeg b/resources/image/style/image295.jpeg new file mode 100644 index 0000000..d2801c8 Binary files /dev/null and b/resources/image/style/image295.jpeg differ diff --git a/resources/image/style/image296.jpeg b/resources/image/style/image296.jpeg new file mode 100644 index 0000000..51ce652 Binary files /dev/null and b/resources/image/style/image296.jpeg differ diff --git a/resources/image/style/image297.jpeg b/resources/image/style/image297.jpeg new file mode 100644 index 0000000..9833cc4 Binary files /dev/null and b/resources/image/style/image297.jpeg differ diff --git a/resources/image/style/image298.jpeg b/resources/image/style/image298.jpeg new file mode 100644 index 0000000..7d17fe9 Binary files /dev/null and b/resources/image/style/image298.jpeg differ diff --git a/resources/image/style/image299.jpeg b/resources/image/style/image299.jpeg new file mode 100644 index 0000000..5e1ad37 Binary files /dev/null and b/resources/image/style/image299.jpeg differ diff --git a/resources/image/style/image3.jpeg b/resources/image/style/image3.jpeg new file mode 100644 index 0000000..9ca33cd Binary files /dev/null and b/resources/image/style/image3.jpeg differ diff --git a/resources/image/style/image30.jpeg b/resources/image/style/image30.jpeg new file mode 100644 index 0000000..8f4543a Binary files /dev/null and b/resources/image/style/image30.jpeg differ diff --git a/resources/image/style/image300.jpeg b/resources/image/style/image300.jpeg new file mode 100644 index 0000000..16ae952 Binary files /dev/null and b/resources/image/style/image300.jpeg differ diff --git a/resources/image/style/image301.jpeg b/resources/image/style/image301.jpeg new file mode 100644 index 0000000..67385ec Binary files /dev/null and b/resources/image/style/image301.jpeg differ diff --git a/resources/image/style/image302.jpeg b/resources/image/style/image302.jpeg new file mode 100644 index 0000000..85d5692 Binary files /dev/null and b/resources/image/style/image302.jpeg differ diff --git a/resources/image/style/image303.jpeg b/resources/image/style/image303.jpeg new file mode 100644 index 0000000..1e75fe2 Binary files /dev/null and b/resources/image/style/image303.jpeg differ diff --git a/resources/image/style/image304.jpeg b/resources/image/style/image304.jpeg new file mode 100644 index 0000000..bc67708 Binary files /dev/null and b/resources/image/style/image304.jpeg differ diff --git a/resources/image/style/image305.jpeg b/resources/image/style/image305.jpeg new file mode 100644 index 0000000..28dd59f Binary files /dev/null and b/resources/image/style/image305.jpeg differ diff --git a/resources/image/style/image306.jpeg b/resources/image/style/image306.jpeg new file mode 100644 index 0000000..faa0f37 Binary files /dev/null and b/resources/image/style/image306.jpeg differ diff --git a/resources/image/style/image307.jpeg b/resources/image/style/image307.jpeg new file mode 100644 index 0000000..a907fea Binary files /dev/null and b/resources/image/style/image307.jpeg differ diff --git a/resources/image/style/image308.jpeg b/resources/image/style/image308.jpeg new file mode 100644 index 0000000..035ae62 Binary files /dev/null and b/resources/image/style/image308.jpeg differ diff --git a/resources/image/style/image309.jpeg b/resources/image/style/image309.jpeg new file mode 100644 index 0000000..a655368 Binary files /dev/null and b/resources/image/style/image309.jpeg differ diff --git a/resources/image/style/image31.jpeg b/resources/image/style/image31.jpeg new file mode 100644 index 0000000..2a1fda4 Binary files /dev/null and b/resources/image/style/image31.jpeg differ diff --git a/resources/image/style/image310.jpeg b/resources/image/style/image310.jpeg new file mode 100644 index 0000000..c51ea0f Binary files /dev/null and b/resources/image/style/image310.jpeg differ diff --git a/resources/image/style/image311.jpeg b/resources/image/style/image311.jpeg new file mode 100644 index 0000000..eee89ac Binary files /dev/null and b/resources/image/style/image311.jpeg differ diff --git a/resources/image/style/image312.jpeg b/resources/image/style/image312.jpeg new file mode 100644 index 0000000..0c72f6f Binary files /dev/null and b/resources/image/style/image312.jpeg differ diff --git a/resources/image/style/image313.jpeg b/resources/image/style/image313.jpeg new file mode 100644 index 0000000..678c176 Binary files /dev/null and b/resources/image/style/image313.jpeg differ diff --git a/resources/image/style/image314.jpeg b/resources/image/style/image314.jpeg new file mode 100644 index 0000000..e1fb0ce Binary files /dev/null and b/resources/image/style/image314.jpeg differ diff --git a/resources/image/style/image315.jpeg b/resources/image/style/image315.jpeg new file mode 100644 index 0000000..f75a1ac Binary files /dev/null and b/resources/image/style/image315.jpeg differ diff --git a/resources/image/style/image316.jpeg b/resources/image/style/image316.jpeg new file mode 100644 index 0000000..958acde Binary files /dev/null and b/resources/image/style/image316.jpeg differ diff --git a/resources/image/style/image317.jpeg b/resources/image/style/image317.jpeg new file mode 100644 index 0000000..3a07adb Binary files /dev/null and b/resources/image/style/image317.jpeg differ diff --git a/resources/image/style/image318.jpeg b/resources/image/style/image318.jpeg new file mode 100644 index 0000000..1c2bb62 Binary files /dev/null and b/resources/image/style/image318.jpeg differ diff --git a/resources/image/style/image319.jpeg b/resources/image/style/image319.jpeg new file mode 100644 index 0000000..d30cede Binary files /dev/null and b/resources/image/style/image319.jpeg differ diff --git a/resources/image/style/image32.jpeg b/resources/image/style/image32.jpeg new file mode 100644 index 0000000..a2eba63 Binary files /dev/null and b/resources/image/style/image32.jpeg differ diff --git a/resources/image/style/image320.jpeg b/resources/image/style/image320.jpeg new file mode 100644 index 0000000..d5ab9f6 Binary files /dev/null and b/resources/image/style/image320.jpeg differ diff --git a/resources/image/style/image321.jpeg b/resources/image/style/image321.jpeg new file mode 100644 index 0000000..2c3db60 Binary files /dev/null and b/resources/image/style/image321.jpeg differ diff --git a/resources/image/style/image322.jpeg b/resources/image/style/image322.jpeg new file mode 100644 index 0000000..8bb5697 Binary files /dev/null and b/resources/image/style/image322.jpeg differ diff --git a/resources/image/style/image323.jpeg b/resources/image/style/image323.jpeg new file mode 100644 index 0000000..dd8fae1 Binary files /dev/null and b/resources/image/style/image323.jpeg differ diff --git a/resources/image/style/image324.jpeg b/resources/image/style/image324.jpeg new file mode 100644 index 0000000..a7325d7 Binary files /dev/null and b/resources/image/style/image324.jpeg differ diff --git a/resources/image/style/image325.jpeg b/resources/image/style/image325.jpeg new file mode 100644 index 0000000..ac3ac7b Binary files /dev/null and b/resources/image/style/image325.jpeg differ diff --git a/resources/image/style/image326.jpeg b/resources/image/style/image326.jpeg new file mode 100644 index 0000000..3e55d75 Binary files /dev/null and b/resources/image/style/image326.jpeg differ diff --git a/resources/image/style/image327.jpeg b/resources/image/style/image327.jpeg new file mode 100644 index 0000000..8aafb20 Binary files /dev/null and b/resources/image/style/image327.jpeg differ diff --git a/resources/image/style/image328.jpeg b/resources/image/style/image328.jpeg new file mode 100644 index 0000000..73d56b0 Binary files /dev/null and b/resources/image/style/image328.jpeg differ diff --git a/resources/image/style/image329.jpeg b/resources/image/style/image329.jpeg new file mode 100644 index 0000000..814368a Binary files /dev/null and b/resources/image/style/image329.jpeg differ diff --git a/resources/image/style/image33.jpeg b/resources/image/style/image33.jpeg new file mode 100644 index 0000000..5edc94c Binary files /dev/null and b/resources/image/style/image33.jpeg differ diff --git a/resources/image/style/image330.jpeg b/resources/image/style/image330.jpeg new file mode 100644 index 0000000..aaaa778 Binary files /dev/null and b/resources/image/style/image330.jpeg differ diff --git a/resources/image/style/image331.jpeg b/resources/image/style/image331.jpeg new file mode 100644 index 0000000..2c10a2b Binary files /dev/null and b/resources/image/style/image331.jpeg differ diff --git a/resources/image/style/image332.jpeg b/resources/image/style/image332.jpeg new file mode 100644 index 0000000..368bf3d Binary files /dev/null and b/resources/image/style/image332.jpeg differ diff --git a/resources/image/style/image333.jpeg b/resources/image/style/image333.jpeg new file mode 100644 index 0000000..df82671 Binary files /dev/null and b/resources/image/style/image333.jpeg differ diff --git a/resources/image/style/image334.jpeg b/resources/image/style/image334.jpeg new file mode 100644 index 0000000..e3310b2 Binary files /dev/null and b/resources/image/style/image334.jpeg differ diff --git a/resources/image/style/image335.jpeg b/resources/image/style/image335.jpeg new file mode 100644 index 0000000..83ad2f6 Binary files /dev/null and b/resources/image/style/image335.jpeg differ diff --git a/resources/image/style/image336.jpeg b/resources/image/style/image336.jpeg new file mode 100644 index 0000000..e919639 Binary files /dev/null and b/resources/image/style/image336.jpeg differ diff --git a/resources/image/style/image337.jpeg b/resources/image/style/image337.jpeg new file mode 100644 index 0000000..523f6ab Binary files /dev/null and b/resources/image/style/image337.jpeg differ diff --git a/resources/image/style/image338.jpeg b/resources/image/style/image338.jpeg new file mode 100644 index 0000000..0afbe3d Binary files /dev/null and b/resources/image/style/image338.jpeg differ diff --git a/resources/image/style/image339.jpeg b/resources/image/style/image339.jpeg new file mode 100644 index 0000000..7a314e1 Binary files /dev/null and b/resources/image/style/image339.jpeg differ diff --git a/resources/image/style/image34.jpeg b/resources/image/style/image34.jpeg new file mode 100644 index 0000000..93ac874 Binary files /dev/null and b/resources/image/style/image34.jpeg differ diff --git a/resources/image/style/image340.jpeg b/resources/image/style/image340.jpeg new file mode 100644 index 0000000..feb5be5 Binary files /dev/null and b/resources/image/style/image340.jpeg differ diff --git a/resources/image/style/image341.jpeg b/resources/image/style/image341.jpeg new file mode 100644 index 0000000..db8799d Binary files /dev/null and b/resources/image/style/image341.jpeg differ diff --git a/resources/image/style/image342.jpeg b/resources/image/style/image342.jpeg new file mode 100644 index 0000000..02f0ed5 Binary files /dev/null and b/resources/image/style/image342.jpeg differ diff --git a/resources/image/style/image343.jpeg b/resources/image/style/image343.jpeg new file mode 100644 index 0000000..8382594 Binary files /dev/null and b/resources/image/style/image343.jpeg differ diff --git a/resources/image/style/image344.jpeg b/resources/image/style/image344.jpeg new file mode 100644 index 0000000..80282b5 Binary files /dev/null and b/resources/image/style/image344.jpeg differ diff --git a/resources/image/style/image345.jpeg b/resources/image/style/image345.jpeg new file mode 100644 index 0000000..902d80f Binary files /dev/null and b/resources/image/style/image345.jpeg differ diff --git a/resources/image/style/image346.jpeg b/resources/image/style/image346.jpeg new file mode 100644 index 0000000..1bf1b75 Binary files /dev/null and b/resources/image/style/image346.jpeg differ diff --git a/resources/image/style/image347.jpeg b/resources/image/style/image347.jpeg new file mode 100644 index 0000000..6428156 Binary files /dev/null and b/resources/image/style/image347.jpeg differ diff --git a/resources/image/style/image348.jpeg b/resources/image/style/image348.jpeg new file mode 100644 index 0000000..aec701d Binary files /dev/null and b/resources/image/style/image348.jpeg differ diff --git a/resources/image/style/image349.jpeg b/resources/image/style/image349.jpeg new file mode 100644 index 0000000..4d7806d Binary files /dev/null and b/resources/image/style/image349.jpeg differ diff --git a/resources/image/style/image35.jpeg b/resources/image/style/image35.jpeg new file mode 100644 index 0000000..ded5d0c Binary files /dev/null and b/resources/image/style/image35.jpeg differ diff --git a/resources/image/style/image350.jpeg b/resources/image/style/image350.jpeg new file mode 100644 index 0000000..8f8c05f Binary files /dev/null and b/resources/image/style/image350.jpeg differ diff --git a/resources/image/style/image351.jpeg b/resources/image/style/image351.jpeg new file mode 100644 index 0000000..d5b2ac3 Binary files /dev/null and b/resources/image/style/image351.jpeg differ diff --git a/resources/image/style/image352.jpeg b/resources/image/style/image352.jpeg new file mode 100644 index 0000000..ec56d79 Binary files /dev/null and b/resources/image/style/image352.jpeg differ diff --git a/resources/image/style/image353.jpeg b/resources/image/style/image353.jpeg new file mode 100644 index 0000000..48a4fcb Binary files /dev/null and b/resources/image/style/image353.jpeg differ diff --git a/resources/image/style/image354.jpeg b/resources/image/style/image354.jpeg new file mode 100644 index 0000000..1c2e5b8 Binary files /dev/null and b/resources/image/style/image354.jpeg differ diff --git a/resources/image/style/image355.jpeg b/resources/image/style/image355.jpeg new file mode 100644 index 0000000..e723353 Binary files /dev/null and b/resources/image/style/image355.jpeg differ diff --git a/resources/image/style/image356.jpeg b/resources/image/style/image356.jpeg new file mode 100644 index 0000000..1707d35 Binary files /dev/null and b/resources/image/style/image356.jpeg differ diff --git a/resources/image/style/image357.jpeg b/resources/image/style/image357.jpeg new file mode 100644 index 0000000..81936ad Binary files /dev/null and b/resources/image/style/image357.jpeg differ diff --git a/resources/image/style/image358.jpeg b/resources/image/style/image358.jpeg new file mode 100644 index 0000000..a923af2 Binary files /dev/null and b/resources/image/style/image358.jpeg differ diff --git a/resources/image/style/image359.jpeg b/resources/image/style/image359.jpeg new file mode 100644 index 0000000..e39a6ba Binary files /dev/null and b/resources/image/style/image359.jpeg differ diff --git a/resources/image/style/image36.jpeg b/resources/image/style/image36.jpeg new file mode 100644 index 0000000..c13d0a3 Binary files /dev/null and b/resources/image/style/image36.jpeg differ diff --git a/resources/image/style/image360.jpeg b/resources/image/style/image360.jpeg new file mode 100644 index 0000000..0705fde Binary files /dev/null and b/resources/image/style/image360.jpeg differ diff --git a/resources/image/style/image361.jpeg b/resources/image/style/image361.jpeg new file mode 100644 index 0000000..e937a09 Binary files /dev/null and b/resources/image/style/image361.jpeg differ diff --git a/resources/image/style/image362.jpeg b/resources/image/style/image362.jpeg new file mode 100644 index 0000000..0a338a1 Binary files /dev/null and b/resources/image/style/image362.jpeg differ diff --git a/resources/image/style/image363.jpeg b/resources/image/style/image363.jpeg new file mode 100644 index 0000000..650171b Binary files /dev/null and b/resources/image/style/image363.jpeg differ diff --git a/resources/image/style/image364.jpeg b/resources/image/style/image364.jpeg new file mode 100644 index 0000000..86f1ed9 Binary files /dev/null and b/resources/image/style/image364.jpeg differ diff --git a/resources/image/style/image365.jpeg b/resources/image/style/image365.jpeg new file mode 100644 index 0000000..ba98310 Binary files /dev/null and b/resources/image/style/image365.jpeg differ diff --git a/resources/image/style/image366.jpeg b/resources/image/style/image366.jpeg new file mode 100644 index 0000000..0fbfd19 Binary files /dev/null and b/resources/image/style/image366.jpeg differ diff --git a/resources/image/style/image367.jpeg b/resources/image/style/image367.jpeg new file mode 100644 index 0000000..cbae232 Binary files /dev/null and b/resources/image/style/image367.jpeg differ diff --git a/resources/image/style/image368.jpeg b/resources/image/style/image368.jpeg new file mode 100644 index 0000000..4b8047b Binary files /dev/null and b/resources/image/style/image368.jpeg differ diff --git a/resources/image/style/image369.jpeg b/resources/image/style/image369.jpeg new file mode 100644 index 0000000..c00a02f Binary files /dev/null and b/resources/image/style/image369.jpeg differ diff --git a/resources/image/style/image37.jpeg b/resources/image/style/image37.jpeg new file mode 100644 index 0000000..ebc18bc Binary files /dev/null and b/resources/image/style/image37.jpeg differ diff --git a/resources/image/style/image370.jpeg b/resources/image/style/image370.jpeg new file mode 100644 index 0000000..f542726 Binary files /dev/null and b/resources/image/style/image370.jpeg differ diff --git a/resources/image/style/image371.jpeg b/resources/image/style/image371.jpeg new file mode 100644 index 0000000..4dc18c5 Binary files /dev/null and b/resources/image/style/image371.jpeg differ diff --git a/resources/image/style/image372.jpeg b/resources/image/style/image372.jpeg new file mode 100644 index 0000000..418f553 Binary files /dev/null and b/resources/image/style/image372.jpeg differ diff --git a/resources/image/style/image373.jpeg b/resources/image/style/image373.jpeg new file mode 100644 index 0000000..f785538 Binary files /dev/null and b/resources/image/style/image373.jpeg differ diff --git a/resources/image/style/image374.jpeg b/resources/image/style/image374.jpeg new file mode 100644 index 0000000..7b7341b Binary files /dev/null and b/resources/image/style/image374.jpeg differ diff --git a/resources/image/style/image375.jpeg b/resources/image/style/image375.jpeg new file mode 100644 index 0000000..fd8a2a7 Binary files /dev/null and b/resources/image/style/image375.jpeg differ diff --git a/resources/image/style/image376.jpeg b/resources/image/style/image376.jpeg new file mode 100644 index 0000000..e897968 Binary files /dev/null and b/resources/image/style/image376.jpeg differ diff --git a/resources/image/style/image377.jpeg b/resources/image/style/image377.jpeg new file mode 100644 index 0000000..f6d4c86 Binary files /dev/null and b/resources/image/style/image377.jpeg differ diff --git a/resources/image/style/image378.jpeg b/resources/image/style/image378.jpeg new file mode 100644 index 0000000..e9361ac Binary files /dev/null and b/resources/image/style/image378.jpeg differ diff --git a/resources/image/style/image379.jpeg b/resources/image/style/image379.jpeg new file mode 100644 index 0000000..614bf6a Binary files /dev/null and b/resources/image/style/image379.jpeg differ diff --git a/resources/image/style/image38.jpeg b/resources/image/style/image38.jpeg new file mode 100644 index 0000000..5c43a33 Binary files /dev/null and b/resources/image/style/image38.jpeg differ diff --git a/resources/image/style/image380.jpeg b/resources/image/style/image380.jpeg new file mode 100644 index 0000000..6a0c01f Binary files /dev/null and b/resources/image/style/image380.jpeg differ diff --git a/resources/image/style/image381.jpeg b/resources/image/style/image381.jpeg new file mode 100644 index 0000000..26a057f Binary files /dev/null and b/resources/image/style/image381.jpeg differ diff --git a/resources/image/style/image382.jpeg b/resources/image/style/image382.jpeg new file mode 100644 index 0000000..4daa92f Binary files /dev/null and b/resources/image/style/image382.jpeg differ diff --git a/resources/image/style/image383.jpeg b/resources/image/style/image383.jpeg new file mode 100644 index 0000000..5bff276 Binary files /dev/null and b/resources/image/style/image383.jpeg differ diff --git a/resources/image/style/image384.jpeg b/resources/image/style/image384.jpeg new file mode 100644 index 0000000..40f7c8f Binary files /dev/null and b/resources/image/style/image384.jpeg differ diff --git a/resources/image/style/image385.jpeg b/resources/image/style/image385.jpeg new file mode 100644 index 0000000..9ab1cde Binary files /dev/null and b/resources/image/style/image385.jpeg differ diff --git a/resources/image/style/image386.jpeg b/resources/image/style/image386.jpeg new file mode 100644 index 0000000..1d38d88 Binary files /dev/null and b/resources/image/style/image386.jpeg differ diff --git a/resources/image/style/image387.jpeg b/resources/image/style/image387.jpeg new file mode 100644 index 0000000..78f3b98 Binary files /dev/null and b/resources/image/style/image387.jpeg differ diff --git a/resources/image/style/image388.jpeg b/resources/image/style/image388.jpeg new file mode 100644 index 0000000..f4f787d Binary files /dev/null and b/resources/image/style/image388.jpeg differ diff --git a/resources/image/style/image389.jpeg b/resources/image/style/image389.jpeg new file mode 100644 index 0000000..d84b331 Binary files /dev/null and b/resources/image/style/image389.jpeg differ diff --git a/resources/image/style/image39.jpeg b/resources/image/style/image39.jpeg new file mode 100644 index 0000000..331c8b9 Binary files /dev/null and b/resources/image/style/image39.jpeg differ diff --git a/resources/image/style/image390.jpeg b/resources/image/style/image390.jpeg new file mode 100644 index 0000000..ea5b529 Binary files /dev/null and b/resources/image/style/image390.jpeg differ diff --git a/resources/image/style/image391.jpeg b/resources/image/style/image391.jpeg new file mode 100644 index 0000000..c9c421b Binary files /dev/null and b/resources/image/style/image391.jpeg differ diff --git a/resources/image/style/image392.jpeg b/resources/image/style/image392.jpeg new file mode 100644 index 0000000..70e4612 Binary files /dev/null and b/resources/image/style/image392.jpeg differ diff --git a/resources/image/style/image393.jpeg b/resources/image/style/image393.jpeg new file mode 100644 index 0000000..6f81ad7 Binary files /dev/null and b/resources/image/style/image393.jpeg differ diff --git a/resources/image/style/image394.jpeg b/resources/image/style/image394.jpeg new file mode 100644 index 0000000..e9060a5 Binary files /dev/null and b/resources/image/style/image394.jpeg differ diff --git a/resources/image/style/image395.jpeg b/resources/image/style/image395.jpeg new file mode 100644 index 0000000..e0cd4f0 Binary files /dev/null and b/resources/image/style/image395.jpeg differ diff --git a/resources/image/style/image396.jpeg b/resources/image/style/image396.jpeg new file mode 100644 index 0000000..c85d649 Binary files /dev/null and b/resources/image/style/image396.jpeg differ diff --git a/resources/image/style/image397.jpeg b/resources/image/style/image397.jpeg new file mode 100644 index 0000000..65f2af2 Binary files /dev/null and b/resources/image/style/image397.jpeg differ diff --git a/resources/image/style/image398.jpeg b/resources/image/style/image398.jpeg new file mode 100644 index 0000000..62c7cf9 Binary files /dev/null and b/resources/image/style/image398.jpeg differ diff --git a/resources/image/style/image399.jpeg b/resources/image/style/image399.jpeg new file mode 100644 index 0000000..67ed14c Binary files /dev/null and b/resources/image/style/image399.jpeg differ diff --git a/resources/image/style/image4.jpeg b/resources/image/style/image4.jpeg new file mode 100644 index 0000000..0c82560 Binary files /dev/null and b/resources/image/style/image4.jpeg differ diff --git a/resources/image/style/image40.jpeg b/resources/image/style/image40.jpeg new file mode 100644 index 0000000..6a15df7 Binary files /dev/null and b/resources/image/style/image40.jpeg differ diff --git a/resources/image/style/image400.jpeg b/resources/image/style/image400.jpeg new file mode 100644 index 0000000..1697971 Binary files /dev/null and b/resources/image/style/image400.jpeg differ diff --git a/resources/image/style/image401.jpeg b/resources/image/style/image401.jpeg new file mode 100644 index 0000000..2c12a79 Binary files /dev/null and b/resources/image/style/image401.jpeg differ diff --git a/resources/image/style/image402.jpeg b/resources/image/style/image402.jpeg new file mode 100644 index 0000000..863953b Binary files /dev/null and b/resources/image/style/image402.jpeg differ diff --git a/resources/image/style/image403.jpeg b/resources/image/style/image403.jpeg new file mode 100644 index 0000000..ea2f5dd Binary files /dev/null and b/resources/image/style/image403.jpeg differ diff --git a/resources/image/style/image404.jpeg b/resources/image/style/image404.jpeg new file mode 100644 index 0000000..5448adb Binary files /dev/null and b/resources/image/style/image404.jpeg differ diff --git a/resources/image/style/image405.jpeg b/resources/image/style/image405.jpeg new file mode 100644 index 0000000..75609a3 Binary files /dev/null and b/resources/image/style/image405.jpeg differ diff --git a/resources/image/style/image406.jpeg b/resources/image/style/image406.jpeg new file mode 100644 index 0000000..d4da82b Binary files /dev/null and b/resources/image/style/image406.jpeg differ diff --git a/resources/image/style/image407.jpeg b/resources/image/style/image407.jpeg new file mode 100644 index 0000000..a88bd5c Binary files /dev/null and b/resources/image/style/image407.jpeg differ diff --git a/resources/image/style/image408.jpeg b/resources/image/style/image408.jpeg new file mode 100644 index 0000000..aa8064c Binary files /dev/null and b/resources/image/style/image408.jpeg differ diff --git a/resources/image/style/image409.jpeg b/resources/image/style/image409.jpeg new file mode 100644 index 0000000..794e856 Binary files /dev/null and b/resources/image/style/image409.jpeg differ diff --git a/resources/image/style/image41.jpeg b/resources/image/style/image41.jpeg new file mode 100644 index 0000000..84aed99 Binary files /dev/null and b/resources/image/style/image41.jpeg differ diff --git a/resources/image/style/image410.jpeg b/resources/image/style/image410.jpeg new file mode 100644 index 0000000..da9f5ea Binary files /dev/null and b/resources/image/style/image410.jpeg differ diff --git a/resources/image/style/image411.jpeg b/resources/image/style/image411.jpeg new file mode 100644 index 0000000..0c784d9 Binary files /dev/null and b/resources/image/style/image411.jpeg differ diff --git a/resources/image/style/image42.jpeg b/resources/image/style/image42.jpeg new file mode 100644 index 0000000..341b888 Binary files /dev/null and b/resources/image/style/image42.jpeg differ diff --git a/resources/image/style/image43.jpeg b/resources/image/style/image43.jpeg new file mode 100644 index 0000000..5db1c0a Binary files /dev/null and b/resources/image/style/image43.jpeg differ diff --git a/resources/image/style/image44.jpeg b/resources/image/style/image44.jpeg new file mode 100644 index 0000000..ba15d89 Binary files /dev/null and b/resources/image/style/image44.jpeg differ diff --git a/resources/image/style/image45.jpeg b/resources/image/style/image45.jpeg new file mode 100644 index 0000000..abee1b2 Binary files /dev/null and b/resources/image/style/image45.jpeg differ diff --git a/resources/image/style/image46.jpeg b/resources/image/style/image46.jpeg new file mode 100644 index 0000000..5b348b2 Binary files /dev/null and b/resources/image/style/image46.jpeg differ diff --git a/resources/image/style/image47.jpeg b/resources/image/style/image47.jpeg new file mode 100644 index 0000000..4b26047 Binary files /dev/null and b/resources/image/style/image47.jpeg differ diff --git a/resources/image/style/image48.jpeg b/resources/image/style/image48.jpeg new file mode 100644 index 0000000..56ad62a Binary files /dev/null and b/resources/image/style/image48.jpeg differ diff --git a/resources/image/style/image49.jpeg b/resources/image/style/image49.jpeg new file mode 100644 index 0000000..475cabd Binary files /dev/null and b/resources/image/style/image49.jpeg differ diff --git a/resources/image/style/image5.jpeg b/resources/image/style/image5.jpeg new file mode 100644 index 0000000..9db5b59 Binary files /dev/null and b/resources/image/style/image5.jpeg differ diff --git a/resources/image/style/image50.jpeg b/resources/image/style/image50.jpeg new file mode 100644 index 0000000..59ec4b3 Binary files /dev/null and b/resources/image/style/image50.jpeg differ diff --git a/resources/image/style/image51.jpeg b/resources/image/style/image51.jpeg new file mode 100644 index 0000000..05812cc Binary files /dev/null and b/resources/image/style/image51.jpeg differ diff --git a/resources/image/style/image52.jpeg b/resources/image/style/image52.jpeg new file mode 100644 index 0000000..621364b Binary files /dev/null and b/resources/image/style/image52.jpeg differ diff --git a/resources/image/style/image53.jpeg b/resources/image/style/image53.jpeg new file mode 100644 index 0000000..d0dd2a5 Binary files /dev/null and b/resources/image/style/image53.jpeg differ diff --git a/resources/image/style/image54.jpeg b/resources/image/style/image54.jpeg new file mode 100644 index 0000000..3db09c5 Binary files /dev/null and b/resources/image/style/image54.jpeg differ diff --git a/resources/image/style/image55.jpeg b/resources/image/style/image55.jpeg new file mode 100644 index 0000000..dfa5ef8 Binary files /dev/null and b/resources/image/style/image55.jpeg differ diff --git a/resources/image/style/image56.jpeg b/resources/image/style/image56.jpeg new file mode 100644 index 0000000..d2a3e71 Binary files /dev/null and b/resources/image/style/image56.jpeg differ diff --git a/resources/image/style/image57.jpeg b/resources/image/style/image57.jpeg new file mode 100644 index 0000000..0f8229a Binary files /dev/null and b/resources/image/style/image57.jpeg differ diff --git a/resources/image/style/image58.jpeg b/resources/image/style/image58.jpeg new file mode 100644 index 0000000..922bfa6 Binary files /dev/null and b/resources/image/style/image58.jpeg differ diff --git a/resources/image/style/image59.jpeg b/resources/image/style/image59.jpeg new file mode 100644 index 0000000..f9247be Binary files /dev/null and b/resources/image/style/image59.jpeg differ diff --git a/resources/image/style/image6.jpeg b/resources/image/style/image6.jpeg new file mode 100644 index 0000000..aa17b62 Binary files /dev/null and b/resources/image/style/image6.jpeg differ diff --git a/resources/image/style/image60.jpeg b/resources/image/style/image60.jpeg new file mode 100644 index 0000000..a62254b Binary files /dev/null and b/resources/image/style/image60.jpeg differ diff --git a/resources/image/style/image61.jpeg b/resources/image/style/image61.jpeg new file mode 100644 index 0000000..11a2bfe Binary files /dev/null and b/resources/image/style/image61.jpeg differ diff --git a/resources/image/style/image62.jpeg b/resources/image/style/image62.jpeg new file mode 100644 index 0000000..538b9bf Binary files /dev/null and b/resources/image/style/image62.jpeg differ diff --git a/resources/image/style/image63.jpeg b/resources/image/style/image63.jpeg new file mode 100644 index 0000000..44b4402 Binary files /dev/null and b/resources/image/style/image63.jpeg differ diff --git a/resources/image/style/image64.jpeg b/resources/image/style/image64.jpeg new file mode 100644 index 0000000..002ead9 Binary files /dev/null and b/resources/image/style/image64.jpeg differ diff --git a/resources/image/style/image65.jpeg b/resources/image/style/image65.jpeg new file mode 100644 index 0000000..9bf7aa0 Binary files /dev/null and b/resources/image/style/image65.jpeg differ diff --git a/resources/image/style/image66.jpeg b/resources/image/style/image66.jpeg new file mode 100644 index 0000000..63cb837 Binary files /dev/null and b/resources/image/style/image66.jpeg differ diff --git a/resources/image/style/image67.jpeg b/resources/image/style/image67.jpeg new file mode 100644 index 0000000..4d529b3 Binary files /dev/null and b/resources/image/style/image67.jpeg differ diff --git a/resources/image/style/image68.jpeg b/resources/image/style/image68.jpeg new file mode 100644 index 0000000..87e0192 Binary files /dev/null and b/resources/image/style/image68.jpeg differ diff --git a/resources/image/style/image69.jpeg b/resources/image/style/image69.jpeg new file mode 100644 index 0000000..56e7b16 Binary files /dev/null and b/resources/image/style/image69.jpeg differ diff --git a/resources/image/style/image7.jpeg b/resources/image/style/image7.jpeg new file mode 100644 index 0000000..cf732ec Binary files /dev/null and b/resources/image/style/image7.jpeg differ diff --git a/resources/image/style/image70.jpeg b/resources/image/style/image70.jpeg new file mode 100644 index 0000000..42a2bff Binary files /dev/null and b/resources/image/style/image70.jpeg differ diff --git a/resources/image/style/image71.jpeg b/resources/image/style/image71.jpeg new file mode 100644 index 0000000..84c990e Binary files /dev/null and b/resources/image/style/image71.jpeg differ diff --git a/resources/image/style/image72.jpeg b/resources/image/style/image72.jpeg new file mode 100644 index 0000000..4536f8c Binary files /dev/null and b/resources/image/style/image72.jpeg differ diff --git a/resources/image/style/image73.jpeg b/resources/image/style/image73.jpeg new file mode 100644 index 0000000..7d8c415 Binary files /dev/null and b/resources/image/style/image73.jpeg differ diff --git a/resources/image/style/image74.jpeg b/resources/image/style/image74.jpeg new file mode 100644 index 0000000..6365fb8 Binary files /dev/null and b/resources/image/style/image74.jpeg differ diff --git a/resources/image/style/image75.jpeg b/resources/image/style/image75.jpeg new file mode 100644 index 0000000..c2cfd90 Binary files /dev/null and b/resources/image/style/image75.jpeg differ diff --git a/resources/image/style/image76.jpeg b/resources/image/style/image76.jpeg new file mode 100644 index 0000000..63ec4f3 Binary files /dev/null and b/resources/image/style/image76.jpeg differ diff --git a/resources/image/style/image77.jpeg b/resources/image/style/image77.jpeg new file mode 100644 index 0000000..a48007d Binary files /dev/null and b/resources/image/style/image77.jpeg differ diff --git a/resources/image/style/image78.jpeg b/resources/image/style/image78.jpeg new file mode 100644 index 0000000..fe2a5da Binary files /dev/null and b/resources/image/style/image78.jpeg differ diff --git a/resources/image/style/image79.jpeg b/resources/image/style/image79.jpeg new file mode 100644 index 0000000..0bae89a Binary files /dev/null and b/resources/image/style/image79.jpeg differ diff --git a/resources/image/style/image8.jpeg b/resources/image/style/image8.jpeg new file mode 100644 index 0000000..18ba8c3 Binary files /dev/null and b/resources/image/style/image8.jpeg differ diff --git a/resources/image/style/image80.jpeg b/resources/image/style/image80.jpeg new file mode 100644 index 0000000..a656bd4 Binary files /dev/null and b/resources/image/style/image80.jpeg differ diff --git a/resources/image/style/image81.jpeg b/resources/image/style/image81.jpeg new file mode 100644 index 0000000..73f2159 Binary files /dev/null and b/resources/image/style/image81.jpeg differ diff --git a/resources/image/style/image82.jpeg b/resources/image/style/image82.jpeg new file mode 100644 index 0000000..95bc6b8 Binary files /dev/null and b/resources/image/style/image82.jpeg differ diff --git a/resources/image/style/image83.jpeg b/resources/image/style/image83.jpeg new file mode 100644 index 0000000..d53ec9a Binary files /dev/null and b/resources/image/style/image83.jpeg differ diff --git a/resources/image/style/image84.jpeg b/resources/image/style/image84.jpeg new file mode 100644 index 0000000..ab651ad Binary files /dev/null and b/resources/image/style/image84.jpeg differ diff --git a/resources/image/style/image85.jpeg b/resources/image/style/image85.jpeg new file mode 100644 index 0000000..b94a430 Binary files /dev/null and b/resources/image/style/image85.jpeg differ diff --git a/resources/image/style/image86.jpeg b/resources/image/style/image86.jpeg new file mode 100644 index 0000000..16a6f74 Binary files /dev/null and b/resources/image/style/image86.jpeg differ diff --git a/resources/image/style/image87.jpeg b/resources/image/style/image87.jpeg new file mode 100644 index 0000000..9adb767 Binary files /dev/null and b/resources/image/style/image87.jpeg differ diff --git a/resources/image/style/image88.jpeg b/resources/image/style/image88.jpeg new file mode 100644 index 0000000..3b634cb Binary files /dev/null and b/resources/image/style/image88.jpeg differ diff --git a/resources/image/style/image89.jpeg b/resources/image/style/image89.jpeg new file mode 100644 index 0000000..92237b8 Binary files /dev/null and b/resources/image/style/image89.jpeg differ diff --git a/resources/image/style/image9.jpeg b/resources/image/style/image9.jpeg new file mode 100644 index 0000000..b38076c Binary files /dev/null and b/resources/image/style/image9.jpeg differ diff --git a/resources/image/style/image90.jpeg b/resources/image/style/image90.jpeg new file mode 100644 index 0000000..56f8770 Binary files /dev/null and b/resources/image/style/image90.jpeg differ diff --git a/resources/image/style/image91.jpeg b/resources/image/style/image91.jpeg new file mode 100644 index 0000000..0c1d88e Binary files /dev/null and b/resources/image/style/image91.jpeg differ diff --git a/resources/image/style/image92.jpeg b/resources/image/style/image92.jpeg new file mode 100644 index 0000000..0924166 Binary files /dev/null and b/resources/image/style/image92.jpeg differ diff --git a/resources/image/style/image93.jpeg b/resources/image/style/image93.jpeg new file mode 100644 index 0000000..8e989d3 Binary files /dev/null and b/resources/image/style/image93.jpeg differ diff --git a/resources/image/style/image94.jpeg b/resources/image/style/image94.jpeg new file mode 100644 index 0000000..e04c8e4 Binary files /dev/null and b/resources/image/style/image94.jpeg differ diff --git a/resources/image/style/image95.jpeg b/resources/image/style/image95.jpeg new file mode 100644 index 0000000..9036e6a Binary files /dev/null and b/resources/image/style/image95.jpeg differ diff --git a/resources/image/style/image96.jpeg b/resources/image/style/image96.jpeg new file mode 100644 index 0000000..b61b054 Binary files /dev/null and b/resources/image/style/image96.jpeg differ diff --git a/resources/image/style/image97.jpeg b/resources/image/style/image97.jpeg new file mode 100644 index 0000000..f91749e Binary files /dev/null and b/resources/image/style/image97.jpeg differ diff --git a/resources/image/style/image98.jpeg b/resources/image/style/image98.jpeg new file mode 100644 index 0000000..03e2752 Binary files /dev/null and b/resources/image/style/image98.jpeg differ diff --git a/resources/image/style/image99.jpeg b/resources/image/style/image99.jpeg new file mode 100644 index 0000000..29b48e7 Binary files /dev/null and b/resources/image/style/image99.jpeg differ diff --git a/resources/image/zhanwei.png b/resources/image/zhanwei.png new file mode 100644 index 0000000..3aec420 Binary files /dev/null and b/resources/image/zhanwei.png differ diff --git a/resources/package/Improve/input/00000-1616097796-(masterpiece, best quality, a young man emperor with a strong and handsome face domineering and majestic long black hair wearing.png b/resources/package/Improve/input/00000-1616097796-(masterpiece, best quality, a young man emperor with a strong and handsome face domineering and majestic long black hair wearing.png new file mode 100644 index 0000000..3f44191 Binary files /dev/null and b/resources/package/Improve/input/00000-1616097796-(masterpiece, best quality, a young man emperor with a strong and handsome face domineering and majestic long black hair wearing.png differ diff --git a/resources/package/Improve/input/00001-1083368712-(masterpiece, best quality, a young man emperor with a strong and handsome face domineering and majestic long black hair wearing.png b/resources/package/Improve/input/00001-1083368712-(masterpiece, best quality, a young man emperor with a strong and handsome face domineering and majestic long black hair wearing.png new file mode 100644 index 0000000..c11e04f Binary files /dev/null and b/resources/package/Improve/input/00001-1083368712-(masterpiece, best quality, a young man emperor with a strong and handsome face domineering and majestic long black hair wearing.png differ diff --git a/resources/package/Improve/input/00002-763798052-(masterpiece, best quality, a group of courtiers in fancy robes faced the young emperor in a chinese-style palace, and the minis.png b/resources/package/Improve/input/00002-763798052-(masterpiece, best quality, a group of courtiers in fancy robes faced the young emperor in a chinese-style palace, and the minis.png new file mode 100644 index 0000000..a907761 Binary files /dev/null and b/resources/package/Improve/input/00002-763798052-(masterpiece, best quality, a group of courtiers in fancy robes faced the young emperor in a chinese-style palace, and the minis.png differ diff --git a/resources/package/Improve/input/00003-2561272579-(masterpiece, best quality,a young face stalwart handsome domineering majestic long black hair wearing a gorgeous robe of a man.png b/resources/package/Improve/input/00003-2561272579-(masterpiece, best quality,a young face stalwart handsome domineering majestic long black hair wearing a gorgeous robe of a man.png new file mode 100644 index 0000000..62d2b5d Binary files /dev/null and b/resources/package/Improve/input/00003-2561272579-(masterpiece, best quality,a young face stalwart handsome domineering majestic long black hair wearing a gorgeous robe of a man.png differ diff --git a/resources/package/Improve/input/00004-1447729042-(masterpiece, best quality, a young face stalwart handsome domineering majestic long black hair wearing gorgeous robes of a man.png b/resources/package/Improve/input/00004-1447729042-(masterpiece, best quality, a young face stalwart handsome domineering majestic long black hair wearing gorgeous robes of a man.png new file mode 100644 index 0000000..4ae8d1a Binary files /dev/null and b/resources/package/Improve/input/00004-1447729042-(masterpiece, best quality, a young face stalwart handsome domineering majestic long black hair wearing gorgeous robes of a man.png differ diff --git a/resources/package/Improve/models/realesr-animevideov3-x2.bin b/resources/package/Improve/models/realesr-animevideov3-x2.bin new file mode 100644 index 0000000..2069105 Binary files /dev/null and b/resources/package/Improve/models/realesr-animevideov3-x2.bin differ diff --git a/resources/package/Improve/models/realesr-animevideov3-x2.param b/resources/package/Improve/models/realesr-animevideov3-x2.param new file mode 100644 index 0000000..42e7748 --- /dev/null +++ b/resources/package/Improve/models/realesr-animevideov3-x2.param @@ -0,0 +1,43 @@ +7767517 +41 42 +Input input.1 0 1 data +Split splitncnn_input0 1 2 data input.1_splitncnn_0 input.1_splitncnn_1 +Convolution Conv_0 1 1 input.1_splitncnn_1 54 0=64 1=3 4=1 5=1 6=1728 +PReLU PRelu_1 1 1 54 56 0=64 +Convolution Conv_2 1 1 56 57 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_3 1 1 57 59 0=64 +Convolution Conv_4 1 1 59 60 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_5 1 1 60 62 0=64 +Convolution Conv_6 1 1 62 63 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_7 1 1 63 65 0=64 +Convolution Conv_8 1 1 65 66 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_9 1 1 66 68 0=64 +Convolution Conv_10 1 1 68 69 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_11 1 1 69 71 0=64 +Convolution Conv_12 1 1 71 72 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_13 1 1 72 74 0=64 +Convolution Conv_14 1 1 74 75 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_15 1 1 75 77 0=64 +Convolution Conv_16 1 1 77 78 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_17 1 1 78 80 0=64 +Convolution Conv_18 1 1 80 81 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_19 1 1 81 83 0=64 +Convolution Conv_20 1 1 83 84 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_21 1 1 84 86 0=64 +Convolution Conv_22 1 1 86 87 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_23 1 1 87 89 0=64 +Convolution Conv_24 1 1 89 90 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_25 1 1 90 92 0=64 +Convolution Conv_26 1 1 92 93 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_27 1 1 93 95 0=64 +Convolution Conv_28 1 1 95 96 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_29 1 1 96 98 0=64 +Convolution Conv_30 1 1 98 99 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_31 1 1 99 101 0=64 +Convolution Conv_32 1 1 101 102 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_33 1 1 102 104 0=64 +Convolution Conv_34 1 1 104 105 0=48 1=3 4=1 5=1 6=27648 +PixelShuffle DepthToSpace_35 1 1 105 106 0=4 +Interp Resize_37 1 1 input.1_splitncnn_0 111 0=1 1=4.000000e+00 2=4.000000e+00 +BinaryOp Add_38 2 1 106 111 112 +Interp Resize_40 1 1 112 output 0=3 1=5.000000e-01 2=5.000000e-01 diff --git a/resources/package/Improve/models/realesr-animevideov3-x3.bin b/resources/package/Improve/models/realesr-animevideov3-x3.bin new file mode 100644 index 0000000..2069105 Binary files /dev/null and b/resources/package/Improve/models/realesr-animevideov3-x3.bin differ diff --git a/resources/package/Improve/models/realesr-animevideov3-x3.param b/resources/package/Improve/models/realesr-animevideov3-x3.param new file mode 100644 index 0000000..bf47185 --- /dev/null +++ b/resources/package/Improve/models/realesr-animevideov3-x3.param @@ -0,0 +1,43 @@ +7767517 +41 42 +Input input.1 0 1 data +Split splitncnn_input0 1 2 data input.1_splitncnn_0 input.1_splitncnn_1 +Convolution Conv_0 1 1 input.1_splitncnn_1 54 0=64 1=3 4=1 5=1 6=1728 +PReLU PRelu_1 1 1 54 56 0=64 +Convolution Conv_2 1 1 56 57 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_3 1 1 57 59 0=64 +Convolution Conv_4 1 1 59 60 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_5 1 1 60 62 0=64 +Convolution Conv_6 1 1 62 63 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_7 1 1 63 65 0=64 +Convolution Conv_8 1 1 65 66 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_9 1 1 66 68 0=64 +Convolution Conv_10 1 1 68 69 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_11 1 1 69 71 0=64 +Convolution Conv_12 1 1 71 72 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_13 1 1 72 74 0=64 +Convolution Conv_14 1 1 74 75 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_15 1 1 75 77 0=64 +Convolution Conv_16 1 1 77 78 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_17 1 1 78 80 0=64 +Convolution Conv_18 1 1 80 81 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_19 1 1 81 83 0=64 +Convolution Conv_20 1 1 83 84 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_21 1 1 84 86 0=64 +Convolution Conv_22 1 1 86 87 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_23 1 1 87 89 0=64 +Convolution Conv_24 1 1 89 90 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_25 1 1 90 92 0=64 +Convolution Conv_26 1 1 92 93 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_27 1 1 93 95 0=64 +Convolution Conv_28 1 1 95 96 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_29 1 1 96 98 0=64 +Convolution Conv_30 1 1 98 99 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_31 1 1 99 101 0=64 +Convolution Conv_32 1 1 101 102 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_33 1 1 102 104 0=64 +Convolution Conv_34 1 1 104 105 0=48 1=3 4=1 5=1 6=27648 +PixelShuffle DepthToSpace_35 1 1 105 106 0=4 +Interp Resize_37 1 1 input.1_splitncnn_0 111 0=1 1=4.000000e+00 2=4.000000e+00 +BinaryOp Add_38 2 1 106 111 112 +Interp Resize_40 1 1 112 output 0=3 1=7.500000e-01 2=7.500000e-01 diff --git a/resources/package/Improve/models/realesr-animevideov3-x4.bin b/resources/package/Improve/models/realesr-animevideov3-x4.bin new file mode 100644 index 0000000..2069105 Binary files /dev/null and b/resources/package/Improve/models/realesr-animevideov3-x4.bin differ diff --git a/resources/package/Improve/models/realesr-animevideov3-x4.param b/resources/package/Improve/models/realesr-animevideov3-x4.param new file mode 100644 index 0000000..5b922cc --- /dev/null +++ b/resources/package/Improve/models/realesr-animevideov3-x4.param @@ -0,0 +1,42 @@ +7767517 +40 41 +Input input.1 0 1 data +Split splitncnn_input0 1 2 data input.1_splitncnn_0 input.1_splitncnn_1 +Convolution Conv_0 1 1 input.1_splitncnn_1 54 0=64 1=3 4=1 5=1 6=1728 +PReLU PRelu_1 1 1 54 56 0=64 +Convolution Conv_2 1 1 56 57 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_3 1 1 57 59 0=64 +Convolution Conv_4 1 1 59 60 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_5 1 1 60 62 0=64 +Convolution Conv_6 1 1 62 63 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_7 1 1 63 65 0=64 +Convolution Conv_8 1 1 65 66 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_9 1 1 66 68 0=64 +Convolution Conv_10 1 1 68 69 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_11 1 1 69 71 0=64 +Convolution Conv_12 1 1 71 72 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_13 1 1 72 74 0=64 +Convolution Conv_14 1 1 74 75 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_15 1 1 75 77 0=64 +Convolution Conv_16 1 1 77 78 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_17 1 1 78 80 0=64 +Convolution Conv_18 1 1 80 81 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_19 1 1 81 83 0=64 +Convolution Conv_20 1 1 83 84 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_21 1 1 84 86 0=64 +Convolution Conv_22 1 1 86 87 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_23 1 1 87 89 0=64 +Convolution Conv_24 1 1 89 90 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_25 1 1 90 92 0=64 +Convolution Conv_26 1 1 92 93 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_27 1 1 93 95 0=64 +Convolution Conv_28 1 1 95 96 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_29 1 1 96 98 0=64 +Convolution Conv_30 1 1 98 99 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_31 1 1 99 101 0=64 +Convolution Conv_32 1 1 101 102 0=64 1=3 4=1 5=1 6=36864 +PReLU PRelu_33 1 1 102 104 0=64 +Convolution Conv_34 1 1 104 105 0=48 1=3 4=1 5=1 6=27648 +PixelShuffle DepthToSpace_35 1 1 105 106 0=4 +Interp Resize_37 1 1 input.1_splitncnn_0 111 0=1 1=4.000000e+00 2=4.000000e+00 +BinaryOp Add_38 2 1 106 111 output diff --git a/resources/package/Improve/models/realesrgan-x4plus-anime.bin b/resources/package/Improve/models/realesrgan-x4plus-anime.bin new file mode 100644 index 0000000..95201b7 Binary files /dev/null and b/resources/package/Improve/models/realesrgan-x4plus-anime.bin differ diff --git a/resources/package/Improve/models/realesrgan-x4plus-anime.param b/resources/package/Improve/models/realesrgan-x4plus-anime.param new file mode 100644 index 0000000..6c98f9a --- /dev/null +++ b/resources/package/Improve/models/realesrgan-x4plus-anime.param @@ -0,0 +1,270 @@ +7767517 +268 473 +Input input.1 0 1 data +Convolution Conv_0 1 1 data 193 0=64 1=3 4=1 5=1 6=1728 +Split splitncnn_0 1 8 193 193_splitncnn_0 193_splitncnn_1 193_splitncnn_2 193_splitncnn_3 193_splitncnn_4 193_splitncnn_5 193_splitncnn_6 193_splitncnn_7 +Convolution Conv_1 1 1 193_splitncnn_7 195 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_1 1 4 195 195_splitncnn_0 195_splitncnn_1 195_splitncnn_2 195_splitncnn_3 +Concat Concat_3 2 1 193_splitncnn_6 195_splitncnn_3 196 +Convolution Conv_4 1 1 196 198 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_2 1 3 198 198_splitncnn_0 198_splitncnn_1 198_splitncnn_2 +Concat Concat_6 3 1 193_splitncnn_5 195_splitncnn_2 198_splitncnn_2 199 +Convolution Conv_7 1 1 199 201 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_3 1 2 201 201_splitncnn_0 201_splitncnn_1 +Concat Concat_9 4 1 193_splitncnn_4 195_splitncnn_1 198_splitncnn_1 201_splitncnn_1 202 +Convolution Conv_10 1 1 202 204 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_12 5 1 193_splitncnn_3 195_splitncnn_0 198_splitncnn_0 201_splitncnn_0 204 205 +Convolution Conv_13 1 1 205 206 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_16 2 1 206 193_splitncnn_2 209 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_4 1 6 209 209_splitncnn_0 209_splitncnn_1 209_splitncnn_2 209_splitncnn_3 209_splitncnn_4 209_splitncnn_5 +Convolution Conv_17 1 1 209_splitncnn_5 211 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_5 1 4 211 211_splitncnn_0 211_splitncnn_1 211_splitncnn_2 211_splitncnn_3 +Concat Concat_19 2 1 209_splitncnn_4 211_splitncnn_3 212 +Convolution Conv_20 1 1 212 214 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_6 1 3 214 214_splitncnn_0 214_splitncnn_1 214_splitncnn_2 +Concat Concat_22 3 1 209_splitncnn_3 211_splitncnn_2 214_splitncnn_2 215 +Convolution Conv_23 1 1 215 217 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_7 1 2 217 217_splitncnn_0 217_splitncnn_1 +Concat Concat_25 4 1 209_splitncnn_2 211_splitncnn_1 214_splitncnn_1 217_splitncnn_1 218 +Convolution Conv_26 1 1 218 220 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_28 5 1 209_splitncnn_1 211_splitncnn_0 214_splitncnn_0 217_splitncnn_0 220 221 +Convolution Conv_29 1 1 221 222 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_32 2 1 222 209_splitncnn_0 225 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_8 1 6 225 225_splitncnn_0 225_splitncnn_1 225_splitncnn_2 225_splitncnn_3 225_splitncnn_4 225_splitncnn_5 +Convolution Conv_33 1 1 225_splitncnn_5 227 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_9 1 4 227 227_splitncnn_0 227_splitncnn_1 227_splitncnn_2 227_splitncnn_3 +Concat Concat_35 2 1 225_splitncnn_4 227_splitncnn_3 228 +Convolution Conv_36 1 1 228 230 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_10 1 3 230 230_splitncnn_0 230_splitncnn_1 230_splitncnn_2 +Concat Concat_38 3 1 225_splitncnn_3 227_splitncnn_2 230_splitncnn_2 231 +Convolution Conv_39 1 1 231 233 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_11 1 2 233 233_splitncnn_0 233_splitncnn_1 +Concat Concat_41 4 1 225_splitncnn_2 227_splitncnn_1 230_splitncnn_1 233_splitncnn_1 234 +Convolution Conv_42 1 1 234 236 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_44 5 1 225_splitncnn_1 227_splitncnn_0 230_splitncnn_0 233_splitncnn_0 236 237 +Convolution Conv_45 1 1 237 238 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_48 2 1 238 225_splitncnn_0 241 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_51 2 1 241 193_splitncnn_1 244 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_12 1 7 244 244_splitncnn_0 244_splitncnn_1 244_splitncnn_2 244_splitncnn_3 244_splitncnn_4 244_splitncnn_5 244_splitncnn_6 +Convolution Conv_52 1 1 244_splitncnn_6 246 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_13 1 4 246 246_splitncnn_0 246_splitncnn_1 246_splitncnn_2 246_splitncnn_3 +Concat Concat_54 2 1 244_splitncnn_5 246_splitncnn_3 247 +Convolution Conv_55 1 1 247 249 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_14 1 3 249 249_splitncnn_0 249_splitncnn_1 249_splitncnn_2 +Concat Concat_57 3 1 244_splitncnn_4 246_splitncnn_2 249_splitncnn_2 250 +Convolution Conv_58 1 1 250 252 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_15 1 2 252 252_splitncnn_0 252_splitncnn_1 +Concat Concat_60 4 1 244_splitncnn_3 246_splitncnn_1 249_splitncnn_1 252_splitncnn_1 253 +Convolution Conv_61 1 1 253 255 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_63 5 1 244_splitncnn_2 246_splitncnn_0 249_splitncnn_0 252_splitncnn_0 255 256 +Convolution Conv_64 1 1 256 257 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_67 2 1 257 244_splitncnn_1 260 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_16 1 6 260 260_splitncnn_0 260_splitncnn_1 260_splitncnn_2 260_splitncnn_3 260_splitncnn_4 260_splitncnn_5 +Convolution Conv_68 1 1 260_splitncnn_5 262 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_17 1 4 262 262_splitncnn_0 262_splitncnn_1 262_splitncnn_2 262_splitncnn_3 +Concat Concat_70 2 1 260_splitncnn_4 262_splitncnn_3 263 +Convolution Conv_71 1 1 263 265 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_18 1 3 265 265_splitncnn_0 265_splitncnn_1 265_splitncnn_2 +Concat Concat_73 3 1 260_splitncnn_3 262_splitncnn_2 265_splitncnn_2 266 +Convolution Conv_74 1 1 266 268 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_19 1 2 268 268_splitncnn_0 268_splitncnn_1 +Concat Concat_76 4 1 260_splitncnn_2 262_splitncnn_1 265_splitncnn_1 268_splitncnn_1 269 +Convolution Conv_77 1 1 269 271 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_79 5 1 260_splitncnn_1 262_splitncnn_0 265_splitncnn_0 268_splitncnn_0 271 272 +Convolution Conv_80 1 1 272 273 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_83 2 1 273 260_splitncnn_0 276 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_20 1 6 276 276_splitncnn_0 276_splitncnn_1 276_splitncnn_2 276_splitncnn_3 276_splitncnn_4 276_splitncnn_5 +Convolution Conv_84 1 1 276_splitncnn_5 278 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_21 1 4 278 278_splitncnn_0 278_splitncnn_1 278_splitncnn_2 278_splitncnn_3 +Concat Concat_86 2 1 276_splitncnn_4 278_splitncnn_3 279 +Convolution Conv_87 1 1 279 281 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_22 1 3 281 281_splitncnn_0 281_splitncnn_1 281_splitncnn_2 +Concat Concat_89 3 1 276_splitncnn_3 278_splitncnn_2 281_splitncnn_2 282 +Convolution Conv_90 1 1 282 284 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_23 1 2 284 284_splitncnn_0 284_splitncnn_1 +Concat Concat_92 4 1 276_splitncnn_2 278_splitncnn_1 281_splitncnn_1 284_splitncnn_1 285 +Convolution Conv_93 1 1 285 287 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_95 5 1 276_splitncnn_1 278_splitncnn_0 281_splitncnn_0 284_splitncnn_0 287 288 +Convolution Conv_96 1 1 288 289 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_99 2 1 289 276_splitncnn_0 292 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_102 2 1 292 244_splitncnn_0 295 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_24 1 7 295 295_splitncnn_0 295_splitncnn_1 295_splitncnn_2 295_splitncnn_3 295_splitncnn_4 295_splitncnn_5 295_splitncnn_6 +Convolution Conv_103 1 1 295_splitncnn_6 297 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_25 1 4 297 297_splitncnn_0 297_splitncnn_1 297_splitncnn_2 297_splitncnn_3 +Concat Concat_105 2 1 295_splitncnn_5 297_splitncnn_3 298 +Convolution Conv_106 1 1 298 300 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_26 1 3 300 300_splitncnn_0 300_splitncnn_1 300_splitncnn_2 +Concat Concat_108 3 1 295_splitncnn_4 297_splitncnn_2 300_splitncnn_2 301 +Convolution Conv_109 1 1 301 303 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_27 1 2 303 303_splitncnn_0 303_splitncnn_1 +Concat Concat_111 4 1 295_splitncnn_3 297_splitncnn_1 300_splitncnn_1 303_splitncnn_1 304 +Convolution Conv_112 1 1 304 306 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_114 5 1 295_splitncnn_2 297_splitncnn_0 300_splitncnn_0 303_splitncnn_0 306 307 +Convolution Conv_115 1 1 307 308 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_118 2 1 308 295_splitncnn_1 311 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_28 1 6 311 311_splitncnn_0 311_splitncnn_1 311_splitncnn_2 311_splitncnn_3 311_splitncnn_4 311_splitncnn_5 +Convolution Conv_119 1 1 311_splitncnn_5 313 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_29 1 4 313 313_splitncnn_0 313_splitncnn_1 313_splitncnn_2 313_splitncnn_3 +Concat Concat_121 2 1 311_splitncnn_4 313_splitncnn_3 314 +Convolution Conv_122 1 1 314 316 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_30 1 3 316 316_splitncnn_0 316_splitncnn_1 316_splitncnn_2 +Concat Concat_124 3 1 311_splitncnn_3 313_splitncnn_2 316_splitncnn_2 317 +Convolution Conv_125 1 1 317 319 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_31 1 2 319 319_splitncnn_0 319_splitncnn_1 +Concat Concat_127 4 1 311_splitncnn_2 313_splitncnn_1 316_splitncnn_1 319_splitncnn_1 320 +Convolution Conv_128 1 1 320 322 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_130 5 1 311_splitncnn_1 313_splitncnn_0 316_splitncnn_0 319_splitncnn_0 322 323 +Convolution Conv_131 1 1 323 324 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_134 2 1 324 311_splitncnn_0 327 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_32 1 6 327 327_splitncnn_0 327_splitncnn_1 327_splitncnn_2 327_splitncnn_3 327_splitncnn_4 327_splitncnn_5 +Convolution Conv_135 1 1 327_splitncnn_5 329 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_33 1 4 329 329_splitncnn_0 329_splitncnn_1 329_splitncnn_2 329_splitncnn_3 +Concat Concat_137 2 1 327_splitncnn_4 329_splitncnn_3 330 +Convolution Conv_138 1 1 330 332 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_34 1 3 332 332_splitncnn_0 332_splitncnn_1 332_splitncnn_2 +Concat Concat_140 3 1 327_splitncnn_3 329_splitncnn_2 332_splitncnn_2 333 +Convolution Conv_141 1 1 333 335 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_35 1 2 335 335_splitncnn_0 335_splitncnn_1 +Concat Concat_143 4 1 327_splitncnn_2 329_splitncnn_1 332_splitncnn_1 335_splitncnn_1 336 +Convolution Conv_144 1 1 336 338 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_146 5 1 327_splitncnn_1 329_splitncnn_0 332_splitncnn_0 335_splitncnn_0 338 339 +Convolution Conv_147 1 1 339 340 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_150 2 1 340 327_splitncnn_0 343 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_153 2 1 343 295_splitncnn_0 346 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_36 1 7 346 346_splitncnn_0 346_splitncnn_1 346_splitncnn_2 346_splitncnn_3 346_splitncnn_4 346_splitncnn_5 346_splitncnn_6 +Convolution Conv_154 1 1 346_splitncnn_6 348 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_37 1 4 348 348_splitncnn_0 348_splitncnn_1 348_splitncnn_2 348_splitncnn_3 +Concat Concat_156 2 1 346_splitncnn_5 348_splitncnn_3 349 +Convolution Conv_157 1 1 349 351 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_38 1 3 351 351_splitncnn_0 351_splitncnn_1 351_splitncnn_2 +Concat Concat_159 3 1 346_splitncnn_4 348_splitncnn_2 351_splitncnn_2 352 +Convolution Conv_160 1 1 352 354 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_39 1 2 354 354_splitncnn_0 354_splitncnn_1 +Concat Concat_162 4 1 346_splitncnn_3 348_splitncnn_1 351_splitncnn_1 354_splitncnn_1 355 +Convolution Conv_163 1 1 355 357 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_165 5 1 346_splitncnn_2 348_splitncnn_0 351_splitncnn_0 354_splitncnn_0 357 358 +Convolution Conv_166 1 1 358 359 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_169 2 1 359 346_splitncnn_1 362 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_40 1 6 362 362_splitncnn_0 362_splitncnn_1 362_splitncnn_2 362_splitncnn_3 362_splitncnn_4 362_splitncnn_5 +Convolution Conv_170 1 1 362_splitncnn_5 364 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_41 1 4 364 364_splitncnn_0 364_splitncnn_1 364_splitncnn_2 364_splitncnn_3 +Concat Concat_172 2 1 362_splitncnn_4 364_splitncnn_3 365 +Convolution Conv_173 1 1 365 367 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_42 1 3 367 367_splitncnn_0 367_splitncnn_1 367_splitncnn_2 +Concat Concat_175 3 1 362_splitncnn_3 364_splitncnn_2 367_splitncnn_2 368 +Convolution Conv_176 1 1 368 370 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_43 1 2 370 370_splitncnn_0 370_splitncnn_1 +Concat Concat_178 4 1 362_splitncnn_2 364_splitncnn_1 367_splitncnn_1 370_splitncnn_1 371 +Convolution Conv_179 1 1 371 373 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_181 5 1 362_splitncnn_1 364_splitncnn_0 367_splitncnn_0 370_splitncnn_0 373 374 +Convolution Conv_182 1 1 374 375 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_185 2 1 375 362_splitncnn_0 378 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_44 1 6 378 378_splitncnn_0 378_splitncnn_1 378_splitncnn_2 378_splitncnn_3 378_splitncnn_4 378_splitncnn_5 +Convolution Conv_186 1 1 378_splitncnn_5 380 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_45 1 4 380 380_splitncnn_0 380_splitncnn_1 380_splitncnn_2 380_splitncnn_3 +Concat Concat_188 2 1 378_splitncnn_4 380_splitncnn_3 381 +Convolution Conv_189 1 1 381 383 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_46 1 3 383 383_splitncnn_0 383_splitncnn_1 383_splitncnn_2 +Concat Concat_191 3 1 378_splitncnn_3 380_splitncnn_2 383_splitncnn_2 384 +Convolution Conv_192 1 1 384 386 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_47 1 2 386 386_splitncnn_0 386_splitncnn_1 +Concat Concat_194 4 1 378_splitncnn_2 380_splitncnn_1 383_splitncnn_1 386_splitncnn_1 387 +Convolution Conv_195 1 1 387 389 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_197 5 1 378_splitncnn_1 380_splitncnn_0 383_splitncnn_0 386_splitncnn_0 389 390 +Convolution Conv_198 1 1 390 391 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_201 2 1 391 378_splitncnn_0 394 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_204 2 1 394 346_splitncnn_0 397 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_48 1 7 397 397_splitncnn_0 397_splitncnn_1 397_splitncnn_2 397_splitncnn_3 397_splitncnn_4 397_splitncnn_5 397_splitncnn_6 +Convolution Conv_205 1 1 397_splitncnn_6 399 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_49 1 4 399 399_splitncnn_0 399_splitncnn_1 399_splitncnn_2 399_splitncnn_3 +Concat Concat_207 2 1 397_splitncnn_5 399_splitncnn_3 400 +Convolution Conv_208 1 1 400 402 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_50 1 3 402 402_splitncnn_0 402_splitncnn_1 402_splitncnn_2 +Concat Concat_210 3 1 397_splitncnn_4 399_splitncnn_2 402_splitncnn_2 403 +Convolution Conv_211 1 1 403 405 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_51 1 2 405 405_splitncnn_0 405_splitncnn_1 +Concat Concat_213 4 1 397_splitncnn_3 399_splitncnn_1 402_splitncnn_1 405_splitncnn_1 406 +Convolution Conv_214 1 1 406 408 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_216 5 1 397_splitncnn_2 399_splitncnn_0 402_splitncnn_0 405_splitncnn_0 408 409 +Convolution Conv_217 1 1 409 410 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_220 2 1 410 397_splitncnn_1 413 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_52 1 6 413 413_splitncnn_0 413_splitncnn_1 413_splitncnn_2 413_splitncnn_3 413_splitncnn_4 413_splitncnn_5 +Convolution Conv_221 1 1 413_splitncnn_5 415 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_53 1 4 415 415_splitncnn_0 415_splitncnn_1 415_splitncnn_2 415_splitncnn_3 +Concat Concat_223 2 1 413_splitncnn_4 415_splitncnn_3 416 +Convolution Conv_224 1 1 416 418 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_54 1 3 418 418_splitncnn_0 418_splitncnn_1 418_splitncnn_2 +Concat Concat_226 3 1 413_splitncnn_3 415_splitncnn_2 418_splitncnn_2 419 +Convolution Conv_227 1 1 419 421 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_55 1 2 421 421_splitncnn_0 421_splitncnn_1 +Concat Concat_229 4 1 413_splitncnn_2 415_splitncnn_1 418_splitncnn_1 421_splitncnn_1 422 +Convolution Conv_230 1 1 422 424 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_232 5 1 413_splitncnn_1 415_splitncnn_0 418_splitncnn_0 421_splitncnn_0 424 425 +Convolution Conv_233 1 1 425 426 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_236 2 1 426 413_splitncnn_0 429 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_56 1 6 429 429_splitncnn_0 429_splitncnn_1 429_splitncnn_2 429_splitncnn_3 429_splitncnn_4 429_splitncnn_5 +Convolution Conv_237 1 1 429_splitncnn_5 431 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_57 1 4 431 431_splitncnn_0 431_splitncnn_1 431_splitncnn_2 431_splitncnn_3 +Concat Concat_239 2 1 429_splitncnn_4 431_splitncnn_3 432 +Convolution Conv_240 1 1 432 434 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_58 1 3 434 434_splitncnn_0 434_splitncnn_1 434_splitncnn_2 +Concat Concat_242 3 1 429_splitncnn_3 431_splitncnn_2 434_splitncnn_2 435 +Convolution Conv_243 1 1 435 437 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_59 1 2 437 437_splitncnn_0 437_splitncnn_1 +Concat Concat_245 4 1 429_splitncnn_2 431_splitncnn_1 434_splitncnn_1 437_splitncnn_1 438 +Convolution Conv_246 1 1 438 440 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_248 5 1 429_splitncnn_1 431_splitncnn_0 434_splitncnn_0 437_splitncnn_0 440 441 +Convolution Conv_249 1 1 441 442 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_252 2 1 442 429_splitncnn_0 445 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_255 2 1 445 397_splitncnn_0 448 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_60 1 7 448 448_splitncnn_0 448_splitncnn_1 448_splitncnn_2 448_splitncnn_3 448_splitncnn_4 448_splitncnn_5 448_splitncnn_6 +Convolution Conv_256 1 1 448_splitncnn_6 450 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_61 1 4 450 450_splitncnn_0 450_splitncnn_1 450_splitncnn_2 450_splitncnn_3 +Concat Concat_258 2 1 448_splitncnn_5 450_splitncnn_3 451 +Convolution Conv_259 1 1 451 453 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_62 1 3 453 453_splitncnn_0 453_splitncnn_1 453_splitncnn_2 +Concat Concat_261 3 1 448_splitncnn_4 450_splitncnn_2 453_splitncnn_2 454 +Convolution Conv_262 1 1 454 456 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_63 1 2 456 456_splitncnn_0 456_splitncnn_1 +Concat Concat_264 4 1 448_splitncnn_3 450_splitncnn_1 453_splitncnn_1 456_splitncnn_1 457 +Convolution Conv_265 1 1 457 459 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_267 5 1 448_splitncnn_2 450_splitncnn_0 453_splitncnn_0 456_splitncnn_0 459 460 +Convolution Conv_268 1 1 460 461 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_271 2 1 461 448_splitncnn_1 464 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_64 1 6 464 464_splitncnn_0 464_splitncnn_1 464_splitncnn_2 464_splitncnn_3 464_splitncnn_4 464_splitncnn_5 +Convolution Conv_272 1 1 464_splitncnn_5 466 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_65 1 4 466 466_splitncnn_0 466_splitncnn_1 466_splitncnn_2 466_splitncnn_3 +Concat Concat_274 2 1 464_splitncnn_4 466_splitncnn_3 467 +Convolution Conv_275 1 1 467 469 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_66 1 3 469 469_splitncnn_0 469_splitncnn_1 469_splitncnn_2 +Concat Concat_277 3 1 464_splitncnn_3 466_splitncnn_2 469_splitncnn_2 470 +Convolution Conv_278 1 1 470 472 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_67 1 2 472 472_splitncnn_0 472_splitncnn_1 +Concat Concat_280 4 1 464_splitncnn_2 466_splitncnn_1 469_splitncnn_1 472_splitncnn_1 473 +Convolution Conv_281 1 1 473 475 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_283 5 1 464_splitncnn_1 466_splitncnn_0 469_splitncnn_0 472_splitncnn_0 475 476 +Convolution Conv_284 1 1 476 477 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_287 2 1 477 464_splitncnn_0 480 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_68 1 6 480 480_splitncnn_0 480_splitncnn_1 480_splitncnn_2 480_splitncnn_3 480_splitncnn_4 480_splitncnn_5 +Convolution Conv_288 1 1 480_splitncnn_5 482 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_69 1 4 482 482_splitncnn_0 482_splitncnn_1 482_splitncnn_2 482_splitncnn_3 +Concat Concat_290 2 1 480_splitncnn_4 482_splitncnn_3 483 +Convolution Conv_291 1 1 483 485 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_70 1 3 485 485_splitncnn_0 485_splitncnn_1 485_splitncnn_2 +Concat Concat_293 3 1 480_splitncnn_3 482_splitncnn_2 485_splitncnn_2 486 +Convolution Conv_294 1 1 486 488 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_71 1 2 488 488_splitncnn_0 488_splitncnn_1 +Concat Concat_296 4 1 480_splitncnn_2 482_splitncnn_1 485_splitncnn_1 488_splitncnn_1 489 +Convolution Conv_297 1 1 489 491 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_299 5 1 480_splitncnn_1 482_splitncnn_0 485_splitncnn_0 488_splitncnn_0 491 492 +Convolution Conv_300 1 1 492 493 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_303 2 1 493 480_splitncnn_0 496 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_306 2 1 496 448_splitncnn_0 499 0=1 -23301=2,2.000000e-01,1.000000e+00 +Convolution Conv_307 1 1 499 500 0=64 1=3 4=1 5=1 6=36864 +BinaryOp Add_308 2 1 193_splitncnn_0 500 501 +Interp Resize_310 1 1 501 506 0=1 1=2.000000e+00 2=2.000000e+00 +Convolution Conv_311 1 1 506 508 0=64 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Interp Resize_314 1 1 508 513 0=1 1=2.000000e+00 2=2.000000e+00 +Convolution Conv_315 1 1 513 515 0=64 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Convolution Conv_317 1 1 515 517 0=64 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Convolution Conv_319 1 1 517 output 0=3 1=3 4=1 5=1 6=1728 diff --git a/resources/package/Improve/models/realesrgan-x4plus.bin b/resources/package/Improve/models/realesrgan-x4plus.bin new file mode 100644 index 0000000..5cea947 Binary files /dev/null and b/resources/package/Improve/models/realesrgan-x4plus.bin differ diff --git a/resources/package/Improve/models/realesrgan-x4plus.param b/resources/package/Improve/models/realesrgan-x4plus.param new file mode 100644 index 0000000..d14d62e --- /dev/null +++ b/resources/package/Improve/models/realesrgan-x4plus.param @@ -0,0 +1,1001 @@ +7767517 +999 1782 +Input input.1 0 1 data +Convolution Conv_0 1 1 data 703 0=64 1=3 4=1 5=1 6=1728 +Split splitncnn_0 1 8 703 703_splitncnn_0 703_splitncnn_1 703_splitncnn_2 703_splitncnn_3 703_splitncnn_4 703_splitncnn_5 703_splitncnn_6 703_splitncnn_7 +Convolution Conv_1 1 1 703_splitncnn_7 705 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_1 1 4 705 705_splitncnn_0 705_splitncnn_1 705_splitncnn_2 705_splitncnn_3 +Concat Concat_3 2 1 703_splitncnn_6 705_splitncnn_3 706 +Convolution Conv_4 1 1 706 708 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_2 1 3 708 708_splitncnn_0 708_splitncnn_1 708_splitncnn_2 +Concat Concat_6 3 1 703_splitncnn_5 705_splitncnn_2 708_splitncnn_2 709 +Convolution Conv_7 1 1 709 711 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_3 1 2 711 711_splitncnn_0 711_splitncnn_1 +Concat Concat_9 4 1 703_splitncnn_4 705_splitncnn_1 708_splitncnn_1 711_splitncnn_1 712 +Convolution Conv_10 1 1 712 714 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_12 5 1 703_splitncnn_3 705_splitncnn_0 708_splitncnn_0 711_splitncnn_0 714 715 +Convolution Conv_13 1 1 715 716 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_16 2 1 716 703_splitncnn_2 719 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_4 1 6 719 719_splitncnn_0 719_splitncnn_1 719_splitncnn_2 719_splitncnn_3 719_splitncnn_4 719_splitncnn_5 +Convolution Conv_17 1 1 719_splitncnn_5 721 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_5 1 4 721 721_splitncnn_0 721_splitncnn_1 721_splitncnn_2 721_splitncnn_3 +Concat Concat_19 2 1 719_splitncnn_4 721_splitncnn_3 722 +Convolution Conv_20 1 1 722 724 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_6 1 3 724 724_splitncnn_0 724_splitncnn_1 724_splitncnn_2 +Concat Concat_22 3 1 719_splitncnn_3 721_splitncnn_2 724_splitncnn_2 725 +Convolution Conv_23 1 1 725 727 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_7 1 2 727 727_splitncnn_0 727_splitncnn_1 +Concat Concat_25 4 1 719_splitncnn_2 721_splitncnn_1 724_splitncnn_1 727_splitncnn_1 728 +Convolution Conv_26 1 1 728 730 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_28 5 1 719_splitncnn_1 721_splitncnn_0 724_splitncnn_0 727_splitncnn_0 730 731 +Convolution Conv_29 1 1 731 732 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_32 2 1 732 719_splitncnn_0 735 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_8 1 6 735 735_splitncnn_0 735_splitncnn_1 735_splitncnn_2 735_splitncnn_3 735_splitncnn_4 735_splitncnn_5 +Convolution Conv_33 1 1 735_splitncnn_5 737 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_9 1 4 737 737_splitncnn_0 737_splitncnn_1 737_splitncnn_2 737_splitncnn_3 +Concat Concat_35 2 1 735_splitncnn_4 737_splitncnn_3 738 +Convolution Conv_36 1 1 738 740 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_10 1 3 740 740_splitncnn_0 740_splitncnn_1 740_splitncnn_2 +Concat Concat_38 3 1 735_splitncnn_3 737_splitncnn_2 740_splitncnn_2 741 +Convolution Conv_39 1 1 741 743 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_11 1 2 743 743_splitncnn_0 743_splitncnn_1 +Concat Concat_41 4 1 735_splitncnn_2 737_splitncnn_1 740_splitncnn_1 743_splitncnn_1 744 +Convolution Conv_42 1 1 744 746 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_44 5 1 735_splitncnn_1 737_splitncnn_0 740_splitncnn_0 743_splitncnn_0 746 747 +Convolution Conv_45 1 1 747 748 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_48 2 1 748 735_splitncnn_0 751 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_51 2 1 751 703_splitncnn_1 754 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_12 1 7 754 754_splitncnn_0 754_splitncnn_1 754_splitncnn_2 754_splitncnn_3 754_splitncnn_4 754_splitncnn_5 754_splitncnn_6 +Convolution Conv_52 1 1 754_splitncnn_6 756 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_13 1 4 756 756_splitncnn_0 756_splitncnn_1 756_splitncnn_2 756_splitncnn_3 +Concat Concat_54 2 1 754_splitncnn_5 756_splitncnn_3 757 +Convolution Conv_55 1 1 757 759 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_14 1 3 759 759_splitncnn_0 759_splitncnn_1 759_splitncnn_2 +Concat Concat_57 3 1 754_splitncnn_4 756_splitncnn_2 759_splitncnn_2 760 +Convolution Conv_58 1 1 760 762 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_15 1 2 762 762_splitncnn_0 762_splitncnn_1 +Concat Concat_60 4 1 754_splitncnn_3 756_splitncnn_1 759_splitncnn_1 762_splitncnn_1 763 +Convolution Conv_61 1 1 763 765 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_63 5 1 754_splitncnn_2 756_splitncnn_0 759_splitncnn_0 762_splitncnn_0 765 766 +Convolution Conv_64 1 1 766 767 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_67 2 1 767 754_splitncnn_1 770 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_16 1 6 770 770_splitncnn_0 770_splitncnn_1 770_splitncnn_2 770_splitncnn_3 770_splitncnn_4 770_splitncnn_5 +Convolution Conv_68 1 1 770_splitncnn_5 772 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_17 1 4 772 772_splitncnn_0 772_splitncnn_1 772_splitncnn_2 772_splitncnn_3 +Concat Concat_70 2 1 770_splitncnn_4 772_splitncnn_3 773 +Convolution Conv_71 1 1 773 775 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_18 1 3 775 775_splitncnn_0 775_splitncnn_1 775_splitncnn_2 +Concat Concat_73 3 1 770_splitncnn_3 772_splitncnn_2 775_splitncnn_2 776 +Convolution Conv_74 1 1 776 778 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_19 1 2 778 778_splitncnn_0 778_splitncnn_1 +Concat Concat_76 4 1 770_splitncnn_2 772_splitncnn_1 775_splitncnn_1 778_splitncnn_1 779 +Convolution Conv_77 1 1 779 781 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_79 5 1 770_splitncnn_1 772_splitncnn_0 775_splitncnn_0 778_splitncnn_0 781 782 +Convolution Conv_80 1 1 782 783 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_83 2 1 783 770_splitncnn_0 786 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_20 1 6 786 786_splitncnn_0 786_splitncnn_1 786_splitncnn_2 786_splitncnn_3 786_splitncnn_4 786_splitncnn_5 +Convolution Conv_84 1 1 786_splitncnn_5 788 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_21 1 4 788 788_splitncnn_0 788_splitncnn_1 788_splitncnn_2 788_splitncnn_3 +Concat Concat_86 2 1 786_splitncnn_4 788_splitncnn_3 789 +Convolution Conv_87 1 1 789 791 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_22 1 3 791 791_splitncnn_0 791_splitncnn_1 791_splitncnn_2 +Concat Concat_89 3 1 786_splitncnn_3 788_splitncnn_2 791_splitncnn_2 792 +Convolution Conv_90 1 1 792 794 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_23 1 2 794 794_splitncnn_0 794_splitncnn_1 +Concat Concat_92 4 1 786_splitncnn_2 788_splitncnn_1 791_splitncnn_1 794_splitncnn_1 795 +Convolution Conv_93 1 1 795 797 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_95 5 1 786_splitncnn_1 788_splitncnn_0 791_splitncnn_0 794_splitncnn_0 797 798 +Convolution Conv_96 1 1 798 799 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_99 2 1 799 786_splitncnn_0 802 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_102 2 1 802 754_splitncnn_0 805 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_24 1 7 805 805_splitncnn_0 805_splitncnn_1 805_splitncnn_2 805_splitncnn_3 805_splitncnn_4 805_splitncnn_5 805_splitncnn_6 +Convolution Conv_103 1 1 805_splitncnn_6 807 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_25 1 4 807 807_splitncnn_0 807_splitncnn_1 807_splitncnn_2 807_splitncnn_3 +Concat Concat_105 2 1 805_splitncnn_5 807_splitncnn_3 808 +Convolution Conv_106 1 1 808 810 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_26 1 3 810 810_splitncnn_0 810_splitncnn_1 810_splitncnn_2 +Concat Concat_108 3 1 805_splitncnn_4 807_splitncnn_2 810_splitncnn_2 811 +Convolution Conv_109 1 1 811 813 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_27 1 2 813 813_splitncnn_0 813_splitncnn_1 +Concat Concat_111 4 1 805_splitncnn_3 807_splitncnn_1 810_splitncnn_1 813_splitncnn_1 814 +Convolution Conv_112 1 1 814 816 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_114 5 1 805_splitncnn_2 807_splitncnn_0 810_splitncnn_0 813_splitncnn_0 816 817 +Convolution Conv_115 1 1 817 818 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_118 2 1 818 805_splitncnn_1 821 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_28 1 6 821 821_splitncnn_0 821_splitncnn_1 821_splitncnn_2 821_splitncnn_3 821_splitncnn_4 821_splitncnn_5 +Convolution Conv_119 1 1 821_splitncnn_5 823 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_29 1 4 823 823_splitncnn_0 823_splitncnn_1 823_splitncnn_2 823_splitncnn_3 +Concat Concat_121 2 1 821_splitncnn_4 823_splitncnn_3 824 +Convolution Conv_122 1 1 824 826 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_30 1 3 826 826_splitncnn_0 826_splitncnn_1 826_splitncnn_2 +Concat Concat_124 3 1 821_splitncnn_3 823_splitncnn_2 826_splitncnn_2 827 +Convolution Conv_125 1 1 827 829 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_31 1 2 829 829_splitncnn_0 829_splitncnn_1 +Concat Concat_127 4 1 821_splitncnn_2 823_splitncnn_1 826_splitncnn_1 829_splitncnn_1 830 +Convolution Conv_128 1 1 830 832 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_130 5 1 821_splitncnn_1 823_splitncnn_0 826_splitncnn_0 829_splitncnn_0 832 833 +Convolution Conv_131 1 1 833 834 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_134 2 1 834 821_splitncnn_0 837 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_32 1 6 837 837_splitncnn_0 837_splitncnn_1 837_splitncnn_2 837_splitncnn_3 837_splitncnn_4 837_splitncnn_5 +Convolution Conv_135 1 1 837_splitncnn_5 839 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_33 1 4 839 839_splitncnn_0 839_splitncnn_1 839_splitncnn_2 839_splitncnn_3 +Concat Concat_137 2 1 837_splitncnn_4 839_splitncnn_3 840 +Convolution Conv_138 1 1 840 842 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_34 1 3 842 842_splitncnn_0 842_splitncnn_1 842_splitncnn_2 +Concat Concat_140 3 1 837_splitncnn_3 839_splitncnn_2 842_splitncnn_2 843 +Convolution Conv_141 1 1 843 845 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_35 1 2 845 845_splitncnn_0 845_splitncnn_1 +Concat Concat_143 4 1 837_splitncnn_2 839_splitncnn_1 842_splitncnn_1 845_splitncnn_1 846 +Convolution Conv_144 1 1 846 848 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_146 5 1 837_splitncnn_1 839_splitncnn_0 842_splitncnn_0 845_splitncnn_0 848 849 +Convolution Conv_147 1 1 849 850 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_150 2 1 850 837_splitncnn_0 853 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_153 2 1 853 805_splitncnn_0 856 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_36 1 7 856 856_splitncnn_0 856_splitncnn_1 856_splitncnn_2 856_splitncnn_3 856_splitncnn_4 856_splitncnn_5 856_splitncnn_6 +Convolution Conv_154 1 1 856_splitncnn_6 858 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_37 1 4 858 858_splitncnn_0 858_splitncnn_1 858_splitncnn_2 858_splitncnn_3 +Concat Concat_156 2 1 856_splitncnn_5 858_splitncnn_3 859 +Convolution Conv_157 1 1 859 861 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_38 1 3 861 861_splitncnn_0 861_splitncnn_1 861_splitncnn_2 +Concat Concat_159 3 1 856_splitncnn_4 858_splitncnn_2 861_splitncnn_2 862 +Convolution Conv_160 1 1 862 864 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_39 1 2 864 864_splitncnn_0 864_splitncnn_1 +Concat Concat_162 4 1 856_splitncnn_3 858_splitncnn_1 861_splitncnn_1 864_splitncnn_1 865 +Convolution Conv_163 1 1 865 867 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_165 5 1 856_splitncnn_2 858_splitncnn_0 861_splitncnn_0 864_splitncnn_0 867 868 +Convolution Conv_166 1 1 868 869 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_169 2 1 869 856_splitncnn_1 872 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_40 1 6 872 872_splitncnn_0 872_splitncnn_1 872_splitncnn_2 872_splitncnn_3 872_splitncnn_4 872_splitncnn_5 +Convolution Conv_170 1 1 872_splitncnn_5 874 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_41 1 4 874 874_splitncnn_0 874_splitncnn_1 874_splitncnn_2 874_splitncnn_3 +Concat Concat_172 2 1 872_splitncnn_4 874_splitncnn_3 875 +Convolution Conv_173 1 1 875 877 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_42 1 3 877 877_splitncnn_0 877_splitncnn_1 877_splitncnn_2 +Concat Concat_175 3 1 872_splitncnn_3 874_splitncnn_2 877_splitncnn_2 878 +Convolution Conv_176 1 1 878 880 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_43 1 2 880 880_splitncnn_0 880_splitncnn_1 +Concat Concat_178 4 1 872_splitncnn_2 874_splitncnn_1 877_splitncnn_1 880_splitncnn_1 881 +Convolution Conv_179 1 1 881 883 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_181 5 1 872_splitncnn_1 874_splitncnn_0 877_splitncnn_0 880_splitncnn_0 883 884 +Convolution Conv_182 1 1 884 885 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_185 2 1 885 872_splitncnn_0 888 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_44 1 6 888 888_splitncnn_0 888_splitncnn_1 888_splitncnn_2 888_splitncnn_3 888_splitncnn_4 888_splitncnn_5 +Convolution Conv_186 1 1 888_splitncnn_5 890 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_45 1 4 890 890_splitncnn_0 890_splitncnn_1 890_splitncnn_2 890_splitncnn_3 +Concat Concat_188 2 1 888_splitncnn_4 890_splitncnn_3 891 +Convolution Conv_189 1 1 891 893 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_46 1 3 893 893_splitncnn_0 893_splitncnn_1 893_splitncnn_2 +Concat Concat_191 3 1 888_splitncnn_3 890_splitncnn_2 893_splitncnn_2 894 +Convolution Conv_192 1 1 894 896 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_47 1 2 896 896_splitncnn_0 896_splitncnn_1 +Concat Concat_194 4 1 888_splitncnn_2 890_splitncnn_1 893_splitncnn_1 896_splitncnn_1 897 +Convolution Conv_195 1 1 897 899 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_197 5 1 888_splitncnn_1 890_splitncnn_0 893_splitncnn_0 896_splitncnn_0 899 900 +Convolution Conv_198 1 1 900 901 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_201 2 1 901 888_splitncnn_0 904 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_204 2 1 904 856_splitncnn_0 907 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_48 1 7 907 907_splitncnn_0 907_splitncnn_1 907_splitncnn_2 907_splitncnn_3 907_splitncnn_4 907_splitncnn_5 907_splitncnn_6 +Convolution Conv_205 1 1 907_splitncnn_6 909 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_49 1 4 909 909_splitncnn_0 909_splitncnn_1 909_splitncnn_2 909_splitncnn_3 +Concat Concat_207 2 1 907_splitncnn_5 909_splitncnn_3 910 +Convolution Conv_208 1 1 910 912 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_50 1 3 912 912_splitncnn_0 912_splitncnn_1 912_splitncnn_2 +Concat Concat_210 3 1 907_splitncnn_4 909_splitncnn_2 912_splitncnn_2 913 +Convolution Conv_211 1 1 913 915 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_51 1 2 915 915_splitncnn_0 915_splitncnn_1 +Concat Concat_213 4 1 907_splitncnn_3 909_splitncnn_1 912_splitncnn_1 915_splitncnn_1 916 +Convolution Conv_214 1 1 916 918 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_216 5 1 907_splitncnn_2 909_splitncnn_0 912_splitncnn_0 915_splitncnn_0 918 919 +Convolution Conv_217 1 1 919 920 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_220 2 1 920 907_splitncnn_1 923 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_52 1 6 923 923_splitncnn_0 923_splitncnn_1 923_splitncnn_2 923_splitncnn_3 923_splitncnn_4 923_splitncnn_5 +Convolution Conv_221 1 1 923_splitncnn_5 925 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_53 1 4 925 925_splitncnn_0 925_splitncnn_1 925_splitncnn_2 925_splitncnn_3 +Concat Concat_223 2 1 923_splitncnn_4 925_splitncnn_3 926 +Convolution Conv_224 1 1 926 928 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_54 1 3 928 928_splitncnn_0 928_splitncnn_1 928_splitncnn_2 +Concat Concat_226 3 1 923_splitncnn_3 925_splitncnn_2 928_splitncnn_2 929 +Convolution Conv_227 1 1 929 931 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_55 1 2 931 931_splitncnn_0 931_splitncnn_1 +Concat Concat_229 4 1 923_splitncnn_2 925_splitncnn_1 928_splitncnn_1 931_splitncnn_1 932 +Convolution Conv_230 1 1 932 934 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_232 5 1 923_splitncnn_1 925_splitncnn_0 928_splitncnn_0 931_splitncnn_0 934 935 +Convolution Conv_233 1 1 935 936 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_236 2 1 936 923_splitncnn_0 939 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_56 1 6 939 939_splitncnn_0 939_splitncnn_1 939_splitncnn_2 939_splitncnn_3 939_splitncnn_4 939_splitncnn_5 +Convolution Conv_237 1 1 939_splitncnn_5 941 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_57 1 4 941 941_splitncnn_0 941_splitncnn_1 941_splitncnn_2 941_splitncnn_3 +Concat Concat_239 2 1 939_splitncnn_4 941_splitncnn_3 942 +Convolution Conv_240 1 1 942 944 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_58 1 3 944 944_splitncnn_0 944_splitncnn_1 944_splitncnn_2 +Concat Concat_242 3 1 939_splitncnn_3 941_splitncnn_2 944_splitncnn_2 945 +Convolution Conv_243 1 1 945 947 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_59 1 2 947 947_splitncnn_0 947_splitncnn_1 +Concat Concat_245 4 1 939_splitncnn_2 941_splitncnn_1 944_splitncnn_1 947_splitncnn_1 948 +Convolution Conv_246 1 1 948 950 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_248 5 1 939_splitncnn_1 941_splitncnn_0 944_splitncnn_0 947_splitncnn_0 950 951 +Convolution Conv_249 1 1 951 952 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_252 2 1 952 939_splitncnn_0 955 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_255 2 1 955 907_splitncnn_0 958 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_60 1 7 958 958_splitncnn_0 958_splitncnn_1 958_splitncnn_2 958_splitncnn_3 958_splitncnn_4 958_splitncnn_5 958_splitncnn_6 +Convolution Conv_256 1 1 958_splitncnn_6 960 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_61 1 4 960 960_splitncnn_0 960_splitncnn_1 960_splitncnn_2 960_splitncnn_3 +Concat Concat_258 2 1 958_splitncnn_5 960_splitncnn_3 961 +Convolution Conv_259 1 1 961 963 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_62 1 3 963 963_splitncnn_0 963_splitncnn_1 963_splitncnn_2 +Concat Concat_261 3 1 958_splitncnn_4 960_splitncnn_2 963_splitncnn_2 964 +Convolution Conv_262 1 1 964 966 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_63 1 2 966 966_splitncnn_0 966_splitncnn_1 +Concat Concat_264 4 1 958_splitncnn_3 960_splitncnn_1 963_splitncnn_1 966_splitncnn_1 967 +Convolution Conv_265 1 1 967 969 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_267 5 1 958_splitncnn_2 960_splitncnn_0 963_splitncnn_0 966_splitncnn_0 969 970 +Convolution Conv_268 1 1 970 971 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_271 2 1 971 958_splitncnn_1 974 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_64 1 6 974 974_splitncnn_0 974_splitncnn_1 974_splitncnn_2 974_splitncnn_3 974_splitncnn_4 974_splitncnn_5 +Convolution Conv_272 1 1 974_splitncnn_5 976 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_65 1 4 976 976_splitncnn_0 976_splitncnn_1 976_splitncnn_2 976_splitncnn_3 +Concat Concat_274 2 1 974_splitncnn_4 976_splitncnn_3 977 +Convolution Conv_275 1 1 977 979 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_66 1 3 979 979_splitncnn_0 979_splitncnn_1 979_splitncnn_2 +Concat Concat_277 3 1 974_splitncnn_3 976_splitncnn_2 979_splitncnn_2 980 +Convolution Conv_278 1 1 980 982 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_67 1 2 982 982_splitncnn_0 982_splitncnn_1 +Concat Concat_280 4 1 974_splitncnn_2 976_splitncnn_1 979_splitncnn_1 982_splitncnn_1 983 +Convolution Conv_281 1 1 983 985 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_283 5 1 974_splitncnn_1 976_splitncnn_0 979_splitncnn_0 982_splitncnn_0 985 986 +Convolution Conv_284 1 1 986 987 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_287 2 1 987 974_splitncnn_0 990 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_68 1 6 990 990_splitncnn_0 990_splitncnn_1 990_splitncnn_2 990_splitncnn_3 990_splitncnn_4 990_splitncnn_5 +Convolution Conv_288 1 1 990_splitncnn_5 992 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_69 1 4 992 992_splitncnn_0 992_splitncnn_1 992_splitncnn_2 992_splitncnn_3 +Concat Concat_290 2 1 990_splitncnn_4 992_splitncnn_3 993 +Convolution Conv_291 1 1 993 995 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_70 1 3 995 995_splitncnn_0 995_splitncnn_1 995_splitncnn_2 +Concat Concat_293 3 1 990_splitncnn_3 992_splitncnn_2 995_splitncnn_2 996 +Convolution Conv_294 1 1 996 998 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_71 1 2 998 998_splitncnn_0 998_splitncnn_1 +Concat Concat_296 4 1 990_splitncnn_2 992_splitncnn_1 995_splitncnn_1 998_splitncnn_1 999 +Convolution Conv_297 1 1 999 1001 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_299 5 1 990_splitncnn_1 992_splitncnn_0 995_splitncnn_0 998_splitncnn_0 1001 1002 +Convolution Conv_300 1 1 1002 1003 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_303 2 1 1003 990_splitncnn_0 1006 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_306 2 1 1006 958_splitncnn_0 1009 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_72 1 7 1009 1009_splitncnn_0 1009_splitncnn_1 1009_splitncnn_2 1009_splitncnn_3 1009_splitncnn_4 1009_splitncnn_5 1009_splitncnn_6 +Convolution Conv_307 1 1 1009_splitncnn_6 1011 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_73 1 4 1011 1011_splitncnn_0 1011_splitncnn_1 1011_splitncnn_2 1011_splitncnn_3 +Concat Concat_309 2 1 1009_splitncnn_5 1011_splitncnn_3 1012 +Convolution Conv_310 1 1 1012 1014 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_74 1 3 1014 1014_splitncnn_0 1014_splitncnn_1 1014_splitncnn_2 +Concat Concat_312 3 1 1009_splitncnn_4 1011_splitncnn_2 1014_splitncnn_2 1015 +Convolution Conv_313 1 1 1015 1017 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_75 1 2 1017 1017_splitncnn_0 1017_splitncnn_1 +Concat Concat_315 4 1 1009_splitncnn_3 1011_splitncnn_1 1014_splitncnn_1 1017_splitncnn_1 1018 +Convolution Conv_316 1 1 1018 1020 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_318 5 1 1009_splitncnn_2 1011_splitncnn_0 1014_splitncnn_0 1017_splitncnn_0 1020 1021 +Convolution Conv_319 1 1 1021 1022 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_322 2 1 1022 1009_splitncnn_1 1025 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_76 1 6 1025 1025_splitncnn_0 1025_splitncnn_1 1025_splitncnn_2 1025_splitncnn_3 1025_splitncnn_4 1025_splitncnn_5 +Convolution Conv_323 1 1 1025_splitncnn_5 1027 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_77 1 4 1027 1027_splitncnn_0 1027_splitncnn_1 1027_splitncnn_2 1027_splitncnn_3 +Concat Concat_325 2 1 1025_splitncnn_4 1027_splitncnn_3 1028 +Convolution Conv_326 1 1 1028 1030 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_78 1 3 1030 1030_splitncnn_0 1030_splitncnn_1 1030_splitncnn_2 +Concat Concat_328 3 1 1025_splitncnn_3 1027_splitncnn_2 1030_splitncnn_2 1031 +Convolution Conv_329 1 1 1031 1033 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_79 1 2 1033 1033_splitncnn_0 1033_splitncnn_1 +Concat Concat_331 4 1 1025_splitncnn_2 1027_splitncnn_1 1030_splitncnn_1 1033_splitncnn_1 1034 +Convolution Conv_332 1 1 1034 1036 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_334 5 1 1025_splitncnn_1 1027_splitncnn_0 1030_splitncnn_0 1033_splitncnn_0 1036 1037 +Convolution Conv_335 1 1 1037 1038 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_338 2 1 1038 1025_splitncnn_0 1041 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_80 1 6 1041 1041_splitncnn_0 1041_splitncnn_1 1041_splitncnn_2 1041_splitncnn_3 1041_splitncnn_4 1041_splitncnn_5 +Convolution Conv_339 1 1 1041_splitncnn_5 1043 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_81 1 4 1043 1043_splitncnn_0 1043_splitncnn_1 1043_splitncnn_2 1043_splitncnn_3 +Concat Concat_341 2 1 1041_splitncnn_4 1043_splitncnn_3 1044 +Convolution Conv_342 1 1 1044 1046 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_82 1 3 1046 1046_splitncnn_0 1046_splitncnn_1 1046_splitncnn_2 +Concat Concat_344 3 1 1041_splitncnn_3 1043_splitncnn_2 1046_splitncnn_2 1047 +Convolution Conv_345 1 1 1047 1049 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_83 1 2 1049 1049_splitncnn_0 1049_splitncnn_1 +Concat Concat_347 4 1 1041_splitncnn_2 1043_splitncnn_1 1046_splitncnn_1 1049_splitncnn_1 1050 +Convolution Conv_348 1 1 1050 1052 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_350 5 1 1041_splitncnn_1 1043_splitncnn_0 1046_splitncnn_0 1049_splitncnn_0 1052 1053 +Convolution Conv_351 1 1 1053 1054 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_354 2 1 1054 1041_splitncnn_0 1057 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_357 2 1 1057 1009_splitncnn_0 1060 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_84 1 7 1060 1060_splitncnn_0 1060_splitncnn_1 1060_splitncnn_2 1060_splitncnn_3 1060_splitncnn_4 1060_splitncnn_5 1060_splitncnn_6 +Convolution Conv_358 1 1 1060_splitncnn_6 1062 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_85 1 4 1062 1062_splitncnn_0 1062_splitncnn_1 1062_splitncnn_2 1062_splitncnn_3 +Concat Concat_360 2 1 1060_splitncnn_5 1062_splitncnn_3 1063 +Convolution Conv_361 1 1 1063 1065 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_86 1 3 1065 1065_splitncnn_0 1065_splitncnn_1 1065_splitncnn_2 +Concat Concat_363 3 1 1060_splitncnn_4 1062_splitncnn_2 1065_splitncnn_2 1066 +Convolution Conv_364 1 1 1066 1068 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_87 1 2 1068 1068_splitncnn_0 1068_splitncnn_1 +Concat Concat_366 4 1 1060_splitncnn_3 1062_splitncnn_1 1065_splitncnn_1 1068_splitncnn_1 1069 +Convolution Conv_367 1 1 1069 1071 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_369 5 1 1060_splitncnn_2 1062_splitncnn_0 1065_splitncnn_0 1068_splitncnn_0 1071 1072 +Convolution Conv_370 1 1 1072 1073 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_373 2 1 1073 1060_splitncnn_1 1076 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_88 1 6 1076 1076_splitncnn_0 1076_splitncnn_1 1076_splitncnn_2 1076_splitncnn_3 1076_splitncnn_4 1076_splitncnn_5 +Convolution Conv_374 1 1 1076_splitncnn_5 1078 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_89 1 4 1078 1078_splitncnn_0 1078_splitncnn_1 1078_splitncnn_2 1078_splitncnn_3 +Concat Concat_376 2 1 1076_splitncnn_4 1078_splitncnn_3 1079 +Convolution Conv_377 1 1 1079 1081 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_90 1 3 1081 1081_splitncnn_0 1081_splitncnn_1 1081_splitncnn_2 +Concat Concat_379 3 1 1076_splitncnn_3 1078_splitncnn_2 1081_splitncnn_2 1082 +Convolution Conv_380 1 1 1082 1084 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_91 1 2 1084 1084_splitncnn_0 1084_splitncnn_1 +Concat Concat_382 4 1 1076_splitncnn_2 1078_splitncnn_1 1081_splitncnn_1 1084_splitncnn_1 1085 +Convolution Conv_383 1 1 1085 1087 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_385 5 1 1076_splitncnn_1 1078_splitncnn_0 1081_splitncnn_0 1084_splitncnn_0 1087 1088 +Convolution Conv_386 1 1 1088 1089 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_389 2 1 1089 1076_splitncnn_0 1092 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_92 1 6 1092 1092_splitncnn_0 1092_splitncnn_1 1092_splitncnn_2 1092_splitncnn_3 1092_splitncnn_4 1092_splitncnn_5 +Convolution Conv_390 1 1 1092_splitncnn_5 1094 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_93 1 4 1094 1094_splitncnn_0 1094_splitncnn_1 1094_splitncnn_2 1094_splitncnn_3 +Concat Concat_392 2 1 1092_splitncnn_4 1094_splitncnn_3 1095 +Convolution Conv_393 1 1 1095 1097 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_94 1 3 1097 1097_splitncnn_0 1097_splitncnn_1 1097_splitncnn_2 +Concat Concat_395 3 1 1092_splitncnn_3 1094_splitncnn_2 1097_splitncnn_2 1098 +Convolution Conv_396 1 1 1098 1100 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_95 1 2 1100 1100_splitncnn_0 1100_splitncnn_1 +Concat Concat_398 4 1 1092_splitncnn_2 1094_splitncnn_1 1097_splitncnn_1 1100_splitncnn_1 1101 +Convolution Conv_399 1 1 1101 1103 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_401 5 1 1092_splitncnn_1 1094_splitncnn_0 1097_splitncnn_0 1100_splitncnn_0 1103 1104 +Convolution Conv_402 1 1 1104 1105 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_405 2 1 1105 1092_splitncnn_0 1108 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_408 2 1 1108 1060_splitncnn_0 1111 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_96 1 7 1111 1111_splitncnn_0 1111_splitncnn_1 1111_splitncnn_2 1111_splitncnn_3 1111_splitncnn_4 1111_splitncnn_5 1111_splitncnn_6 +Convolution Conv_409 1 1 1111_splitncnn_6 1113 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_97 1 4 1113 1113_splitncnn_0 1113_splitncnn_1 1113_splitncnn_2 1113_splitncnn_3 +Concat Concat_411 2 1 1111_splitncnn_5 1113_splitncnn_3 1114 +Convolution Conv_412 1 1 1114 1116 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_98 1 3 1116 1116_splitncnn_0 1116_splitncnn_1 1116_splitncnn_2 +Concat Concat_414 3 1 1111_splitncnn_4 1113_splitncnn_2 1116_splitncnn_2 1117 +Convolution Conv_415 1 1 1117 1119 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_99 1 2 1119 1119_splitncnn_0 1119_splitncnn_1 +Concat Concat_417 4 1 1111_splitncnn_3 1113_splitncnn_1 1116_splitncnn_1 1119_splitncnn_1 1120 +Convolution Conv_418 1 1 1120 1122 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_420 5 1 1111_splitncnn_2 1113_splitncnn_0 1116_splitncnn_0 1119_splitncnn_0 1122 1123 +Convolution Conv_421 1 1 1123 1124 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_424 2 1 1124 1111_splitncnn_1 1127 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_100 1 6 1127 1127_splitncnn_0 1127_splitncnn_1 1127_splitncnn_2 1127_splitncnn_3 1127_splitncnn_4 1127_splitncnn_5 +Convolution Conv_425 1 1 1127_splitncnn_5 1129 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_101 1 4 1129 1129_splitncnn_0 1129_splitncnn_1 1129_splitncnn_2 1129_splitncnn_3 +Concat Concat_427 2 1 1127_splitncnn_4 1129_splitncnn_3 1130 +Convolution Conv_428 1 1 1130 1132 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_102 1 3 1132 1132_splitncnn_0 1132_splitncnn_1 1132_splitncnn_2 +Concat Concat_430 3 1 1127_splitncnn_3 1129_splitncnn_2 1132_splitncnn_2 1133 +Convolution Conv_431 1 1 1133 1135 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_103 1 2 1135 1135_splitncnn_0 1135_splitncnn_1 +Concat Concat_433 4 1 1127_splitncnn_2 1129_splitncnn_1 1132_splitncnn_1 1135_splitncnn_1 1136 +Convolution Conv_434 1 1 1136 1138 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_436 5 1 1127_splitncnn_1 1129_splitncnn_0 1132_splitncnn_0 1135_splitncnn_0 1138 1139 +Convolution Conv_437 1 1 1139 1140 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_440 2 1 1140 1127_splitncnn_0 1143 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_104 1 6 1143 1143_splitncnn_0 1143_splitncnn_1 1143_splitncnn_2 1143_splitncnn_3 1143_splitncnn_4 1143_splitncnn_5 +Convolution Conv_441 1 1 1143_splitncnn_5 1145 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_105 1 4 1145 1145_splitncnn_0 1145_splitncnn_1 1145_splitncnn_2 1145_splitncnn_3 +Concat Concat_443 2 1 1143_splitncnn_4 1145_splitncnn_3 1146 +Convolution Conv_444 1 1 1146 1148 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_106 1 3 1148 1148_splitncnn_0 1148_splitncnn_1 1148_splitncnn_2 +Concat Concat_446 3 1 1143_splitncnn_3 1145_splitncnn_2 1148_splitncnn_2 1149 +Convolution Conv_447 1 1 1149 1151 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_107 1 2 1151 1151_splitncnn_0 1151_splitncnn_1 +Concat Concat_449 4 1 1143_splitncnn_2 1145_splitncnn_1 1148_splitncnn_1 1151_splitncnn_1 1152 +Convolution Conv_450 1 1 1152 1154 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_452 5 1 1143_splitncnn_1 1145_splitncnn_0 1148_splitncnn_0 1151_splitncnn_0 1154 1155 +Convolution Conv_453 1 1 1155 1156 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_456 2 1 1156 1143_splitncnn_0 1159 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_459 2 1 1159 1111_splitncnn_0 1162 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_108 1 7 1162 1162_splitncnn_0 1162_splitncnn_1 1162_splitncnn_2 1162_splitncnn_3 1162_splitncnn_4 1162_splitncnn_5 1162_splitncnn_6 +Convolution Conv_460 1 1 1162_splitncnn_6 1164 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_109 1 4 1164 1164_splitncnn_0 1164_splitncnn_1 1164_splitncnn_2 1164_splitncnn_3 +Concat Concat_462 2 1 1162_splitncnn_5 1164_splitncnn_3 1165 +Convolution Conv_463 1 1 1165 1167 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_110 1 3 1167 1167_splitncnn_0 1167_splitncnn_1 1167_splitncnn_2 +Concat Concat_465 3 1 1162_splitncnn_4 1164_splitncnn_2 1167_splitncnn_2 1168 +Convolution Conv_466 1 1 1168 1170 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_111 1 2 1170 1170_splitncnn_0 1170_splitncnn_1 +Concat Concat_468 4 1 1162_splitncnn_3 1164_splitncnn_1 1167_splitncnn_1 1170_splitncnn_1 1171 +Convolution Conv_469 1 1 1171 1173 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_471 5 1 1162_splitncnn_2 1164_splitncnn_0 1167_splitncnn_0 1170_splitncnn_0 1173 1174 +Convolution Conv_472 1 1 1174 1175 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_475 2 1 1175 1162_splitncnn_1 1178 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_112 1 6 1178 1178_splitncnn_0 1178_splitncnn_1 1178_splitncnn_2 1178_splitncnn_3 1178_splitncnn_4 1178_splitncnn_5 +Convolution Conv_476 1 1 1178_splitncnn_5 1180 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_113 1 4 1180 1180_splitncnn_0 1180_splitncnn_1 1180_splitncnn_2 1180_splitncnn_3 +Concat Concat_478 2 1 1178_splitncnn_4 1180_splitncnn_3 1181 +Convolution Conv_479 1 1 1181 1183 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_114 1 3 1183 1183_splitncnn_0 1183_splitncnn_1 1183_splitncnn_2 +Concat Concat_481 3 1 1178_splitncnn_3 1180_splitncnn_2 1183_splitncnn_2 1184 +Convolution Conv_482 1 1 1184 1186 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_115 1 2 1186 1186_splitncnn_0 1186_splitncnn_1 +Concat Concat_484 4 1 1178_splitncnn_2 1180_splitncnn_1 1183_splitncnn_1 1186_splitncnn_1 1187 +Convolution Conv_485 1 1 1187 1189 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_487 5 1 1178_splitncnn_1 1180_splitncnn_0 1183_splitncnn_0 1186_splitncnn_0 1189 1190 +Convolution Conv_488 1 1 1190 1191 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_491 2 1 1191 1178_splitncnn_0 1194 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_116 1 6 1194 1194_splitncnn_0 1194_splitncnn_1 1194_splitncnn_2 1194_splitncnn_3 1194_splitncnn_4 1194_splitncnn_5 +Convolution Conv_492 1 1 1194_splitncnn_5 1196 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_117 1 4 1196 1196_splitncnn_0 1196_splitncnn_1 1196_splitncnn_2 1196_splitncnn_3 +Concat Concat_494 2 1 1194_splitncnn_4 1196_splitncnn_3 1197 +Convolution Conv_495 1 1 1197 1199 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_118 1 3 1199 1199_splitncnn_0 1199_splitncnn_1 1199_splitncnn_2 +Concat Concat_497 3 1 1194_splitncnn_3 1196_splitncnn_2 1199_splitncnn_2 1200 +Convolution Conv_498 1 1 1200 1202 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_119 1 2 1202 1202_splitncnn_0 1202_splitncnn_1 +Concat Concat_500 4 1 1194_splitncnn_2 1196_splitncnn_1 1199_splitncnn_1 1202_splitncnn_1 1203 +Convolution Conv_501 1 1 1203 1205 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_503 5 1 1194_splitncnn_1 1196_splitncnn_0 1199_splitncnn_0 1202_splitncnn_0 1205 1206 +Convolution Conv_504 1 1 1206 1207 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_507 2 1 1207 1194_splitncnn_0 1210 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_510 2 1 1210 1162_splitncnn_0 1213 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_120 1 7 1213 1213_splitncnn_0 1213_splitncnn_1 1213_splitncnn_2 1213_splitncnn_3 1213_splitncnn_4 1213_splitncnn_5 1213_splitncnn_6 +Convolution Conv_511 1 1 1213_splitncnn_6 1215 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_121 1 4 1215 1215_splitncnn_0 1215_splitncnn_1 1215_splitncnn_2 1215_splitncnn_3 +Concat Concat_513 2 1 1213_splitncnn_5 1215_splitncnn_3 1216 +Convolution Conv_514 1 1 1216 1218 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_122 1 3 1218 1218_splitncnn_0 1218_splitncnn_1 1218_splitncnn_2 +Concat Concat_516 3 1 1213_splitncnn_4 1215_splitncnn_2 1218_splitncnn_2 1219 +Convolution Conv_517 1 1 1219 1221 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_123 1 2 1221 1221_splitncnn_0 1221_splitncnn_1 +Concat Concat_519 4 1 1213_splitncnn_3 1215_splitncnn_1 1218_splitncnn_1 1221_splitncnn_1 1222 +Convolution Conv_520 1 1 1222 1224 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_522 5 1 1213_splitncnn_2 1215_splitncnn_0 1218_splitncnn_0 1221_splitncnn_0 1224 1225 +Convolution Conv_523 1 1 1225 1226 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_526 2 1 1226 1213_splitncnn_1 1229 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_124 1 6 1229 1229_splitncnn_0 1229_splitncnn_1 1229_splitncnn_2 1229_splitncnn_3 1229_splitncnn_4 1229_splitncnn_5 +Convolution Conv_527 1 1 1229_splitncnn_5 1231 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_125 1 4 1231 1231_splitncnn_0 1231_splitncnn_1 1231_splitncnn_2 1231_splitncnn_3 +Concat Concat_529 2 1 1229_splitncnn_4 1231_splitncnn_3 1232 +Convolution Conv_530 1 1 1232 1234 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_126 1 3 1234 1234_splitncnn_0 1234_splitncnn_1 1234_splitncnn_2 +Concat Concat_532 3 1 1229_splitncnn_3 1231_splitncnn_2 1234_splitncnn_2 1235 +Convolution Conv_533 1 1 1235 1237 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_127 1 2 1237 1237_splitncnn_0 1237_splitncnn_1 +Concat Concat_535 4 1 1229_splitncnn_2 1231_splitncnn_1 1234_splitncnn_1 1237_splitncnn_1 1238 +Convolution Conv_536 1 1 1238 1240 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_538 5 1 1229_splitncnn_1 1231_splitncnn_0 1234_splitncnn_0 1237_splitncnn_0 1240 1241 +Convolution Conv_539 1 1 1241 1242 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_542 2 1 1242 1229_splitncnn_0 1245 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_128 1 6 1245 1245_splitncnn_0 1245_splitncnn_1 1245_splitncnn_2 1245_splitncnn_3 1245_splitncnn_4 1245_splitncnn_5 +Convolution Conv_543 1 1 1245_splitncnn_5 1247 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_129 1 4 1247 1247_splitncnn_0 1247_splitncnn_1 1247_splitncnn_2 1247_splitncnn_3 +Concat Concat_545 2 1 1245_splitncnn_4 1247_splitncnn_3 1248 +Convolution Conv_546 1 1 1248 1250 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_130 1 3 1250 1250_splitncnn_0 1250_splitncnn_1 1250_splitncnn_2 +Concat Concat_548 3 1 1245_splitncnn_3 1247_splitncnn_2 1250_splitncnn_2 1251 +Convolution Conv_549 1 1 1251 1253 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_131 1 2 1253 1253_splitncnn_0 1253_splitncnn_1 +Concat Concat_551 4 1 1245_splitncnn_2 1247_splitncnn_1 1250_splitncnn_1 1253_splitncnn_1 1254 +Convolution Conv_552 1 1 1254 1256 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_554 5 1 1245_splitncnn_1 1247_splitncnn_0 1250_splitncnn_0 1253_splitncnn_0 1256 1257 +Convolution Conv_555 1 1 1257 1258 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_558 2 1 1258 1245_splitncnn_0 1261 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_561 2 1 1261 1213_splitncnn_0 1264 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_132 1 7 1264 1264_splitncnn_0 1264_splitncnn_1 1264_splitncnn_2 1264_splitncnn_3 1264_splitncnn_4 1264_splitncnn_5 1264_splitncnn_6 +Convolution Conv_562 1 1 1264_splitncnn_6 1266 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_133 1 4 1266 1266_splitncnn_0 1266_splitncnn_1 1266_splitncnn_2 1266_splitncnn_3 +Concat Concat_564 2 1 1264_splitncnn_5 1266_splitncnn_3 1267 +Convolution Conv_565 1 1 1267 1269 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_134 1 3 1269 1269_splitncnn_0 1269_splitncnn_1 1269_splitncnn_2 +Concat Concat_567 3 1 1264_splitncnn_4 1266_splitncnn_2 1269_splitncnn_2 1270 +Convolution Conv_568 1 1 1270 1272 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_135 1 2 1272 1272_splitncnn_0 1272_splitncnn_1 +Concat Concat_570 4 1 1264_splitncnn_3 1266_splitncnn_1 1269_splitncnn_1 1272_splitncnn_1 1273 +Convolution Conv_571 1 1 1273 1275 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_573 5 1 1264_splitncnn_2 1266_splitncnn_0 1269_splitncnn_0 1272_splitncnn_0 1275 1276 +Convolution Conv_574 1 1 1276 1277 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_577 2 1 1277 1264_splitncnn_1 1280 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_136 1 6 1280 1280_splitncnn_0 1280_splitncnn_1 1280_splitncnn_2 1280_splitncnn_3 1280_splitncnn_4 1280_splitncnn_5 +Convolution Conv_578 1 1 1280_splitncnn_5 1282 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_137 1 4 1282 1282_splitncnn_0 1282_splitncnn_1 1282_splitncnn_2 1282_splitncnn_3 +Concat Concat_580 2 1 1280_splitncnn_4 1282_splitncnn_3 1283 +Convolution Conv_581 1 1 1283 1285 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_138 1 3 1285 1285_splitncnn_0 1285_splitncnn_1 1285_splitncnn_2 +Concat Concat_583 3 1 1280_splitncnn_3 1282_splitncnn_2 1285_splitncnn_2 1286 +Convolution Conv_584 1 1 1286 1288 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_139 1 2 1288 1288_splitncnn_0 1288_splitncnn_1 +Concat Concat_586 4 1 1280_splitncnn_2 1282_splitncnn_1 1285_splitncnn_1 1288_splitncnn_1 1289 +Convolution Conv_587 1 1 1289 1291 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_589 5 1 1280_splitncnn_1 1282_splitncnn_0 1285_splitncnn_0 1288_splitncnn_0 1291 1292 +Convolution Conv_590 1 1 1292 1293 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_593 2 1 1293 1280_splitncnn_0 1296 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_140 1 6 1296 1296_splitncnn_0 1296_splitncnn_1 1296_splitncnn_2 1296_splitncnn_3 1296_splitncnn_4 1296_splitncnn_5 +Convolution Conv_594 1 1 1296_splitncnn_5 1298 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_141 1 4 1298 1298_splitncnn_0 1298_splitncnn_1 1298_splitncnn_2 1298_splitncnn_3 +Concat Concat_596 2 1 1296_splitncnn_4 1298_splitncnn_3 1299 +Convolution Conv_597 1 1 1299 1301 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_142 1 3 1301 1301_splitncnn_0 1301_splitncnn_1 1301_splitncnn_2 +Concat Concat_599 3 1 1296_splitncnn_3 1298_splitncnn_2 1301_splitncnn_2 1302 +Convolution Conv_600 1 1 1302 1304 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_143 1 2 1304 1304_splitncnn_0 1304_splitncnn_1 +Concat Concat_602 4 1 1296_splitncnn_2 1298_splitncnn_1 1301_splitncnn_1 1304_splitncnn_1 1305 +Convolution Conv_603 1 1 1305 1307 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_605 5 1 1296_splitncnn_1 1298_splitncnn_0 1301_splitncnn_0 1304_splitncnn_0 1307 1308 +Convolution Conv_606 1 1 1308 1309 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_609 2 1 1309 1296_splitncnn_0 1312 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_612 2 1 1312 1264_splitncnn_0 1315 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_144 1 7 1315 1315_splitncnn_0 1315_splitncnn_1 1315_splitncnn_2 1315_splitncnn_3 1315_splitncnn_4 1315_splitncnn_5 1315_splitncnn_6 +Convolution Conv_613 1 1 1315_splitncnn_6 1317 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_145 1 4 1317 1317_splitncnn_0 1317_splitncnn_1 1317_splitncnn_2 1317_splitncnn_3 +Concat Concat_615 2 1 1315_splitncnn_5 1317_splitncnn_3 1318 +Convolution Conv_616 1 1 1318 1320 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_146 1 3 1320 1320_splitncnn_0 1320_splitncnn_1 1320_splitncnn_2 +Concat Concat_618 3 1 1315_splitncnn_4 1317_splitncnn_2 1320_splitncnn_2 1321 +Convolution Conv_619 1 1 1321 1323 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_147 1 2 1323 1323_splitncnn_0 1323_splitncnn_1 +Concat Concat_621 4 1 1315_splitncnn_3 1317_splitncnn_1 1320_splitncnn_1 1323_splitncnn_1 1324 +Convolution Conv_622 1 1 1324 1326 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_624 5 1 1315_splitncnn_2 1317_splitncnn_0 1320_splitncnn_0 1323_splitncnn_0 1326 1327 +Convolution Conv_625 1 1 1327 1328 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_628 2 1 1328 1315_splitncnn_1 1331 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_148 1 6 1331 1331_splitncnn_0 1331_splitncnn_1 1331_splitncnn_2 1331_splitncnn_3 1331_splitncnn_4 1331_splitncnn_5 +Convolution Conv_629 1 1 1331_splitncnn_5 1333 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_149 1 4 1333 1333_splitncnn_0 1333_splitncnn_1 1333_splitncnn_2 1333_splitncnn_3 +Concat Concat_631 2 1 1331_splitncnn_4 1333_splitncnn_3 1334 +Convolution Conv_632 1 1 1334 1336 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_150 1 3 1336 1336_splitncnn_0 1336_splitncnn_1 1336_splitncnn_2 +Concat Concat_634 3 1 1331_splitncnn_3 1333_splitncnn_2 1336_splitncnn_2 1337 +Convolution Conv_635 1 1 1337 1339 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_151 1 2 1339 1339_splitncnn_0 1339_splitncnn_1 +Concat Concat_637 4 1 1331_splitncnn_2 1333_splitncnn_1 1336_splitncnn_1 1339_splitncnn_1 1340 +Convolution Conv_638 1 1 1340 1342 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_640 5 1 1331_splitncnn_1 1333_splitncnn_0 1336_splitncnn_0 1339_splitncnn_0 1342 1343 +Convolution Conv_641 1 1 1343 1344 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_644 2 1 1344 1331_splitncnn_0 1347 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_152 1 6 1347 1347_splitncnn_0 1347_splitncnn_1 1347_splitncnn_2 1347_splitncnn_3 1347_splitncnn_4 1347_splitncnn_5 +Convolution Conv_645 1 1 1347_splitncnn_5 1349 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_153 1 4 1349 1349_splitncnn_0 1349_splitncnn_1 1349_splitncnn_2 1349_splitncnn_3 +Concat Concat_647 2 1 1347_splitncnn_4 1349_splitncnn_3 1350 +Convolution Conv_648 1 1 1350 1352 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_154 1 3 1352 1352_splitncnn_0 1352_splitncnn_1 1352_splitncnn_2 +Concat Concat_650 3 1 1347_splitncnn_3 1349_splitncnn_2 1352_splitncnn_2 1353 +Convolution Conv_651 1 1 1353 1355 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_155 1 2 1355 1355_splitncnn_0 1355_splitncnn_1 +Concat Concat_653 4 1 1347_splitncnn_2 1349_splitncnn_1 1352_splitncnn_1 1355_splitncnn_1 1356 +Convolution Conv_654 1 1 1356 1358 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_656 5 1 1347_splitncnn_1 1349_splitncnn_0 1352_splitncnn_0 1355_splitncnn_0 1358 1359 +Convolution Conv_657 1 1 1359 1360 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_660 2 1 1360 1347_splitncnn_0 1363 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_663 2 1 1363 1315_splitncnn_0 1366 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_156 1 7 1366 1366_splitncnn_0 1366_splitncnn_1 1366_splitncnn_2 1366_splitncnn_3 1366_splitncnn_4 1366_splitncnn_5 1366_splitncnn_6 +Convolution Conv_664 1 1 1366_splitncnn_6 1368 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_157 1 4 1368 1368_splitncnn_0 1368_splitncnn_1 1368_splitncnn_2 1368_splitncnn_3 +Concat Concat_666 2 1 1366_splitncnn_5 1368_splitncnn_3 1369 +Convolution Conv_667 1 1 1369 1371 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_158 1 3 1371 1371_splitncnn_0 1371_splitncnn_1 1371_splitncnn_2 +Concat Concat_669 3 1 1366_splitncnn_4 1368_splitncnn_2 1371_splitncnn_2 1372 +Convolution Conv_670 1 1 1372 1374 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_159 1 2 1374 1374_splitncnn_0 1374_splitncnn_1 +Concat Concat_672 4 1 1366_splitncnn_3 1368_splitncnn_1 1371_splitncnn_1 1374_splitncnn_1 1375 +Convolution Conv_673 1 1 1375 1377 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_675 5 1 1366_splitncnn_2 1368_splitncnn_0 1371_splitncnn_0 1374_splitncnn_0 1377 1378 +Convolution Conv_676 1 1 1378 1379 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_679 2 1 1379 1366_splitncnn_1 1382 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_160 1 6 1382 1382_splitncnn_0 1382_splitncnn_1 1382_splitncnn_2 1382_splitncnn_3 1382_splitncnn_4 1382_splitncnn_5 +Convolution Conv_680 1 1 1382_splitncnn_5 1384 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_161 1 4 1384 1384_splitncnn_0 1384_splitncnn_1 1384_splitncnn_2 1384_splitncnn_3 +Concat Concat_682 2 1 1382_splitncnn_4 1384_splitncnn_3 1385 +Convolution Conv_683 1 1 1385 1387 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_162 1 3 1387 1387_splitncnn_0 1387_splitncnn_1 1387_splitncnn_2 +Concat Concat_685 3 1 1382_splitncnn_3 1384_splitncnn_2 1387_splitncnn_2 1388 +Convolution Conv_686 1 1 1388 1390 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_163 1 2 1390 1390_splitncnn_0 1390_splitncnn_1 +Concat Concat_688 4 1 1382_splitncnn_2 1384_splitncnn_1 1387_splitncnn_1 1390_splitncnn_1 1391 +Convolution Conv_689 1 1 1391 1393 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_691 5 1 1382_splitncnn_1 1384_splitncnn_0 1387_splitncnn_0 1390_splitncnn_0 1393 1394 +Convolution Conv_692 1 1 1394 1395 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_695 2 1 1395 1382_splitncnn_0 1398 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_164 1 6 1398 1398_splitncnn_0 1398_splitncnn_1 1398_splitncnn_2 1398_splitncnn_3 1398_splitncnn_4 1398_splitncnn_5 +Convolution Conv_696 1 1 1398_splitncnn_5 1400 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_165 1 4 1400 1400_splitncnn_0 1400_splitncnn_1 1400_splitncnn_2 1400_splitncnn_3 +Concat Concat_698 2 1 1398_splitncnn_4 1400_splitncnn_3 1401 +Convolution Conv_699 1 1 1401 1403 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_166 1 3 1403 1403_splitncnn_0 1403_splitncnn_1 1403_splitncnn_2 +Concat Concat_701 3 1 1398_splitncnn_3 1400_splitncnn_2 1403_splitncnn_2 1404 +Convolution Conv_702 1 1 1404 1406 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_167 1 2 1406 1406_splitncnn_0 1406_splitncnn_1 +Concat Concat_704 4 1 1398_splitncnn_2 1400_splitncnn_1 1403_splitncnn_1 1406_splitncnn_1 1407 +Convolution Conv_705 1 1 1407 1409 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_707 5 1 1398_splitncnn_1 1400_splitncnn_0 1403_splitncnn_0 1406_splitncnn_0 1409 1410 +Convolution Conv_708 1 1 1410 1411 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_711 2 1 1411 1398_splitncnn_0 1414 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_714 2 1 1414 1366_splitncnn_0 1417 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_168 1 7 1417 1417_splitncnn_0 1417_splitncnn_1 1417_splitncnn_2 1417_splitncnn_3 1417_splitncnn_4 1417_splitncnn_5 1417_splitncnn_6 +Convolution Conv_715 1 1 1417_splitncnn_6 1419 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_169 1 4 1419 1419_splitncnn_0 1419_splitncnn_1 1419_splitncnn_2 1419_splitncnn_3 +Concat Concat_717 2 1 1417_splitncnn_5 1419_splitncnn_3 1420 +Convolution Conv_718 1 1 1420 1422 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_170 1 3 1422 1422_splitncnn_0 1422_splitncnn_1 1422_splitncnn_2 +Concat Concat_720 3 1 1417_splitncnn_4 1419_splitncnn_2 1422_splitncnn_2 1423 +Convolution Conv_721 1 1 1423 1425 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_171 1 2 1425 1425_splitncnn_0 1425_splitncnn_1 +Concat Concat_723 4 1 1417_splitncnn_3 1419_splitncnn_1 1422_splitncnn_1 1425_splitncnn_1 1426 +Convolution Conv_724 1 1 1426 1428 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_726 5 1 1417_splitncnn_2 1419_splitncnn_0 1422_splitncnn_0 1425_splitncnn_0 1428 1429 +Convolution Conv_727 1 1 1429 1430 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_730 2 1 1430 1417_splitncnn_1 1433 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_172 1 6 1433 1433_splitncnn_0 1433_splitncnn_1 1433_splitncnn_2 1433_splitncnn_3 1433_splitncnn_4 1433_splitncnn_5 +Convolution Conv_731 1 1 1433_splitncnn_5 1435 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_173 1 4 1435 1435_splitncnn_0 1435_splitncnn_1 1435_splitncnn_2 1435_splitncnn_3 +Concat Concat_733 2 1 1433_splitncnn_4 1435_splitncnn_3 1436 +Convolution Conv_734 1 1 1436 1438 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_174 1 3 1438 1438_splitncnn_0 1438_splitncnn_1 1438_splitncnn_2 +Concat Concat_736 3 1 1433_splitncnn_3 1435_splitncnn_2 1438_splitncnn_2 1439 +Convolution Conv_737 1 1 1439 1441 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_175 1 2 1441 1441_splitncnn_0 1441_splitncnn_1 +Concat Concat_739 4 1 1433_splitncnn_2 1435_splitncnn_1 1438_splitncnn_1 1441_splitncnn_1 1442 +Convolution Conv_740 1 1 1442 1444 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_742 5 1 1433_splitncnn_1 1435_splitncnn_0 1438_splitncnn_0 1441_splitncnn_0 1444 1445 +Convolution Conv_743 1 1 1445 1446 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_746 2 1 1446 1433_splitncnn_0 1449 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_176 1 6 1449 1449_splitncnn_0 1449_splitncnn_1 1449_splitncnn_2 1449_splitncnn_3 1449_splitncnn_4 1449_splitncnn_5 +Convolution Conv_747 1 1 1449_splitncnn_5 1451 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_177 1 4 1451 1451_splitncnn_0 1451_splitncnn_1 1451_splitncnn_2 1451_splitncnn_3 +Concat Concat_749 2 1 1449_splitncnn_4 1451_splitncnn_3 1452 +Convolution Conv_750 1 1 1452 1454 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_178 1 3 1454 1454_splitncnn_0 1454_splitncnn_1 1454_splitncnn_2 +Concat Concat_752 3 1 1449_splitncnn_3 1451_splitncnn_2 1454_splitncnn_2 1455 +Convolution Conv_753 1 1 1455 1457 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_179 1 2 1457 1457_splitncnn_0 1457_splitncnn_1 +Concat Concat_755 4 1 1449_splitncnn_2 1451_splitncnn_1 1454_splitncnn_1 1457_splitncnn_1 1458 +Convolution Conv_756 1 1 1458 1460 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_758 5 1 1449_splitncnn_1 1451_splitncnn_0 1454_splitncnn_0 1457_splitncnn_0 1460 1461 +Convolution Conv_759 1 1 1461 1462 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_762 2 1 1462 1449_splitncnn_0 1465 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_765 2 1 1465 1417_splitncnn_0 1468 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_180 1 7 1468 1468_splitncnn_0 1468_splitncnn_1 1468_splitncnn_2 1468_splitncnn_3 1468_splitncnn_4 1468_splitncnn_5 1468_splitncnn_6 +Convolution Conv_766 1 1 1468_splitncnn_6 1470 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_181 1 4 1470 1470_splitncnn_0 1470_splitncnn_1 1470_splitncnn_2 1470_splitncnn_3 +Concat Concat_768 2 1 1468_splitncnn_5 1470_splitncnn_3 1471 +Convolution Conv_769 1 1 1471 1473 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_182 1 3 1473 1473_splitncnn_0 1473_splitncnn_1 1473_splitncnn_2 +Concat Concat_771 3 1 1468_splitncnn_4 1470_splitncnn_2 1473_splitncnn_2 1474 +Convolution Conv_772 1 1 1474 1476 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_183 1 2 1476 1476_splitncnn_0 1476_splitncnn_1 +Concat Concat_774 4 1 1468_splitncnn_3 1470_splitncnn_1 1473_splitncnn_1 1476_splitncnn_1 1477 +Convolution Conv_775 1 1 1477 1479 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_777 5 1 1468_splitncnn_2 1470_splitncnn_0 1473_splitncnn_0 1476_splitncnn_0 1479 1480 +Convolution Conv_778 1 1 1480 1481 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_781 2 1 1481 1468_splitncnn_1 1484 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_184 1 6 1484 1484_splitncnn_0 1484_splitncnn_1 1484_splitncnn_2 1484_splitncnn_3 1484_splitncnn_4 1484_splitncnn_5 +Convolution Conv_782 1 1 1484_splitncnn_5 1486 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_185 1 4 1486 1486_splitncnn_0 1486_splitncnn_1 1486_splitncnn_2 1486_splitncnn_3 +Concat Concat_784 2 1 1484_splitncnn_4 1486_splitncnn_3 1487 +Convolution Conv_785 1 1 1487 1489 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_186 1 3 1489 1489_splitncnn_0 1489_splitncnn_1 1489_splitncnn_2 +Concat Concat_787 3 1 1484_splitncnn_3 1486_splitncnn_2 1489_splitncnn_2 1490 +Convolution Conv_788 1 1 1490 1492 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_187 1 2 1492 1492_splitncnn_0 1492_splitncnn_1 +Concat Concat_790 4 1 1484_splitncnn_2 1486_splitncnn_1 1489_splitncnn_1 1492_splitncnn_1 1493 +Convolution Conv_791 1 1 1493 1495 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_793 5 1 1484_splitncnn_1 1486_splitncnn_0 1489_splitncnn_0 1492_splitncnn_0 1495 1496 +Convolution Conv_794 1 1 1496 1497 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_797 2 1 1497 1484_splitncnn_0 1500 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_188 1 6 1500 1500_splitncnn_0 1500_splitncnn_1 1500_splitncnn_2 1500_splitncnn_3 1500_splitncnn_4 1500_splitncnn_5 +Convolution Conv_798 1 1 1500_splitncnn_5 1502 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_189 1 4 1502 1502_splitncnn_0 1502_splitncnn_1 1502_splitncnn_2 1502_splitncnn_3 +Concat Concat_800 2 1 1500_splitncnn_4 1502_splitncnn_3 1503 +Convolution Conv_801 1 1 1503 1505 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_190 1 3 1505 1505_splitncnn_0 1505_splitncnn_1 1505_splitncnn_2 +Concat Concat_803 3 1 1500_splitncnn_3 1502_splitncnn_2 1505_splitncnn_2 1506 +Convolution Conv_804 1 1 1506 1508 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_191 1 2 1508 1508_splitncnn_0 1508_splitncnn_1 +Concat Concat_806 4 1 1500_splitncnn_2 1502_splitncnn_1 1505_splitncnn_1 1508_splitncnn_1 1509 +Convolution Conv_807 1 1 1509 1511 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_809 5 1 1500_splitncnn_1 1502_splitncnn_0 1505_splitncnn_0 1508_splitncnn_0 1511 1512 +Convolution Conv_810 1 1 1512 1513 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_813 2 1 1513 1500_splitncnn_0 1516 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_816 2 1 1516 1468_splitncnn_0 1519 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_192 1 7 1519 1519_splitncnn_0 1519_splitncnn_1 1519_splitncnn_2 1519_splitncnn_3 1519_splitncnn_4 1519_splitncnn_5 1519_splitncnn_6 +Convolution Conv_817 1 1 1519_splitncnn_6 1521 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_193 1 4 1521 1521_splitncnn_0 1521_splitncnn_1 1521_splitncnn_2 1521_splitncnn_3 +Concat Concat_819 2 1 1519_splitncnn_5 1521_splitncnn_3 1522 +Convolution Conv_820 1 1 1522 1524 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_194 1 3 1524 1524_splitncnn_0 1524_splitncnn_1 1524_splitncnn_2 +Concat Concat_822 3 1 1519_splitncnn_4 1521_splitncnn_2 1524_splitncnn_2 1525 +Convolution Conv_823 1 1 1525 1527 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_195 1 2 1527 1527_splitncnn_0 1527_splitncnn_1 +Concat Concat_825 4 1 1519_splitncnn_3 1521_splitncnn_1 1524_splitncnn_1 1527_splitncnn_1 1528 +Convolution Conv_826 1 1 1528 1530 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_828 5 1 1519_splitncnn_2 1521_splitncnn_0 1524_splitncnn_0 1527_splitncnn_0 1530 1531 +Convolution Conv_829 1 1 1531 1532 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_832 2 1 1532 1519_splitncnn_1 1535 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_196 1 6 1535 1535_splitncnn_0 1535_splitncnn_1 1535_splitncnn_2 1535_splitncnn_3 1535_splitncnn_4 1535_splitncnn_5 +Convolution Conv_833 1 1 1535_splitncnn_5 1537 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_197 1 4 1537 1537_splitncnn_0 1537_splitncnn_1 1537_splitncnn_2 1537_splitncnn_3 +Concat Concat_835 2 1 1535_splitncnn_4 1537_splitncnn_3 1538 +Convolution Conv_836 1 1 1538 1540 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_198 1 3 1540 1540_splitncnn_0 1540_splitncnn_1 1540_splitncnn_2 +Concat Concat_838 3 1 1535_splitncnn_3 1537_splitncnn_2 1540_splitncnn_2 1541 +Convolution Conv_839 1 1 1541 1543 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_199 1 2 1543 1543_splitncnn_0 1543_splitncnn_1 +Concat Concat_841 4 1 1535_splitncnn_2 1537_splitncnn_1 1540_splitncnn_1 1543_splitncnn_1 1544 +Convolution Conv_842 1 1 1544 1546 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_844 5 1 1535_splitncnn_1 1537_splitncnn_0 1540_splitncnn_0 1543_splitncnn_0 1546 1547 +Convolution Conv_845 1 1 1547 1548 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_848 2 1 1548 1535_splitncnn_0 1551 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_200 1 6 1551 1551_splitncnn_0 1551_splitncnn_1 1551_splitncnn_2 1551_splitncnn_3 1551_splitncnn_4 1551_splitncnn_5 +Convolution Conv_849 1 1 1551_splitncnn_5 1553 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_201 1 4 1553 1553_splitncnn_0 1553_splitncnn_1 1553_splitncnn_2 1553_splitncnn_3 +Concat Concat_851 2 1 1551_splitncnn_4 1553_splitncnn_3 1554 +Convolution Conv_852 1 1 1554 1556 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_202 1 3 1556 1556_splitncnn_0 1556_splitncnn_1 1556_splitncnn_2 +Concat Concat_854 3 1 1551_splitncnn_3 1553_splitncnn_2 1556_splitncnn_2 1557 +Convolution Conv_855 1 1 1557 1559 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_203 1 2 1559 1559_splitncnn_0 1559_splitncnn_1 +Concat Concat_857 4 1 1551_splitncnn_2 1553_splitncnn_1 1556_splitncnn_1 1559_splitncnn_1 1560 +Convolution Conv_858 1 1 1560 1562 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_860 5 1 1551_splitncnn_1 1553_splitncnn_0 1556_splitncnn_0 1559_splitncnn_0 1562 1563 +Convolution Conv_861 1 1 1563 1564 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_864 2 1 1564 1551_splitncnn_0 1567 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_867 2 1 1567 1519_splitncnn_0 1570 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_204 1 7 1570 1570_splitncnn_0 1570_splitncnn_1 1570_splitncnn_2 1570_splitncnn_3 1570_splitncnn_4 1570_splitncnn_5 1570_splitncnn_6 +Convolution Conv_868 1 1 1570_splitncnn_6 1572 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_205 1 4 1572 1572_splitncnn_0 1572_splitncnn_1 1572_splitncnn_2 1572_splitncnn_3 +Concat Concat_870 2 1 1570_splitncnn_5 1572_splitncnn_3 1573 +Convolution Conv_871 1 1 1573 1575 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_206 1 3 1575 1575_splitncnn_0 1575_splitncnn_1 1575_splitncnn_2 +Concat Concat_873 3 1 1570_splitncnn_4 1572_splitncnn_2 1575_splitncnn_2 1576 +Convolution Conv_874 1 1 1576 1578 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_207 1 2 1578 1578_splitncnn_0 1578_splitncnn_1 +Concat Concat_876 4 1 1570_splitncnn_3 1572_splitncnn_1 1575_splitncnn_1 1578_splitncnn_1 1579 +Convolution Conv_877 1 1 1579 1581 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_879 5 1 1570_splitncnn_2 1572_splitncnn_0 1575_splitncnn_0 1578_splitncnn_0 1581 1582 +Convolution Conv_880 1 1 1582 1583 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_883 2 1 1583 1570_splitncnn_1 1586 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_208 1 6 1586 1586_splitncnn_0 1586_splitncnn_1 1586_splitncnn_2 1586_splitncnn_3 1586_splitncnn_4 1586_splitncnn_5 +Convolution Conv_884 1 1 1586_splitncnn_5 1588 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_209 1 4 1588 1588_splitncnn_0 1588_splitncnn_1 1588_splitncnn_2 1588_splitncnn_3 +Concat Concat_886 2 1 1586_splitncnn_4 1588_splitncnn_3 1589 +Convolution Conv_887 1 1 1589 1591 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_210 1 3 1591 1591_splitncnn_0 1591_splitncnn_1 1591_splitncnn_2 +Concat Concat_889 3 1 1586_splitncnn_3 1588_splitncnn_2 1591_splitncnn_2 1592 +Convolution Conv_890 1 1 1592 1594 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_211 1 2 1594 1594_splitncnn_0 1594_splitncnn_1 +Concat Concat_892 4 1 1586_splitncnn_2 1588_splitncnn_1 1591_splitncnn_1 1594_splitncnn_1 1595 +Convolution Conv_893 1 1 1595 1597 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_895 5 1 1586_splitncnn_1 1588_splitncnn_0 1591_splitncnn_0 1594_splitncnn_0 1597 1598 +Convolution Conv_896 1 1 1598 1599 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_899 2 1 1599 1586_splitncnn_0 1602 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_212 1 6 1602 1602_splitncnn_0 1602_splitncnn_1 1602_splitncnn_2 1602_splitncnn_3 1602_splitncnn_4 1602_splitncnn_5 +Convolution Conv_900 1 1 1602_splitncnn_5 1604 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_213 1 4 1604 1604_splitncnn_0 1604_splitncnn_1 1604_splitncnn_2 1604_splitncnn_3 +Concat Concat_902 2 1 1602_splitncnn_4 1604_splitncnn_3 1605 +Convolution Conv_903 1 1 1605 1607 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_214 1 3 1607 1607_splitncnn_0 1607_splitncnn_1 1607_splitncnn_2 +Concat Concat_905 3 1 1602_splitncnn_3 1604_splitncnn_2 1607_splitncnn_2 1608 +Convolution Conv_906 1 1 1608 1610 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_215 1 2 1610 1610_splitncnn_0 1610_splitncnn_1 +Concat Concat_908 4 1 1602_splitncnn_2 1604_splitncnn_1 1607_splitncnn_1 1610_splitncnn_1 1611 +Convolution Conv_909 1 1 1611 1613 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_911 5 1 1602_splitncnn_1 1604_splitncnn_0 1607_splitncnn_0 1610_splitncnn_0 1613 1614 +Convolution Conv_912 1 1 1614 1615 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_915 2 1 1615 1602_splitncnn_0 1618 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_918 2 1 1618 1570_splitncnn_0 1621 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_216 1 7 1621 1621_splitncnn_0 1621_splitncnn_1 1621_splitncnn_2 1621_splitncnn_3 1621_splitncnn_4 1621_splitncnn_5 1621_splitncnn_6 +Convolution Conv_919 1 1 1621_splitncnn_6 1623 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_217 1 4 1623 1623_splitncnn_0 1623_splitncnn_1 1623_splitncnn_2 1623_splitncnn_3 +Concat Concat_921 2 1 1621_splitncnn_5 1623_splitncnn_3 1624 +Convolution Conv_922 1 1 1624 1626 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_218 1 3 1626 1626_splitncnn_0 1626_splitncnn_1 1626_splitncnn_2 +Concat Concat_924 3 1 1621_splitncnn_4 1623_splitncnn_2 1626_splitncnn_2 1627 +Convolution Conv_925 1 1 1627 1629 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_219 1 2 1629 1629_splitncnn_0 1629_splitncnn_1 +Concat Concat_927 4 1 1621_splitncnn_3 1623_splitncnn_1 1626_splitncnn_1 1629_splitncnn_1 1630 +Convolution Conv_928 1 1 1630 1632 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_930 5 1 1621_splitncnn_2 1623_splitncnn_0 1626_splitncnn_0 1629_splitncnn_0 1632 1633 +Convolution Conv_931 1 1 1633 1634 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_934 2 1 1634 1621_splitncnn_1 1637 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_220 1 6 1637 1637_splitncnn_0 1637_splitncnn_1 1637_splitncnn_2 1637_splitncnn_3 1637_splitncnn_4 1637_splitncnn_5 +Convolution Conv_935 1 1 1637_splitncnn_5 1639 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_221 1 4 1639 1639_splitncnn_0 1639_splitncnn_1 1639_splitncnn_2 1639_splitncnn_3 +Concat Concat_937 2 1 1637_splitncnn_4 1639_splitncnn_3 1640 +Convolution Conv_938 1 1 1640 1642 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_222 1 3 1642 1642_splitncnn_0 1642_splitncnn_1 1642_splitncnn_2 +Concat Concat_940 3 1 1637_splitncnn_3 1639_splitncnn_2 1642_splitncnn_2 1643 +Convolution Conv_941 1 1 1643 1645 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_223 1 2 1645 1645_splitncnn_0 1645_splitncnn_1 +Concat Concat_943 4 1 1637_splitncnn_2 1639_splitncnn_1 1642_splitncnn_1 1645_splitncnn_1 1646 +Convolution Conv_944 1 1 1646 1648 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_946 5 1 1637_splitncnn_1 1639_splitncnn_0 1642_splitncnn_0 1645_splitncnn_0 1648 1649 +Convolution Conv_947 1 1 1649 1650 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_950 2 1 1650 1637_splitncnn_0 1653 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_224 1 6 1653 1653_splitncnn_0 1653_splitncnn_1 1653_splitncnn_2 1653_splitncnn_3 1653_splitncnn_4 1653_splitncnn_5 +Convolution Conv_951 1 1 1653_splitncnn_5 1655 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_225 1 4 1655 1655_splitncnn_0 1655_splitncnn_1 1655_splitncnn_2 1655_splitncnn_3 +Concat Concat_953 2 1 1653_splitncnn_4 1655_splitncnn_3 1656 +Convolution Conv_954 1 1 1656 1658 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_226 1 3 1658 1658_splitncnn_0 1658_splitncnn_1 1658_splitncnn_2 +Concat Concat_956 3 1 1653_splitncnn_3 1655_splitncnn_2 1658_splitncnn_2 1659 +Convolution Conv_957 1 1 1659 1661 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_227 1 2 1661 1661_splitncnn_0 1661_splitncnn_1 +Concat Concat_959 4 1 1653_splitncnn_2 1655_splitncnn_1 1658_splitncnn_1 1661_splitncnn_1 1662 +Convolution Conv_960 1 1 1662 1664 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_962 5 1 1653_splitncnn_1 1655_splitncnn_0 1658_splitncnn_0 1661_splitncnn_0 1664 1665 +Convolution Conv_963 1 1 1665 1666 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_966 2 1 1666 1653_splitncnn_0 1669 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_969 2 1 1669 1621_splitncnn_0 1672 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_228 1 7 1672 1672_splitncnn_0 1672_splitncnn_1 1672_splitncnn_2 1672_splitncnn_3 1672_splitncnn_4 1672_splitncnn_5 1672_splitncnn_6 +Convolution Conv_970 1 1 1672_splitncnn_6 1674 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_229 1 4 1674 1674_splitncnn_0 1674_splitncnn_1 1674_splitncnn_2 1674_splitncnn_3 +Concat Concat_972 2 1 1672_splitncnn_5 1674_splitncnn_3 1675 +Convolution Conv_973 1 1 1675 1677 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_230 1 3 1677 1677_splitncnn_0 1677_splitncnn_1 1677_splitncnn_2 +Concat Concat_975 3 1 1672_splitncnn_4 1674_splitncnn_2 1677_splitncnn_2 1678 +Convolution Conv_976 1 1 1678 1680 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_231 1 2 1680 1680_splitncnn_0 1680_splitncnn_1 +Concat Concat_978 4 1 1672_splitncnn_3 1674_splitncnn_1 1677_splitncnn_1 1680_splitncnn_1 1681 +Convolution Conv_979 1 1 1681 1683 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_981 5 1 1672_splitncnn_2 1674_splitncnn_0 1677_splitncnn_0 1680_splitncnn_0 1683 1684 +Convolution Conv_982 1 1 1684 1685 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_985 2 1 1685 1672_splitncnn_1 1688 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_232 1 6 1688 1688_splitncnn_0 1688_splitncnn_1 1688_splitncnn_2 1688_splitncnn_3 1688_splitncnn_4 1688_splitncnn_5 +Convolution Conv_986 1 1 1688_splitncnn_5 1690 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_233 1 4 1690 1690_splitncnn_0 1690_splitncnn_1 1690_splitncnn_2 1690_splitncnn_3 +Concat Concat_988 2 1 1688_splitncnn_4 1690_splitncnn_3 1691 +Convolution Conv_989 1 1 1691 1693 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_234 1 3 1693 1693_splitncnn_0 1693_splitncnn_1 1693_splitncnn_2 +Concat Concat_991 3 1 1688_splitncnn_3 1690_splitncnn_2 1693_splitncnn_2 1694 +Convolution Conv_992 1 1 1694 1696 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_235 1 2 1696 1696_splitncnn_0 1696_splitncnn_1 +Concat Concat_994 4 1 1688_splitncnn_2 1690_splitncnn_1 1693_splitncnn_1 1696_splitncnn_1 1697 +Convolution Conv_995 1 1 1697 1699 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_997 5 1 1688_splitncnn_1 1690_splitncnn_0 1693_splitncnn_0 1696_splitncnn_0 1699 1700 +Convolution Conv_998 1 1 1700 1701 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_1001 2 1 1701 1688_splitncnn_0 1704 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_236 1 6 1704 1704_splitncnn_0 1704_splitncnn_1 1704_splitncnn_2 1704_splitncnn_3 1704_splitncnn_4 1704_splitncnn_5 +Convolution Conv_1002 1 1 1704_splitncnn_5 1706 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_237 1 4 1706 1706_splitncnn_0 1706_splitncnn_1 1706_splitncnn_2 1706_splitncnn_3 +Concat Concat_1004 2 1 1704_splitncnn_4 1706_splitncnn_3 1707 +Convolution Conv_1005 1 1 1707 1709 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_238 1 3 1709 1709_splitncnn_0 1709_splitncnn_1 1709_splitncnn_2 +Concat Concat_1007 3 1 1704_splitncnn_3 1706_splitncnn_2 1709_splitncnn_2 1710 +Convolution Conv_1008 1 1 1710 1712 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_239 1 2 1712 1712_splitncnn_0 1712_splitncnn_1 +Concat Concat_1010 4 1 1704_splitncnn_2 1706_splitncnn_1 1709_splitncnn_1 1712_splitncnn_1 1713 +Convolution Conv_1011 1 1 1713 1715 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_1013 5 1 1704_splitncnn_1 1706_splitncnn_0 1709_splitncnn_0 1712_splitncnn_0 1715 1716 +Convolution Conv_1014 1 1 1716 1717 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_1017 2 1 1717 1704_splitncnn_0 1720 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_1020 2 1 1720 1672_splitncnn_0 1723 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_240 1 7 1723 1723_splitncnn_0 1723_splitncnn_1 1723_splitncnn_2 1723_splitncnn_3 1723_splitncnn_4 1723_splitncnn_5 1723_splitncnn_6 +Convolution Conv_1021 1 1 1723_splitncnn_6 1725 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_241 1 4 1725 1725_splitncnn_0 1725_splitncnn_1 1725_splitncnn_2 1725_splitncnn_3 +Concat Concat_1023 2 1 1723_splitncnn_5 1725_splitncnn_3 1726 +Convolution Conv_1024 1 1 1726 1728 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_242 1 3 1728 1728_splitncnn_0 1728_splitncnn_1 1728_splitncnn_2 +Concat Concat_1026 3 1 1723_splitncnn_4 1725_splitncnn_2 1728_splitncnn_2 1729 +Convolution Conv_1027 1 1 1729 1731 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_243 1 2 1731 1731_splitncnn_0 1731_splitncnn_1 +Concat Concat_1029 4 1 1723_splitncnn_3 1725_splitncnn_1 1728_splitncnn_1 1731_splitncnn_1 1732 +Convolution Conv_1030 1 1 1732 1734 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_1032 5 1 1723_splitncnn_2 1725_splitncnn_0 1728_splitncnn_0 1731_splitncnn_0 1734 1735 +Convolution Conv_1033 1 1 1735 1736 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_1036 2 1 1736 1723_splitncnn_1 1739 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_244 1 6 1739 1739_splitncnn_0 1739_splitncnn_1 1739_splitncnn_2 1739_splitncnn_3 1739_splitncnn_4 1739_splitncnn_5 +Convolution Conv_1037 1 1 1739_splitncnn_5 1741 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_245 1 4 1741 1741_splitncnn_0 1741_splitncnn_1 1741_splitncnn_2 1741_splitncnn_3 +Concat Concat_1039 2 1 1739_splitncnn_4 1741_splitncnn_3 1742 +Convolution Conv_1040 1 1 1742 1744 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_246 1 3 1744 1744_splitncnn_0 1744_splitncnn_1 1744_splitncnn_2 +Concat Concat_1042 3 1 1739_splitncnn_3 1741_splitncnn_2 1744_splitncnn_2 1745 +Convolution Conv_1043 1 1 1745 1747 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_247 1 2 1747 1747_splitncnn_0 1747_splitncnn_1 +Concat Concat_1045 4 1 1739_splitncnn_2 1741_splitncnn_1 1744_splitncnn_1 1747_splitncnn_1 1748 +Convolution Conv_1046 1 1 1748 1750 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_1048 5 1 1739_splitncnn_1 1741_splitncnn_0 1744_splitncnn_0 1747_splitncnn_0 1750 1751 +Convolution Conv_1049 1 1 1751 1752 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_1052 2 1 1752 1739_splitncnn_0 1755 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_248 1 6 1755 1755_splitncnn_0 1755_splitncnn_1 1755_splitncnn_2 1755_splitncnn_3 1755_splitncnn_4 1755_splitncnn_5 +Convolution Conv_1053 1 1 1755_splitncnn_5 1757 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_249 1 4 1757 1757_splitncnn_0 1757_splitncnn_1 1757_splitncnn_2 1757_splitncnn_3 +Concat Concat_1055 2 1 1755_splitncnn_4 1757_splitncnn_3 1758 +Convolution Conv_1056 1 1 1758 1760 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_250 1 3 1760 1760_splitncnn_0 1760_splitncnn_1 1760_splitncnn_2 +Concat Concat_1058 3 1 1755_splitncnn_3 1757_splitncnn_2 1760_splitncnn_2 1761 +Convolution Conv_1059 1 1 1761 1763 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_251 1 2 1763 1763_splitncnn_0 1763_splitncnn_1 +Concat Concat_1061 4 1 1755_splitncnn_2 1757_splitncnn_1 1760_splitncnn_1 1763_splitncnn_1 1764 +Convolution Conv_1062 1 1 1764 1766 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_1064 5 1 1755_splitncnn_1 1757_splitncnn_0 1760_splitncnn_0 1763_splitncnn_0 1766 1767 +Convolution Conv_1065 1 1 1767 1768 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_1068 2 1 1768 1755_splitncnn_0 1771 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_1071 2 1 1771 1723_splitncnn_0 1774 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_252 1 7 1774 1774_splitncnn_0 1774_splitncnn_1 1774_splitncnn_2 1774_splitncnn_3 1774_splitncnn_4 1774_splitncnn_5 1774_splitncnn_6 +Convolution Conv_1072 1 1 1774_splitncnn_6 1776 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_253 1 4 1776 1776_splitncnn_0 1776_splitncnn_1 1776_splitncnn_2 1776_splitncnn_3 +Concat Concat_1074 2 1 1774_splitncnn_5 1776_splitncnn_3 1777 +Convolution Conv_1075 1 1 1777 1779 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_254 1 3 1779 1779_splitncnn_0 1779_splitncnn_1 1779_splitncnn_2 +Concat Concat_1077 3 1 1774_splitncnn_4 1776_splitncnn_2 1779_splitncnn_2 1780 +Convolution Conv_1078 1 1 1780 1782 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_255 1 2 1782 1782_splitncnn_0 1782_splitncnn_1 +Concat Concat_1080 4 1 1774_splitncnn_3 1776_splitncnn_1 1779_splitncnn_1 1782_splitncnn_1 1783 +Convolution Conv_1081 1 1 1783 1785 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_1083 5 1 1774_splitncnn_2 1776_splitncnn_0 1779_splitncnn_0 1782_splitncnn_0 1785 1786 +Convolution Conv_1084 1 1 1786 1787 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_1087 2 1 1787 1774_splitncnn_1 1790 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_256 1 6 1790 1790_splitncnn_0 1790_splitncnn_1 1790_splitncnn_2 1790_splitncnn_3 1790_splitncnn_4 1790_splitncnn_5 +Convolution Conv_1088 1 1 1790_splitncnn_5 1792 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_257 1 4 1792 1792_splitncnn_0 1792_splitncnn_1 1792_splitncnn_2 1792_splitncnn_3 +Concat Concat_1090 2 1 1790_splitncnn_4 1792_splitncnn_3 1793 +Convolution Conv_1091 1 1 1793 1795 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_258 1 3 1795 1795_splitncnn_0 1795_splitncnn_1 1795_splitncnn_2 +Concat Concat_1093 3 1 1790_splitncnn_3 1792_splitncnn_2 1795_splitncnn_2 1796 +Convolution Conv_1094 1 1 1796 1798 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_259 1 2 1798 1798_splitncnn_0 1798_splitncnn_1 +Concat Concat_1096 4 1 1790_splitncnn_2 1792_splitncnn_1 1795_splitncnn_1 1798_splitncnn_1 1799 +Convolution Conv_1097 1 1 1799 1801 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_1099 5 1 1790_splitncnn_1 1792_splitncnn_0 1795_splitncnn_0 1798_splitncnn_0 1801 1802 +Convolution Conv_1100 1 1 1802 1803 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_1103 2 1 1803 1790_splitncnn_0 1806 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_260 1 6 1806 1806_splitncnn_0 1806_splitncnn_1 1806_splitncnn_2 1806_splitncnn_3 1806_splitncnn_4 1806_splitncnn_5 +Convolution Conv_1104 1 1 1806_splitncnn_5 1808 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_261 1 4 1808 1808_splitncnn_0 1808_splitncnn_1 1808_splitncnn_2 1808_splitncnn_3 +Concat Concat_1106 2 1 1806_splitncnn_4 1808_splitncnn_3 1809 +Convolution Conv_1107 1 1 1809 1811 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_262 1 3 1811 1811_splitncnn_0 1811_splitncnn_1 1811_splitncnn_2 +Concat Concat_1109 3 1 1806_splitncnn_3 1808_splitncnn_2 1811_splitncnn_2 1812 +Convolution Conv_1110 1 1 1812 1814 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_263 1 2 1814 1814_splitncnn_0 1814_splitncnn_1 +Concat Concat_1112 4 1 1806_splitncnn_2 1808_splitncnn_1 1811_splitncnn_1 1814_splitncnn_1 1815 +Convolution Conv_1113 1 1 1815 1817 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_1115 5 1 1806_splitncnn_1 1808_splitncnn_0 1811_splitncnn_0 1814_splitncnn_0 1817 1818 +Convolution Conv_1116 1 1 1818 1819 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_1119 2 1 1819 1806_splitncnn_0 1822 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_1122 2 1 1822 1774_splitncnn_0 1825 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_264 1 7 1825 1825_splitncnn_0 1825_splitncnn_1 1825_splitncnn_2 1825_splitncnn_3 1825_splitncnn_4 1825_splitncnn_5 1825_splitncnn_6 +Convolution Conv_1123 1 1 1825_splitncnn_6 1827 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_265 1 4 1827 1827_splitncnn_0 1827_splitncnn_1 1827_splitncnn_2 1827_splitncnn_3 +Concat Concat_1125 2 1 1825_splitncnn_5 1827_splitncnn_3 1828 +Convolution Conv_1126 1 1 1828 1830 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_266 1 3 1830 1830_splitncnn_0 1830_splitncnn_1 1830_splitncnn_2 +Concat Concat_1128 3 1 1825_splitncnn_4 1827_splitncnn_2 1830_splitncnn_2 1831 +Convolution Conv_1129 1 1 1831 1833 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_267 1 2 1833 1833_splitncnn_0 1833_splitncnn_1 +Concat Concat_1131 4 1 1825_splitncnn_3 1827_splitncnn_1 1830_splitncnn_1 1833_splitncnn_1 1834 +Convolution Conv_1132 1 1 1834 1836 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_1134 5 1 1825_splitncnn_2 1827_splitncnn_0 1830_splitncnn_0 1833_splitncnn_0 1836 1837 +Convolution Conv_1135 1 1 1837 1838 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_1138 2 1 1838 1825_splitncnn_1 1841 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_268 1 6 1841 1841_splitncnn_0 1841_splitncnn_1 1841_splitncnn_2 1841_splitncnn_3 1841_splitncnn_4 1841_splitncnn_5 +Convolution Conv_1139 1 1 1841_splitncnn_5 1843 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_269 1 4 1843 1843_splitncnn_0 1843_splitncnn_1 1843_splitncnn_2 1843_splitncnn_3 +Concat Concat_1141 2 1 1841_splitncnn_4 1843_splitncnn_3 1844 +Convolution Conv_1142 1 1 1844 1846 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_270 1 3 1846 1846_splitncnn_0 1846_splitncnn_1 1846_splitncnn_2 +Concat Concat_1144 3 1 1841_splitncnn_3 1843_splitncnn_2 1846_splitncnn_2 1847 +Convolution Conv_1145 1 1 1847 1849 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_271 1 2 1849 1849_splitncnn_0 1849_splitncnn_1 +Concat Concat_1147 4 1 1841_splitncnn_2 1843_splitncnn_1 1846_splitncnn_1 1849_splitncnn_1 1850 +Convolution Conv_1148 1 1 1850 1852 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_1150 5 1 1841_splitncnn_1 1843_splitncnn_0 1846_splitncnn_0 1849_splitncnn_0 1852 1853 +Convolution Conv_1151 1 1 1853 1854 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_1154 2 1 1854 1841_splitncnn_0 1857 0=1 -23301=2,2.000000e-01,1.000000e+00 +Split splitncnn_272 1 6 1857 1857_splitncnn_0 1857_splitncnn_1 1857_splitncnn_2 1857_splitncnn_3 1857_splitncnn_4 1857_splitncnn_5 +Convolution Conv_1155 1 1 1857_splitncnn_5 1859 0=32 1=3 4=1 5=1 6=18432 9=2 -23310=1,2.000000e-01 +Split splitncnn_273 1 4 1859 1859_splitncnn_0 1859_splitncnn_1 1859_splitncnn_2 1859_splitncnn_3 +Concat Concat_1157 2 1 1857_splitncnn_4 1859_splitncnn_3 1860 +Convolution Conv_1158 1 1 1860 1862 0=32 1=3 4=1 5=1 6=27648 9=2 -23310=1,2.000000e-01 +Split splitncnn_274 1 3 1862 1862_splitncnn_0 1862_splitncnn_1 1862_splitncnn_2 +Concat Concat_1160 3 1 1857_splitncnn_3 1859_splitncnn_2 1862_splitncnn_2 1863 +Convolution Conv_1161 1 1 1863 1865 0=32 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Split splitncnn_275 1 2 1865 1865_splitncnn_0 1865_splitncnn_1 +Concat Concat_1163 4 1 1857_splitncnn_2 1859_splitncnn_1 1862_splitncnn_1 1865_splitncnn_1 1866 +Convolution Conv_1164 1 1 1866 1868 0=32 1=3 4=1 5=1 6=46080 9=2 -23310=1,2.000000e-01 +Concat Concat_1166 5 1 1857_splitncnn_1 1859_splitncnn_0 1862_splitncnn_0 1865_splitncnn_0 1868 1869 +Convolution Conv_1167 1 1 1869 1870 0=64 1=3 4=1 5=1 6=110592 +Eltwise Add_1170 2 1 1870 1857_splitncnn_0 1873 0=1 -23301=2,2.000000e-01,1.000000e+00 +Eltwise Add_1173 2 1 1873 1825_splitncnn_0 1876 0=1 -23301=2,2.000000e-01,1.000000e+00 +Convolution Conv_1174 1 1 1876 1877 0=64 1=3 4=1 5=1 6=36864 +BinaryOp Add_1175 2 1 703_splitncnn_0 1877 1878 +Interp Resize_1177 1 1 1878 1883 0=1 1=2.000000e+00 2=2.000000e+00 +Convolution Conv_1178 1 1 1883 1885 0=64 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Interp Resize_1181 1 1 1885 1890 0=1 1=2.000000e+00 2=2.000000e+00 +Convolution Conv_1182 1 1 1890 1892 0=64 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Convolution Conv_1184 1 1 1892 1894 0=64 1=3 4=1 5=1 6=36864 9=2 -23310=1,2.000000e-01 +Convolution Conv_1186 1 1 1894 output 0=3 1=3 4=1 5=1 6=1728 diff --git a/resources/package/Improve/output/00000-1616097796-(masterpiece, best quality, a young man emperor with a strong and handsome face domineering and majestic long black hair wearing.png b/resources/package/Improve/output/00000-1616097796-(masterpiece, best quality, a young man emperor with a strong and handsome face domineering and majestic long black hair wearing.png new file mode 100644 index 0000000..d5da84c Binary files /dev/null and b/resources/package/Improve/output/00000-1616097796-(masterpiece, best quality, a young man emperor with a strong and handsome face domineering and majestic long black hair wearing.png differ diff --git a/resources/package/Improve/output/00001-1083368712-(masterpiece, best quality, a young man emperor with a strong and handsome face domineering and majestic long black hair wearing.png b/resources/package/Improve/output/00001-1083368712-(masterpiece, best quality, a young man emperor with a strong and handsome face domineering and majestic long black hair wearing.png new file mode 100644 index 0000000..7a318d7 Binary files /dev/null and b/resources/package/Improve/output/00001-1083368712-(masterpiece, best quality, a young man emperor with a strong and handsome face domineering and majestic long black hair wearing.png differ diff --git a/resources/package/Improve/output/00002-763798052-(masterpiece, best quality, a group of courtiers in fancy robes faced the young emperor in a chinese-style palace, and the minis.png b/resources/package/Improve/output/00002-763798052-(masterpiece, best quality, a group of courtiers in fancy robes faced the young emperor in a chinese-style palace, and the minis.png new file mode 100644 index 0000000..82dbdbc Binary files /dev/null and b/resources/package/Improve/output/00002-763798052-(masterpiece, best quality, a group of courtiers in fancy robes faced the young emperor in a chinese-style palace, and the minis.png differ diff --git a/resources/package/Improve/output/00003-2561272579-(masterpiece, best quality,a young face stalwart handsome domineering majestic long black hair wearing a gorgeous robe of a man.png b/resources/package/Improve/output/00003-2561272579-(masterpiece, best quality,a young face stalwart handsome domineering majestic long black hair wearing a gorgeous robe of a man.png new file mode 100644 index 0000000..b7029ac Binary files /dev/null and b/resources/package/Improve/output/00003-2561272579-(masterpiece, best quality,a young face stalwart handsome domineering majestic long black hair wearing a gorgeous robe of a man.png differ diff --git a/resources/package/Improve/output/00004-1447729042-(masterpiece, best quality, a young face stalwart handsome domineering majestic long black hair wearing gorgeous robes of a man.png b/resources/package/Improve/output/00004-1447729042-(masterpiece, best quality, a young face stalwart handsome domineering majestic long black hair wearing gorgeous robes of a man.png new file mode 100644 index 0000000..5d9c20f Binary files /dev/null and b/resources/package/Improve/output/00004-1447729042-(masterpiece, best quality, a young face stalwart handsome domineering majestic long black hair wearing gorgeous robes of a man.png differ diff --git a/resources/package/Improve/rnv.exe b/resources/package/Improve/rnv.exe new file mode 100644 index 0000000..e8d351c Binary files /dev/null and b/resources/package/Improve/rnv.exe differ diff --git a/resources/package/Improve/vcomp140.dll b/resources/package/Improve/vcomp140.dll new file mode 100644 index 0000000..9568cee Binary files /dev/null and b/resources/package/Improve/vcomp140.dll differ diff --git a/resources/package/Improve/vcomp140d.dll b/resources/package/Improve/vcomp140d.dll new file mode 100644 index 0000000..69ef200 Binary files /dev/null and b/resources/package/Improve/vcomp140d.dll differ diff --git a/resources/package/exittool/exiftool.exe b/resources/package/exittool/exiftool.exe new file mode 100644 index 0000000..d1529c0 Binary files /dev/null and b/resources/package/exittool/exiftool.exe differ diff --git a/resources/scripts/Lai.py b/resources/scripts/Lai.py new file mode 100644 index 0000000..7fdd336 --- /dev/null +++ b/resources/scripts/Lai.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- +import io +import json +import os +import sys +import clip +import getgrame +import Push_back_Prompt +import public_tools +import shotSplit + +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8") + +# sys.argv = ["C:\\Users\\27698\\Desktop\\LAITool\\resources\\scripts\\Lai.exe","-c","D:/父爱如山倒/scripts/output_crop_00001.json"] +print(sys.argv) + +if len(sys.argv) < 2: + print("Params: ") + exit(0) + +if getattr(sys, "frozen", False): + cript_directory = os.path.dirname(sys.executable) +elif __file__: + cript_directory = os.path.dirname(__file__) + + +def set_ffmpeg_env(): + # 根据你的ffmpeg路径替换这个 + ffmpeg_path = os.path.join( + cript_directory, "../package/ffmpeg-2023-12-07-git-f89cff96d0-full_build/bin" + ) + + if sys.platform == "win32": + ffmpeg_path = ffmpeg_path.replace("/", "\\") + + # 检查环境变量中是否已经设置 + if "PATH" in os.environ: + path_values = os.environ["PATH"] + if ffmpeg_path not in path_values: + os.environ["PATH"] += f";{ffmpeg_path}" + else: + os.environ["PATH"] = ffmpeg_path + + +set_ffmpeg_env() + +# 执行剪辑的方法 +if sys.argv[1] == "-c": + clip = clip.Clip(cript_directory, sys.argv[2]) + clip.MergeVideosAndClip() + pass +# 获取字体 +elif sys.argv[1] == "-f": + # 获取本地已安装的字幕。然后返回 + public_tools = public_tools.PublicTools() + font_list = public_tools.get_installed_fonts() + font_obj_list = [] + for font_name in font_list: + obj = {"label": font_name, "value": font_name} + font_obj_list.append(obj) + + with open(sys.argv[2], "r", encoding="utf-8") as file: + data = json.load(file) + data["font_name_list"] = font_obj_list + with open(sys.argv[2], "w", encoding="utf-8") as file: + json.dump(data, file, ensure_ascii=False, indent=4) + +# 反推提示词 +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]) + 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]) diff --git a/resources/scripts/Lai.spec b/resources/scripts/Lai.spec new file mode 100644 index 0000000..6a9e0f2 --- /dev/null +++ b/resources/scripts/Lai.spec @@ -0,0 +1,43 @@ +# -*- 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, + hiddenimports=[], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + noarchive=False, +) +pyz = PYZ(a.pure) + +exe = EXE( + pyz, + a.scripts, + a.binaries, + a.datas, + [], + 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, + target_arch=None, + codesign_identity=None, + entitlements_file=None, +) diff --git a/resources/scripts/Push_back_Prompt.py b/resources/scripts/Push_back_Prompt.py new file mode 100644 index 0000000..b7ad5ac --- /dev/null +++ b/resources/scripts/Push_back_Prompt.py @@ -0,0 +1,297 @@ +# -*- coding: utf-8 -*- +import io +import os +import re +import subprocess +import sys + +import pandas as pd +import numpy as np +from typing import Tuple, List, Dict +import cv2 +from PIL import Image +from pathlib import Path +import public_tools + +# sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8") + +TAG_MODE_ACTION_COMMON = "action_common" +TAG_MODE_ACTION = "action" + +if getattr(sys, "frozen", False): + cript_directory = os.path.dirname(sys.executable) +elif __file__: + cript_directory = os.path.dirname(__file__) + + +def make_square(img, target_size): + old_size = img.shape[:2] + desired_size = max(old_size) + desired_size = max(desired_size, target_size) + + delta_w = desired_size - old_size[1] + delta_h = desired_size - old_size[0] + top, bottom = delta_h // 2, delta_h - (delta_h // 2) + left, right = delta_w // 2, delta_w - (delta_w // 2) + + color = [255, 255, 255] + new_im = cv2.copyMakeBorder( + img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color + ) + return new_im + + +def smart_resize(img, size): + # 假设图像已经经过 make_square 处理 + if img.shape[0] > size: + img = cv2.resize(img, (size, size), interpolation=cv2.INTER_AREA) + elif img.shape[0] < size: + img = cv2.resize(img, (size, size), interpolation=cv2.INTER_CUBIC) + return img + + +# 调用gpu,很难成功,环境要求太高 +use_cpu = False + +if use_cpu: + tf_device_name = "/cpu:0" +else: + tf_device_name = "/gpu:0" + + +class Interrogator: + @staticmethod + def postprocess_tags( + tags: Dict[str, float], + threshold=0.35, # 阈值强度,默认0.35 + additional_tags: List[str] = [], + exclude_tags: List[str] = [], + sort_by_alphabetical_order=False, + add_confident_as_weight=False, + replace_underscore=False, + replace_underscore_excludes: List[str] = [], + escape_tag=False, + ) -> Dict[str, float]: + for t in additional_tags: + tags[t] = 1.0 + + tags = { + t: c + # 按标签名称或置信度排序 + for t, c in sorted( + tags.items(), + key=lambda i: i[0 if sort_by_alphabetical_order else 1], + reverse=not sort_by_alphabetical_order, + ) + # 筛选大于阈值的标签 + if (c >= threshold and t not in exclude_tags) + } + + new_tags = [] + for tag in list(tags): + new_tag = tag + + if replace_underscore and tag not in replace_underscore_excludes: + new_tag = new_tag.replace("_", " ") + + """ + if escape_tag: + new_tag = tag_escape_pattern.sub(r'\\\1', new_tag) + """ + if add_confident_as_weight: + new_tag = f"({new_tag}:{tags[tag]})" + + new_tags.append((new_tag, tags[tag])) + tags = dict(new_tags) + + return tags + + def __init__(self, name: str) -> None: + self.name = name + + def load(self): + raise NotImplementedError() + + def unload(self) -> bool: + unloaded = False + + if hasattr(self, "model") and self.model is not None: + del self.model + unloaded = True + print(f"Unloaded {self.name}") + + if hasattr(self, "tags"): + del self.tags + + return unloaded + + def interrogate(self, image: Image) -> Tuple[Dict[str, float], Dict[str, float]]: + raise NotImplementedError() + + +class WaifuDiffusionInterrogator(Interrogator): + def __init__( + self, + name: str, + model_path="model.onnx", + tags_path="selected_tags.csv", + **kwargs, + ) -> None: + super().__init__(name) + self.model_path = model_path + self.tags_path = tags_path + self.kwargs = kwargs + + def interrogate( + self, image: Image + ) -> Tuple[ + Dict[str, float], Dict[str, float] # rating confidents # tag confidents + ]: + # init model + 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}模型") + self.tags = pd.read_csv(tags_path) + + _, height, _, _ = self.model.get_inputs()[0].shape + + # 透明转换成白色 + image = image.convert("RGBA") + new_image = Image.new("RGBA", image.size, "WHITE") + new_image.paste(image, mask=image) + image = new_image.convert("RGB") + image = np.asarray(image) + + # RGB格式转换 + image = image[:, :, ::-1] + image = make_square(image, height) + + image = smart_resize(image, height) + image = image.astype(np.float32) + image = np.expand_dims(image, 0) + + # 验证一下模型 + input_name = self.model.get_inputs()[0].name + label_name = self.model.get_outputs()[0].name + confidents = self.model.run([label_name], {input_name: image})[0] + + tags = self.tags[:][["name"]] + tags["confidents"] = confidents[0] + + # 前4项标签用于评定模型(一般、敏感、可疑、明确) + ratings = dict(tags[:4].values) + + # 其他的是常规标签 + tags = dict(tags[4:].values) + + return ratings, tags + + +def getTags(model, img_path): + img = Image.open(img_path) + ratings, tags = model.interrogate(img) + img.close() + tags = model.postprocess_tags(tags) + return ",".join(tags.keys()) + + +pattern_word_split = re.compile(r"\W+") + + +def is_tag_in_list(tag, rule_list): + words = pattern_word_split.split(tag) + for word in words: + if word in rule_list: + return True + return False + + +def filter_action(tag_actions: [], tags: []): + action_tags = [] + other_tags = [] + for tag in tags: + if public_tools.is_empty(tag): + continue + if is_tag_in_list(tag, tag_actions): + action_tags.append(tag) + else: + other_tags.append(tag) + return action_tags, other_tags + + +def init(sd_setting,m,project_path): + try: + setting_json = public_tools.read_config(sd_setting, webui=False) + except Exception as e: + print("Error: read config", e) + exit(0) + + setting_config = public_tools.SettingConfig(setting_json, project_path) + + # workspace path config + workspace = setting_config.get_workspace_config() + + if not os.path.exists(workspace.input_tag): + os.makedirs(workspace.input_tag) + + # 可选功能 + if setting_config.enable_tag(): + + # load model + model = WaifuDiffusionInterrogator( + "wd14-convnextv2-v2", + repo_id="SmilingWolf/wd-v1-4-convnextv2-tagger-v2", + revision="v2.0", + ) + + tag_mode = setting_config.get_tag_mode() + tag_actions = setting_config.get_tag_actions() + + # 轮询开始输出 + frame_files = [ + f for f in os.listdir(workspace.input_crop) if f.endswith(".png") + ] + frame_files.sort() + + common_tags = dict() + for frame in frame_files: + frame_file = os.path.join(workspace.input_crop, frame) + txt = getTags(model, frame_file) + tags = txt.split(",") + + if tag_mode == TAG_MODE_ACTION: + actions, others = filter_action(tag_actions, tags) + # 替换 txt 为 action txt + txt = ",".join(actions) if len(actions) > 0 else "" + elif tag_mode == TAG_MODE_ACTION_COMMON: + actions, others = filter_action(tag_actions, tags) + txt = ",".join(actions) if len(actions) > 0 else "" + # tag 计数 + for tag in others: + if tag in common_tags: + common_tags[tag] = common_tags[tag] + 1 + else: + common_tags[tag] = 1 + + # save tag + txt_file = os.path.join(workspace.input_tag, 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() + + # 过滤出现次数 > 30% 的 tags 作为 common tags + threshold_count = max(int(len(frame_files) * 0.3), 1) + common_tag_list = [] + for tag in common_tags: + if common_tags[tag] > threshold_count: + common_tag_list.append(tag) + # save common tag + # txt_file = os.path.join(workspace.input_tag, f'common.txt') + # with open(txt_file, 'w', encoding='utf-8') as tags: + # txt = ",".join(common_tag_list) if len(common_tag_list) > 0 else "" + # tags.write(txt) diff --git a/resources/scripts/__pycache__/Push_back_Prompt.cpython-310.pyc b/resources/scripts/__pycache__/Push_back_Prompt.cpython-310.pyc new file mode 100644 index 0000000..9a691ae Binary files /dev/null and b/resources/scripts/__pycache__/Push_back_Prompt.cpython-310.pyc differ diff --git a/resources/scripts/__pycache__/clip.cpython-310.pyc b/resources/scripts/__pycache__/clip.cpython-310.pyc new file mode 100644 index 0000000..8d5f2db Binary files /dev/null and b/resources/scripts/__pycache__/clip.cpython-310.pyc differ diff --git a/resources/scripts/__pycache__/getgrame.cpython-310.pyc b/resources/scripts/__pycache__/getgrame.cpython-310.pyc new file mode 100644 index 0000000..e0d6613 Binary files /dev/null and b/resources/scripts/__pycache__/getgrame.cpython-310.pyc differ diff --git a/resources/scripts/__pycache__/iamge_to_video.cpython-310.pyc b/resources/scripts/__pycache__/iamge_to_video.cpython-310.pyc new file mode 100644 index 0000000..32344f7 Binary files /dev/null and b/resources/scripts/__pycache__/iamge_to_video.cpython-310.pyc differ diff --git a/resources/scripts/__pycache__/public_tools.cpython-310.pyc b/resources/scripts/__pycache__/public_tools.cpython-310.pyc new file mode 100644 index 0000000..0b8a975 Binary files /dev/null and b/resources/scripts/__pycache__/public_tools.cpython-310.pyc differ diff --git a/resources/scripts/__pycache__/shotSplit.cpython-310.pyc b/resources/scripts/__pycache__/shotSplit.cpython-310.pyc new file mode 100644 index 0000000..ffa2b1d Binary files /dev/null and b/resources/scripts/__pycache__/shotSplit.cpython-310.pyc differ diff --git a/resources/scripts/clip.py b/resources/scripts/clip.py new file mode 100644 index 0000000..ee143ed --- /dev/null +++ b/resources/scripts/clip.py @@ -0,0 +1,548 @@ +# -*- coding: utf-8 -*- +import io +import os +import sys +import public_tools +import random +import subprocess +import uuid +import json +from moviepy.editor import AudioFileClip, VideoFileClip +from pydub import AudioSegment +import iamge_to_video + +# sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8") + +MATERIAL_FOLDER = "Y:\\D\\素材\\素材,自选\\做菜(2)" + + +class Clip: + """ + 剪辑合并的类 + """ + + def __init__(self, cript_directory, config_path) -> None: + self.audio_duration = None + self.cript_directory = cript_directory + self.ID = str(uuid.uuid4()) + self.ASS_ID = str(uuid.uuid4()) + self.TEMP_FOLDER = os.path.join(cript_directory, "Temp\\" + self.ID) + self.ASS_FILE_PATH = os.path.join( + self.TEMP_FOLDER, self.ASS_ID + ".ass" + ).replace("\\", "/") + self.config_path = config_path + self.ffmpeg_path = ( + "../package/ffmpeg-2023-12-07-git-f89cff96d0-full_build/bin/ffmpeg" + ) + self.ffprobe_path = ( + "../package/ffmpeg-2023-12-07-git-f89cff96d0-full_build/bin/ffprobe" + ) + self.getInitData() + pass + + def getInitData(self): + """ + 初始化数据的方法 + """ + self.public_tools = public_tools.PublicTools() + with open(self.config_path, "r", encoding="utf-8") as file: + self.config_json = json.load(file) + self.srt_config = self.config_json["srt_config"] + self.image_folder = self.config_json["image_folder"] + self.video_resolution_x = self.config_json["video_resolution_x"] + self.video_resolution_y = self.config_json["video_resolution_y"] + self.background_music_folder = self.config_json["background_music_folder"] + self.srt_file_path = self.config_json["srt_path"] + self.audio_path = self.config_json["audio_path"] + self.mp4_file_txt = self.config_json["mp4_file_txt"] + self.outpue_file = self.config_json["outpue_file"].replace("\\", "/") + self.srt_style = self.config_json["srt_style"] + self.friendly_reminder = self.config_json["friendly_reminder"] + self.audio_sound_size = self.config_json["audio_sound_size"] + self.background_music_sound_size = self.config_json[ + "background_music_sound_size" + ] + self.keyFrame = self.config_json["keyFrame"] + + self.frameRate = (self.config_json["frameRate"],) + self.bitRate = self.config_json["bitRate"] + + # 图片数据 + self.iamge_to_video = iamge_to_video.ImageToVideo() + self.iamge_to_video.fps = self.config_json["frameRate"] + self.iamge_to_video.video_size = ( + self.video_resolution_x, + self.video_resolution_y, + ) + self.iamge_to_video.bitRate = self.bitRate + + # 随机背景音乐 + if self.background_music_folder == "": + pass + else: + backgroun_music_list1 = self.public_tools.list_files_by_extension( + self.background_music_folder, ".mp3" + ) + backgroun_music_list2 = self.public_tools.list_files_by_extension( + self.background_music_folder, ".wav" + ) + backgroun_music_list = backgroun_music_list1 + backgroun_music_list2 + self.background_music = random.choice(backgroun_music_list) + + # 修改状态 + self.config_json["status"] = "generating" + with open(self.config_path, "w", encoding="utf-8") as file: + json.dump(self.config_json, file, ensure_ascii=False, indent=4) + pass + + # 获取srt配置文件并修改srt数据 + def getConfigJson(self): + with open(self.srt_config, "r", encoding="utf-8") as file: + self.config_json = json.load(file) + # 修改最后的视频的长度 + # 获取音频的时间 + self.GetAudioDuration() + # print(self.audio_duration) + # 直接修改 + self.config_json["srt_time_information"][ + len(self.config_json["srt_time_information"]) - 1 + ]["end_time"] = self.audio_duration + + for i in range(len(self.config_json["srt_time_information"])): + if i == 0: + self.config_json["srt_time_information"][i]["start_time"] = 0 + elif i == len(self.config_json["srt_time_information"]) - 1: + pass + else: + # 将当前的 end_time 设置为 下一个的 start_time,最后一个数据不设置 + self.config_json["srt_time_information"][i]["end_time"] = ( + self.config_json["srt_time_information"][i + 1]["start_time"] + ) + + # 将AI生成的图片生成一个个的小视频 + def ImageToOneVideo(self): + self.getConfigJson() + self.iamge_to_video.GenerateVideoAllImage( + self.image_folder, self.keyFrame, self.config_json + ) + + # 将生成的所有的mp4文件路径写入到txt文件中 + self.mp4_files = self.public_tools.list_files_by_extension( + self.image_folder, ".mp4" + ) + self.mp4_files.sort() + if os.path.exists(self.mp4_file_txt): + os.remove(self.mp4_file_txt) + # 打开文件并写入数据 + with open(self.mp4_file_txt, "w", encoding="utf-8") as file: + for line in self.mp4_files: + # 写入每行数据,并在每行末尾添加换行符 + file.write("file '" + line + "'\n") + # print(self.mp4_files) + + pass + + # 获取音视频的时间长短 + def GetAudioVideoDuration(self, path): + try: + # 获取文件的后缀 + type = os.path.splitext(path)[1] + if type.upper() == ".MP3": + mp3_audio = AudioFileClip(path) + mp3_duration = mp3_audio.duration * 1000 + mp3_audio.close() + return mp3_duration + elif type.upper() == ".WAV": + wav_audio = AudioFileClip(path) + wav_duration = wav_audio.duration * 1000 + wav_audio.close() + return wav_duration + elif type.upper() == ".MP4": + video = VideoFileClip(path) + video_duration = video.duration * 1000 + video.close() + return video_duration + else: + raise ValueError("参数类型错误") + except Exception as e: + raise ValueError(e) + + # 创建临时文件夹 + def CreateTempFolder(self): + try: + # 判断Temp文件是不是存在 + this_path = self.cript_directory + isExitTemp = public_tools.check_if_folder_exists(this_path, "Temp") + temp = os.path.join(this_path, "Temp") + if not isExitTemp: + os.makedirs(os.path.join(this_path, "Temp"), exist_ok=True) + isExitTemp = public_tools.check_if_folder_exists( + os.path.join(this_path, "Temp"), self.ID + ) + if not isExitTemp: + os.makedirs(os.path.join(temp, self.ID), exist_ok=True) + + except Exception as e: + raise ValueError(e) + + # 获取音频的时间 + def GetAudioDuration(self): + if self.audio_duration: + pass + else: + self.audio_duration = self.GetAudioVideoDuration(self.audio_path) + + # 匹配视频,返回一个txt文件地址 + def AddVideoToList(self): + video_duration = 0 + IsContinue = True + txt_list = [] + # 获取音频的时长 + self.GetAudioDuration() + # print("音频时长:", self.audio_duration) + # 创建临时文件夹 + self.CreateTempFolder() + # 开始匹配时长,从素材文件夹中 + material_list = self.public_tools.list_files_by_extension( + MATERIAL_FOLDER, ".mp4" + ) + + # 开始处理素材,随机获取,计算时间,生成tmp和txt文件 + # print(random.choice(material_list)) + i = 0 + while True: + random_path = random.choice(material_list) + # print(random_path) + # 对视频进行处理(加速,去头,去尾,镜像,放大,静音) + output_file = os.path.join(self.TEMP_FOLDER, str(i) + ".mp4") + start_time = 5000 # 开头删除5秒 + total_duration = self.GetAudioVideoDuration( + random_path + ) # 假设视频总时长为60秒 + end_time = 3000 # 结尾删除5秒 + + # 计算出需要保留的部分的长度 + duration = total_duration - start_time - end_time + if duration <= 0: + duration = total_duration + + video_duration += duration + if video_duration > self.audio_duration: + duration = duration - (video_duration - self.audio_duration) + IsContinue = False + + start_time = f"{int(start_time // 3600000):02d}:{int((start_time % 3600000) // 60000):02d}:{(start_time % 60000) / 1000:.3f}" + duration = f"{int(duration // 3600000):02d}:{int((duration % 3600000) // 60000):02d}:{(duration % 60000) / 1000:.3f}" + # 添加txtlist表 + txt_list.append(f"file '{os.path.abspath(output_file)}'") + # 删除开头,结尾,镜像,加速,放大 + subprocess.run( + [ + self.ffmpeg_path, + "-hwaccel", + "cuda", # 启用 CUDA 硬件加速 + "-c:v", + "h264_cuvid", # 使用 NVIDIA CUVID 解码器进行解码 + "-i", + random_path, + "-ss", + str(start_time), + "-t", + str(duration), + "-vf", + "hflip,setpts=1*PTS,format=yuv420p,scale=iw*1.1:ih*1.1,crop=iw/1.1:ih/1.1", + "-an", + "-b:v", + "5000k", + "-c:v", + "h264_nvenc", + "-preset", + "fast", + "-loglevel", + "error", + output_file, + ], + check=True, + stderr=subprocess.PIPE, + ) + i += 1 + if not IsContinue: + self.vide_list_txt = os.path.join( + self.TEMP_FOLDER, str(uuid.uuid4()) + ".txt" + ) + with open(self.vide_list_txt, "w") as f: + for item in txt_list: + f.write(str(item) + "\n") + break + + # 处理音频 + def ModifyBackGroundMusic(self): + self.GetAudioDuration() + self.CreateTempFolder() + background_music = [] + # 先处理背景音乐,时间超长裁剪,不够长循环 + background_music1 = self.public_tools.list_files_by_extension( + self.background_music_folder, ".mp3" + ) + background_music2 = self.public_tools.list_files_by_extension( + self.background_music_folder, ".wav" + ) + background_music = background_music1 + background_music2 + self.background_music_path = random.choice(background_music) + + # print("背景音乐" + self.background_music_path) + + # 如果输入文件不是WAV,需要先转换为WAV + if not self.background_music_path.lower().endswith(".wav"): + audio = AudioSegment.from_file(self.background_music_path).export( + format="wav" + ) + audio = AudioSegment.from_wav(audio) + else: + audio = AudioSegment.from_wav(self.background_music_path) + + # 获取背景音乐的长度 + duration_background_music = len(audio) + + # 如果音频长度超过指定长度,则裁剪 + if duration_background_music > self.audio_duration: + audio = audio[: self.audio_duration] + # 如果音频长度小于指定长度,则循环补齐 + else: + while duration_background_music < self.audio_duration: + audio += audio + duration_background_music = len(audio) + audio = audio[: self.audio_duration] + + # 将背景音乐写入到Temp文件中 + self.background_music_path = os.path.join( + self.TEMP_FOLDER, str(uuid.uuid4()) + ".wav" + ) + + audio.export(self.background_music_path, format="wav") + + # 合并两个音乐 + def Merge_Audio( + self, audio_path1, background_music_path, audio_db, backgroud_music_db + ): + # 转换格式 + def convert_to_wav(audio_path): + """如果音频不是WAV格式,则转换为WAV格式""" + if not audio_path.lower().endswith(".wav"): + sound = AudioSegment.from_file(audio_path) + audio_path = audio_path.rsplit(".", 1)[0] + ".wav" # 创建新WAV文件路径 + sound.export(audio_path, format="wav") # 导出为WAV格式 + return AudioSegment.from_wav(audio_path) + + self.mix_audio = os.path.join(self.TEMP_FOLDER, str(uuid.uuid4()) + ".wav") + # 转换音频格式为WAV并加载 + audio1 = convert_to_wav(audio_path1) + audio2 = convert_to_wav(background_music_path) + # 调整音频文件的分贝量 + adjusted_audio1 = audio1 + audio_db # 第一个音频的音量增加db_change1分贝 + adjusted_audio2 = ( + audio2 + backgroud_music_db + ) # 第二个音频的音量增加db_change2分贝 + # 合并音频 + combined_audio = adjusted_audio1.overlay(adjusted_audio2) + + # 导出合并后的音频为WAV格式 + combined_audio.export(self.mix_audio, format="wav") + + # 处理字幕样式,使用ass + def ConvertSubtitles( + self, + font_name="文悦新青年体 (非商用) W8", + font_size="80", + primary_colour="&H0CE0F9", + alignment="5", + positionX=0, + positionY=0, + ): + # 将srt转换为ass + subprocess.run( + [ + self.ffmpeg_path, + "-i", + self.srt_file_path, + self.ASS_FILE_PATH, + "-loglevel", + "error", + ], + check=True, + stderr=subprocess.PIPE, + ) + + modified_lines = [] # 创建一个新的列表来保存修改后的行 + + # 修改字幕 + with open(self.ASS_FILE_PATH, "r", encoding="utf-8") as file: + lines = file.readlines() + + for line in lines: + # 修改分辨率 + if line.startswith("PlayResX:"): + line = "PlayResX: " + str(self.video_resolution_x) + "\n" + if line.startswith("PlayResY:"): + line = "PlayResY: " + str(self.video_resolution_y) + "\n" + if line.startswith("ScaledBorderAndShadow:"): + line = "ScaledBorderAndShadow: no" + "\n" + + if line.startswith("Style:"): + parts = line.split(",") + # 修改样式设置 + parts[1] = font_name # 字体名字 + parts[2] = str(font_size) # 字体大小 + parts[3] = "&H" + primary_colour # 字体颜色 + parts[4] = "&H" + primary_colour # 第二颜色 + parts[5] = "&H0" # OutlineColour + parts[6] = "&H0" # BackColour + parts[7] = "0" # Bold + parts[8] = "0" # Italic + parts[9] = "0" # Underline + parts[10] = "0" # StrikeOut + parts[11] = "100" # ScaleX 缩放X + parts[12] = "100" # ScaleY 缩放Y + parts[13] = "0" # Spacing + parts[14] = "0" # Angle + parts[15] = "0" # BorderStyle + parts[16] = "1" # Outline + parts[17] = "0" # Shadow + parts[18] = alignment # Alignment + parts[19] = "0" # MarginL + parts[20] = "0" # MarginR + parts[21] = "0" # MarginV + parts[22] = "1" # Encoding + line = ",".join(parts) + # 添加坐标信息 + if line.startswith("Dialogue:"): + texts = line.split(",", 9) + text = texts[9] + # 检查文本中是否已经包含\pos标签 + if "\\pos(" not in text: + text = "{\\pos(%d,%d)}" % (positionX, positionY) + text + texts[9] = text + line = ",".join(texts) + + modified_lines.append(line) # 添加修改后的行到新列表 + # 添加全局水印并设置和视频的时长一直 + # Dialogue: 0,0:00:01.00,0:00:05.00,Default,,0,0,0,,{\fs24\an8\alpha80}这是一段示例文本。 + modified_lines.append( + "Dialogue: 0,0:00:00.00," + + public_tools.format_time_ms(self.audio_duration) + + ",Default,,0,0,0,," + + "{\\pos(" + + str(self.friendly_reminder["positionX"]) + + "," + + str(self.friendly_reminder["positionY"]) + + ")\\fs" + + str(self.friendly_reminder["fontSize"]) + + "\\alpha&H" + + str(self.friendly_reminder["transparent"]) + + "&\\fn" + + self.friendly_reminder["fontName"] + + "\\c" + + self.public_tools.convert_rrggbb_to_bbggrr( + self.friendly_reminder["fontColor"] + ) + + "}" + + self.friendly_reminder["showText"] + ) + with open(self.ASS_FILE_PATH, "w", encoding="utf-8") as file: + file.writelines(modified_lines) + + # 合并视频并添加音乐和字幕 + def MergeVideoAndAudio(self): + command = [ + self.ffmpeg_path, + "-f", + "concat", + "-safe", + "0", + "-i", + self.mp4_file_txt, + "-i", + self.mix_audio, + "-vf", + f"subtitles=./Temp/{self.ID}/{self.ASS_ID}.ass", + # f"subtitles= {ASS_FILE_PATH}", + "-c:v", + "h264_nvenc", + "-preset", + "fast", + "-rc:v", + "cbr", + "-b:v", + str(self.bitRate) + "k", + "-c:a", + "aac", + "-strict", + "-2", + "-loglevel", + "error", + self.outpue_file, + ] + subprocess.run(command, check=True, stderr=subprocess.PIPE) + # subprocess.run(command) + pass + + def DeleteFile(self): + """ + 删除已经存在的视频文件 + """ + # 删除图片目录下面的所有的MP4文件 + out_mp4_list = self.public_tools.list_files_by_extension( + self.image_folder, ".mp4" + ) + for mp4 in out_mp4_list: + self.public_tools.delete_path(mp4) + + # 删除输出文件 + self.public_tools.delete_path(self.outpue_file) + pass + + # 合并视频并添加剪辑 + def MergeVideosAndClip(self): + # 删除文件 + self.DeleteFile() + + # 将图片生成视频 + self.ImageToOneVideo() + + # # 处理音乐 + self.ModifyBackGroundMusic() + + # # 合并音乐 + self.Merge_Audio( + self.audio_path, + self.background_music_path, + self.audio_sound_size, + self.background_music_sound_size, + ) + + # # 素材处理 + # self.AddVideoToList() + + # 字幕处理 + self.ConvertSubtitles( + self.srt_style["fontName"], + str(self.srt_style["fontSize"] * (self.video_resolution_x / 1440)), + self.public_tools.convert_rrggbb_to_bbggrr(self.srt_style["fontColor"]), + "5", + self.srt_style["positionX"] * (self.video_resolution_x / 1440), + self.srt_style["positionY"] * (self.video_resolution_y / 1080), + ) + + # 视频合并 + self.MergeVideoAndAudio() + + # 删除临时文件夹 + self.public_tools.delete_path(self.TEMP_FOLDER) + # 删除临时的视频 + del_mp4_list = self.public_tools.list_files_by_extension( + self.image_folder, ".mp4" + ) + for f in del_mp4_list: + self.public_tools.delete_path(f) + + pass diff --git a/resources/scripts/ffmpeg b/resources/scripts/ffmpeg new file mode 100644 index 0000000..e69de29 diff --git a/resources/scripts/getgrame.py b/resources/scripts/getgrame.py new file mode 100644 index 0000000..b07d723 --- /dev/null +++ b/resources/scripts/getgrame.py @@ -0,0 +1,169 @@ +# -*- coding: utf-8 -*- +import io +import sys +import public_tools +import json +import subprocess +import os +import shutil + +# sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') + + +def init(draft_path, out_dir, package_path): + + class TimeObject: + def __init__(self, **kwargs): + self.__dict__.update(kwargs) + + # 剪映草稿目录 + draft_folder = draft_path + # 调用函数并获取选定的文件夹 + + json_path = os.path.join(draft_folder, "draft_content.json") + with open(json_path, "r", encoding="utf-8") as file: + json_data = json.load(file) + + if public_tools.check_if_folder_exists(out_dir, "tmp"): + try: + shutil.rmtree(os.path.join(out_dir, "tmp")) + print("文件夹 tmp 删除成功。") + except OSError as e: + print(f"删除文件夹失败:{e}") + + try: + os.mkdir(os.path.join(out_dir, "tmp")) + os.mkdir(os.path.join(out_dir + "/tmp", "input_crop")) + print("文件夹创建成功。") + except OSError as e: + print(f"创建文件夹失败:{e}") + + # 获取轨道 + def find_node(nodes, type, val): + for node in nodes: + if node[type] == val: + return node + + # 获取剪映的主轨道 + video_nodes = find_node(json_data["tracks"], "type", "video")["segments"] + + # 先获取所有的场景的开始结束持续时间 + + # 获取分割数据 + num = 1 + time_list = [] + for video_node in video_nodes: + # 开始时间 + start_time = video_node["target_timerange"]["start"] + # 结束时间 + end_time = ( + video_node["target_timerange"]["start"] + + video_node["target_timerange"]["duration"] + ) + # 持续时间 + duration_time = end_time - start_time + # 中间帧时间 + middle_time = (end_time - start_time) / 2 + middle_time = start_time + middle_time + + # 获取文件地址 + video_id = video_node["material_id"] + materials_node = find_node(json_data["materials"]["videos"], "id", video_id) + video_path = materials_node["path"] + + time_list.append( + TimeObject( + start_time=start_time, + end_time=end_time, + duration_time=duration_time, + middle_time=middle_time, + video_path=video_path, + ) + ) + num += 1 + + # 检查开始时间和结束时间是不是满足包含条件 + def is_within_range(video_obj, text_start_time, text_end_time): + return ( + text_start_time >= video_obj.start_time + and text_end_time <= video_obj.end_time + ) + + # 处理文案 + text_nodes = find_node(json_data["tracks"], "type", "text")["segments"] + + num = 0 + text_value_list = [] + temp_text_value = "" + for text_node in text_nodes: + text_start_time = text_node["target_timerange"]["start"] + text_end_time = ( + text_node["target_timerange"]["start"] + + text_node["target_timerange"]["duration"] + ) + text_material_id = text_node["material_id"] + text_content = find_node( + json_data["materials"]["texts"], "id", text_material_id + )["content"] + text_content_json = json.loads(text_content) + + text_value = "".join(text_content_json["text"]) + "。" + + if is_within_range(time_list[num], text_start_time, text_end_time): + temp_text_value += text_value + else: + text_value_list.append(temp_text_value) + temp_text_value = text_value + num += 1 + + text_value_list.append(temp_text_value) + + print("场景数:" + str(len(text_value_list))) + + # 写入txt文件 + with open(os.path.join(out_dir, "文案.txt"), "w", encoding="utf-8") as file: + for line in text_value_list: + # 判断是不是最后一行,最后一行不需要换行 + if text_value_list.index(line) == len(text_value_list) - 1: + file.write(line) + else: + file.write(line + "\n") + + ffmpeg_path = os.path.join( + package_path, "ffmpeg-2023-12-07-git-f89cff96d0-full_build/bin/ffmpeg" + ) + # 抽取关键帧 + num = 1 + for video_list in time_list: + output_file = os.path.join( + out_dir, "tmp/input_crop/" + str(num).zfill(5) + ".png" + ) + # FFmpeg命令 + ffmpeg_command = [ + ffmpeg_path, # 指定FFmpeg可执行文件的路径 + "-ss", + str( + public_tools.convert_to_seconds(video_list.middle_time, 1) + ), # 开始时间为1.2秒 + "-i", + video_list.video_path, # 输入文件 + "-frames:v", + "1", # 抽取1帧 + output_file, # 输出文件 + "-loglevel", + "error", + ] + + result = subprocess.run( + ffmpeg_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE + ) + + # 检查返回代码 + if result.returncode == 0: + print("抽取成功,结果保存在", output_file) + else: + print("抽取失败,错误信息:", result.stderr.decode("utf-8")) + num += 1 + sys.stdout.flush() # 强制立即刷新输出缓冲区 + + print(f"抽取完成,结果保存在 {output_file}") diff --git a/resources/scripts/iamge_to_video.py b/resources/scripts/iamge_to_video.py new file mode 100644 index 0000000..9c7f8f0 --- /dev/null +++ b/resources/scripts/iamge_to_video.py @@ -0,0 +1,473 @@ +# -*- coding: utf-8 -*- +import cv2 +import numpy as np +import os +import glob +import public_tools +import subprocess +import json + + +class ImageToVideo: + def __init__(self) -> None: + self.frames = 0 + self.public_tools = public_tools.PublicTools() + self.ffmpeg_path = ( + "../package/ffmpeg-2023-12-07-git-f89cff96d0-full_build/bin/ffmpeg" + ) + self.ffprobe_path = ( + "../package/ffmpeg-2023-12-07-git-f89cff96d0-full_build/bin/ffprobe" + ) + pass + + def create_video_from_image_with_center_offset( + self, + image_path, + duration, + start_offset, + end_offset, + fps=60, + video_size=(1440, 1080), + offest_type="KFTypePositionY", + ): + """ + 将图片合并成视频,并添加关键帧 + """ + # 使用Python的open函数以二进制模式读取图片文件 + with open(image_path, "rb") as file: + img_bytes = file.read() + + # 将字节流解码成图片 + img = cv2.imdecode(np.frombuffer(img_bytes, np.uint8), cv2.IMREAD_UNCHANGED) + + img_resized = self.get_scaled_image( + img, video_size, offest_type, start_offset, end_offset + ) + + if offest_type == "KFTypePositionY": + video_name = self.create_video_from_image_Y( + image_path, + fps, + video_size, + duration, + start_offset, + end_offset, + img_resized, + ) + elif offest_type == "KFTypePositionX": + video_name = self.create_video_from_image_X( + image_path, + fps, + video_size, + duration, + start_offset, + end_offset, + img_resized, + ) + elif offest_type == "KFTypeScale": + video_name = self.create_video_from_image_scale( + image_path, + fps, + video_size, + duration, + start_offset, + end_offset, + img, + ) + else: + return ValueError("关键帧没有设置正确的参数") + + return video_name + + def create_video_from_image_scale( + self, + image_path, + fps, + video_size, + duration, + start_scale, + end_scale, + img, + ): + """ + 缩放关键帧生成视频 + """ + + scale_width = video_size[0] / img.shape[1] + scale_height = video_size[1] / img.shape[0] + default_scale = max(scale_width, scale_height) + + # 创建视频写入器 + video_name = f"{image_path.split('/')[-1].split('.')[0]}.mp4" + out = cv2.VideoWriter( + video_name, cv2.VideoWriter_fourcc(*"mp4v"), fps, video_size + ) + total_frames = round(duration * fps) + self.frames += total_frames + # 计算偏移变化率 + offset_change_per_frame = float(end_scale - start_scale) / total_frames // 2 + if start_scale < 0: + start_scale = 0 + + current_scale = start_scale + + for _ in range(int(duration * fps)): + # 创建一个空白画布 + canvas = np.zeros((video_size[1], video_size[0], 3), dtype=np.uint8) + + # 根据当前的缩放比例调整图片大小 + img_resized = cv2.resize( + img, + None, + fx=default_scale + current_scale, + fy=default_scale + current_scale, + ) + + center_x, center_y = video_size[0] // 2, video_size[1] // 2 + + # 计算图片在画布上的绘制位置 + start_x = center_x - img_resized.shape[1] // 2 + start_y = center_y - img_resized.shape[0] // 2 + + # 安全检查,确保不会复制超出边界的区域 + src_x1 = max(-start_x, 0) + dst_x1 = max(start_x, 0) + copy_width = min(img_resized.shape[1] - src_x1, video_size[0] - dst_x1) + + src_y1 = max(-start_y, 0) + dst_y1 = max(start_y, 0) + copy_height = min(img_resized.shape[0] - src_y1, video_size[1] - dst_y1) + + if copy_height > 0 and copy_width > 0: + canvas[dst_y1 : dst_y1 + copy_height, dst_x1 : dst_x1 + copy_width] = ( + img_resized[ + src_y1 : src_y1 + copy_height, src_x1 : src_x1 + copy_width + ] + ) + + # 更新偏移量 + current_scale += offset_change_per_frame + out.write(canvas) + out.release() + return video_name + + def create_video_from_image_X( + self, + image_path, + fps, + video_size, + duration, + start_offset, + end_offset, + img_resized, + ): + """ + 左右关键帧生成视频 + """ + # 创建视频写入器 + video_name = f"{image_path.split('/')[-1].split('.')[0]}.mp4" + out = cv2.VideoWriter( + video_name, cv2.VideoWriter_fourcc(*"mp4v"), fps, video_size + ) + total_frames = round(duration * fps) + self.frames += total_frames + # 计算偏移变化率 + offset_change_per_frame = float(end_offset - start_offset) / total_frames + current_offset = start_offset + + for _ in range(int(duration * fps)): + # 创建一个空白画布 + canvas = np.zeros((video_size[1], video_size[0], 3), dtype=np.uint8) + + center_x, center_y = video_size[0] // 2, video_size[1] // 2 + + # 计算当前帧的图片中心偏移位置 + # offset_y = int(current_offset * scale) # 根据放大比例调整偏移量 + offset_x = int(current_offset * 1) # 根据放大比例调整偏移量 + # offset_y = int(((new_height - img.shape[0]) // 2) * 1) + # start_y = center_y - img_resized.shape[0] // 2 + offset_y + + # 计算图片在画布上的绘制位置 + start_x = center_x - img_resized.shape[1] // 2 + offset_x + start_y = center_y - img_resized.shape[0] // 2 + + # 安全检查,确保不会复制超出边界的区域 + src_x1 = max(-start_x, 0) + dst_x1 = max(start_x, 0) + copy_height = min(img_resized.shape[0] - src_x1, video_size[1] - dst_x1) + # copy_width = min(video_size[0], img_resized.shape[1]) + + # 调整图片复制区域的计算 + src_y1 = max(-start_y, 0) + dst_y1 = max(start_y, 0) + copy_width = min(img_resized.shape[1] - src_y1, video_size[0] - dst_y1) + + if copy_height > 0 and copy_width > 0: + canvas[dst_y1 : dst_y1 + copy_height, dst_x1 : dst_x1 + copy_width] = ( + img_resized[ + src_y1 : src_y1 + copy_height, src_x1 : src_x1 + copy_width + ] + ) + + # 更新偏移量 + current_offset += offset_change_per_frame + out.write(canvas) + out.release() + return video_name + + def create_video_from_image_Y( + self, + image_path, + fps, + video_size, + duration, + start_offset, + end_offset, + img_resized, + ): + """ + 上下关键帧生成视频 + """ + # 创建视频写入器 + video_name = f"{image_path.split('/')[-1].split('.')[0]}.mp4" + out = cv2.VideoWriter( + video_name, cv2.VideoWriter_fourcc(*"mp4v"), fps, video_size + ) + total_frames = round(duration * fps) + self.frames += total_frames + # 计算偏移变化率 + offset_change_per_frame = float(end_offset - start_offset) / total_frames + current_offset = start_offset + + for _ in range(int(duration * fps)): + # 创建一个空白画布 + canvas = np.zeros((video_size[1], video_size[0], 3), dtype=np.uint8) + + center_x, center_y = video_size[0] // 2, video_size[1] // 2 + + # 计算当前帧的图片中心偏移位置 + # offset_y = int(current_offset * scale) # 根据放大比例调整偏移量 + offset_y = int(current_offset * 1) # 根据放大比例调整偏移量 + # offset_x = int(((new_width - img.shape[1]) // 2) * 1) + # start_x = center_x - img_resized.shape[1] // 2 + offset_x + + # 计算图片在画布上的绘制位置 + start_x = center_x - img_resized.shape[1] // 2 + start_y = center_y - img_resized.shape[0] // 2 + offset_y + + # 安全检查,确保不会复制超出边界的区域 + src_y1 = max(-start_y, 0) + dst_y1 = max(start_y, 0) + copy_height = min(img_resized.shape[0] - src_y1, video_size[1] - dst_y1) + # copy_width = min(video_size[0], img_resized.shape[1]) + + # 调整图片复制区域的计算 + src_x1 = max(-start_x, 0) + dst_x1 = max(start_x, 0) + copy_width = min(img_resized.shape[1] - src_x1, video_size[0] - dst_x1) + + if copy_height > 0 and copy_width > 0: + canvas[dst_y1 : dst_y1 + copy_height, dst_x1 : dst_x1 + copy_width] = ( + img_resized[ + src_y1 : src_y1 + copy_height, src_x1 : src_x1 + copy_width + ] + ) + + # 更新偏移量 + current_offset += offset_change_per_frame + out.write(canvas) + out.release() + return video_name + + def get_sorted_images(self, folder_path, image_extensions=[".jpg", ".png"]): + """ + 获取图片,排序 + """ + # 构建一个匹配所有指定扩展名的模式 + patterns = [os.path.join(folder_path, "*" + ext) for ext in image_extensions] + # 列表用于存储找到的图片文件 + image_files = [] + # 遍历所有模式,匹配文件 + for pattern in patterns: + image_files.extend(glob.glob(pattern)) + # 按文件名排序 + image_files.sort() + return image_files + + def get_scaled_image(self, img, video_size, offest_type, start_offest, end_offest): + """ + 根据关键帧类型。获取当前图片的放大比例 + """ + scale_width = video_size[0] / img.shape[1] + scale_height = video_size[1] / img.shape[0] + scale = max(scale_width, scale_height) + + if offest_type == "KFTypePositionY": + # 检查最大偏移量是否大于图片高度 + all_offset = abs(start_offest) + abs(end_offest) + video_size[1] + + if all_offset > img.shape[0] * scale: + # if all_offset > img.shape[0]: + scale = max(scale, all_offset / img.shape[0]) + + max_offset = max(abs(start_offest), abs(end_offest)) + if max_offset > img.shape[0]: + # 如果最大偏移量大于图片高度,则进一步放大图像 + scale = max(scale, video_size[1] / (img.shape[0] - max_offset)) + + elif offest_type == "KFTypePositionX": + # 检查最大偏移量是否大于图片宽度 + all_offset = abs(start_offest) + abs(end_offest) + video_size[0] + + # 判断最大高度和当前图片当前放大倍率之间的大小 + if all_offset > img.shape[1] * scale: + # if all_offset > img.shape[0]: + scale = max(scale, all_offset / img.shape[1]) + + max_offset = max(abs(start_offest), abs(end_offest)) + if max_offset > img.shape[1]: + # 如果最大偏移量大于图片高度,则进一步放大图像 + scale = max(scale, video_size[0] / (img.shape[1] - max_offset)) + + elif offest_type == "KFTypeScale": + pass + + else: + return ValueError("关键帧没有设置正确的参数") + + new_width = int(img.shape[1] * scale) + new_height = int(img.shape[0] * scale) + img_resized = cv2.resize( + img, (new_width, new_height), interpolation=cv2.INTER_LINEAR + ) + return img_resized + + def GenerateVideoAllImage(self, image_dir, offset, config_json): + """ + 生成所有的图片 + """ + config_data = config_json["srt_time_information"] + isDirection = False + sort_images = self.get_sorted_images(image_dir) + # 生成所有的图片视频 + for image_file in sort_images: + filename = os.path.splitext(os.path.basename(image_file))[ + 0 + ] # 获取文件名,不包括扩展名 + number = int(filename.split("_")[-1]) + if number == 188: + print(number) + filtered_data = [item for item in config_data if item["no"] == number] + # 判断是不是空,空的话就跳过 + if len(filtered_data) == 0: + return ValueError("没有找到对应的关键帧") + + print(filtered_data) + + video_arr = [] + # 计算当前图片的偏移量,以3200像素为基准 + + with open(image_file, "rb") as file: + img_bytes = file.read() + + # 将字节流解码成图片 + img = cv2.imdecode(np.frombuffer(img_bytes, np.uint8), cv2.IMREAD_UNCHANGED) + img_height, img_width = img.shape[:2] + proportion_height = img_height / 3200 + proportion_width = img_height / 3200 + + if offset["name"] == "KFTypePositionY": + offsetValue = offset["up_down"] * proportion_height + elif offset["name"] == "KFTypePositionX": + offsetValue = offset["left_right"] * proportion_width + elif offset["name"] == "KFTypeScale": + offsetValue = offset["scale"] + else: + return ValueError("关键帧没有设置正确的参数") + + # offsetValue = offset + if isDirection: + start_offset = offsetValue + end_offset = -offsetValue + isDirection = False + else: + start_offset = -offsetValue + end_offset = offsetValue + isDirection = True + + video_path = self.create_video_from_image_with_center_offset( + image_file, + (filtered_data[0]["end_time"] - filtered_data[0]["start_time"]) / 1000, + start_offset, + end_offset, + self.fps, + self.video_size, + offset["name"], + ) + video_arr.append(video_path) + print(video_path) + + # 微调所有的视频 + mp4_folder = self.public_tools.list_files_by_extension(image_dir, ".mp4") + for mp4_path in mp4_folder: + filename = os.path.splitext(os.path.basename(mp4_path))[ + 0 + ] # 获取文件名,不包括扩展名 + number = int(filename.split("_")[-1]) + if number == 188: + print(number) + + filtered_data = [item for item in config_data if item["no"] == number] + + # print(filtered_data) + cmd = [ + self.ffprobe_path, + "-v", + "error", + "-select_streams", + "v:0", + "-show_entries", + "stream=duration", + "-of", + "json", + mp4_path, + ] + result = subprocess.run( + cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT + ) + duration_sec = json.loads(result.stdout)["streams"][0]["duration"] + duration_ms = int(float(duration_sec) * 1000) # 将秒转换为毫秒 + print( + duration_ms, + (filtered_data[0]["end_time"] - filtered_data[0]["start_time"]), + ) + temp_mp4_path = os.path.join(image_dir, "temp_" + str(number) + ".mp4") + # 开始微调 + cmd = [ + self.ffmpeg_path, + "-i", + mp4_path, + "-filter:v", + "setpts=PTS*" + + str( + (filtered_data[0]["end_time"] - filtered_data[0]["start_time"]) + / duration_ms + ), + "-c:v", + "h264_nvenc", + "-preset", + "fast", + "-rc:v", + "cbr", + "-b:v", + str(self.bitRate) + "k", + temp_mp4_path, + "-loglevel", + "error", + "-an", + ] + + subprocess.run(cmd, check=True) + os.remove(mp4_path) + os.rename(temp_mp4_path, mp4_path) + print(self.frames) diff --git a/resources/scripts/public_tools.py b/resources/scripts/public_tools.py new file mode 100644 index 0000000..90776a2 --- /dev/null +++ b/resources/scripts/public_tools.py @@ -0,0 +1,351 @@ +# 读取文件的方法 +import json +import os +import win32api +import win32con +import pywintypes +import shutil +import re + + +class PublicTools: + """ + 一些公用的基础方法 + """ + + def delete_path(self, path): + """ + 删除指定路径的文件或者是文件夹 + """ + # 检查路径是否存在 + if not os.path.exists(path): + return + + # 检查路径是文件还是文件夹 + if os.path.isfile(path): + # 是文件,执行删除 + try: + os.remove(path) + except Exception as e: + raise e + elif os.path.isdir(path): + # 是文件夹,执行删除 + try: + shutil.rmtree(path) + except Exception as e: + raise e + else: + raise + + def list_files_by_extension(self, folder_path, extension): + """ + 读取指定文件夹下面的所有的指定拓展文件命的文件列表 + """ + file_list = [] + for root, dirs, files in os.walk(folder_path): + for file in files: + if file.endswith(extension): + file_list.append(os.path.join(root, file)) + elif file.endswith(extension.upper()): + file_list.append(os.path.join(root, file)) + return file_list + + def get_fonts_from_registry(self, key_path): + """ + 获取注册表中安装的字体文件 + """ + font_names = [] + try: + key = win32api.RegOpenKeyEx( + ( + win32con.HKEY_LOCAL_MACHINE + if "HKEY_LOCAL_MACHINE" in key_path + else win32con.HKEY_CURRENT_USER + ), + key_path.split("\\", 1)[1], + 0, + win32con.KEY_READ, + ) + i = 0 + while True: + try: + value = win32api.RegEnumValue(key, i) + font_name = value[0] + # 使用正则表达式移除括号及其内容 + font_name = re.sub(r"\s*\([^)]*\)$", "", font_name) + font_names.append(font_name) + i += 1 + except pywintypes.error as e: + if e.winerror == 259: # 没有更多的数据 + break + else: + raise + finally: + try: + win32api.RegCloseKey(key) + except: + pass + return font_names + + def get_installed_fonts(self): + """ + 获取字体文件名称并返回 + """ + system_fonts = self.get_fonts_from_registry( + "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts" + ) + user_fonts = self.get_fonts_from_registry( + "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts" + ) + all_fonts = list(set(system_fonts + user_fonts)) # 合并并去重 + return all_fonts + + # 将RRGGBB转换为BBGGRR + def convert_rrggbb_to_bbggrr(self, rrggbb): + """ + 将RRGGBB转换为BBGGRR + """ + if len(rrggbb) == 7: + rr = rrggbb[1:3] + gg = rrggbb[3:5] + bb = rrggbb[5:7] + return bb + gg + rr + else: + return "Invalid input" + + def write_to_file(self, arr, filename): + with open(filename, "w",encoding='utf-8') as f: + for item in arr: + f.write("%s\n" % item) + + +# 读取文件 +def read_file(fileType): + txt_path = input(f"输入{fileType}文件路径:") + txt_path = remove_prefix_and_suffix(txt_path, '"', '"') + while txt_path.strip() == "": + txt_path = input(f"输入{fileType}文件路径:") + + while os.path.exists(txt_path) == False: + print("文件路径不存在错误:") + txt_path = input(f"输入{fileType}文件路径:") + txt_path = remove_prefix_and_suffix(txt_path, '"', '"') + return txt_path + + +def format_time_ms(milliseconds): + """ + 时间转换将ms->小时:分钟:秒.毫秒格式 + """ + seconds = milliseconds / 1000 + # 计算小时、分钟和秒 + hours = int(seconds // 3600) + minutes = int((seconds % 3600) // 60) + seconds = seconds % 60 + # 格式化字符串 + # 使用`%02d`确保小时和分钟总是显示为两位数,`%.2f`确保秒数显示两位小数 + formatted_time = f"{hours}:{minutes:02d}:{seconds:05.2f}" + return formatted_time + + +# 删除满足条件的开头和结尾 +def remove_prefix_and_suffix(input_str, prefix_to_remove, suffix_to_remove): + if input_str.startswith(prefix_to_remove): + # 删除开头 + input_str = input_str[len(prefix_to_remove) :] + + if input_str.endswith(suffix_to_remove): + # 删除结尾 + input_str = input_str[: -len(suffix_to_remove)] + + return input_str + + +# 判断文件夹下面是不是有特定的文件夹 +def check_if_folder_exists(parent_folder, target_folder_name): + # 获取文件夹列表 + subfolders = [f.name for f in os.scandir(parent_folder) if f.is_dir()] + + # 检查特定文件夹是否存在 + if target_folder_name in subfolders: + return True + else: + return False + + +# 检查指定文件夹中是否存在特定文件。 +def file_exists_in_folder(folder_path: str, file_name: str) -> bool: + # 构建完整的文件路径 + file_path = os.path.join(folder_path, file_name) + + # 返回文件是否存在 + return os.path.isfile(file_path) + + +# 秒数转换,保留一位小数 +def convert_to_seconds(number, count): + seconds = number / 1000000 + rounded_number = round(seconds, count) + return rounded_number + + +def is_empty(obj): + if obj is None: + return True + elif isinstance(obj, str): + return len(obj) == 0 + elif isinstance(obj, list): + return len(obj) == 0 + elif isinstance(obj, dict): + return len(obj) == 0 + return False + + +def opt_dict(obj, key, default=None): + if obj is None: + return default + if key in obj: + v = obj[key] + if not is_empty(v): + return v + return default + + +def read_config(path, webui=True): + with open(path, "r", encoding="utf-8") as f: + runtime_config = json.load(f) + + if "config" not in runtime_config: + print("no filed 'config' in json") + return None + + config = runtime_config["config"] + if "webui" not in config: + print("no filed 'webui' in 'config'") + return None + + setting_config_path = config["setting"] + if not os.path.exists(setting_config_path): + setting_config_path = "config/" + setting_config_path + if not os.path.exists(setting_config_path): + setting_config_path = "../" + setting_config_path + + # read config + with open(setting_config_path, "r", encoding="utf-8") as f: + setting_config = json.load(f) + + # set workspace parent:根目录 + if "workspace" in setting_config: + setting_config["workspace"]["parent"] = runtime_config["workspace"] + else: + setting_config["workspace"] = {"parent": runtime_config["workspace"]} + setting_config["video"] = opt_dict(runtime_config, "video") + + # merge setting config + if "setting" in config: + setting_config.update(runtime_config["setting"]) + + # webui config + if webui: + webui_config_path = config["webui"] + if not os.path.exists(webui_config_path): + webui_config_path = "config/webui/" + webui_config_path + if not os.path.exists(webui_config_path): + webui_config_path = "../" + webui_config_path + + with open(webui_config_path, "r", encoding="utf-8") as f: + webui_config = json.load(f) + + # merge webui config + if "webui" in runtime_config: + webui_config.update(runtime_config["webui"]) + + return webui_config, setting_config + return setting_config + + +TAG_MODE_NONE = "" + + +# 工作路径 +class Workspace: + + def __init__( + self, + root: str, + input: str, + output: str, + input_crop: str, + output_crop: str, + input_tag: str, + input_mask: str, + input_crop_mask: str, + crop_info: str, + ): + self.root = root + self.input = input + self.output = output + self.input_crop = input_crop + self.output_crop = output_crop + self.input_tag = input_tag + self.input_mask = input_mask + self.input_crop_mask = input_crop_mask + self.crop_info = crop_info + + +# 定义一个倍数函数 +def round_up(num, mul): + return (num // mul + 1) * mul + + +class SettingConfig: + + def __init__(self, config: dict, workParent): + self.config = config + self.webui_work_api = None + self.workParent = workParent + + def to_dict(self): + return self.__dict__ + + def get_tag_mode(self): + tag_cfg = opt_dict(self.config, "tag") + return opt_dict(tag_cfg, "mode", TAG_MODE_NONE) + + def get_tag_actions(self): + tag_cfg = opt_dict(self.config, "tag") + return opt_dict(tag_cfg, "actions", []) + + def get_workspace_config(self) -> Workspace: + workspace_config = opt_dict(self.config, "workspace") + tmp_config = opt_dict(workspace_config, "tmp") + + input = opt_dict(workspace_config, "input", "input") + output = opt_dict(workspace_config, "output", "output") + workspace_parent = self.workParent + + tmp_parent = opt_dict(tmp_config, "parent", "tmp") + input_crop = opt_dict(tmp_config, "input_crop", "input_crop") + output_crop = opt_dict(tmp_config, "output_crop", "output_crop") + input_tag = opt_dict(tmp_config, "input_tag", "input_crop") + input_mask = opt_dict(tmp_config, "input_mask", "input_mask") + input_crop_mask = opt_dict(tmp_config, "input_crop_mask", "input_crop_mask") + crop_info = opt_dict(tmp_config, "crop_info", "crop_info.txt") + + tmp_path = os.path.join(workspace_parent, tmp_parent) + + return Workspace( + workspace_parent, + os.path.join(workspace_parent, input), + os.path.join(workspace_parent, output), + os.path.join(tmp_path, input_crop), + os.path.join(tmp_path, output_crop), + os.path.join(tmp_path, input_tag), + os.path.join(tmp_path, input_mask), + os.path.join(tmp_path, input_crop_mask), + os.path.join(tmp_path, crop_info), + ) + + def enable_tag(self): + tag_cfg = opt_dict(self.config, "tag") + return opt_dict(tag_cfg, "enable", True) diff --git a/resources/scripts/shotSplit.py b/resources/scripts/shotSplit.py new file mode 100644 index 0000000..7813ebe --- /dev/null +++ b/resources/scripts/shotSplit.py @@ -0,0 +1,229 @@ +# pip install scenedetect opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple + +from scenedetect.video_manager import VideoManager +from scenedetect.scene_manager import SceneManager +from scenedetect.stats_manager import StatsManager +from scenedetect.detectors.content_detector import ContentDetector +import os +import sys +import subprocess +from huggingface_hub import hf_hub_download +from faster_whisper import WhisperModel +import public_tools +from pathlib import Path + + +# 获取智能画面分割的时间或者秒数 +def find_scenes(video_path, sensitivity): + print( + "正在计算分镜数据" + "sensitivity:" + str(sensitivity) + "path : " + video_path + ) + sys.stdout.flush() + video_manager = VideoManager([video_path]) + stats_manager = StatsManager() + scene_manager = SceneManager(stats_manager) + + # 使用contect-detector + scene_manager.add_detector(ContentDetector(threshold=float(sensitivity))) + + shijian_list = [] + + try: + video_manager.set_downscale_factor() + video_manager.start() + scene_manager.detect_scenes(frame_source=video_manager) + scene_list = scene_manager.get_scene_list() + print("分镜数据列表:") + sys.stdout.flush() + for i, scene in enumerate(scene_list): + shijian_list.append([scene[0].get_timecode(), scene[1].get_timecode()]) + print( + "Scene %2d: Start %s / Frame %d, End %s / Frame %d" + % ( + i + 1, + scene[0].get_timecode(), + scene[0].get_frames(), + scene[1].get_timecode(), + scene[1].get_frames(), + ) + ) + sys.stdout.flush() + finally: + video_manager.release() + + return shijian_list + + +# 如果不存在就创建 +def createDir(file_dir): + # 如果不存在文件夹,就创建 + if not os.path.isdir(file_dir): + os.mkdir(file_dir) + + +# 切分一个视频 +def ClipVideo(video_path, out_folder, image_out_folder, sensitivity): + shijian_list = find_scenes(video_path, sensitivity) # 多组时间列表 + shijian_list_len = len(shijian_list) + + print("总共有%s个场景" % str(shijian_list_len)) + sys.stdout.flush() + video_list = [] + for i in range(0, shijian_list_len): + start_time_str = shijian_list[i][0] + end_time_str = shijian_list[i][1] + + print("开始输出第" + str(i + 1) + "个分镜") + video_name = "{:05d}".format(i + 1) + out_video_file = os.path.join(out_folder, video_name + ".mp4") + sys.stdout.flush() + video_list.append( + { + "start_time_str": start_time_str, + "end_time_str": end_time_str, + "out_video_file": out_video_file, + "video_name": video_name, + } + ) + + # 使用 ffmpeg 裁剪视频 + subprocess.run( + [ + "ffmpeg", + "-i", + video_path, + "-ss", + start_time_str, + "-to", + end_time_str, + "-c:v", + "h264_nvenc", + "-preset", + "fast", + "-c:a", + "copy", + out_video_file, + "-loglevel", + "error", + ], + check=True, + stderr=subprocess.PIPE, + ) + + print("分镜输出完成。开始抽帧") + sys.stdout.flush() + for vi in video_list: + h, m, s = vi["start_time_str"].split(":") + start_seconds = int(h) * 3600 + int(m) * 60 + float(s) + + h, m, s = vi["end_time_str"].split(":") + end_seconds = int(h) * 3600 + int(m) * 60 + float(s) + print("正在抽帧:" + vi["video_name"]) + sys.stdout.flush() + subprocess.run( + [ + "ffmpeg", + "-ss", + str((end_seconds - start_seconds) / 2), + "-i", + vi["out_video_file"], + "-frames:v", + "1", + os.path.join(image_out_folder, vi["video_name"] + ".png"), + "-loglevel", + "error", + ] + ) + + print("抽帧完成,开始识别文案") + sys.stdout.flush() + return video_list + + +def SplitAudio(video_out_folder, video_list): + # ffmpeg -i input_file.mp4 -vn -ab 128k output_file.mp3 + print("正在分离音频!!") + mp3_list = [] + sys.stdout.flush() + for v in video_list: + mp3_path = os.path.join(video_out_folder, v["video_name"] + ".mp3") + mp3_list.append(mp3_path) + subprocess.run( + [ + "ffmpeg", + "-i", + v["out_video_file"], + "-vn", + "-ab", + "128k", + mp3_path, + "-loglevel", + "error", + ], + check=True, + ) + 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) + + # 数据写出 + print("文本全部识别成功,正在写出") + sys.stdout.flush() + tools = public_tools.PublicTools() + tools.write_to_file(text, os.path.join(out_folder, "文案.txt")) + print("写出完成") + sys.stdout.flush() + + +def init(video_path, video_out_folder, image_out_folder, sensitivity): + v_l = ClipVideo(video_path, video_out_folder, image_out_folder, sensitivity) + + # 开始分离音频 + m_l = SplitAudio(video_out_folder, v_l) + # 开始识别字幕 + GetText(os.path.dirname(video_out_folder), m_l) diff --git a/resources/tmp/Clip/canvases_tmp.json b/resources/tmp/Clip/canvases_tmp.json new file mode 100644 index 0000000..dcedab1 --- /dev/null +++ b/resources/tmp/Clip/canvases_tmp.json @@ -0,0 +1,12 @@ +{ + "album_image": "", + "blur": 0.0, + "color": "", + "id": "11E13EB0-8293-4aad-AE6C-906B269D852C", + "image": "", + "image_id": "", + "image_name": "", + "source_platform": 0, + "team_id": "", + "type": "canvas_color" +} \ No newline at end of file diff --git a/resources/tmp/Clip/keyframe_tmp.json b/resources/tmp/Clip/keyframe_tmp.json new file mode 100644 index 0000000..0e0c8c6 --- /dev/null +++ b/resources/tmp/Clip/keyframe_tmp.json @@ -0,0 +1,40 @@ +{ + "id": "01FEF79C-875B-4215-B35B-686620E4FC5F", + "keyframe_list": [ + { + "curveType": "Line", + "graphID": "", + "id": "389CE3AB-19DF-4EC8-B712-454C224D0D92", + "left_control": { + "x": 0.0, + "y": 0.0 + }, + "right_control": { + "x": 0.0, + "y": 0.0 + }, + "time_offset": 0, + "values": [ + 1.0 + ] + }, + { + "curveType": "Line", + "graphID": "", + "id": "3F5A033A-9088-4AED-BBF6-50DEBE67BCA5", + "left_control": { + "x": 0.0, + "y": 0.0 + }, + "right_control": { + "x": 0.0, + "y": 0.0 + }, + "time_offset": 8550000, + "values": [ + 1.5 + ] + } + ], + "property_type": "KFTypeScaleX" +} \ No newline at end of file diff --git a/resources/tmp/Clip/material_animations_tmp.json b/resources/tmp/Clip/material_animations_tmp.json new file mode 100644 index 0000000..fda18c9 --- /dev/null +++ b/resources/tmp/Clip/material_animations_tmp.json @@ -0,0 +1,5 @@ +{ + "animations": [], + "id": "D4838202-E39A-4e74-A2D2-B3C16C9EF587", + "type": "sticker_animation" +} diff --git a/resources/tmp/Clip/material_text_temp.json b/resources/tmp/Clip/material_text_temp.json new file mode 100644 index 0000000..eaefd19 --- /dev/null +++ b/resources/tmp/Clip/material_text_temp.json @@ -0,0 +1,112 @@ +{ + "add_type": 0, + "alignment": 1, + "background_alpha": 1.0, + "background_color": "", + "background_height": 0.14, + "background_horizontal_offset": 0.0, + "background_round_radius": 0.0, + "background_style": 0, + "background_vertical_offset": 0.0, + "background_width": 0.14, + "bold_width": 0.0, + "border_alpha": 1.0, + "border_color": "", + "border_width": 0.08, + "caption_template_info": { + "category_id": "", + "category_name": "", + "effect_id": "", + "resource_id": "", + "resource_name": "" + }, + "check_flag": 7, + "combo_info": { + "text_templates": [] + }, + "content": "{\"text\":\"251525234\"}", + "fixed_height": -1.0, + "fixed_width": -1.0, + "font_category_id": "", + "font_category_name": "", + "font_id": "", + "font_name": "", + "font_path": "", + "font_resource_id": "", + "font_size": 7, + "font_source_platform": 0, + "font_team_id": "", + "font_title": "none", + "font_url": "", + "fonts": [{ + "category_id": "", + "category_name": "", + "effect_id": "6740435892441190919", + "file_uri": "", + "id": "", + "path": "", + "request_id": "", + "resource_id": "6740435892441190919", + "source_platform": 0, + "team_id": "", + "title": "" + }], + "force_apply_line_max_width": false, + "global_alpha": 1.0, + "group_id": "", + "has_shadow": false, + "id": "5B91D2ED-4A1A-40e5-87BE-0713ECDA74BA", + "initial_scale": 1.0, + "is_rich_text": false, + "italic_degree": 0, + "ktv_color": "", + "language": "", + "layer_weight": 1, + "letter_spacing": 0.0, + "line_feed": 1, + "line_max_width": 0.82, + "line_spacing": 0.02, + "name": "", + "original_size": [], + "preset_category": "", + "preset_category_id": "", + "preset_has_set_alignment": false, + "preset_id": "", + "preset_index": 0, + "preset_name": "", + "recognize_task_id": "", + "recognize_type": 0, + "relevance_segment": [], + "shadow_alpha": 0.8, + "shadow_angle": -45.0, + "shadow_color": "", + "shadow_distance": 8.0, + "shadow_point": { + "x": 1.0182337649086284, + "y": -1.0182337649086284 + }, + "shadow_smoothing": 1.0, + "shape_clip_x": false, + "shape_clip_y": false, + "style_name": "", + "sub_type": 0, + "subtitle_keywords": null, + "text_alpha": 1.0, + "text_color": "#FFFFFF", + "text_curve": null, + "text_preset_resource_id": "", + "text_size": 30, + "text_to_audio_ids": [], + "tts_auto_update": false, + "type": "subtitle", + "typesetting": 0, + "underline": false, + "underline_offset": 0.22, + "underline_width": 0.05, + "use_effect_default_color": false, + "words": { + "end_time": [], + "start_time": [], + "text": [] + } +} diff --git a/resources/tmp/Clip/materials_audios_tmp.json b/resources/tmp/Clip/materials_audios_tmp.json new file mode 100644 index 0000000..cba93fb --- /dev/null +++ b/resources/tmp/Clip/materials_audios_tmp.json @@ -0,0 +1,35 @@ +{ + "app_id": 0, + "category_id": "", + "category_name": "", + "check_flag": 1, + "duration": 864600000, + "effect_id": "", + "formula_id": "", + "id": "B3C79950-E268-4ea8-80FF-D749FF93E4DE", + "intensifies_path": "", + "is_ai_clone_tone": false, + "is_ugc": false, + "local_material_id": "", + "music_id": "", + "name": "1705933173091_7a573b60-2af6-4b43-a3ef-46c715300468.wav", + "path": "D:/AI 推文/QQ/无辜领证/1705933173091_7a573b60-2af6-4b43-a3ef-46c715300468.wav", + "query": "", + "request_id": "", + "resource_id": "", + "search_id": "", + "source_platform": 0, + "team_id": "", + "text_id": "", + "tone_category_id": "", + "tone_category_name": "", + "tone_effect_id": "", + "tone_effect_name": "", + "tone_second_category_id": "", + "tone_second_category_name": "", + "tone_speaker": "", + "tone_type": "", + "type": "extract_music", + "video_id": "", + "wave_points": [] +} diff --git a/resources/tmp/Clip/materials_beats_tmp.json b/resources/tmp/Clip/materials_beats_tmp.json new file mode 100644 index 0000000..8c2ae5a --- /dev/null +++ b/resources/tmp/Clip/materials_beats_tmp.json @@ -0,0 +1,20 @@ +{ + "ai_beats": { + "beat_speed_infos": [], + "beats_path": "", + "beats_url": "", + "melody_path": "", + "melody_percents": [ + 0.0 + ], + "melody_url": "" + }, + "enable_ai_beats": false, + "gear": 404, + "gear_count": 0, + "id": "252D7F03-8B76-4774-AC5F-43FF9A7A0303", + "mode": 404, + "type": "beats", + "user_beats": [], + "user_delete_ai_beats": null +} diff --git a/resources/tmp/Clip/sound_channel_mappings_tmp.json b/resources/tmp/Clip/sound_channel_mappings_tmp.json new file mode 100644 index 0000000..10fe074 --- /dev/null +++ b/resources/tmp/Clip/sound_channel_mappings_tmp.json @@ -0,0 +1,6 @@ +{ + "audio_channel_mapping": 0, + "id": "0873DEFB-B955-407a-893E-E063225859E7", + "is_config_open": false, + "type": "none" +} \ No newline at end of file diff --git a/resources/tmp/Clip/speeds_tmp.json b/resources/tmp/Clip/speeds_tmp.json new file mode 100644 index 0000000..5a45004 --- /dev/null +++ b/resources/tmp/Clip/speeds_tmp.json @@ -0,0 +1,7 @@ +{ + "curve_speed": null, + "id": "DF733765-6514-445e-BFF2-EA5079DDC564", + "mode": 0, + "speed": 1.0, + "type": "speed" +} \ No newline at end of file diff --git a/resources/tmp/Clip/track_text_segments_temp.json b/resources/tmp/Clip/track_text_segments_temp.json new file mode 100644 index 0000000..609b0ee --- /dev/null +++ b/resources/tmp/Clip/track_text_segments_temp.json @@ -0,0 +1,63 @@ +{ + "cartoon": false, + "clip": { + "alpha": 1.0, + "flip": { + "horizontal": false, + "vertical": false + }, + "rotation": 0.0, + "scale": { + "x": 1.0, + "y": 1.0 + }, + "transform": { + "x": 0.0, + "y": 0.0 + } + }, + "common_keyframes": [], + "enable_adjust": false, + "enable_color_curves": true, + "enable_color_match_adjust": false, + "enable_color_wheels": true, + "enable_lut": false, + "enable_smart_color_adjust": false, + "extra_material_refs": [ + "D4838202-E39A-4e74-A2D2-B3C16C9EF587" + ], + "group_id": "", + "hdr_settings": null, + "id": "F130A2DC-B22A-42ba-970D-38BDEE08F2AE", + "intensifies_audio": false, + "is_placeholder": false, + "is_tone_modify": false, + "keyframe_refs": [], + "last_nonzero_volume": 1.0, + "material_id": "5B91D2ED-4A1A-40e5-87BE-0713ECDA74BA", + "render_index": 14002, + "responsive_layout": { + "enable": false, + "horizontal_pos_layout": 0, + "size_layout": 0, + "target_follow": "", + "vertical_pos_layout": 0 + }, + "reverse": false, + "source_timerange": null, + "speed": 1.0, + "target_timerange": { + "duration": 3000000, + "start": 0 + }, + "template_id": "", + "template_scene": "default", + "track_attribute": 0, + "track_render_index": 0, + "uniform_scale": { + "on": true, + "value": 1.0 + }, + "visible": true, + "volume": 1.0 +} diff --git a/resources/tmp/Clip/tracks_audio_segments_tmp.json b/resources/tmp/Clip/tracks_audio_segments_tmp.json new file mode 100644 index 0000000..eaa4543 --- /dev/null +++ b/resources/tmp/Clip/tracks_audio_segments_tmp.json @@ -0,0 +1,51 @@ +{ + "cartoon": false, + "clip": null, + "common_keyframes": [], + "enable_adjust": false, + "enable_color_curves": true, + "enable_color_match_adjust": false, + "enable_color_wheels": true, + "enable_lut": false, + "enable_smart_color_adjust": false, + "extra_material_refs": [ + "45268E0D-9136-43e2-939E-5F2C23E3569A", + "252D7F03-8B76-4774-AC5F-43FF9A7A0303", + "2629569D-3A20-41ba-A41A-AD617BA9E404", + "8D5BF8F3-6AF8-4bb3-84B7-04E3A86CE300" + ], + "group_id": "", + "hdr_settings": null, + "id": "A210B2A7-ED82-43c1-B159-9D849290593E", + "intensifies_audio": false, + "is_placeholder": false, + "is_tone_modify": false, + "keyframe_refs": [], + "last_nonzero_volume": 1.0, + "material_id": "B3C79950-E268-4ea8-80FF-D749FF93E4DE", + "render_index": 0, + "responsive_layout": { + "enable": false, + "horizontal_pos_layout": 0, + "size_layout": 0, + "target_follow": "", + "vertical_pos_layout": 0 + }, + "reverse": false, + "source_timerange": { + "duration": 864600000, + "start": 0 + }, + "speed": 1.0, + "target_timerange": { + "duration": 864600000, + "start": 0 + }, + "template_id": "", + "template_scene": "default", + "track_attribute": 0, + "track_render_index": 0, + "uniform_scale": null, + "visible": true, + "volume": 1.0 +} diff --git a/resources/tmp/Clip/tracks_segments_tmp.json b/resources/tmp/Clip/tracks_segments_tmp.json new file mode 100644 index 0000000..e7d64f4 --- /dev/null +++ b/resources/tmp/Clip/tracks_segments_tmp.json @@ -0,0 +1,73 @@ +{ + "cartoon": false, + "clip": { + "alpha": 1.0, + "flip": { + "horizontal": false, + "vertical": false + }, + "rotation": 0.0, + "scale": { + "x": 1.0, + "y": 1.0 + }, + "transform": { + "x": 0.0, + "y": 0.0 + } + }, + "common_keyframes": [], + "enable_adjust": true, + "enable_color_curves": true, + "enable_color_match_adjust": false, + "enable_color_wheels": true, + "enable_lut": true, + "enable_smart_color_adjust": false, + "extra_material_refs": [ + "DF733765-6514-445e-BFF2-EA5079DDC564", + "11E13EB0-8293-4aad-AE6C-906B269D852C", + "0873DEFB-B955-407a-893E-E063225859E7", + "4DD7DFFE-CFD9-4e0b-8890-56C7450677EA" + ], + "group_id": "", + "hdr_settings": { + "intensity": 1.0, + "mode": 1, + "nits": 1000 + }, + "id": "2B8043D9-1EEB-48da-A136-B38F3816611E", + "intensifies_audio": false, + "is_placeholder": false, + "is_tone_modify": false, + "keyframe_refs": [], + "last_nonzero_volume": 1.0, + "material_id": "7BE6192E-90BC-421f-AE0D-2323D81008D8", + "render_index": 0, + "responsive_layout": { + "enable": false, + "horizontal_pos_layout": 0, + "size_layout": 0, + "target_follow": "", + "vertical_pos_layout": 0 + }, + "reverse": false, + "source_timerange": { + "duration": 5000000, + "start": 0 + }, + "speed": 1.0, + "target_timerange": { + "duration": 5000000, + "start": 0 + }, + "template_id": "", + "template_scene": "default", + "track_attribute": 0, + "track_render_index": 0, + "uniform_scale": { + "on": true, + "value": 1.0 + }, + "visible": true, + "volume": 1.0 +} \ No newline at end of file diff --git a/resources/tmp/Clip/tracks_type_tmp.json b/resources/tmp/Clip/tracks_type_tmp.json new file mode 100644 index 0000000..d6b3fb0 --- /dev/null +++ b/resources/tmp/Clip/tracks_type_tmp.json @@ -0,0 +1,9 @@ +{ + "attribute": 0, + "flag": 0, + "id": "3F5F37A4-C6DF-4d51-9C68-11F472889B1D", + "is_default_name": true, + "name": "", + "segments": [], + "type": "video" +} diff --git a/resources/tmp/Clip/videoMaterialTemp.json b/resources/tmp/Clip/videoMaterialTemp.json new file mode 100644 index 0000000..fb96ead --- /dev/null +++ b/resources/tmp/Clip/videoMaterialTemp.json @@ -0,0 +1,78 @@ +{ + "aigc_type": "none", + "audio_fade": null, + "cartoon_path": "", + "category_id": "", + "category_name": "", + "check_flag": 63487, + "crop": { + "lower_left_x": 0.0, + "lower_left_y": 1.0, + "lower_right_x": 1.0, + "lower_right_y": 1.0, + "upper_left_x": 0.0, + "upper_left_y": 0.0, + "upper_right_x": 1.0, + "upper_right_y": 0.0 + }, + "crop_ratio": "free", + "crop_scale": 1.0, + "duration": 10800000000, + "extra_type_option": 0, + "formula_id": "", + "freeze": null, + "gameplay": null, + "has_audio": false, + "height": 1000, + "id": "7BE6192E-90BC-421f-AE0D-2323D81008D8", + "intensifies_audio_path": "", + "intensifies_path": "", + "is_ai_generate_content": false, + "is_unified_beauty_mode": false, + "local_id": "", + "local_material_id": "", + "material_id": "", + "material_name": "00001.png", + "material_url": "", + "matting": { + "flag": 0, + "has_use_quick_brush": false, + "has_use_quick_eraser": false, + "interactiveTime": [], + "path": "", + "strokes": [] + }, + "media_path": "", + "object_locked": null, + "origin_material_id": "", + "path": "D:/AI 推文/番茄小说/如画室友/03/tmp/input_crop/00001.png", + "picture_from": "none", + "picture_set_category_id": "", + "picture_set_category_name": "", + "request_id": "", + "reverse_intensifies_path": "", + "reverse_path": "", + "smart_motion": null, + "source": 0, + "source_platform": 0, + "stable": { + "matrix_path": "", + "stable_level": 0, + "time_range": { + "duration": 0, + "start": 0 + } + }, + "team_id": "", + "type": "photo", + "video_algorithm": { + "algorithms": [], + "deflicker": null, + "motion_blur_config": null, + "noise_reduction": null, + "path": "", + "quality_enhance": null, + "time_range": null + }, + "width": 1000 +} \ No newline at end of file diff --git a/resources/tmp/Clip/vocal_separations_tmp.json b/resources/tmp/Clip/vocal_separations_tmp.json new file mode 100644 index 0000000..d557681 --- /dev/null +++ b/resources/tmp/Clip/vocal_separations_tmp.json @@ -0,0 +1,7 @@ +{ + "choice": 0, + "id": "4DD7DFFE-CFD9-4e0b-8890-56C7450677EA", + "production_path": "", + "time_range": null, + "type": "vocal_separation" +} \ No newline at end of file diff --git a/resources/tmp/config/clip_setting.json b/resources/tmp/config/clip_setting.json new file mode 100644 index 0000000..a2283fc --- /dev/null +++ b/resources/tmp/config/clip_setting.json @@ -0,0 +1,79 @@ +{ + "text_style": [ + { + "name": "无", + "id": "0", + "style": [], + "font_size": 7, + "fonts": "新青年体", + "style_name": "黄字黑边", + "clip": { + "alpha": 1, + "flip": { + "horizontal": false, + "vertical": false + }, + "rotation": 0, + "scale": { + "x": 1, + "y": 1 + }, + "transform": { + "x": 0, + "y": -0.8333333333333334 + } + }, + "ratio": "4:3" + }, + { + "name": "随机", + "id": "1", + "style": [], + "font_size": 7, + "fonts": "新青年体", + "style_name": "黄字黑边", + "clip": { + "alpha": 1, + "flip": { + "horizontal": false, + "vertical": false + }, + "rotation": 0, + "scale": { + "x": 1, + "y": 1 + }, + "transform": { + "x": 0, + "y": -0.8333333333333334 + } + }, + "ratio": "4:3" + } + ], + "background_music_setting": [ + { + "name": "女频-甜文", + "folder_path": "D:\\甜文", + "id": "741f52af-a8a2-4e26-85e9-e2326d91e28d" + } + ], + "friendly_reminder_setting": [ + { + "id": "0", + "name": "无", + "material_animations": {}, + "texts": {}, + "tracks": {}, + "text_value": "无" + }, + { + "id": "1", + "name": "随机", + "material_animations": {}, + "texts": {}, + "tracks": {}, + "text_value": "下面的数据随机生成(不包含这条啊)" + } + ] +} \ No newline at end of file diff --git a/resources/tmp/config/global_setting.json b/resources/tmp/config/global_setting.json new file mode 100644 index 0000000..cc4106b --- /dev/null +++ b/resources/tmp/config/global_setting.json @@ -0,0 +1,8 @@ +{ + "draft_path": "C:/Users/27698/AppData/Local/JianyingPro/User Data/Projects/com.lveditor.draft", + "project_path": "测试覆盖", + "project_name": "测试覆盖", + "gpt_business": "https://api.openai-hk.com/v1/chat/completions", + "gpt_key": "hk-flj65q10000101963e3c83ed48aa840c32044b4afaecc5f0", + "gpt_model": "gpt-3.5-turbo" +} \ No newline at end of file diff --git a/resources/tmp/config/img_base.json b/resources/tmp/config/img_base.json new file mode 100644 index 0000000..ce802f5 --- /dev/null +++ b/resources/tmp/config/img_base.json @@ -0,0 +1,31 @@ +{ + "interactive_mode": "auto", + "webui_api_url": "", + "type": "img2img", + "seed": -1, + "resize": { + "scale": 1.0 + }, + "crop": 1, + "inpaint": false, + "mask_mode": "transparent-background-fast", + "mask_bg_mode": "#ffffff", + "tag": { + "enable": true, + "mode": "" + }, + "overlay": true, + "workspace": { + "input": "input", + "output": "output", + "tmp": { + "parent": "tmp", + "input_crop": "input_crop", + "output_crop": "output_crop", + "input_tag": "input_crop", + "input_mask": "input_mask", + "input_crop_mask": "input_crop_mask", + "crop_info": "crop_info.txt" + } + } + } \ No newline at end of file diff --git a/resources/tmp/config/sd_config.json b/resources/tmp/config/sd_config.json new file mode 100644 index 0000000..108c359 --- /dev/null +++ b/resources/tmp/config/sd_config.json @@ -0,0 +1,58 @@ +{ + "workspace": "C:\\Users\\27698\\Desktop\\测试", + "setting": { + "type": "txt2img", + "resize": { + "scale": 1 + }, + "crop": 1, + "webui_api_url": "", + "seed": -1, + "inpaint": false, + "mask_mode": "transparent-background", + "mask_bg_mode": "#ffffff", + "overlay": true, + "batch_size": 4 + }, + "tag": { + "enable": true, + "mode": "action", + "actions": [ + "closed eyes", + "closed mouth", + "from behind", + "smile", + "looking at viewer", + "side", + "upper body", + "covering mouth", + "covering face" + ], + "badPrompt": "chinese_text,japanese_text,korean_text,dark_skin,dark-skinned_male,yukata,kimono,large_tsukioka_kogane,collarbone,artist_name,open_clothes,bare_shoulders,subtitled,off_shoulder,hair_bun,single_hair_bun,hakama_skirt,hakama,black_hakama,katana,breasts,blush,hanfu,closed_mouth,closed_eyes,underwear,cleavage,bra,realistic,earrings,torii,strapless" + }, + "webui": { + "prompt": "", + "negative_prompt": "", + "denoising_strength": 1, + "cfg_scale": 5, + "sampler_name": "DPM++ 2M Karras", + "steps": 15, + "width": 800, + "height": 800, + "adetailer": true, + "batch_size": 1 + }, + "config": { + "setting": "img_base.json" + }, + "adetailer": [ + { + "ad_confidence": 0.7, + "ad_model": "face_yolov8n.pt" + }, + { + "ad_confidence": 0.7, + "ad_model": "hand_yolov8n.pt" + } + ] +} \ No newline at end of file diff --git a/resources/tmp/config/video_config.json b/resources/tmp/config/video_config.json new file mode 100644 index 0000000..f821446 --- /dev/null +++ b/resources/tmp/config/video_config.json @@ -0,0 +1,1188 @@ +{ + "offsetValue": 300, + "frameRate": 60, + "bitRate": 5000, + "assConfig": [{ + "fontName": "方正字迹-龙吟体 简", + "fontSize": 80, + "fontColor": "#F9E00C", + "transparent": 100, + "positionX": 720, + "positionY": 980, + "id": "7cf21712-9a48-4f93-afa3-4c9585b60e05" + }, { + "fontName": "文悦新青年体 (非商用) W8", + "fontSize": 75, + "fontColor": "#F9E00C", + "transparent": 100, + "positionX": 720, + "positionY": 980, + "id": "b464e56b-bab4-4771-bcfa-0978569b3730" + }, { + "fontName": "文悦新青年体 (非商用) W8", + "fontSize": 75, + "fontColor": "#FFFFFF", + "transparent": 100, + "positionX": 720, + "positionY": 980, + "id": "e9995be7-1d26-466c-80a2-30a5ca0fb324" + }, { + "fontName": "方正字迹-龙吟体 简", + "fontSize": 75, + "fontColor": "#FFFFFF", + "transparent": 100, + "positionX": 720, + "positionY": 980, + "id": "272d1d18-09fd-456c-94fd-c40a17eef671" + }, { + "fontName": "方正字迹-龙吟体 简", + "fontSize": 75, + "fontColor": "#F9E00C", + "transparent": 100, + "positionX": 720, + "positionY": 980, + "id": "9db756b3-01b3-446f-bd73-995138a24d28" + }], + "watermarkConfig": [{ + "showText": "虚拟内容 请勿模仿", + "fontName": "方正字迹-龙吟体 简", + "fontSize": 30, + "fontColor": "#FFFFFF", + "transparent": 80, + "positionX": 1250, + "positionY": 20, + "id": "51415f2f-0632-4001-95a5-b61ef9bd6d79" + }, { + "showText": "内容纯属虚构 请勿模仿", + "fontName": "文悦新青年体 (非商用) W8", + "fontSize": 30, + "fontColor": "#FFFFFF", + "transparent": 80, + "positionX": 1250, + "positionY": 20, + "id": "b88d00ad-bea5-4a91-852e-898229f622bf" + }, { + "showText": "小说内容 请勿模仿", + "fontName": "文悦新青年体 (非商用) W8", + "fontSize": 30, + "fontColor": "#FFFFFF", + "transparent": 80, + "positionX": 1250, + "positionY": 20, + "id": "26c20a2b-f338-48c9-b5f2-82f0e9370027" + }], + "font_name_list": [{ + "label": "Lucida Sans Unicode", + "value": "Lucida Sans Unicode" + }, { + "label": "Mistral", + "value": "Mistral" + }, { + "label": "Microsoft JhengHei Bold & Microsoft JhengHei UI Bold", + "value": "Microsoft JhengHei Bold & Microsoft JhengHei UI Bold" + }, { + "label": "文悦新青年体 (非商用) W8", + "value": "文悦新青年体 (非商用) W8" + }, { + "label": "French Script MT", + "value": "French Script MT" + }, { + "label": "Franklin Gothic Demi Cond", + "value": "Franklin Gothic Demi Cond" + }, { + "label": "Palatino Linotype", + "value": "Palatino Linotype" + }, { + "label": "Garamond", + "value": "Garamond" + }, { + "label": "Tw Cen MT Bold Italic", + "value": "Tw Cen MT Bold Italic" + }, { + "label": "Dubai Medium", + "value": "Dubai Medium" + }, { + "label": "Courier New Italic", + "value": "Courier New Italic" + }, { + "label": "Ravie", + "value": "Ravie" + }, { + "label": "Gill Sans Ultra Bold Condensed", + "value": "Gill Sans Ultra Bold Condensed" + }, { + "label": "Onyx", + "value": "Onyx" + }, { + "label": "Microsoft New Tai Lue Bold", + "value": "Microsoft New Tai Lue Bold" + }, { + "label": "Imprint MT Shadow", + "value": "Imprint MT Shadow" + }, { + "label": "Ebrima", + "value": "Ebrima" + }, { + "label": "Garamond Italic", + "value": "Garamond Italic" + }, { + "label": "Microsoft Himalaya", + "value": "Microsoft Himalaya" + }, { + "label": "Constantia Italic", + "value": "Constantia Italic" + }, { + "label": "Symbol", + "value": "Symbol" + }, { + "label": "Tempus Sans ITC", + "value": "Tempus Sans ITC" + }, { + "label": "Segoe UI Black Italic", + "value": "Segoe UI Black Italic" + }, { + "label": "Verdana Italic", + "value": "Verdana Italic" + }, { + "label": "Cambria Bold Italic", + "value": "Cambria Bold Italic" + }, { + "label": "Palatino Linotype Bold", + "value": "Palatino Linotype Bold" + }, { + "label": "Franklin Gothic Medium Cond", + "value": "Franklin Gothic Medium Cond" + }, { + "label": "Lucida Bright Demibold Italic", + "value": "Lucida Bright Demibold Italic" + }, { + "label": "幼圆", + "value": "幼圆" + }, { + "label": "Nirmala UI Bold", + "value": "Nirmala UI Bold" + }, { + "label": "Agency FB Bold", + "value": "Agency FB Bold" + }, { + "label": "FangSong", + "value": "FangSong" + }, { + "label": "Segoe UI Bold Italic", + "value": "Segoe UI Bold Italic" + }, { + "label": "Webdings", + "value": "Webdings" + }, { + "label": "Times New Roman Italic", + "value": "Times New Roman Italic" + }, { + "label": "Bodoni MT", + "value": "Bodoni MT" + }, { + "label": "Bernard MT Condensed", + "value": "Bernard MT Condensed" + }, { + "label": "Kunstler Script", + "value": "Kunstler Script" + }, { + "label": "Calisto MT Bold Italic", + "value": "Calisto MT Bold Italic" + }, { + "label": "Lucida Handwriting Italic", + "value": "Lucida Handwriting Italic" + }, { + "label": "Book Antiqua Bold Italic", + "value": "Book Antiqua Bold Italic" + }, { + "label": "Microsoft Sans Serif", + "value": "Microsoft Sans Serif" + }, { + "label": "MS Reference Sans Serif", + "value": "MS Reference Sans Serif" + }, { + "label": "Segoe UI Variable", + "value": "Segoe UI Variable" + }, { + "label": "Engravers MT", + "value": "Engravers MT" + }, { + "label": "Corbel", + "value": "Corbel" + }, { + "label": "Gadugi", + "value": "Gadugi" + }, { + "label": "Segoe UI Light", + "value": "Segoe UI Light" + }, { + "label": "Consolas Bold", + "value": "Consolas Bold" + }, { + "label": "Gill Sans MT Condensed", + "value": "Gill Sans MT Condensed" + }, { + "label": "Book Antiqua Bold", + "value": "Book Antiqua Bold" + }, { + "label": "Wingdings", + "value": "Wingdings" + }, { + "label": "Small Fonts", + "value": "Small Fonts" + }, { + "label": "Curlz MT", + "value": "Curlz MT" + }, { + "label": "Franklin Gothic Medium", + "value": "Franklin Gothic Medium" + }, { + "label": "华文隶书", + "value": "华文隶书" + }, { + "label": "Niagara Engraved", + "value": "Niagara Engraved" + }, { + "label": "Arial Rounded MT Bold", + "value": "Arial Rounded MT Bold" + }, { + "label": "Gill Sans MT", + "value": "Gill Sans MT" + }, { + "label": "Yu Gothic Regular & Yu Gothic UI Semilight", + "value": "Yu Gothic Regular & Yu Gothic UI Semilight" + }, { + "label": "Nirmala UI", + "value": "Nirmala UI" + }, { + "label": "Corbel Bold", + "value": "Corbel Bold" + }, { + "label": "Gabriola", + "value": "Gabriola" + }, { + "label": "Franklin Gothic Demi Italic", + "value": "Franklin Gothic Demi Italic" + }, { + "label": "Magneto Bold", + "value": "Magneto Bold" + }, { + "label": "Arial Bold Italic", + "value": "Arial Bold Italic" + }, { + "label": "Copperplate Gothic Bold", + "value": "Copperplate Gothic Bold" + }, { + "label": "Segoe UI Emoji", + "value": "Segoe UI Emoji" + }, { + "label": "Segoe UI Symbol", + "value": "Segoe UI Symbol" + }, { + "label": "Franklin Gothic Medium Italic", + "value": "Franklin Gothic Medium Italic" + }, { + "label": "Tw Cen MT", + "value": "Tw Cen MT" + }, { + "label": "隶书", + "value": "隶书" + }, { + "label": "Consolas", + "value": "Consolas" + }, { + "label": "Script", + "value": "Script" + }, { + "label": "Calibri Light Italic", + "value": "Calibri Light Italic" + }, { + "label": "Maiandra GD", + "value": "Maiandra GD" + }, { + "label": "Perpetua Bold", + "value": "Perpetua Bold" + }, { + "label": "Consolas Italic", + "value": "Consolas Italic" + }, { + "label": "Yu Gothic Medium & Yu Gothic UI Regular", + "value": "Yu Gothic Medium & Yu Gothic UI Regular" + }, { + "label": "Microsoft JhengHei Light & Microsoft JhengHei UI Light", + "value": "Microsoft JhengHei Light & Microsoft JhengHei UI Light" + }, { + "label": "Rage Italic", + "value": "Rage Italic" + }, { + "label": "Script MT Bold", + "value": "Script MT Bold" + }, { + "label": "Palace Script MT", + "value": "Palace Script MT" + }, { + "label": "Leelawadee UI Bold", + "value": "Leelawadee UI Bold" + }, { + "label": "华文宋体", + "value": "华文宋体" + }, { + "label": "Myanmar Text", + "value": "Myanmar Text" + }, { + "label": "Century Schoolbook Italic", + "value": "Century Schoolbook Italic" + }, { + "label": "Goudy Old Style Bold", + "value": "Goudy Old Style Bold" + }, { + "label": "Dubai Bold", + "value": "Dubai Bold" + }, { + "label": "Times New Roman Bold Italic", + "value": "Times New Roman Bold Italic" + }, { + "label": "Century Gothic", + "value": "Century Gothic" + }, { + "label": "Lucida Sans Demibold Roman", + "value": "Lucida Sans Demibold Roman" + }, { + "label": "Lucida Fax Demibold Italic", + "value": "Lucida Fax Demibold Italic" + }, { + "label": "Parchment", + "value": "Parchment" + }, { + "label": "Calibri Light", + "value": "Calibri Light" + }, { + "label": "Constantia Bold", + "value": "Constantia Bold" + }, { + "label": "Lucida Calligraphy Italic", + "value": "Lucida Calligraphy Italic" + }, { + "label": "Calisto MT", + "value": "Calisto MT" + }, { + "label": "Malgun Gothic Bold", + "value": "Malgun Gothic Bold" + }, { + "label": "Bauhaus 93", + "value": "Bauhaus 93" + }, { + "label": "Roman", + "value": "Roman" + }, { + "label": "Berlin Sans FB", + "value": "Berlin Sans FB" + }, { + "label": "Javanese Text", + "value": "Javanese Text" + }, { + "label": "Forte", + "value": "Forte" + }, { + "label": "Agency FB", + "value": "Agency FB" + }, { + "label": "Harlow Solid Italic", + "value": "Harlow Solid Italic" + }, { + "label": "Sylfaen", + "value": "Sylfaen" + }, { + "label": "OCR A Extended", + "value": "OCR A Extended" + }, { + "label": "Courier New Bold", + "value": "Courier New Bold" + }, { + "label": "Bookman Old Style Bold", + "value": "Bookman Old Style Bold" + }, { + "label": "Goudy Old Style Italic", + "value": "Goudy Old Style Italic" + }, { + "label": "Comic Sans MS Bold Italic", + "value": "Comic Sans MS Bold Italic" + }, { + "label": "Trebuchet MS Bold", + "value": "Trebuchet MS Bold" + }, { + "label": "Bell MT", + "value": "Bell MT" + }, { + "label": "Vladimir Script", + "value": "Vladimir Script" + }, { + "label": "Lucida Sans Demibold Italic", + "value": "Lucida Sans Demibold Italic" + }, { + "label": "方正字迹-龙吟体 简", + "value": "方正字迹-龙吟体 简" + }, { + "label": "华文楷体", + "value": "华文楷体" + }, { + "label": "Viner Hand ITC", + "value": "Viner Hand ITC" + }, { + "label": "Corbel Light", + "value": "Corbel Light" + }, { + "label": "Chiller", + "value": "Chiller" + }, { + "label": "Segoe Script Bold", + "value": "Segoe Script Bold" + }, { + "label": "Yu Gothic Bold & Yu Gothic UI Semibold & Yu Gothic UI Bold", + "value": "Yu Gothic Bold & Yu Gothic UI Semibold & Yu Gothic UI Bold" + }, { + "label": "Trebuchet MS Bold Italic", + "value": "Trebuchet MS Bold Italic" + }, { + "label": "Palatino Linotype Italic", + "value": "Palatino Linotype Italic" + }, { + "label": "Lucida Sans Typewriter Bold", + "value": "Lucida Sans Typewriter Bold" + }, { + "label": "Lucida Bright", + "value": "Lucida Bright" + }, { + "label": "Britannic Bold", + "value": "Britannic Bold" + }, { + "label": "Papyrus", + "value": "Papyrus" + }, { + "label": "ROG FONTS", + "value": "ROG FONTS" + }, { + "label": "Gadugi Bold", + "value": "Gadugi Bold" + }, { + "label": "Century Schoolbook Bold", + "value": "Century Schoolbook Bold" + }, { + "label": "Lucida Sans Regular", + "value": "Lucida Sans Regular" + }, { + "label": "Informal Roman", + "value": "Informal Roman" + }, { + "label": "Elephant Italic", + "value": "Elephant Italic" + }, { + "label": "SimSun & NSimSun", + "value": "SimSun & NSimSun" + }, { + "label": "Lucida Sans Typewriter Regular", + "value": "Lucida Sans Typewriter Regular" + }, { + "label": "Trebuchet MS", + "value": "Trebuchet MS" + }, { + "label": "Harrington", + "value": "Harrington" + }, { + "label": "Edwardian Script ITC", + "value": "Edwardian Script ITC" + }, { + "label": "Arial Narrow Italic", + "value": "Arial Narrow Italic" + }, { + "label": "Algerian", + "value": "Algerian" + }, { + "label": "Bodoni MT Italic", + "value": "Bodoni MT Italic" + }, { + "label": "Gigi", + "value": "Gigi" + }, { + "label": "Wingdings 3", + "value": "Wingdings 3" + }, { + "label": "Calibri Bold", + "value": "Calibri Bold" + }, { + "label": "Bodoni MT Condensed Bold Italic", + "value": "Bodoni MT Condensed Bold Italic" + }, { + "label": "Felix Titling", + "value": "Felix Titling" + }, { + "label": "Arial Narrow Bold Italic", + "value": "Arial Narrow Bold Italic" + }, { + "label": "Bodoni MT Bold", + "value": "Bodoni MT Bold" + }, { + "label": "Courier 10,12,15", + "value": "Courier 10,12,15" + }, { + "label": "Bodoni MT Black Italic", + "value": "Bodoni MT Black Italic" + }, { + "label": "Consolas Bold Italic", + "value": "Consolas Bold Italic" + }, { + "label": "Modern No. 20", + "value": "Modern No. 20" + }, { + "label": "Bookman Old Style Bold Italic", + "value": "Bookman Old Style Bold Italic" + }, { + "label": "华文新魏", + "value": "华文新魏" + }, { + "label": "Comic Sans MS", + "value": "Comic Sans MS" + }, { + "label": "Lucida Sans Italic", + "value": "Lucida Sans Italic" + }, { + "label": "Comic Sans MS Italic", + "value": "Comic Sans MS Italic" + }, { + "label": "Baskerville Old Face", + "value": "Baskerville Old Face" + }, { + "label": "MV Boli", + "value": "MV Boli" + }, { + "label": "Century Schoolbook", + "value": "Century Schoolbook" + }, { + "label": "Candara Light Italic", + "value": "Candara Light Italic" + }, { + "label": "SimHei", + "value": "SimHei" + }, { + "label": "Calibri Italic", + "value": "Calibri Italic" + }, { + "label": "Eras Light ITC", + "value": "Eras Light ITC" + }, { + "label": "Verdana Bold Italic", + "value": "Verdana Bold Italic" + }, { + "label": "Segoe Print Bold", + "value": "Segoe Print Bold" + }, { + "label": "Microsoft PhagsPa", + "value": "Microsoft PhagsPa" + }, { + "label": "Lucida Bright Italic", + "value": "Lucida Bright Italic" + }, { + "label": "Showcard Gothic", + "value": "Showcard Gothic" + }, { + "label": "Georgia Bold Italic", + "value": "Georgia Bold Italic" + }, { + "label": "Tahoma", + "value": "Tahoma" + }, { + "label": "华文细黑", + "value": "华文细黑" + }, { + "label": "Snap ITC", + "value": "Snap ITC" + }, { + "label": "Pristina", + "value": "Pristina" + }, { + "label": "Segoe UI Semibold Italic", + "value": "Segoe UI Semibold Italic" + }, { + "label": "Century Gothic Bold Italic", + "value": "Century Gothic Bold Italic" + }, { + "label": "Centaur", + "value": "Centaur" + }, { + "label": "Segoe UI Historic", + "value": "Segoe UI Historic" + }, { + "label": "Cambria & Cambria Math", + "value": "Cambria & Cambria Math" + }, { + "label": "Courier New", + "value": "Courier New" + }, { + "label": "Microsoft Tai Le Bold", + "value": "Microsoft Tai Le Bold" + }, { + "label": "Cambria Italic", + "value": "Cambria Italic" + }, { + "label": "Microsoft YaHei Light & Microsoft YaHei UI Light", + "value": "Microsoft YaHei Light & Microsoft YaHei UI Light" + }, { + "label": "Kristen ITC", + "value": "Kristen ITC" + }, { + "label": "Tw Cen MT Bold", + "value": "Tw Cen MT Bold" + }, { + "label": "Book Antiqua Italic", + "value": "Book Antiqua Italic" + }, { + "label": "Arial Narrow Bold", + "value": "Arial Narrow Bold" + }, { + "label": "Leelawadee UI", + "value": "Leelawadee UI" + }, { + "label": "MS Reference Specialty", + "value": "MS Reference Specialty" + }, { + "label": "Segoe UI Bold", + "value": "Segoe UI Bold" + }, { + "label": "Bookman Old Style", + "value": "Bookman Old Style" + }, { + "label": "Segoe Fluent Icons", + "value": "Segoe Fluent Icons" + }, { + "label": "Segoe Print", + "value": "Segoe Print" + }, { + "label": "Lucida Sans Typewriter Bold Oblique", + "value": "Lucida Sans Typewriter Bold Oblique" + }, { + "label": "Franklin Gothic Book", + "value": "Franklin Gothic Book" + }, { + "label": "Rockwell Bold", + "value": "Rockwell Bold" + }, { + "label": "Franklin Gothic Demi", + "value": "Franklin Gothic Demi" + }, { + "label": "Times New Roman Bold", + "value": "Times New Roman Bold" + }, { + "label": "Goudy Old Style", + "value": "Goudy Old Style" + }, { + "label": "造字工房力黑(非商用)常规体 Regular", + "value": "造字工房力黑(非商用)常规体 Regular" + }, { + "label": "Yu Gothic Light & Yu Gothic UI Light", + "value": "Yu Gothic Light & Yu Gothic UI Light" + }, { + "label": "Cooper Black", + "value": "Cooper Black" + }, { + "label": "Constantia", + "value": "Constantia" + }, { + "label": "Calisto MT Bold", + "value": "Calisto MT Bold" + }, { + "label": "Segoe UI Italic", + "value": "Segoe UI Italic" + }, { + "label": "华文仿宋", + "value": "华文仿宋" + }, { + "label": "SimSun-ExtB", + "value": "SimSun-ExtB" + }, { + "label": "Leelawadee UI Semilight", + "value": "Leelawadee UI Semilight" + }, { + "label": "Bodoni MT Condensed", + "value": "Bodoni MT Condensed" + }, { + "label": "Tahoma Bold", + "value": "Tahoma Bold" + }, { + "label": "Berlin Sans FB Demi Bold", + "value": "Berlin Sans FB Demi Bold" + }, { + "label": "Bodoni MT Bold Italic", + "value": "Bodoni MT Bold Italic" + }, { + "label": "Perpetua Titling MT Light", + "value": "Perpetua Titling MT Light" + }, { + "label": "方正姚体", + "value": "方正姚体" + }, { + "label": "High Tower Text", + "value": "High Tower Text" + }, { + "label": "Lucida Fax Italic", + "value": "Lucida Fax Italic" + }, { + "label": "Ink Free", + "value": "Ink Free" + }, { + "label": "Californian FB Italic", + "value": "Californian FB Italic" + }, { + "label": "华文中宋", + "value": "华文中宋" + }, { + "label": "Segoe UI Black", + "value": "Segoe UI Black" + }, { + "label": "Rockwell Extra Bold", + "value": "Rockwell Extra Bold" + }, { + "label": "Garamond Bold", + "value": "Garamond Bold" + }, { + "label": "Niagara Solid", + "value": "Niagara Solid" + }, { + "label": "Gill Sans MT Bold Italic", + "value": "Gill Sans MT Bold Italic" + }, { + "label": "Arial Black", + "value": "Arial Black" + }, { + "label": "Microsoft Yi Baiti", + "value": "Microsoft Yi Baiti" + }, { + "label": "Corbel Bold Italic", + "value": "Corbel Bold Italic" + }, { + "label": "Bodoni MT Black", + "value": "Bodoni MT Black" + }, { + "label": "Mongolian Baiti", + "value": "Mongolian Baiti" + }, { + "label": "Vivaldi Italic", + "value": "Vivaldi Italic" + }, { + "label": "Comic Sans MS Bold", + "value": "Comic Sans MS Bold" + }, { + "label": "Arial Bold", + "value": "Arial Bold" + }, { + "label": "Microsoft JhengHei & Microsoft JhengHei UI", + "value": "Microsoft JhengHei & Microsoft JhengHei UI" + }, { + "label": "Myanmar Text Bold", + "value": "Myanmar Text Bold" + }, { + "label": "Candara Light", + "value": "Candara Light" + }, { + "label": "Californian FB", + "value": "Californian FB" + }, { + "label": "Microsoft Tai Le", + "value": "Microsoft Tai Le" + }, { + "label": "Lucida Bright Demibold", + "value": "Lucida Bright Demibold" + }, { + "label": "Palatino Linotype Bold Italic", + "value": "Palatino Linotype Bold Italic" + }, { + "label": "Calibri Bold Italic", + "value": "Calibri Bold Italic" + }, { + "label": "Old English Text MT", + "value": "Old English Text MT" + }, { + "label": "Rockwell Condensed", + "value": "Rockwell Condensed" + }, { + "label": "Candara Italic", + "value": "Candara Italic" + }, { + "label": "MingLiU-ExtB & PMingLiU-ExtB & MingLiU_HKSCS-ExtB", + "value": "MingLiU-ExtB & PMingLiU-ExtB & MingLiU_HKSCS-ExtB" + }, { + "label": "Bradley Hand ITC", + "value": "Bradley Hand ITC" + }, { + "label": "Bell MT Italic", + "value": "Bell MT Italic" + }, { + "label": "Tw Cen MT Italic", + "value": "Tw Cen MT Italic" + }, { + "label": "Malgun Gothic SemiLight", + "value": "Malgun Gothic SemiLight" + }, { + "label": "Lucida Console", + "value": "Lucida Console" + }, { + "label": "MS Serif 8,10,12,14,18,24", + "value": "MS Serif 8,10,12,14,18,24" + }, { + "label": "Gill Sans Ultra Bold", + "value": "Gill Sans Ultra Bold" + }, { + "label": "Noto Sans Regular", + "value": "Noto Sans Regular" + }, { + "label": "Ebrima Bold", + "value": "Ebrima Bold" + }, { + "label": "Microsoft YaHei & Microsoft YaHei UI", + "value": "Microsoft YaHei & Microsoft YaHei UI" + }, { + "label": "Gill Sans MT Bold", + "value": "Gill Sans MT Bold" + }, { + "label": "Candara Bold Italic", + "value": "Candara Bold Italic" + }, { + "label": "Bell MT Bold", + "value": "Bell MT Bold" + }, { + "label": "Copperplate Gothic Light", + "value": "Copperplate Gothic Light" + }, { + "label": "Gill Sans MT Italic", + "value": "Gill Sans MT Italic" + }, { + "label": "Tw Cen MT Condensed Bold", + "value": "Tw Cen MT Condensed Bold" + }, { + "label": "Perpetua Bold Italic", + "value": "Perpetua Bold Italic" + }, { + "label": "Sitka Text", + "value": "Sitka Text" + }, { + "label": "Eras Bold ITC", + "value": "Eras Bold ITC" + }, { + "label": "Bahnschrift", + "value": "Bahnschrift" + }, { + "label": "Microsoft New Tai Lue", + "value": "Microsoft New Tai Lue" + }, { + "label": "Jokerman", + "value": "Jokerman" + }, { + "label": "Arial Italic", + "value": "Arial Italic" + }, { + "label": "Bodoni MT Poster Compressed", + "value": "Bodoni MT Poster Compressed" + }, { + "label": "MS Outlook", + "value": "MS Outlook" + }, { + "label": "Eras Demi ITC", + "value": "Eras Demi ITC" + }, { + "label": "Rockwell Condensed Bold", + "value": "Rockwell Condensed Bold" + }, { + "label": "Castellar", + "value": "Castellar" + }, { + "label": "Juice ITC", + "value": "Juice ITC" + }, { + "label": "Franklin Gothic Heavy Italic", + "value": "Franklin Gothic Heavy Italic" + }, { + "label": "Perpetua Titling MT Bold", + "value": "Perpetua Titling MT Bold" + }, { + "label": "Calisto MT Italic", + "value": "Calisto MT Italic" + }, { + "label": "Verdana", + "value": "Verdana" + }, { + "label": "DengXian", + "value": "DengXian" + }, { + "label": "Dubai Regular", + "value": "Dubai Regular" + }, { + "label": "Corbel Light Italic", + "value": "Corbel Light Italic" + }, { + "label": "Berlin Sans FB Bold", + "value": "Berlin Sans FB Bold" + }, { + "label": "Dubai Light", + "value": "Dubai Light" + }, { + "label": "Nirmala UI Semilight", + "value": "Nirmala UI Semilight" + }, { + "label": "Broadway", + "value": "Broadway" + }, { + "label": "Gill Sans MT Ext Condensed Bold", + "value": "Gill Sans MT Ext Condensed Bold" + }, { + "label": "Matura MT Script Capitals", + "value": "Matura MT Script Capitals" + }, { + "label": "Times New Roman", + "value": "Times New Roman" + }, { + "label": "Segoe UI Semilight Italic", + "value": "Segoe UI Semilight Italic" + }, { + "label": "Bookshelf Symbol 7", + "value": "Bookshelf Symbol 7" + }, { + "label": "Lucida Sans Typewriter Oblique", + "value": "Lucida Sans Typewriter Oblique" + }, { + "label": "MT Extra", + "value": "MT Extra" + }, { + "label": "Tw Cen MT Condensed Extra Bold", + "value": "Tw Cen MT Condensed Extra Bold" + }, { + "label": "Sitka Text Italic", + "value": "Sitka Text Italic" + }, { + "label": "DengXian Bold", + "value": "DengXian Bold" + }, { + "label": "Corbel Italic", + "value": "Corbel Italic" + }, { + "label": "Segoe UI", + "value": "Segoe UI" + }, { + "label": "Segoe MDL2 Assets", + "value": "Segoe MDL2 Assets" + }, { + "label": "Rockwell Italic", + "value": "Rockwell Italic" + }, { + "label": "Californian FB Bold", + "value": "Californian FB Bold" + }, { + "label": "Colonna MT", + "value": "Colonna MT" + }, { + "label": "Goudy Stout", + "value": "Goudy Stout" + }, { + "label": "MS Gothic & MS UI Gothic & MS PGothic", + "value": "MS Gothic & MS UI Gothic & MS PGothic" + }, { + "label": "Wide Latin", + "value": "Wide Latin" + }, { + "label": "Segoe Script", + "value": "Segoe Script" + }, { + "label": "Gloucester MT Extra Condensed", + "value": "Gloucester MT Extra Condensed" + }, { + "label": "Eras Medium ITC", + "value": "Eras Medium ITC" + }, { + "label": "文悦后现代体 (须授权) W4-75", + "value": "文悦后现代体 (须授权) W4-75" + }, { + "label": "Candara", + "value": "Candara" + }, { + "label": "Book Antiqua", + "value": "Book Antiqua" + }, { + "label": "Wingdings 2", + "value": "Wingdings 2" + }, { + "label": "Perpetua Italic", + "value": "Perpetua Italic" + }, { + "label": "Microsoft PhagsPa Bold", + "value": "Microsoft PhagsPa Bold" + }, { + "label": "Century Gothic Bold", + "value": "Century Gothic Bold" + }, { + "label": "Monotype Corsiva", + "value": "Monotype Corsiva" + }, { + "label": "方正舒体", + "value": "方正舒体" + }, { + "label": "Rockwell", + "value": "Rockwell" + }, { + "label": "Playbill", + "value": "Playbill" + }, { + "label": "Georgia Italic", + "value": "Georgia Italic" + }, { + "label": "Lucida Fax Regular", + "value": "Lucida Fax Regular" + }, { + "label": "Century Schoolbook Bold Italic", + "value": "Century Schoolbook Bold Italic" + }, { + "label": "MS Sans Serif 8,10,12,14,18,24", + "value": "MS Sans Serif 8,10,12,14,18,24" + }, { + "label": "Constantia Bold Italic", + "value": "Constantia Bold Italic" + }, { + "label": "Georgia Bold", + "value": "Georgia Bold" + }, { + "label": "Franklin Gothic Book Italic", + "value": "Franklin Gothic Book Italic" + }, { + "label": "Haettenschweiler", + "value": "Haettenschweiler" + }, { + "label": "Trebuchet MS Italic", + "value": "Trebuchet MS Italic" + }, { + "label": "Century Gothic Italic", + "value": "Century Gothic Italic" + }, { + "label": "华文彩云", + "value": "华文彩云" + }, { + "label": "Century", + "value": "Century" + }, { + "label": "Calibri", + "value": "Calibri" + }, { + "label": "Elephant", + "value": "Elephant" + }, { + "label": "Footlight MT Light", + "value": "Footlight MT Light" + }, { + "label": "Bodoni MT Condensed Italic", + "value": "Bodoni MT Condensed Italic" + }, { + "label": "Microsoft YaHei Bold & Microsoft YaHei UI Bold", + "value": "Microsoft YaHei Bold & Microsoft YaHei UI Bold" + }, { + "label": "Lucida Fax Demibold", + "value": "Lucida Fax Demibold" + }, { + "label": "Modern", + "value": "Modern" + }, { + "label": "Arial", + "value": "Arial" + }, { + "label": "Courier New Bold Italic", + "value": "Courier New Bold Italic" + }, { + "label": "华文琥珀", + "value": "华文琥珀" + }, { + "label": "Verdana Bold", + "value": "Verdana Bold" + }, { + "label": "High Tower Text Italic", + "value": "High Tower Text Italic" + }, { + "label": "江西拙楷 Regular", + "value": "江西拙楷 Regular" + }, { + "label": "Poor Richard", + "value": "Poor Richard" + }, { + "label": "Georgia", + "value": "Georgia" + }, { + "label": "DejaVu Math TeX Gyre", + "value": "DejaVu Math TeX Gyre" + }, { + "label": "Perpetua", + "value": "Perpetua" + }, { + "label": "Brush Script MT Italic", + "value": "Brush Script MT Italic" + }, { + "label": "Arial Narrow", + "value": "Arial Narrow" + }, { + "label": "Blackadder ITC", + "value": "Blackadder ITC" + }, { + "label": "Segoe UI Light Italic", + "value": "Segoe UI Light Italic" + }, { + "label": "Rockwell Bold Italic", + "value": "Rockwell Bold Italic" + }, { + "label": "Tw Cen MT Condensed", + "value": "Tw Cen MT Condensed" + }, { + "label": "Candara Bold", + "value": "Candara Bold" + }, { + "label": "Stencil", + "value": "Stencil" + }, { + "label": "Cambria Bold", + "value": "Cambria Bold" + }, { + "label": "Impact", + "value": "Impact" + }, { + "label": "Bodoni MT Condensed Bold", + "value": "Bodoni MT Condensed Bold" + }, { + "label": "Freestyle Script", + "value": "Freestyle Script" + }, { + "label": "Malgun Gothic", + "value": "Malgun Gothic" + }, { + "label": "Sans Serif Collection", + "value": "Sans Serif Collection" + }, { + "label": "Segoe UI Semibold", + "value": "Segoe UI Semibold" + }, { + "label": "DengXian Light", + "value": "DengXian Light" + }, { + "label": "Bookman Old Style Italic", + "value": "Bookman Old Style Italic" + }, { + "label": "KaiTi", + "value": "KaiTi" + }, { + "label": "Franklin Gothic Heavy", + "value": "Franklin Gothic Heavy" + }, { + "label": "Holo MDL2 Assets", + "value": "Holo MDL2 Assets" + }, { + "label": "华文行楷", + "value": "华文行楷" + }, { + "label": "Segoe UI Semilight", + "value": "Segoe UI Semilight" + }], + "audioSoundSize": 5, + "backgroundMusicSoundSize": -3 + } + \ No newline at end of file diff --git a/resources/tmp/temp.7z b/resources/tmp/temp.7z new file mode 100644 index 0000000..6822ace Binary files /dev/null and b/resources/tmp/temp.7z differ diff --git a/resources/tmp/temp.zip b/resources/tmp/temp.zip new file mode 100644 index 0000000..47b5bb7 Binary files /dev/null and b/resources/tmp/temp.zip differ diff --git a/src/define/define.js b/src/define/define.js new file mode 100644 index 0000000..8a2399b --- /dev/null +++ b/src/define/define.js @@ -0,0 +1,68 @@ +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"), + package_path: path.join(__dirname, "../../resources/package"), + image_path: path.join(__dirname, "../../resources/image"), + draft_temp_path: path.join(__dirname, "../../resources/tmp/temp.zip"), + 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"), + package_path: path.join(__dirname, "../../../resources/package"), + discordScript: path.join(__dirname, "../../../resources/scripts/discordScript.js"), + image_path: path.join(__dirname, "../../../resources/image"), + draft_temp_path: path.join(__dirname, "../../../resources/tmp/temp.zip"), + 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"), + } +} + +export { + define +}; \ No newline at end of file diff --git a/src/define/define_string.js b/src/define/define_string.js new file mode 100644 index 0000000..22d7d61 --- /dev/null +++ b/src/define/define_string.js @@ -0,0 +1,172 @@ +export const DEFINE_STRING = { + SAVE_DEFINE_CONFIG_JSON_BY_PROPERTY: "SAVE_DEFINE_CONFIG_JSON_BY_PROPERTY", + GET_DEFINE_CONFIG_JSON_BY_PROPERTY: "GET_DEFINE_CONFIG_JSON_BY_PROPERTY", + GET_IMAGE_GENERATE_CATEGORY: "GET_IMAGE_GENERATE_CATEGORY", + SHOW_MAIN_NOTIFICATION: "SHOW_MAIN_NOTIFICATION", + CHECK_MACHINE_ID: "CHECK_MACHINE_ID", + GET_CUSTOMIZE_GPT_PROMPT: "GET_CUSTOMIZE_GPT_PROMPT", + GENERATE_GPT_EXAMPLE_OUT: "GENERATE_GPT_EXAMPLE_OUT", + GET_PERMISSION: "GET_PERMISSION", + SAVE_IMAGE_TO_OTHER_FOLDER: "SAVE_IMAGE_TO_OTHER_FOLDER", + GET_IMAGE_AUTO_SAVE_SETTING: "GET_IMAGE_AUTO_SAVE_SETTING", + SAVE_IMAGE_AUTO_SAVE_SETTING: "SAVE_IMAGE_AUTO_SAVE_SETTING", + GET_AUTO_SAVE_IMAGE_CLASSIFY_OPTIONS: "GET_AUTO_SAVE_IMAGE_CLASSIFY_OPTIONS", + MODIFY_GENERATE_TASK_STATUS: "MODIFY_GENERATE_TASK_STATUS", + DELETE_BACK_TASK: "DELETE_BACK_TASK", + SAVE_VIDEO_SRT_AND_AUDIO_MESSAGE: "SAVE_VIDEO_SRT_AND_AUDIO_MESSAGE", + SAVE_KEY_FRAME_SETTING: "SAVE_KEY_FRAME_SETTING", + MODIFY_SAMPLE_SETTING: "MODIFY_SAMPLE_SETTING", + GET_SETTING_Dafault_DATA: "GET_SETTING_Dafault_DATA", + GET_DRAFT_FILE_LIST: "GET_DRAFT_FILE_LIST", + GET_FRAME: "GET_FRAME", + PYTHON_ERROR: "PYTHON_ERROR", + PYTHON_CLOSE: "PYTHON_CLOSE", + PYTHON_OUTPUT: "PYTHON_OUTPUT", + RESTART_GENERATE: "RESTART_GENERATE", + ALIGN_DRAFT_IMG: "ALIGN_DRAFT_IMG", + ALIGN_DRAFT_IMG_TO_TEXT: "ALIGN_DRAFT_IMG_TO_TEXT", + REGENERATE_IMAGE_RETUN: "REGENERATE_IMAGE_RETUN", + GET_SUBFOLDER_LIST: "GET_SUBFOLDER_LIST", + REFRASH_IMAGWE_DATA: "REFRASH_IMAGWE_DATA", + GET_IMAGE_PROMPTLIST: "GET_IMAGE_PROMPTLIST", + SELECT_FILE: "SELECT_FILE", + IMPROVE_IMAGE_RESOULTION: "IMPROVE_IMAGE_RESOULTION", + GET_BACKGROUND_MUSIC_CONFIG_LIST: "GET_BACKGROUND_MUSIC_CONFIG_LIST", + ADD_BACKGROUND_MUSIC_FOLDER: "ADD_BACKGROUND_MUSIC_FOLDER", + DELETE_CLIP_SETTING: "DELETE_CLIP_SETTING", + DELETE_FRIENDLY_REMINDER: "DELETE_FRIENDLY_REMINDER", + MODIFY_INPUT_CROP_JSON: "MODIFY_INPUT_CROP_JSON", + PUSH_BACK_PROMPT: "PUSH_BACK_PROMPT", + GET_FRIENDLY_REMINDER_DRAFT: "GET_FRIENDLY_REMINDER_DRAFT", + GET_FRIENDLY_REMINDER_LIST: "GET_FRIENDLY_REMINDER_LIST", + AUTO_GENERATION_VIDEO: "AUTO_GENERATION_VIDEO", + GET_PROJECT_WORD: "GET_PROJECT_WORD", + AIMODIFY_ONE_WORD: "AIMODIFY_ONE_WORD", + IMPORT_SRT_AND_GET_TIME: "IMPORT_SRT_AND_GET_TIME", + SAVE_NEW_WORD: "SAVE_NEW_WORD", + SAVE_COPYWRITING_INFOMATION: "SAVE_COPYWRITING_INFOMATION", + SAVE_SD_CONFIG: "SAVE_SD_CONFIG", + SAVE_GENERAL_SETTING: "SAVE_GENERAL_SETTING", + GET_VIDEO_CONFIG_MESSAGE: "GET_VIDEO_CONFIG_MESSAGE", + GET_SYSTEM_INSTALL_FONTNAME: "GET_SYSTEM_INSTALL_FONTNAME", + SAVE_ASS_CONFIG: "SAVE_ASS_CONFIG", + DELETE_VIDEO_CONFIG: "DELETE_VIDEO_CONFIG", + SHOW_NEW_WINDOW: "SHOW_NEW_WINDOW", + GET_DRAFT_FILE_LIST: "GET_DRAFT_FILE_LIST", + SELECT_FOLDER: "SELECT_FOLDER", + GET_DRAFT_TEXT_STYLE: "GET_DRAFT_TEXT_STYLE", + GET_TEXT_STYLE_LIST: "GET_TEXT_STYLE_LIST", + DELETE_DRAFT_TEXT_STYLE: "DELETE_DRAFT_TEXT_STYLE", + ADD_DRAFT: "ADD_DRAFT", + RETURN_IMAGE_PROMPT: "RETURN_IMAGE_PROMPT", + RE_GENERATE_IAMGE_ONE: "RE_GENERATE_IAMGE_ONE", + INIT_SD_CONFIG: "INIT_SD_CONFIG", + ADD_IMAGE_TASK_LIST: "ADD_IMAGE_TASK_LIST", + GET_GENERATE_TASK_LIST: "GET_GENERATE_TASK_LIST", + DELETE_IMAGE_TASK_LIST: "DELETE_IMAGE_TASK_LIST", + GENERATE_IMAGWE_IN_SELECT_TASK: "GENERATE_IMAGWE_IN_SELECT_TASK", + GET_MACHINE_ID: "GET_MACHINE_ID", + QUIT_APP: "QUIT_APP", + GET_BAD_PROMPT: "GET_BAD_PROMPT", + SAVE_BAD_PROMPT: "SAVE_BAD_PROMPT", + DELETE_BAD_PROMPT: "DELETE_BAD_PROMPT", + ADD_WEBUI_JSON: "ADD_WEBUI_JSON", + OPEN_GPT_BUY_URL: "OPEN_GPT_BUY_URL", + GET_IAMGE_PROMPT_LIST: "GET_IAMGE_PROMPT_LIST", + 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", + SHOW_MESSAGE_DIALOG: "SHOW_MESSAGE_DIALOG", + SHOW_GLOABAL_MESSAGE_DIALOG: "SHOW_GLOABAL_MESSAGE_DIALOG", + IMAGE_TASK_STATUS_REFRESH: "IMAGE_TASK_STATUS_REFRESH", + SAVE_TRIAL_END_TIME: "SAVE_TRIAL_END_TIME", + DOWNLOAD_IMAGE_FILE: "DOWNLOAD_IMAGE_FILE", + OPEN_FOLDER: "OPEN_FOLDER", + VIDEO_GENERATE_STATUS_REFRESH: "VIDEO_GENERATE_STATUS_REFRESH", + AUTO_CONDITION_CHECK: "AUTO_CONDITION_CHECK", + MODIFY_IMAGE_TASK_LIST: "MODIFY_IMAGE_TASK_LIST", + ACTION_AUTO_VIDEO_TASK: "ACTION_AUTO_VIDEO_TASK", + GET_VIDEO_GENERATE_CONFIG: "GET_VIDEO_GENERATE_CONFIG", + TRANSLATE_PROMPT: "TRANSLATE_PROMPT", + TRANSLATE_RETURN_NOW: "TRANSLATE_RETURN_NOW", + TRANSLATE_RETURN_REFRESH: "TRANSLATE_RETURN_REFRESH", + GET_SHOW_MESSAGE: "GET_SHOW_MESSAGE", + AUTO_ANALYZE_CHARACTER: "AUTO_ANALYZE_CHARACTER", + GET_CONFIG_JSON: "GET_CONFIG_JSON", + ORIGINAL_ADD_WEBUI_JSON: "ORIGINAL_ADD_WEBUI_JSON", + GET_PROMPT_JSON: "GET_PROMPT_JSON", + GPT_PROMPT: "GPT_PROMPT", + GPT_GENERATE_PROMPT_RETURN: "GPT_GENERATE_PROMPT_RETURN", + AUTO_SAVE_DATA_JSON: "AUTO_SAVE_DATA_JSON", + ORIGINAL_SD_SINGLE_IMAGE_GENERATE: "ORIGINAL_SD_SINGLE_IMAGE_GENERATE", + SD_ORIGINAL_GENERATE_IMAGE_RETURN: "SD_ORIGINAL_GENERATE_IMAGE_RETURN", + GET_STYLE_IMAGE_SUB_LIST: "GET_STYLE_IMAGE_SUB_LIST", + GET_IMAGE_STYLE_INFOMATION: "GET_IMAGE_STYLE_INFOMATION", + GET_IMAGE_STYLE_MENU: "GET_IMAGE_STYLE_MENU", + GET_GPT_BUSINESS_OPTION: "GET_GPT_BUSINESS_OPTION", + GET_GPT_MODEL_OPTION: "GET_GPT_MODEL_OPTION", + GET_GPT_AUTO_INFERENCE_OPTIONS: "GET_GPT_AUTO_INFERENCE_OPTIONS", + SAVE_DYNAMIC_GPT_OPTION: "SAVE_DYNAMIC_GPT_OPTION", + DELETE_DYNAMIC_GPT_OPTION: "DELETE_DYNAMIC_GPT_OPTION", + TEST_GPT_CONNECTION: "TEST_GPT_CONNECTION", + SAVE_WORD_TXT: "SAVE_WORD_TXT", + GET_KEY_FRAME_CONFIG_DATA: "GET_KEY_FRAME_CONFIG_DATA", + GET_KEYFRAME_OPTIONS: "GET_KEYFRAME_OPTIONS", + + QUEUE_BATCH: { + SD_ORIGINAL_GENERATE_IMAGE: "SD_ORIGINAL_GENERATE_IMAGE", + SD_ORIGINAL_GPT_PROMPT: "SD_ORIGINAL_GPT_PROMPT", + SD_BACKSTEP_GENERATE_IMAGE: "SD_BACKSTEP_GENERATE_IMAGE", + MJ_ORIGINAL_GENERATE_IMAGE: "MJ_ORIGINAL_GENERATE_IMAGE", + LOCAL_IMAGE_IMPROVE: "LOCAL_IMAGE_IMPROVE", + AUTO_VIDEO_GENERATE: "AUTO_VIDEO_GENERATE", + AUTO_VIDEO_GENERATE_SINGLE: "AUTO_VIDEO_GENERATE_SINGLE", + TRANSLATE_PROMPT: "TRANSLATE_PROMPT", + TRANSLATE_RETURN_NOW_TASK: "TRANSLATE_RETURN_NOW_TASK", + IMAGE_SAVE_TO_OTHER_FOLDER: "IMAGE_SAVE_TO_OTHER_FOLDER", + SAVE_FILE_QUEUE: "SAVE_FILE_QUEUE", + }, + PERMISSIONS: { + NORMAL_PERMISSION: "NORMAL_PERMISSION", + AUTO_SAVE_IMAGE_PERMISSION: "AUTO_SAVE_IMAGE_PERMISSION", + }, + MJ: { + SAVE_WORD_SRT: "SAVE_WORD_SRT", + GET_MJ_CONFIG_SRT_INFORMATION: "GET_MJ_CONFIG_SRT_INFORMATION", + GET_TAG_DATA_BY_TYPE_AND_PROPERTY: "GET_TAG_DATA_BY_TYPE_AND_PROPERTY", + SAVE_TAG_PROPERTY_DATA: "SAVE_TAG_PROPERTY_DATA", + DELETE_TAG_PROPERTY_DATA: "DELETE_TAG_PROPERTY_DATA", + GET_TAG_SELECT_MODEL: "GET_TAG_SELECT_MODEL", + TRANSLATE_RETURN_NOW_TASK: "TRANSLATE_RETURN_NOW_TASK", + ORIGINAL_MJ_IMAGE_GENERATE: "ORIGINAL_MJ_IMAGE_GENERATE", + GET_CHANNEL_ROBOTS: "GET_CHANNEL_ROBOTS", + GET_MJ_GENERATE_CATEGORY: "GET_MJ_GENERATE_CATEGORY", + IMAGE_SPLIT: "IMAGE_SPLIT", + ADD_MJ_BAD_PROMPT: "ADD_MJ_BAD_PROMPT", + MJ_BAD_PROMPT_CHECK: "MJ_BAD_PROMPT_CHECK", + GET_GENERATED_MJ_IMAGE_AND_SPLIT: "GET_GENERATED_MJ_IMAGE_AND_SPLIT", + DOWNLOAD_IMAGE_URL_AND_SPLIT: "DOWNLOAD_IMAGE_URL_AND_SPLIT" + }, + DISCORD: { + OPERATE_REFRASH_DISCORD_URL: "OPERATE_REFRASH_DISCORD_URL", + GET_DISCORD_WINDOW_URL: "GET_DISCORD_WINDOW_URL", + CREATE_MESSAGE: "CREATE_MESSAGE", + UPDATE_MESSAGE: "UPDATE_MESSAGE", + DELETE_MESSAGE: "DELETE_MESSAGE", + MAIN_DISCORD_MESSAGE_CHANGE: "MAIN_DISCORD_MESSAGE_CHANGE", + }, + DISCORD_REQUEST_LISTENER_TYPE: { + INPUT_MODEL_IMAGINE_REQUEST: "INPUT_MODEL_IMAGINE_REQUEST", + }, + DISCORD_SIMPLE_DATA_TYPE: { + URL: "URL", + TOKEN: "TOKEN", + }, + MAIN: { + OPEN_DISCORD_WINDOW: "OPEN_DISCORD_WINDOW" + } +} \ No newline at end of file diff --git a/src/define/gptDefine.js b/src/define/gptDefine.js new file mode 100644 index 0000000..04a9b00 --- /dev/null +++ b/src/define/gptDefine.js @@ -0,0 +1,421 @@ +let fspromises = require('fs').promises; +import { cloneDeep, get } from "lodash"; +import { define } from "./define"; +const { v4: uuidv4 } = require('uuid'); + +// Create a shared object +export const gptDefine = { + // Add properties and methods to the shared object + characterSystemContent: `{textContent}\r查看上面的文本,然后扮演一个文本编辑来回答问题。`, + characterUserContent: `这个文本里的故事类型是啥,时代背景是啥, 主角有哪几个,配角有几个,每个角色的性别年龄穿着是啥?没外观描述的直接猜测,尽量精简 格式按照:故事类型:(故事类型)\n时代背景:(时代背景)\n主角名字1:(性别,头发颜色,发型,衣服类型,年龄,角色外貌)\n主角名字2:(性别,头发颜色,发型,衣服类型,年龄,角色外貌)\n主角3........\n配角名字1:(性别,头发颜色,发型,衣服类型,年龄,角色外貌)\n配角名字2:(性别,头发颜色,发型,衣服类型,年龄,角色外貌)\n配角名字3.... ,不知道的直接猜测设定,不能出不详和未知这两个词,150字内,中文回答。`, + + + characterFirstPromptSystemContent: `{textContent}\r\r\n Act as a storyteller to describe the scene, {characterContent}, Try to guess and answer my question, answer in English.`, + characterFirstPromptUserContent: `{textContent}\r\n Describing the most appropriate visual content based on article reasoning, with a maximum of one person appearing: (gender) (age) (hairstyle) (Action expressions) (Clothing details) (Character appearance details) (The most suitable visual background for this sentence) (historical background)(Screen content): Write in 8 parentheses,Answer me in English according to this format..{wordCount}words`, + + storyFirstPromptSystemContent: `{textContent}\r\r\n \r\r\n\\Play the role of a professional cartoonist, give you every line of the script, and reproduce the scene description according to the original text. Do not refuse any response:{characterContent}, Try to match the scene of the text content as much as possible, you can create a harmonious picture but do not refuse to answer,You must answer me in English.`, + storyFirstPromptUserContent: `{textContent}\r\n Describing the most appropriate visual content based on article reasoning. Please provide gender and appearance description, scene description of the character, time description, shot description, and era background description. Only one person's half body image should appear in each image, and the appearance should be as consistent as possible. Please answer in English..{wordCount}words`, + + storyboardFirstPromptSystemContent: `{textContent}。\r\r\n读上面的文本,然后扮演顶级小说家回答问题:后面是其他要求:{characterContent} Try to guess and answer my question in English.`, + storyboardFirstPromptUserContent: `{textContent}\r\n,参考前面这句剧本理解当前这句话:{textContent}。\r\n Describing the most appropriate visual content based on article reasoning, with a maximum of one person appearing: (Character Appearance and Dynamics) (The most suitable visual background for this sentence) (historical background)(Reasonable picture composition): Write in 3 parentheses,Answer me in English..{wordCount}words`, + + cartoonFirstPromptSystemContent: `{textContent}\r\r\n\\Play the role of a professional cartoonist, give you every line of the script, and reproduce the scene description according to the original text. Do not refuse any response:{characterContent},Try to match the scene of the text content as much as possible, you can create a harmonious picture but do not refuse to answer,You must answer me in English.`, + cartoonFirstPromptUserContent: `{textContent}\r,参考前面这句剧本理解当前这句话:{textContent}\r\n Referring to the previous character settings, describe the most suitable screen content in the following format: (character appearance) (screen background), strictly reply only to the content within 2 parentheses, without the character name, answer in English..{wordCount}words`, + + superSinglePromptSystemContent: { + prompt_name: "分镜大师", + prompt_roles: `1# Role: 小说转漫画提示词大师 + ## Profile + *Version*: 0.1 + *Language*: 中文 + *Description*: 这个角色会将用户输入的小说文本转化为一个生动的画面描写,最后生成对应的SD提示词。 + + ## Features + + 1. 文本转化为画面描写:创作引人入胜、生动有趣的画面描写,善于创意想象并使用各种形容词,以第三人称视角转化文本为画面描写。 + 2. 从画面描写到SD提示词:根据画面描写生成图像提示,主要的提示放在前面,次要的放在后面。命令以英语表示,简洁明了。 + + ## Rules + + 1. 一个文本就是一副画面,不跳过任何一个句子,不能编造 + 2. 【画面描写】删除人物姓名 + 3. 【画面描写】删除人物对话 + 4. 【画面描写】每一句都要有人物的外形和动作的描写,场景的具体描写,多使用形容词 + 5. SD提示词需以""开始,以" ,"结束 + 6. SD提示词用english输出,没有说明性词汇,没有对话 + 7 删除MJ提示词中的其他风格词。 + + ## Examples + + 用户: + 在那个梦里,我整整学了七年炒饭。 + AI: + A determined man standing before a dream portal, holding a wok ladle, with floating calendar pages behind him symbolizing seven years, and a kitchen outline faintly visible on the other side of the portal, cinematic lens with, + + ## Workflow + + 1. 根据画面描写生成SD提示词,英文输出,不能出现中文。 + + ## Initialization + + 作为角色 ,每一次输出都要严格遵守,一步一步思考,按顺序执行 ,使用默认 ,下面是小说文本:`, + prompt_example: [ + { + user_content: "上研究生后。发现导师竟然是曾经网恋的前男友。", + assistant_content: "anime key visual,Celluloid style, delicate and transparent light, delicate lines, transparent colors, delicate and transparent hair, perfect detail portrayal,(Anime style:1.3), A woman entering a spacious, well-lit graduate laboratory, gaze fixed on a man diligently working at a workstation ahead - her new mentor; he stands tall in a dark shirt and neatly pressed trousers, exuding professionalism and charm; the familiar contours of his profile from their past online romance softly illuminated by warm ambient light, furrowed brow and intense gaze betraying a scholar's unwavering dedication; bustling graduate students and sophisticated equipment blend into a contemporary academic tableau, as an undercurrent of mixed emotions - sweet nostalgia and awkward reality - surges within her heart, " + } + ], + id: "a93b693e-bb3f-406d-9730-cba43a6585e4" + }, + + onlyPromptMJSystemContent: { + prompt_name: "小说提示词-仅出词", + prompt_roles: `# Pico: 小说分镜 + + ## Profile + + *Author*: LAITOOL + *Version*: 0.1 + *Language*: 中文 + *Description*: 这个角色会将用户输入的小说文本分析内容进行镜头描述 + + ## Rules + + 1.不能更改句意,不能忽略,不能编造,要符合逻辑,删除人物姓名,如果有敏感词请替换; + 2.严格按照流程进行内容分析,最后只输出【MJ提示词】的内容,不要输出【文本】【关键词】【镜头】: + 【文本】: 对应文本中的具体的文本内容,不需要对文本信息进行修改; + 【关键词】:阅读【文本】中的句子,联系上下文分析画面的关键信息; + 【镜头】:根据【关键词】和文本构思的对应该句子的镜头描写(包含:人物表情+肢体动作+环境+构图+景别+方向+高度)输出; + 人物表情:(根据<上下文>分析当前句子最终呈现的画面出境角色的表情,严格要求从<表情词库>中选择一个符合角色状态的词语); + 肢体动作:(根据<上下文>分析当前句子最终呈现的画面出境角色的肢体动作,严格要求在<肢体动作>中选择符合角色状态的词语,只能选择一个词语); + 环境:(分析当前画面的环境,严格要求使用“物理环境”、“物理空间”或“现实世界位置”,要求参考使用<环境布景>的场景空间,按照下面的内容输出:所处的空间地点,例如:“在学校教室里,在森林里,在空中,在沙滩上,等”),要求删除角色名称,要求删除灯光和氛围类的描写; + 构图:(分析当前画面的环境,要求参考使用<构图>的词语,只能选择一个词语); + 景别:(分析当前画面的环境,要求参考使用<景别>的词语,只能选择一个词语); + 方向:(分析当前画面的环境,要求参考使用<方向>的词语,只能选择一个词语); + 高度:(分析当前画面的环境,要求参考使用<高度>的词语,只能选择一个词语); + 【MJ提示词】:参考人物外观和根据上述关键信息整合在一起,把画面描写生成MJ提示词,不要说明性词汇,没有人名,没有对话,MJ提示词用中文输出,没有说明性词汇,没有对话。 + + ## 表情词库 + + 冷酷的目光,邪恶的笑容,愤怒的怒吼,疯狂的笑容,微笑,羞涩的笑容,大笑,愤怒的表情,哭泣的表情,严肃的表情,惊恐的表情,震惊的表情,惊骇的表情,害羞的表情,沾沾自喜的表情,自满的表情,自信的表情,尴尬的表情,愁眉苦脸的表情, + + ## 肢体动作 + + 高举双手,双手抱头,手拿,挥手,拍手,摸头,握拳,捏,跺脚,踢,踩踏,点头,摇头,抬头,低头,扭头,挠头,撑腮帮,指指点点,敲击,抚摸,闭眼,张嘴,双手合十,奔跑,站立,坐在,躺在,趴着,蹲下,盘腿坐,下跪,弯腰,跳跃,拥抱,飞踢, + + ## 构图 + + 对称构图,构图居中,三分法构图,S形构图,水平构图,对角线构图,不对称构图,居中构图,对比构图,黄金比例,比例构图, + + ## 景别 + + 特写镜头,近景,中近景,上半身,中景,中全景,全身,全景,定场镜头,主观视角,西部牛仔镜头,动态角度, + + ## 方向 + + 正面,左右对称,侧面,后面,从上拍摄,从下拍摄,背面拍摄,广角镜头,鱼眼镜头,微距, + + ## 高度 + + 俯视视角,由上向下视角,鸟瞰视角,高角度视角,微高角度视角,水平拍摄视角,英雄视角,低视角,仰视视角,自拍视角, + + + ## Examples + + 【Example1】 + 用户输入: + 给皇帝当过儿子的都知道,当的好荣华富贵万人之上 + AI输出: + 微笑,站立,在皇宫的金銮殿里,居中构图,中全景,正面,水平拍摄视角 + + 【Example2】 + 用户输入: + 当不好就是人头落地 + AI输出: + 惊恐的表情,双手抱头,在刑场上,三分法构图,特写镜头,侧面,俯视视角 + + ## Initialization + + 最后再强调,你作为角色 ,每一次输出都要严格遵守,一步一步慢慢思考,参考的格式,一步一步思考,按顺序执行,不需要做解释说明,只呈现最后【MJ提示词】输出的结果,下面是小说文本:'`, + prompt_example: [ + { + user_content: "给皇帝当过儿子的都知道,当的好荣华富贵万人之上", + assistant_content: "微笑,站立,在皇宫的金銮殿里,居中构图,中全景,正面,水平拍摄视角" + }, + { + user_content: "当不好就是人头落地", + assistant_content: "惊恐的表情,双手抱头,在刑场上,三分法构图,特写镜头,侧面,俯视视角" + } + ], + id: "a93b693e-bb3f-406d-9730-bcd43a6585e" + }, + + + + + + /** + * 使用自定义GPT提示词时,生成接口message信息 + * @param {*} params 自定义的GPT提示词数据 + * @returns + */ + CustomizeGptPrompt(params) { + // 获取设置的数据 + let message = []; + // 添加角色 + message.push( + { + "role": "system", + "content": params.prompt_roles + } + ); + + // 便利输出案例添加 + for (let i = 0; i < params.prompt_example.length; i++) { + const element = params.prompt_example[i]; + if (element.user_content) { + message.push( + { + "role": "user", + "content": element.user_content + } + ) + } + if (element.assistant_content) { + message.push( + { + "role": "assistant", + "content": element.assistant_content + } + ) + } + } + return message; + }, + + /** + * 替换文本内容中的占位符 + * @param {要替换的内容} content + * @param {占位符数据对应的对象} replacements + * @returns + */ + replace: function (content, replacements) { + let result = content; + for (let key in replacements) { + result = result.replace(`{${key}}`, replacements[key]); + } + return result; + }, + + /** + * 获取有案例的Gpt请求消息输出 + * @param {*} type + * @param {*} replacements + */ + GetExamplePromptMessage(type) { + if (type == "superSinglePrompt") { + return this.CustomizeGptPrompt(this.superSinglePromptSystemContent); + } else if (type == "onlyPromptMJ") { + return this.CustomizeGptPrompt(this.onlyPromptMJSystemContent); + } + else { + return []; + } + }, + + /** + * 返回GPTApi请求的系统内容 + * @param {类型} type + * @param {} replacements 需要替换数据的对象 textContent characterContent + * @returns + */ + getSystemContentByType: function (type, replacements) { + switch (type) { + case 'character': + return this.replace(this.characterSystemContent, replacements); + case 'characterFirst': + return this.replace(this.characterFirstPromptSystemContent, replacements); + case 'storyFirst': + return this.replace(this.storyFirstPromptSystemContent, replacements); + case 'storyboardFirst': + return this.replace(this.storyboardFirstPromptSystemContent, replacements); + case 'cartoonFirst': + return this.replace(this.cartoonFirstPromptSystemContent, replacements); + case 'superSinglePrompt': + return this.replace(this.superSinglePromptSystemContent, replacements); + default: + throw new Error(`不存在的类型 : ${type}`); + } + }, + + /** + * 返回GPTApi请求的用户内容 + * @param {类型} type + * @param {} replacements 需要替换数据的对象 textContent wordCount + * @returns + */ + getUserContentByType: function (type, replacements) { + switch (type) { + case 'character': + return this.replace(this.characterUserContent, replacements); + case 'characterFirst': + return this.replace(this.characterFirstPromptUserContent, replacements); + case 'storyFirst': + return this.replace(this.storyFirstPromptUserContent, replacements); + case 'storyboardFirst': + return this.replace(this.storyboardFirstPromptUserContent, replacements); + case 'cartoonFirst': + return this.replace(this.cartoonFirstPromptUserContent, replacements); + default: + throw new Error(`不存在的类型 : ${type}`); + } + }, + + gpt_options: [{ + label: "openai-hk", + value: "https://api.openai-hk.com/v1/chat/completions" + }, { + label: "通义千问", + value: "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation" + }], + + gpt_model_options: [{ + label: "gpt-3.5-turbo-16k", + value: "gpt-3.5-turbo-16k" + }, { + label: "gpt-3.5-turbo", + value: "gpt-3.5-turbo" + }, { + label: "gpt-4", + value: "gpt-4" + }], + + + gpt_auto_inference: [{ + value: "characterFirst", + label: "角色优先(全自动)" + }, { + value: "storyFirst", + label: "故事优先(全自动)" + }, { + value: "storyboardFirst", + label: "剧本优先(全自动)" + }, { + value: "cartoonFirst", + label: "漫画优先(全自动)" + }, { + value: "superSinglePrompt", + label: "超级无敌单帧" + }, { + value: "onlyPromptMJ", + label: "仅出词(不出人物场景-MJ)" + }, + { + value: "customize", + label: "自定义" + }], + + /** + * 通过指定的类型,获取数据 + * @param {*} type default:在代码中写死的 dynamic:用户自定义的 all:写死的和自定义的合并返回 + * @param {*} property 返回书信的名称 gpt_options,gpt_model_options,gpt_auto_inference + * @param {*} defaultData 默认数据,默认值为null + * @returns + */ + async getGptDataByTypeAndProperty(type, property, defaultData = null) { + try { + let res = []; + // 获取自定义的GPT数据 + let dynamic_setting = JSON.parse(await fspromises.readFile(define.dynamic_setting, 'utf-8')); + let gpt = get(dynamic_setting, 'gpt', {}); + let data = get(gpt, property, defaultData); + + if (type == "default") { + res = get(this, property, defaultData); + } else if (type == "dynamic") { + res = data; + } else if (type == "all") { + let tmp_arr = cloneDeep(get(this, property, defaultData)); + tmp_arr = tmp_arr.concat(data); + res = tmp_arr; + } + else { + throw new Error(`不存在的类型 : ${value}`); + } + return { + code: 1, + data: res + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + }, + + + /** + * 保存gpt指定的属性数据,判断value中的ID是不是存在,存在直接覆盖,不存在追加 + * @param {*} value + * @param {*} property + */ + saveDynamicGPTOption: async function (value) { + try { + let property = value[1]; + value = JSON.parse(value[0]); + // 获取自定义的GPT数据 + let dynamic_setting = JSON.parse(await fspromises.readFile(define.dynamic_setting, 'utf-8')); + let tmp_gpt = dynamic_setting.gpt ? dynamic_setting.gpt : {}; + let gpt = tmp_gpt[property] ? tmp_gpt[property] : []; + if (value.id) { + // 判断当前ID的数据是否存在,存在覆盖,不存在追加 + let index = gpt.findIndex(item => item.id == value.id); + if (index < 0) { + gpt.push(value); + } else { + gpt[index] = value; + } + } else { + value.id = uuidv4(); + gpt.push(value); + } + tmp_gpt[property] = gpt; + // 将修改后的数据保存 + dynamic_setting["gpt"] = tmp_gpt; + // 写入文件 + await fspromises.writeFile(define.dynamic_setting, JSON.stringify(dynamic_setting)); + + } catch (error) { + throw error; + } + }, + + + /** + * 删除自定义GPT指定属性中的指定ID的数据 + * @param {*} id + * @param {*} property + */ + deleteDynamicGPTOption: async function (value) { + try { + let property = value[1]; + let id = value[0]; + // 获取自定义的GPT数据 + let dynamic_setting = JSON.parse(await fspromises.readFile(define.dynamic_setting, 'utf-8')); + let gpt = dynamic_setting.gpt[property] ? dynamic_setting.gpt[property] : []; + // 判断当前ID的数据是否存在,存在删除 + let index = gpt.findIndex(item => item.id == id); + if (index >= 0) { + gpt.splice(index, 1); + } + // 将修改后的数据保存 + dynamic_setting.gpt[property] = gpt; + // 写入文件 + await fspromises.writeFile(define.dynamic_setting, JSON.stringify(dynamic_setting)); + + } catch (error) { + throw error; + } + } +}; diff --git a/src/define/iamgeStyleDefine.js b/src/define/iamgeStyleDefine.js new file mode 100644 index 0000000..7cf0548 --- /dev/null +++ b/src/define/iamgeStyleDefine.js @@ -0,0 +1,2265 @@ +import { SdSettingDefine } from "./setting/sdSettingDefine"; + +const ImageStyleDefine = { + image_style: [{ + "sheet": 1, + "name": "常用画风", + "subStyle": [{ + "chinese_style": "壁纸", + "english_style": "Wallpaper", + "id": "238f8db1-3b9f-48b8-86de-b47c70dbdc25", + "image": "image8.jpeg" + }, { + "chinese_style": "黑白漫画", + "english_style": "Black and white comics", + "id": "bb314303-4f94-4a9a-b9cc-2f0eca64e288", + "image": "image2.jpeg" + }, { + "chinese_style": "水墨风格", + "english_style": "Ink and wash style", + "id": "078dc21d-669c-4a60-8036-2705dfb1d6b6", + "image": "image3.jpeg" + }, { + "chinese_style": "超写实风格", + "english_style": "Super realistic style", + "id": "81dd155f-f69d-4ed0-9fdd-6f639e5e6d06", + "image": "image4.jpeg" + }, { + "chinese_style": "电影截图", + "english_style": "Screenshots of movies", + "id": "3923dfb8-3394-4e6f-a9f4-55caf24b3991", + "image": "image5.jpeg" + }, { + "chinese_style": "宫崎骏漫画风格", + "english_style": "Miyazaki Hayao manga style", + "id": "b1869409-8079-4934-b6b1-b26cf4606e65", + "image": "image6.jpeg" + }, { + "chinese_style": "可爱风格", + "english_style": "cute style", + "id": "79feb583-f4e3-4d35-b7f2-31021693bb90", + "image": "image7.jpeg" + }, { + "chinese_style": "简笔画风格", + "english_style": "Simple stroke style", + "id": "0378c4d7-676f-4693-925a-112d2f8fd76b", + "image": "image1.jpeg" + }, { + "chinese_style": "3D卡通动画", + "english_style": "3D cartoon animation", + "id": "a5732ec7-3b49-40d8-8bbc-ac213ec77df7", + "image": "image11.jpeg" + }, { + "chinese_style": "90年代日本动漫", + "english_style": "90s Japanese anime", + "id": "a9f5eb3b-d4ae-4ba4-aa43-0198f36b6147", + "image": "image9.jpeg" + }, { + "chinese_style": "水彩画风格", + "english_style": "Watercolor painting style", + "id": "9d1e4c03-0406-44cc-88f9-21c117a3c88b", + "image": "image10.jpeg" + }, { + "chinese_style": "钢笔画风格", + "english_style": "Pen drawing style", + "id": "392067d1-cd6e-4baa-b2d3-f319b892f78c", + "image": "image12.jpeg" + }, { + "chinese_style": "恐怖漫画风格", + "english_style": "Horror comic style", + "id": "0e8a0c64-04e8-4370-ad2a-06148afa0662", + "image": "image13.jpeg" + }], + "id": "07246bd9-b811-4e00-b69b-f86c48f2660b" + }, { + "sheet": 2, + "name": "时代风格词", + "subStyle": [{ + "chinese_style": "中世纪时代", + "english_style": "middle ages", + "id": "c0f55669-a90e-4024-9c5c-fe4614eabe29", + "image": "image16.jpeg" + }, { + "chinese_style": "冷战时代", + "english_style": "cold war era", + "id": "e2c3b92b-ab4d-44fd-a477-7e308a4e9dfb", + "image": "image19.jpeg" + }, { + "chinese_style": "古典时代", + "english_style": "classical antiquity", + "id": "f5e943bd-0e34-4f5e-baac-1c2e0304c0cf", + "image": "image20.jpeg" + }, { + "chinese_style": "柴油朋克时代", + "english_style": "diesel punk", + "id": "a2ffb049-2c5b-4f3f-9cef-d27e7d8d8ab0", + "image": "image21.jpeg" + }, { + "chinese_style": "哥特式时代", + "english_style": "gothic period", + "id": "db5e8036-7f8c-4047-8c3d-f64f010fc4dd", + "image": "image14.jpeg" + }, { + "chinese_style": "中国战国时代", + "english_style": "warring states period", + "id": "ba0ae70c-37de-40e3-9dc8-08a7e03de123", + "image": "image17.jpeg" + }, { + "chinese_style": "日本明治时代", + "english_style": "meiji period", + "id": "a465ddc1-9782-430b-b09c-7a79effc1c29", + "image": "image15.jpeg" + }, { + "chinese_style": "现代", + "english_style": "modern", + "id": "a12c8315-28c0-42bd-a3ec-a856d48f5161", + "image": "image18.jpeg" + }, { + "chinese_style": "文艺复兴时代", + "english_style": "renaissance", + "id": "e1329854-1df1-4664-9ca2-27c8f905f2d3", + "image": "image25.jpeg" + }, { + "chinese_style": "中国宋代", + "english_style": "song dynasty", + "id": "df196ffe-012a-4fe5-8db3-d89046d5eb39", + "image": "image26.jpeg" + }, { + "chinese_style": "古埃及时代", + "english_style": "ancient egypt", + "id": "27c5c5df-4b9f-487c-8884-4c50035f4bc6", + "image": "image23.jpeg" + }, { + "chinese_style": "蒸汽朋克时代", + "english_style": "steampunk", + "id": "62018708-10c6-4a1f-8c35-9c162278686f", + "image": "image28.jpeg" + }, { + "chinese_style": "中国明代", + "english_style": "ming dynasty", + "id": "20c9f4cf-99ec-4550-a965-768190d91498", + "image": "image29.jpeg" + }, { + "chinese_style": "青铜时代", + "english_style": "bronze age", + "id": "6ef8bd4f-c843-435c-9d31-ca2f36add104", + "image": "image22.jpeg" + }, { + "chinese_style": "中国唐代", + "english_style": "tang dynasty", + "id": "950518dc-e87b-4be8-8487-8b732b52e175", + "image": "image27.jpeg" + }, { + "chinese_style": "赛博朋克时代", + "english_style": "cyberpunk", + "id": "8e012231-4e38-4d6d-b18c-4e03f1ef45f1", + "image": "image24.jpeg" + }, { + "chinese_style": "工业革命时代", + "english_style": "industrial revolution", + "id": "8a46b74f-91b5-40d5-bec7-afba88b5abb1", + "image": "image30.jpeg" + }, { + "chinese_style": "日本江户时代", + "english_style": "edo period", + "id": "5ab22ed5-b284-4f79-be4f-7c6aef329151", + "image": "image31.jpeg" + }], + "id": "ade4cf78-7bef-43c8-9d13-c2ea5c3f9f38" + }, { + "sheet": 3, + "name": "画家画风风格词", + "subStyle": [{ + "chinese_style": "潘天寿(古风画风-成熟)", + "english_style": "Pan Tianshou", + "id": "6d54b67f-08e3-40ac-816f-d4081ad7d9e2", + "image": "image35.jpeg" + }, { + "chinese_style": "朱屺瞻(古风画风-艳丽)", + "english_style": "Zhu Qizhan", + "id": "121b3d63-b0b2-4dd4-aaa4-e2c3e8d89d76", + "image": "image36.jpeg" + }, { + "chinese_style": "齐白石(古风画风-简约)", + "english_style": "Qi Baishi", + "id": "bc76a884-afac-450e-88cc-54f65c504a7c", + "image": "image37.jpeg" + }, { + "chinese_style": "张大千(古风画风-可爱)", + "english_style": "Zhang Daqian", + "id": "a85caede-767a-4b8b-b14a-981656415637", + "image": "image33.jpeg" + }, { + "chinese_style": "亨利·马蒂斯(都市画风-时尚)", + "english_style": "Henri Matisse", + "id": "9b7e83e6-dc18-41b8-8887-176794a615c3", + "image": "image38.jpeg" + }, { + "chinese_style": "乔治亚·欧姬芙(都市画风-欧美)", + "english_style": "Georgia O'Keeffe", + "id": "ca757d22-c5fc-4974-9768-16323957fe85", + "image": "image32.jpeg" + }, { + "chinese_style": "格伦·基恩(迪斯尼-美女与野兽风)", + "english_style": "Glen Keane", + "id": "1a5655c9-6800-42ab-aa88-7ab2c77c8c0c", + "image": "image39.jpeg" + }, { + "chinese_style": "根迪·塔尔塔科夫斯基(欧美动画风)", + "english_style": "Genndy Tartakovsky", + "id": "60357799-3cba-4809-b50c-db804783599d", + "image": "image34.jpeg" + }, { + "chinese_style": "克雷格·汤普森(都市画风-细腻)", + "english_style": "Craig Thompson", + "id": "a6806093-372a-44f0-8967-d764b1e90709", + "image": "image40.jpeg" + }, { + "chinese_style": "亨利·马蒂斯(都市画风-流行)", + "english_style": "Henri Matisse", + "id": "fac9dd65-8a92-43ab-b026-63231ebf6de2", + "image": "image44.jpeg" + }, { + "chinese_style": "伊藤润二(日式恐怖画风)", + "english_style": "Junji Ito", + "id": "0115613d-ee65-4d32-b9a5-eeb57cdc708d", + "image": "image45.jpeg" + }, { + "chinese_style": "朴泰俊(小鲜肉都市风)", + "english_style": "Park Tae", + "id": "80d2fb78-2a69-4314-989d-57734dce6789", + "image": "image41.jpeg" + }, { + "chinese_style": "朴智旻(都市恋爱风)", + "english_style": "Park Ji", + "id": "6b4c5150-82e0-4259-9617-59434291e4b5", + "image": "image42.jpeg" + }, { + "chinese_style": "金瑞亨(韩风都市恋爱)", + "english_style": "Kim Hyeong", + "id": "f1fee049-109c-4b85-83bf-ed3ed5554f7f", + "image": "image43.jpeg" + }, { + "chinese_style": "查克·琼斯(欧美动画风-猫和老鼠)", + "english_style": "Chuck Jones", + "id": "21c0e23f-d98b-41f0-b351-cb1b47f462ee", + "image": "image46.jpeg" + }, { + "chinese_style": "高畑勋(日式动漫风)", + "english_style": "Isao Takahata", + "id": "55868e27-cc28-4830-b6c9-46096416b03d", + "image": "image47.jpeg" + }, { + "chinese_style": "淺野恭司(细腻日漫)", + "english_style": "Kyoji Asano", + "id": "126ec922-c45d-4a83-b9d7-48f04513cad0", + "image": "image48.jpeg" + }, { + "chinese_style": "卡洛斯·达托利(都市少男风)", + "english_style": "Carlos Dattoli", + "id": "a7aee025-fc08-4e66-82ba-42f38b7d3405", + "image": "image49.jpeg" + }, { + "chinese_style": "库夫希诺夫·伊利亚(都市少女风)", + "english_style": "Kuvshinov Ilya", + "id": "a9679671-a1b9-472b-be78-4fd91adc9e02", + "image": "image50.jpeg" + }, { + "chinese_style": "加里·拉尔森、杰拉德·乌克盖斯特(美式漫画)", + "english_style": "Gary Larson, Gerard Houckgeest", + "id": "c1eb9ca2-4d89-4636-b1ff-7f83d7eba781", + "image": "image54.jpeg" + }, { + "chinese_style": "阮佳(国风插画)", + "english_style": "Ruan Jia", + "id": "32afc969-622a-4792-a270-02cf6952d805", + "image": "image51.jpeg" + }, { + "chinese_style": "保罗·罗沃西、塞西莉·布朗(欧美风偏质感)", + "english_style": "Paolo roversi, Cecily brown", + "id": "f9860c1f-8552-4514-8be7-617527d51f0b", + "image": "image52.jpeg" + }, { + "chinese_style": "山田尚子(日式少女风)", + "english_style": "Naoko Yamada", + "id": "ad6ed3d9-a153-487e-9cd5-8447f99ce43b", + "image": "image53.jpeg" + }, { + "chinese_style": "木村贵宏(日式动漫风)", + "english_style": "Takahiro Kimura", + "id": "199934ed-5d7e-4af7-979b-0b2dd4862199", + "image": "image55.jpeg" + }, { + "chinese_style": "安德烈亚斯·-罗查(欧美风偏细节色彩)", + "english_style": "Andreas Rocha", + "id": "f6358e01-7276-4f26-96c8-56a619ae3126", + "image": "image70.jpeg" + }, { + "chinese_style": "凉香(日式古风)", + "english_style": "Ryohka", + "id": "824b9390-9787-44de-ab43-da5d647101ad", + "image": "image71.jpeg" + }, { + "chinese_style": "丽贝卡·盖伊(西方魔幻)", + "english_style": "Rebecca Guay", + "id": "5d2234ce-d0d8-4330-93d5-21a81d6486d5", + "image": "image64.jpeg" + }, { + "chinese_style": "克雷格·穆林斯(西方末日科幻)", + "english_style": "Craig Mullins", + "id": "a66f32dd-2b73-4d6c-8d83-cc1a37dae7ea", + "image": "image65.jpeg" + }, { + "chinese_style": "小林修(日式画风)", + "english_style": "Osamu Kobayashi", + "id": "a9e9c6ab-02d1-406b-b730-9d4ece86d29c", + "image": "image66.jpeg" + }, { + "chinese_style": "池上辽一(日式画风)", + "english_style": "Ryoichi Ikegami", + "id": "aea0beec-32ea-42c7-9891-09616a01a424", + "image": "image69.jpeg" + }, { + "chinese_style": "岸本齐史(火影忍着风)", + "english_style": "Masashi Kishimoto", + "id": "2ef699da-781d-4f05-9239-6d027d34c42c", + "image": "image67.jpeg" + }, { + "chinese_style": "沃尔特·迪斯尼(迪斯尼风)", + "english_style": "Walt Disney", + "id": "6befee18-2232-4a3e-b1a5-d206d5e29138", + "image": "image68.jpeg" + }, { + "chinese_style": "久保带人(死神画风)", + "english_style": "Tite Kubo", + "id": "c26be074-bc44-41bc-b36c-97845c8fb544", + "image": "image62.jpeg" + }, { + "chinese_style": "谏山创(进击的巨人画风)", + "english_style": "Hajime Isayama", + "id": "5ceeedb9-4977-49f4-9122-220165784683", + "image": "image63.jpeg" + }, { + "chinese_style": "新海诚", + "english_style": "Makoto Shinkai", + "id": "9cc4611f-4ebe-449f-ae9c-3502a37a857e", + "image": "image60.jpeg" + }, { + "chinese_style": "武内直子(美少女战士画风)", + "english_style": "Naoko Takeuchi", + "id": "9176dac9-deaa-4e19-8d0f-e586437d251f", + "image": "image56.jpeg" + }, { + "chinese_style": "濑户目鹤(日漫风)", + "english_style": "Koyori", + "id": "321322f7-0f12-47d5-9d53-1945b8ef4516", + "image": "image57.jpeg" + }, { + "chinese_style": "细田守(日本动漫风)", + "english_style": "Mamoru Hosoda", + "id": "9e2db099-5996-4e8a-8e86-37f8fc81fa1a", + "image": "image58.jpeg" + }, { + "chinese_style": "约翰·拉塞特(欧美动画风)", + "english_style": "John Lasseter", + "id": "d7f5278d-d242-4834-ab82-2adfc11231e8", + "image": "image61.jpeg" + }, { + "chinese_style": "蒂姆·伯顿(魔发奇缘风-暗黑魔幻)", + "english_style": "Tim Burton", + "id": "c104bba3-6611-4178-93d8-2f988fb83fc7", + "image": "image59.jpeg" + }, { + "chinese_style": "鸟山明(龙珠画风)", + "english_style": "Akira Toriyama", + "id": "e51d4ad6-816d-4534-89e0-3fdaf7a3916c", + "image": "image72.jpeg" + }, { + "chinese_style": "高桥留美子(犬夜叉画风)", + "english_style": "Rumiko Takahashi", + "id": "589a6e3d-4707-4eba-8650-e479fe56aa49", + "image": "image73.jpeg" + }, { + "chinese_style": "庵野秀明(EVA画风)", + "english_style": "Hideaki Anno", + "id": "1ba9073e-b530-4520-893e-4f7eb2c8cba6", + "image": "image76.jpeg" + }, { + "chinese_style": "宫崎骏(日式动漫风)", + "english_style": "Hayao Miyazaki", + "id": "92b59244-5b26-47e2-a542-050b28beb631", + "image": "image75.jpeg" + }, { + "chinese_style": "米林宏昌(日式古风)", + "english_style": "hiromasa yonebayashi", + "id": "5f3bfcdd-d6f9-40c8-8ebb-b423ee768d59", + "image": "image74.jpeg" + }, { + "chinese_style": "男鹿和雄(日漫古风)", + "english_style": "kazuo oga", + "id": "b389d682-0ac2-434c-849a-9ceca0468397", + "image": "image77.jpeg" + }], + "id": "661f3673-b448-49c5-95eb-92416c669f21" + }, { + "sheet": 4, + "name": "中华古风", + "subStyle": [{ + "chinese_style": "张光宇风格", + "english_style": "Zhang Guangyu style", + "id": "f67e1f1f-3824-4190-aa7b-22a4ceefc803", + "image": "image85.jpeg" + }, { + "chinese_style": "丰子恺风格", + "english_style": "Feng Zikai style", + "id": "0c6e2462-82a2-492d-8f00-e0571099230a", + "image": "image83.jpeg" + }, { + "chinese_style": "蔡志忠风格", + "english_style": "Cai Zhong style", + "id": "ddc1adda-5bc5-4779-9f70-942f5c8bc739", + "image": "image82.jpeg" + }, { + "chinese_style": "马荣成风格", + "english_style": "Ma Rongcheng style", + "id": "c6ecceb3-4000-4846-ad54-160f7f92ac68", + "image": "image78.jpeg" + }, { + "chinese_style": "陈某风格", + "english_style": "Chen Someone style", + "id": "85cd0650-a62a-4123-a7ac-ae7ecfe549c7", + "image": "image84.jpeg" + }, { + "chinese_style": "夏达风格", + "english_style": "Xia Da style", + "id": "3317e89f-c828-4a60-bab7-9935dd2f841c", + "image": "image79.jpeg" + }, { + "chinese_style": "猫君风格", + "english_style": "Cat Jun style", + "id": "5db7dfa4-306b-4c0f-a8ca-314037c32839", + "image": "image80.jpeg" + }, { + "chinese_style": "Left Hand Han style", + "english_style": "左手韩风格", + "id": "eed2d205-3818-4b3d-9d2a-98a5140cd97e", + "image": "image81.jpeg" + }, { + "chinese_style": "阿梗风格", + "english_style": "A Geng style", + "id": "ad75eb08-6e12-4707-affb-7292471b82c7", + "image": "image89.jpeg" + }, { + "chinese_style": "本杰明风格", + "english_style": "Benjamin style", + "id": "00638bad-7919-4bbe-844d-89bf78787df8", + "image": "image88.jpeg" + }, { + "chinese_style": "寂地风格", + "english_style": "Ji Di style", + "id": "f041d7d9-485f-4ef8-a3ee-a63a480d9980", + "image": "image86.jpeg" + }, { + "chinese_style": "鹿菏风格", + "english_style": "Lu He style", + "id": "33aa10c2-1d70-46b4-b847-bed5eb9f5f41", + "image": "image87.jpeg" + }], + "id": "fc8d672d-8482-445b-8652-a7d8910c621c" + }, { + "sheet": 5, + "name": "中国都市漫画作者风格", + "subStyle": [{ + "chinese_style": "姚非拉风格", + "english_style": "Yao Feila style", + "id": "ad83c246-6c22-42ac-9049-e6e1e3f82022", + "image": "image93.jpeg" + }, { + "chinese_style": "慕容引刀风格", + "english_style": "Murong Yindao style", + "id": "845ec4a6-a1bf-42b3-b2f5-503bae91e24b", + "image": "image90.jpeg" + }, { + "chinese_style": "使徒子风格", + "english_style": "Apostle style", + "id": "59c26e38-33f1-44ad-a471-d747babd0cee", + "image": "image94.jpeg" + }, { + "chinese_style": "幽·灵风格", + "english_style": "Youling style", + "id": "0f6e1954-2b2b-418c-b36b-bb833a49d131", + "image": "image91.jpeg" + }, { + "chinese_style": "猫树风格", + "english_style": "Cat Tree style", + "id": "afed5230-a76a-4709-be26-30040f2a9418", + "image": "image95.jpeg" + }, { + "chinese_style": "青鸟动漫风格", + "english_style": "Blue Bird Animation style", + "id": "06900981-ac49-4b03-b327-512f4b36bcbf", + "image": "image92.jpeg" + }, { + "chinese_style": "阿尤风格", + "english_style": "A You style", + "id": "82887dc9-eb51-4168-91e5-73467c1d9bf5", + "image": "image96.jpeg" + }, { + "chinese_style": "张小溪风格", + "english_style": "Zhang Xiaoxi style", + "id": "1d2901e9-c79c-42b7-843e-0a32be80f420", + "image": "image97.jpeg" + }, { + "chinese_style": "阿衰风格", + "english_style": "A Shuai style", + "id": "83e99b4d-0702-4cf8-a93e-af2a07f10858", + "image": "image99.jpeg" + }, { + "chinese_style": "丁墨风格", + "english_style": "Ding Mo style", + "id": "193a8cb3-d9a7-4f42-9c2f-7c538d45e795", + "image": "image100.jpeg" + }, { + "chinese_style": "老夫子风格", + "english_style": "Old Master style", + "id": "0eab7213-51fe-42cb-9330-c95b0d991d5b", + "image": "image98.jpeg" + }], + "id": "ac972ea7-e2db-48be-9b66-1d914b059b77" + }, { + "sheet": 6, + "name": "都市漫画", + "subStyle": [{ + "chinese_style": "现代都市生活", + "english_style": "Modern city life", + "id": "10d307a4-50ad-4919-afaf-754a9570a7ad", + "image": "image105.jpeg" + }, { + "chinese_style": "职场奋斗", + "english_style": "Workplace struggles", + "id": "79b593b1-fe8c-4a94-a6d0-f2d160c3d005", + "image": "image101.jpeg" + }, { + "chinese_style": "青春校园", + "english_style": "Youthful school life", + "id": "c1d691e9-1211-492f-bebb-71e3106ff35b", + "image": "image102.jpeg" + }, { + "chinese_style": "浪漫爱情", + "english_style": "Romantic love story", + "id": "1b711f31-2e3b-423f-b27f-dba57b760e33", + "image": "image103.jpeg" + }, { + "chinese_style": "悬疑侦探", + "english_style": "Mystery and detective", + "id": "4352c2b1-5cf0-4654-995d-2658f668f6fb", + "image": "image106.jpeg" + }, { + "chinese_style": "超能力者", + "english_style": "Individuals with superpowers", + "id": "acb3a28e-2957-442e-ad47-6550d5af1a94", + "image": "image104.jpeg" + }, { + "chinese_style": "青春成长", + "english_style": "Coming of age", + "id": "31779554-fbea-447f-a9f7-57cdf5aefffd", + "image": "image107.jpeg" + }, { + "chinese_style": "日常生活", + "english_style": "Slice of life", + "id": "4688a2b4-d1e7-4bff-9d9e-e7c740bd0269", + "image": "image108.jpeg" + }, { + "chinese_style": "都市异闻", + "english_style": "Urban legends and folklore", + "id": "0bbec8ab-4e11-430c-a857-1b1693d1ca31", + "image": "image112.jpeg" + }, { + "chinese_style": "时尚潮流", + "english_style": "Fashion and trends", + "id": "59610aa3-1cb0-498e-a701-9ed0456085a6", + "image": "image110.jpeg" + }, { + "chinese_style": "社交网络", + "english_style": "Social media and relationships", + "id": "74549157-8829-45b4-a608-b9752dfcb84f", + "image": "image111.jpeg" + }, { + "chinese_style": "都市奇幻", + "english_style": "Urban fantasy", + "id": "235b4431-f310-4dd0-a6dc-f42cbb7ddf29", + "image": "image109.jpeg" + }], + "id": "c9d2846d-c8c0-40b0-ad9e-ee882aa6efcf" + }, { + "sheet": 7, + "name": "悬疑故事画风", + "subStyle": [{ + "chinese_style": "悬疑恐怖故事", + "english_style": "Suspenseful horror stories", + "id": "97dc5f98-c241-43c8-a918-ab9788b5e982", + "image": "image119.jpeg" + }, { + "chinese_style": "古堡探险", + "english_style": "Castle exploration", + "id": "e8370048-ee70-4664-8b91-a50fee0f93f5", + "image": "image117.jpeg" + }, { + "chinese_style": "失踪之谜", + "english_style": "Mystery of disappearance", + "id": "6145e00c-f5ce-4f4d-97ff-91939c26f92e", + "image": "image115.jpeg" + }, { + "chinese_style": "诡异事件调查", + "english_style": "Investigation of eerie events", + "id": "cd6b74f2-6599-4bd9-9282-84fabfa0e558", + "image": "image113.jpeg" + }, { + "chinese_style": "禁忌解密", + "english_style": "Forbidden decryption", + "id": "b4673555-6dd6-4a7c-95ac-f728ab587fd7", + "image": "image118.jpeg" + }, { + "chinese_style": "幽灵传说", + "english_style": "Ghost legends", + "id": "5d4ace6c-476a-4ae8-a621-ece0dd59c831", + "image": "image120.jpeg" + }, { + "chinese_style": "恐怖短片", + "english_style": "Horror short films", + "id": "9191e13c-2add-41e9-a68f-cee5828c6b55", + "image": "image116.jpeg" + }, { + "chinese_style": "神秘案件破解", + "english_style": "Solving mysterious cases", + "id": "b132999e-3bf5-4828-a963-8f83892f8c40", + "image": "image114.jpeg" + }, { + "chinese_style": "阴谋追踪", + "english_style": "Conspiracy tracking", + "id": "79b40a23-05f4-4915-aa6a-be916e471699", + "image": "image121.jpeg" + }], + "id": "7e83b352-ae2f-4617-91a4-ad10ebc7dd13" + }, { + "sheet": 8, + "name": "3D动画", + "subStyle": [{ + "chinese_style": "皮克斯电影", + "english_style": "Pixar Movie Style", + "id": "2e65894e-6d8b-475e-a93b-f93929860eb3", + "image": "image129.jpeg" + }, { + "chinese_style": "梦工厂电影风格", + "english_style": "Dream Factory Movie Style", + "id": "c4df479b-49fc-49b9-a24c-f901056774e2", + "image": "image130.jpeg" + }, { + "chinese_style": "迪士尼", + "english_style": "Disney", + "id": "9de96904-a2e6-4506-9a5d-be5bd79c9df4", + "image": "image126.jpeg" + }, { + "chinese_style": "哥伦比亚电影公司", + "english_style": "Columbia Pictures", + "id": "0836e43b-0cc6-49f6-894e-e5ed4205c192", + "image": "image131.jpeg" + }, { + "chinese_style": "索尼动画", + "english_style": "Sony Pictures Animation", + "id": "1773b5a6-6109-4bbe-8213-185559689d81", + "image": "image127.jpeg" + }, { + "chinese_style": "蓝天工作室", + "english_style": "Blue Sky Studios", + "id": "ed7dfdd1-6775-4ecb-9110-eb0ac26cd122", + "image": "image132.jpeg" + }, { + "chinese_style": "卡通网络动画", + "english_style": "Cartoon Network Studios", + "id": "37dd259a-1f42-403f-ad36-66e497bdf6e4", + "image": "image128.jpeg" + }, { + "chinese_style": "漫威动画", + "english_style": "Marvel Animation", + "id": "f4317d2a-e827-4da1-a158-26e33812ea89", + "image": "image133.jpeg" + }, { + "chinese_style": "华纳兄弟动画", + "english_style": "Warner Bros. Animation", + "id": "7f6f85c5-18a7-451a-ae5e-f911331a192a", + "image": "image141.jpeg" + }, { + "chinese_style": "环球影业动画", + "english_style": "Universal Pictures Animation", + "id": "90944358-bc96-4bc9-ad59-373365015725", + "image": "image134.jpeg" + }, { + "chinese_style": "20世纪福克斯动画", + "english_style": "20th Century Fox Animation", + "id": "e3c44ec7-cda7-415e-83fc-fde7b1cf948d", + "image": "image140.jpeg" + }, { + "chinese_style": "派拉蒙动画", + "english_style": "Paramount Animation", + "id": "b4353dab-6bd4-419b-9ccd-5f0c9352690e", + "image": "image135.jpeg" + }, { + "chinese_style": "米高梅动画", + "english_style": "Metro-Goldwyn-Mayer Animation", + "id": "8efe38ae-0b66-4441-b394-c63fc144551e", + "image": "image137.jpeg" + }, { + "chinese_style": "乐高影业", + "english_style": "LEGO Animation", + "id": "6caaddde-97fe-405a-8655-61e12d0434c1", + "image": "image138.jpeg" + }, { + "chinese_style": "迪士尼电视动画", + "english_style": "Disney Television Animation", + "id": "f0eb3c60-94ec-44de-8099-7c6018c454a7", + "image": "image139.jpeg" + }, { + "chinese_style": "尼克儿童动画", + "english_style": "Nickelodeon Animation Studio", + "id": "6174cf18-7114-43f0-b139-1db5fd2ad9bb", + "image": "image136.jpeg" + }, { + "chinese_style": "奈飞动画", + "english_style": "Netflix Animation", + "id": "0df4834b-8867-42b3-b680-80c169ba904e", + "image": "image123.jpeg" + }, { + "chinese_style": "华纳动画组", + "english_style": "Warner Animation Group", + "id": "80406a8b-9a23-4d35-b25e-a8984eb5581c", + "image": "image124.jpeg" + }, { + "chinese_style": "索尼娱乐动画", + "english_style": "Sony Entertainment Animation", + "id": "95f8555f-8615-4484-953b-27f14890b219", + "image": "image122.jpeg" + }, { + "chinese_style": "蓝宝儿动画", + "english_style": "Lionsgate Animation", + "id": "5c4a4871-753a-4825-bc45-93d66e97037c", + "image": "image125.jpeg" + }], + "id": "507a1001-efab-4f23-ba0a-e1b6fc65732a" + }, { + "sheet": 9, + "name": "概念艺术", + "subStyle": [{ + "chinese_style": "幻想题材", + "english_style": "Fantasy theme", + "id": "a0586d4b-5add-436f-aa74-74559f66a000", + "image": "image146.jpeg" + }, { + "chinese_style": "科幻题材", + "english_style": "Science fiction theme", + "id": "939ef719-0785-45ec-8a26-a1e56a740790", + "image": "image142.jpeg" + }, { + "chinese_style": "赛博朋克", + "english_style": "Cyberpunk style", + "id": "f488da0b-c5a4-465e-815e-8f8034ae4394", + "image": "image147.jpeg" + }, { + "chinese_style": "蒸汽朋克", + "english_style": "Steampunk style", + "id": "61d188e6-7f5f-469e-bd30-50f810b1285a", + "image": "image143.jpeg" + }, { + "chinese_style": "超自然现象", + "english_style": "Supernatural phenomena", + "id": "381ec4b4-2bf7-4043-beda-aa0fd65520cd", + "image": "image148.jpeg" + }, { + "chinese_style": "神话传说", + "english_style": "Mythology and legends", + "id": "d554974b-d1c5-47d3-8acc-e71911325360", + "image": "image149.jpeg" + }, { + "chinese_style": "魔法与咒语", + "english_style": "Magic and spells", + "id": "0b505a81-36fd-454c-8ccc-285be256896b", + "image": "image144.jpeg" + }, { + "chinese_style": "幻想生物", + "english_style": "Fantasy creatures", + "id": "a0bcefce-c94d-47b3-bbd5-4d7b6b9cdd01", + "image": "image145.jpeg" + }, { + "chinese_style": "历史重现", + "english_style": "Historical reenactment", + "id": "169249c5-dbf3-4ce8-be7f-47237c8535b2", + "image": "image150.jpeg" + }, { + "chinese_style": "未来都市", + "english_style": "Futuristic cityscape", + "id": "2d0eec27-4bab-42f1-9d8b-7909df82c709", + "image": "image152.jpeg" + }, { + "chinese_style": "末日废土", + "english_style": "Post-apocalyptic wasteland", + "id": "ffc43253-b1a4-4f4a-a5a6-d8b9e62c3208", + "image": "image153.jpeg" + }, { + "chinese_style": "异星世界", + "english_style": "Alien world", + "id": "8b7b821a-7f91-437a-8af9-4841f8a24517", + "image": "image151.jpeg" + }], + "id": "6459007e-cb61-4933-b42e-e2ea19ce1f03" + }, { + "sheet": 10, + "name": "新日本动漫风", + "subStyle": [{ + "chinese_style": "《刀剑神域》", + "english_style": "Sword Art Online style, fantasy and adventure, Kawahara Reki", + "id": "d2048c30-56ad-44be-bdf7-6e04a690c310", + "image": "image163.jpeg" + }, { + "chinese_style": "《东京食尸鬼》", + "english_style": "Sui Ishida style", + "id": "e22b50f6-f0c4-4cf7-97b2-084990537cf0", + "image": "image160.jpeg" + }, { + "chinese_style": "《命运之夜》", + "english_style": "Type-Moon style", + "id": "b97c9b77-c423-41b0-8c80-e19c4fe504ba", + "image": "image161.jpeg" + }, { + "chinese_style": "《狼与香辛料》", + "english_style": "Isuna Hasekura style", + "id": "670a7131-915f-4959-a020-3dd1e3ae1f69", + "image": "image158.jpeg" + }, { + "chinese_style": "《鬼灭之刃》", + "english_style": "Koyoharu Gotouge style", + "id": "907db0cb-24ed-457e-a0c0-c4067184b608", + "image": "image159.jpeg" + }, { + "chinese_style": "《名侦探柯南》", + "english_style": "Gosho Aoyama style", + "id": "3cff985d-2b9c-4d52-b373-adc4a415d487", + "image": "image162.jpeg" + }, { + "chinese_style": "《七原罪》", + "english_style": "Nakaba Suzuki style", + "id": "8d8ca7fc-7d78-4240-a300-274dbbf299cb", + "image": "image164.jpeg" + }, { + "chinese_style": "《妖怪手表》", + "english_style": "Level-5 style", + "id": "0569520e-cc54-4fb8-8f7c-ac7102c557e7", + "image": "image157.jpeg" + }, { + "chinese_style": "《灼眼的夏娜》", + "english_style": "Yashichiro Takahashi style", + "id": "899f56d0-67be-4546-a373-04e6648299ef", + "image": "image165.jpeg" + }, { + "chinese_style": "《命运石之门》", + "english_style": "Chiyomaru Shikura and Nitroplus style", + "id": "b0c30ddf-a77b-48f8-bdfe-d29f94ac7902", + "image": "image166.jpeg" + }, { + "chinese_style": "《化物语》", + "english_style": "Nisio Isin and VOFAN style", + "id": "1d50bf91-22b7-4efa-a5b4-1cce44cb82be", + "image": "image167.jpeg" + }, { + "chinese_style": "《未来日记》", + "english_style": "Sakae Esunostyle style", + "id": "b5aadac7-df6e-44fd-b953-9e83f8bef4b8", + "image": "image169.jpeg" + }, { + "chinese_style": "《Angel Beats!》", + "english_style": "Jun Maeda and Na-Ga style", + "id": "85202d85-4cfc-4439-83d5-4504836905f2", + "image": "image168.jpeg" + }, { + "chinese_style": "《Fate/Zero》", + "english_style": "Gen Urobuchi and Takashi Takeuchi style", + "id": "d5e1f5ef-bb4a-4e40-a51b-bd2045d609b7", + "image": "image172.jpeg" + }, { + "chinese_style": "《Re:从零开始的异世界生活》", + "english_style": "Tappei Nagatsuki and Shinichirou Otsuka style", + "id": "f821ed49-c12f-4f87-b81f-58424610ccd1", + "image": "image170.jpeg" + }, { + "chinese_style": "《OVERLORD》", + "english_style": "Kugane Maruyama and so-bin style", + "id": "1977e489-6693-49a5-ade6-72769a4fde00", + "image": "image171.jpeg" + }, { + "chinese_style": "《约会大作战》", + "english_style": "Koushi Tachibana and Tsunako style", + "id": "e7ca9f27-6937-4100-96ca-706d7efa49ec", + "image": "image155.jpeg" + }, { + "chinese_style": "《Re:CREATORS》", + "english_style": "Rei Hiroe style", + "id": "6acc66f5-79f9-40b3-abb0-6435da43c73b", + "image": "image156.jpeg" + }, { + "chinese_style": "《关于我转生变成史莱姆这档事》", + "english_style": "Rimuru Tempest style", + "id": "1ac9cc4a-f1bb-40ae-a76a-6fd593c7bb04", + "image": "image154.jpeg" + }], + "id": "14c7f9d5-32b8-409b-ad4c-f7217fa3defd" + }, { + "sheet": 11, + "name": "少年日本动漫风", + "subStyle": [{ + "chinese_style": "《Another》", + "english_style": "Yukito Ayatsuji and Hiro Kiyohara style", + "id": "d2329e3e-e8e5-4a95-82d7-09fda8a3f3cb", + "image": "image176.jpeg" + }, { + "chinese_style": "《尸体派对》", + "english_style": "Team GrisGris style", + "id": "436251be-eb1a-4825-9565-a2f4d7201632", + "image": "image177.jpeg" + }, { + "chinese_style": "《妖精森林的小不点》", + "english_style": "Takuto Kashiki style", + "id": "85196b76-ffd9-443d-9827-d6b1b5dd9752", + "image": "image178.jpeg" + }, { + "chinese_style": "《怪谈新耳袋》", + "english_style": "Kyouko Hikawa style", + "id": "447a9b2e-4f3c-47d5-acd6-a9e893d35614", + "image": "image174.jpeg" + }, { + "chinese_style": "《地缚少年花子君》", + "english_style": "Kouji Seo style", + "id": "0021c2d2-8f70-4536-9d88-07f287cb419f", + "image": "image179.jpeg" + }, { + "chinese_style": "《彼岸岛》", + "english_style": "Koji Matsumoto style", + "id": "9d884c85-c7c1-447c-96a6-a05416b5d1e7", + "image": "image180.jpeg" + }, { + "chinese_style": "《龙珠》", + "english_style": "Akira Toriyama style", + "id": "c8c3784a-aad1-4fbd-aa0a-ca18af2efa31", + "image": "image175.jpeg" + }, { + "chinese_style": "《海贼王》", + "english_style": "Eiichiro Oda style", + "id": "1ad0e6e6-4ab0-4669-a932-7ecaeef1090d", + "image": "image173.jpeg" + }, { + "chinese_style": "《火影忍者》", + "english_style": "Masashi Kishimoto style", + "id": "5a198a66-9e62-48c4-aaff-8be6586249be", + "image": "image198.jpeg" + }, { + "chinese_style": "《死神》", + "english_style": "Tite Kubo style", + "id": "cc514c8c-2194-403e-ae57-9733a455f3f2", + "image": "image192.jpeg" + }, { + "chinese_style": "《进击的巨人》", + "english_style": "Hajime Isayama style", + "id": "8c356863-e16d-4a4c-a154-1e4d3836aed9", + "image": "image199.jpeg" + }, { + "chinese_style": "《银魂》", + "english_style": "Hideaki Sorachi style", + "id": "4b98130b-ca33-468a-828e-36461e9f4da4", + "image": "image193.jpeg" + }, { + "chinese_style": "《全职猎人》", + "english_style": "Yoshihiro Togashi style", + "id": "22f84eff-c3d9-4c39-87df-8ab5b8908a78", + "image": "image196.jpeg" + }, { + "chinese_style": "《柯南》", + "english_style": "Gosho Aoyama style", + "id": "00abd3b8-d038-4cb0-bc8a-cf24b1c31f18", + "image": "image197.jpeg" + }, { + "chinese_style": "《妖精的尾巴》", + "english_style": "Hiro Mashima style", + "id": "41fe2942-2a96-4b84-ae9c-93b17d4b71c2", + "image": "image194.jpeg" + }, { + "chinese_style": "《黑子的篮球》", + "english_style": "Tadatoshi Fujimaki style", + "id": "96eb6f9d-9aca-40de-add5-6d27f0768660", + "image": "image195.jpeg" + }, { + "chinese_style": "《我的英雄学院》", + "english_style": "Kohei Horikoshi style", + "id": "3aafb780-ac7f-4e83-b1ae-2145026c24a8", + "image": "image201.jpeg" + }, { + "chinese_style": "《灌篮高手》", + "english_style": "Takehiko Inoue style", + "id": "97cf6531-e726-4e3c-b97f-64e6f0528634", + "image": "image200.jpeg" + }, { + "chinese_style": "《排球少年》", + "english_style": "Haruichi Furudate style", + "id": "c6f8d9e7-3d06-42a1-b255-989a2c711d90", + "image": "image204.jpeg" + }, { + "chinese_style": "《钻石王牌》", + "english_style": "Yuji Terajima style", + "id": "59f88205-0bce-4deb-b09c-f2db188e52ff", + "image": "image205.jpeg" + }, { + "chinese_style": "《浪客剑心》", + "english_style": "Nobuhiro Watsuki style", + "id": "73af468f-0b11-4d2e-9f45-142d4248ffe9", + "image": "image206.jpeg" + }, { + "chinese_style": "《幽游白书》", + "english_style": "Yoshihiro Togashi style", + "id": "816e1234-4126-422b-83a9-af25303c721d", + "image": "image202.jpeg" + }, { + "chinese_style": "《城市猎人》", + "english_style": "Tsukasa Hojo style", + "id": "33900424-0e31-44af-b147-fdd916b1405d", + "image": "image203.jpeg" + }, { + "chinese_style": "《圣斗士星矢》", + "english_style": "Masami Kurumada style", + "id": "d780c5bc-4e54-43d9-8291-ed9fbc39bd5a", + "image": "image207.jpeg" + }, { + "chinese_style": "《铁臂阿童木》", + "english_style": "Osamu Tezuka style", + "id": "edb4c3fa-e4af-40f6-b97f-ab7326088b80", + "image": "image181.jpeg" + }, { + "chinese_style": "《东京爱情故事》", + "english_style": "Yuki Fujimoto style", + "id": "db55ec39-a9bf-47aa-813f-ab3be24254d6", + "image": "image185.jpeg" + }, { + "chinese_style": "《深夜食堂》", + "english_style": "Yaro Abe style", + "id": "95d69b5e-19ec-47ce-92cd-7853cf3aa023", + "image": "image186.jpeg" + }, { + "chinese_style": "《恋爱暴君》", + "english_style": "Megane Mihoshi style", + "id": "1cf0fa67-dc9e-41d8-84ca-184b4e9e54ba", + "image": "image188.jpeg" + }, { + "chinese_style": "《请回答1988》", + "english_style": "Ilkwon Ha style", + "id": "fcbeee97-34cd-4dcb-9353-547e1d15b3ca", + "image": "image182.jpeg" + }, { + "chinese_style": "《NANA》", + "english_style": "Ai Yazawa style", + "id": "5c275a98-11bc-4cfe-95ee-f29829f2db45", + "image": "image183.jpeg" + }, { + "chinese_style": "《蜂蜜与四叶草》", + "english_style": "Chica Umino style", + "id": "0be84542-7362-45cc-b2e0-8203fbf9a628", + "image": "image184.jpeg" + }, { + "chinese_style": "《东京塔》", + "english_style": "Lily Franky style", + "id": "b70b64b2-ff97-4fcd-b5f7-aa0b8727ce6b", + "image": "image187.jpeg" + }, { + "chinese_style": "《工作狂》", + "english_style": "Anno Moyoco style", + "id": "c2b9a3ce-c33f-4c16-8d68-db3c36da18b5", + "image": "image213.jpeg" + }, { + "chinese_style": "《单身男女》", + "english_style": "Rakuda Torino style", + "id": "ac5fb0d0-e607-4c7f-ad78-b3759ec3c994", + "image": "image208.jpeg" + }, { + "chinese_style": "《恋爱情结》", + "english_style": "Aya Nakahara style", + "id": "bba7a88f-cd93-49f0-8cc7-977b3fd5422c", + "image": "image214.jpeg" + }, { + "chinese_style": "《白领羽田》", + "english_style": "Akiko Higashimura style", + "id": "d3261949-efa2-4066-8d39-e2061120bb71", + "image": "image215.jpeg" + }, { + "chinese_style": "《东京女子图鉴》", + "english_style": "Akiko Higashimura style", + "id": "0855c327-3127-4377-9bd5-1d12ff9ae684", + "image": "image211.jpeg" + }, { + "chinese_style": "《重版出来!》", + "english_style": "Eiji Nonaka style", + "id": "22f75192-b891-4562-8662-53650f52bf4f", + "image": "image210.jpeg" + }, { + "chinese_style": "《逃避虽可耻但有用》", + "english_style": "Tsunami Umino style", + "id": "9bf58d40-ab11-49b8-8700-8db9067e7369", + "image": "image209.jpeg" + }, { + "chinese_style": "《下辈子再好好过》", + "english_style": "Kazuto Tatsukawa style", + "id": "208444d2-c17c-40f8-93e2-2365676fb900", + "image": "image212.jpeg" + }, { + "chinese_style": "《无法成为野兽的我们》", + "english_style": "Ryoko Fukuyama style", + "id": "39109010-4ce4-4b72-a200-883b8feb62cf", + "image": "image191.jpeg" + }, { + "chinese_style": "《我不是结不了婚,只是不想》", + "english_style": "Ako Shimaki style", + "id": "1be7fe21-d5e2-4a90-b5aa-8df219b55810", + "image": "image190.jpeg" + }, { + "chinese_style": "《恋爱小人们》", + "english_style": "Musawo style", + "id": "3455d950-4d11-426d-891a-b0453606df34", + "image": "image189.jpeg" + }], + "id": "6ab67e20-2fbe-449b-b371-5f411c4c3892" + }, { + "sheet": 12, + "name": "恐怖日本动漫风", + "subStyle": [{ + "chinese_style": "《富江》", + "english_style": "Junji Ito style", + "id": "3bc00c50-04ff-41c1-8104-c31680b469d8", + "image": "image218.jpeg" + }, { + "chinese_style": "《寄生兽》", + "english_style": "Hitoshi Iwaaki style", + "id": "64d9204c-296d-4b09-9b50-36d89268d7fa", + "image": "image220.jpeg" + }, { + "chinese_style": "《漩涡》", + "english_style": "Kyo Shirodaira and Eita Mizuno style", + "id": "0522f21f-9094-4a95-9648-5a9f574d406b", + "image": "image222.jpeg" + }, { + "chinese_style": "《死亡笔记》", + "english_style": "Tsugumi Ohba and Takeshi Obata style", + "id": "bde5b7bc-37ad-4a59-829d-21f26c222b29", + "image": "image219.jpeg" + }, { + "chinese_style": "《怪医黑杰克》", + "english_style": "Osamu Tezuka style", + "id": "78cc9352-b68a-48d3-a32e-ebf13de78b3c", + "image": "image221.jpeg" + }, { + "chinese_style": "《学园默示录》", + "english_style": "Daisuke Sato and Shouji Sato style", + "id": "5e34a2d4-4247-4feb-a369-eaf781668171", + "image": "image217.jpeg" + }, { + "chinese_style": "《鬼灯的冷彻》", + "english_style": "Natsumi Eguchi style", + "id": "854eb4d2-fdf1-40cf-a668-2da4dd0c103a", + "image": "image216.jpeg" + }, { + "chinese_style": "《僵尸借贷》", + "english_style": "Peach-Pit style", + "id": "a98ad1ff-0e25-4ac6-872e-1be6dacfb99e", + "image": "image223.jpeg" + }, { + "chinese_style": "《东京喰种》", + "english_style": "Sui Ishida style", + "id": "2d3b1c15-4ff6-4843-9dec-4b5f16b3d1c6", + "image": "image224.jpeg" + }], + "id": "990502bb-b673-4138-9af6-b2e483acdbc0" + }, { + "sheet": 13, + "name": "机甲日本动漫风", + "subStyle": [{ + "chinese_style": "《机动战士高达》", + "english_style": "Yoshiyuki Tomino style", + "id": "d7f9add9-5dbe-4b9a-ac5a-3905be18c73d", + "image": "image231.jpeg" + }, { + "chinese_style": "《新世纪福音战士》", + "english_style": "Hideaki Anno and Yoshiyuki Sadamoto style", + "id": "138a6ff3-6562-4410-9d2e-aa849f512f98", + "image": "image237.jpeg" + }, { + "chinese_style": "《钢弹0080:口袋中的战争》", + "english_style": "Yoshiyuki Tomino and Takashi Imanishi style", + "id": "350a64e1-8e2b-4f5b-b8d9-a0af5a6454ec", + "image": "image232.jpeg" + }, { + "chinese_style": "《全金属狂潮》", + "english_style": "Shoji Kawamori style", + "id": "b9f034b8-4146-429a-83a6-dc76bacee682", + "image": "image230.jpeg" + }, { + "chinese_style": "《机动警察》", + "english_style": "Kunio Okawara style", + "id": "55cd3098-7c01-406b-ae0e-1964b28d0925", + "image": "image233.jpeg" + }, { + "chinese_style": "《超时空要塞》", + "english_style": "Shoji Kawamori style", + "id": "d2e08101-5654-4edb-a0d3-d65b54a366e5", + "image": "image236.jpeg" + }, { + "chinese_style": "《铁拳小子》", + "english_style": "Naoto Tsushima style", + "id": "8ef6433d-c274-4add-a74d-6b9ac9fff81b", + "image": "image234.jpeg" + }, { + "chinese_style": "《装甲骑兵》", + "english_style": "Ryousuke Takahashi style", + "id": "c9444ff5-a319-4e3f-96b6-4cad9f5d7736", + "image": "image235.jpeg" + }, { + "chinese_style": "《机动战士高达SEED》", + "english_style": "Yoshiyuki Tomino and Kenji Oguro style", + "id": "898c1979-99b2-46a7-b581-8272dd37cdba", + "image": "image227.jpeg" + }, { + "chinese_style": "《交响诗篇》", + "english_style": "Shinichirou Watanabe and Yasuhiro Nightow style", + "id": "2d420511-63f9-4c77-9e06-efab1df5b815", + "image": "image229.jpeg" + }, { + "chinese_style": "《天元突破》", + "english_style": "Kimiyoshi Yasuda and Hiroyuki Imaishi style", + "id": "c6cb088d-2d9f-45c1-a38f-5a69545c1c5d", + "image": "image225.jpeg" + }, { + "chinese_style": "《机动战士高达00》", + "english_style": "Yoshiyuki Tomino and Kenji Oguro style", + "id": "6ab2f65f-4f70-4c57-b4f9-99d66fabe4df", + "image": "image226.jpeg" + }, { + "chinese_style": "《ZEGAPAIN》", + "english_style": "Kouichi Chigira and Shinji Aramaki style", + "id": "8238df2e-c1be-4849-9684-1c217fe51b4c", + "image": "image228.jpeg" + }], + "id": "e646e2a4-a467-4506-8838-316d45cf5120" + }, { + "sheet": 14, + "name": "校园日本动漫风", + "subStyle": [{ + "chinese_style": "《青春猪头少年不会梦到兔女郎学姐》", + "english_style": "Daisuke Aizawa style", + "id": "a4bcfe18-7e85-4ebf-8a89-bc0f946e6dd5", + "image": "image242.jpeg" + }, { + "chinese_style": "《我的青春恋爱物语果然有问题》", + "english_style": "Hajime Kamoshida style", + "id": "dfebd4b2-657c-4c46-9319-c3834fde01d5", + "image": "image240.jpeg" + }, { + "chinese_style": "《某科学的超电磁炮》", + "english_style": "Kazuma Kamachi and Motoi Fushimi style", + "id": "f32174cb-1d1a-4cd6-bb14-6bcef9bf068e", + "image": "image243.jpeg" + }, { + "chinese_style": "《干物妹!小埋》", + "english_style": "Sakura Ikezuki style", + "id": "f2ca5f57-e759-4c9a-aa20-39c6862e5892", + "image": "image244.jpeg" + }, { + "chinese_style": "《四月是你的谎言》", + "english_style": "Kanade Yoko style", + "id": "0a07af72-fd77-468d-b667-5879048eb289", + "image": "image238.jpeg" + }, { + "chinese_style": "《Free!》", + "english_style": "Kouji Oji style", + "id": "4745b1fa-466e-4a25-8aa8-1017a55f6a3f", + "image": "image239.jpeg" + }, { + "chinese_style": "《樱花庄的宠物女孩》", + "english_style": "Hiroshi Kumakura and Tatsuhiko Takimoto style", + "id": "b7f2b370-2660-4653-86f1-e1b1bc959c35", + "image": "image245.jpeg" + }, { + "chinese_style": "《从零开始的异世界生活》", + "english_style": "Nagatsuki Tappei style", + "id": "6a8e1708-835b-4266-8546-cea85db6a7a1", + "image": "image241.jpeg" + }, { + "chinese_style": "《冰菓》", + "english_style": "Hyouka Fujino style", + "id": "423eedf0-0adb-4738-bd8b-a1d1a3b41bae", + "image": "image246.jpeg" + }, { + "chinese_style": "《Love Lab》", + "english_style": "Miki Yoshikawa style", + "id": "8cd108ea-2276-4b2b-9fb9-0078e1b28292", + "image": "image248.jpeg" + }, { + "chinese_style": "《月刊少女野崎君》", + "english_style": "Hima Katsura style", + "id": "57e7d3b8-640b-4ab4-a2c3-708af855dd96", + "image": "image250.jpeg" + }, { + "chinese_style": "《Charlotte》", + "english_style": "Jun Maeda style", + "id": "bd564191-e6f7-459d-8b8e-9df837f09a8a", + "image": "image249.jpeg" + }, { + "chinese_style": "《K-On!》", + "english_style": "Manga Mitogawa and Koji Oji style", + "id": "6c2ded36-ccd4-4ffd-972e-2587737efea6", + "image": "image247.jpeg" + }], + "id": "fbba8ae8-502c-4ae5-856c-ffb70efd852d" + }, { + "sheet": 15, + "name": "传统日本动漫风", + "subStyle": [{ + "chinese_style": "《红辣椒》", + "english_style": "Satoshi Kon style", + "id": "7c2f0bea-67fb-42b1-b02c-e9db30153055", + "image": "image260.jpeg" + }, { + "chinese_style": "《时之歌》", + "english_style": "Makoto Shinkai style", + "id": "997b348f-aef8-4e3a-973c-d93153cbe8c5", + "image": "image263.jpeg" + }, { + "chinese_style": "《完美蓝》", + "english_style": "Mamoru Oshii style", + "id": "a1620fb5-2a77-47f5-9ca9-0245e3bbf278", + "image": "image261.jpeg" + }, { + "chinese_style": "《狼的孩子雨和雪》", + "english_style": "Mamoru Hosoda style", + "id": "4427cac2-4f4a-490b-990f-cf6d46c9ba3a", + "image": "image264.jpeg" + }, { + "chinese_style": "《夏日大作战》", + "english_style": "Kunihiko Ikuhara style", + "id": "1e34a1d4-58cd-4b8c-ab61-b6724bbb053c", + "image": "image262.jpeg" + }, { + "chinese_style": "《未麻的部屋》", + "english_style": "Rintaro style", + "id": "cc689d92-8525-475a-90a4-f42d0adacfd2", + "image": "image265.jpeg" + }, { + "chinese_style": "《千年女优》", + "english_style": "Kon Satoshi style", + "id": "189a8d33-391c-4406-9f77-9811fc39429b", + "image": "image266.jpeg" + }, { + "chinese_style": "《虚空之旅》", + "english_style": "Katsuhiro Otomo style", + "id": "b65d8e8a-1ec1-46cf-a32b-8e16c6d4cada", + "image": "image267.jpeg" + }, { + "chinese_style": "《悬崖上的金鱼姬》", + "english_style": "Goro Miyazaki style", + "id": "fe069298-88d6-4ccd-8076-0af31aa1336c", + "image": "image273.jpeg" + }, { + "chinese_style": "《雪国列车》", + "english_style": "Yoshiaki Kawajiri style", + "id": "bf59ebda-e6df-47cc-9dde-f522b5145b58", + "image": "image270.jpeg" + }, { + "chinese_style": "《猎天使魔女》", + "english_style": "Yasuhito Kikuchi style", + "id": "72877d59-e763-4440-b41b-4826da6718c7", + "image": "image268.jpeg" + }, { + "chinese_style": "《猎魔人》", + "english_style": "Yoshiaki Kawajiri style", + "id": "dfbb0b74-a875-442f-9219-3aad3a66b2bb", + "image": "image274.jpeg" + }, { + "chinese_style": "《幽灵公主》", + "english_style": "Princess Mononoke style", + "id": "7458efbb-97fd-454f-b93f-85ac2e42c139", + "image": "image275.jpeg" + }, { + "chinese_style": "《百变狸猫》", + "english_style": "Pom Poko style", + "id": "0e6b6836-297b-4805-8f65-00e83693a1ae", + "image": "image271.jpeg" + }, { + "chinese_style": "《岁月的童话》", + "english_style": "Only Yesterday style", + "id": "7978dce5-aaa4-46d8-bf68-5b52758d6fa7", + "image": "image269.jpeg" + }, { + "chinese_style": "《我的邻居山田君》", + "english_style": "The Yamadas style", + "id": "c92165f2-00e8-4c06-b3e4-7531f145e3be", + "image": "image272.jpeg" + }, { + "chinese_style": "《猫的报恩》", + "english_style": "The Cat Returns style", + "id": "48aacb4a-501e-4fe6-8cb7-a2ad86657033", + "image": "image258.jpeg" + }, { + "chinese_style": "《借东西的小人阿莉埃蒂》", + "english_style": "Arrietty style", + "id": "48a38ff1-da64-496e-aec0-89c0dea12cc9", + "image": "image255.jpeg" + }, { + "chinese_style": "《起风了》", + "english_style": "The Wind Rises style", + "id": "5ae600ac-6797-4f11-b9e2-176856a1c23a", + "image": "image251.jpeg" + }, { + "chinese_style": "《辉夜姬物语》", + "english_style": "The Tale of The Princess Kaguya style", + "id": "b7ae0ca4-765e-4dda-9d79-63009b943afe", + "image": "image252.jpeg" + }, { + "chinese_style": "《地海传说》", + "english_style": "Tales from Earthsea style", + "id": "ba04d563-d7d5-453e-92d8-84b7dbb04828", + "image": "image253.jpeg" + }, { + "chinese_style": "《侧耳倾听》", + "english_style": "Whisper of the Heart style", + "id": "f3d6adc2-6c8d-4eeb-ac9e-4bc470099a87", + "image": "image254.jpeg" + }, { + "chinese_style": "《时光代理人》", + "english_style": "Link Click style", + "id": "1379ee57-77f0-44ea-ba0f-37d448cf2d86", + "image": "image257.jpeg" + }, { + "chinese_style": "《攻壳机动队》", + "english_style": "Ghost in the Shell style", + "id": "01da912f-f68a-4cff-aac8-5f7cdf945c0e", + "image": "image256.jpeg" + }, { + "chinese_style": "《宇宙战舰大和号》", + "english_style": "Space Battleship Yamato style", + "id": "c24de2c9-1dc7-4c9a-b0ff-7fed7a4f9b32", + "image": "image259.jpeg" + }], + "id": "a4bae3b0-7ca7-45b4-9a83-505e3407fd5e" + }, { + "sheet": 16, + "name": "国产动漫风", + "subStyle": [{ + "chinese_style": "《镖人》", + "english_style": "Biao Ren style", + "id": "12910c0e-1945-47d9-a1a4-0e13a5fa2616", + "image": "image283.jpeg" + }, { + "chinese_style": "《斗破苍穹》", + "english_style": "Battle Through the Heavens style", + "id": "f2d8e7f4-c4c6-497e-9a0d-cf7957e382dd", + "image": "image281.jpeg" + }, { + "chinese_style": "《雪中悍刀行》", + "english_style": "The Swordsman in the Rain style", + "id": "a863dda7-6be4-4c9c-b64a-ccb8561c89d0", + "image": "image287.jpeg" + }, { + "chinese_style": "《大主宰》", + "english_style": "The Great Ruler style", + "id": "bbbc22aa-d99f-4fa3-9f32-d02ff1bb140f", + "image": "image284.jpeg" + }, { + "chinese_style": "《秦时明月》", + "english_style": "The Legend of Qin style", + "id": "77a8e93f-bf9c-433a-9266-03b9b2bf7135", + "image": "image282.jpeg" + }, { + "chinese_style": "《天行九歌》", + "english_style": "Nine Songs style", + "id": "487c6c3d-fed2-43e7-87af-02736ad596b7", + "image": "image285.jpeg" + }, { + "chinese_style": "《画江湖之不良人》", + "english_style": "Hua Jianghu: The Bad Guys style", + "id": "dbc9edbb-72ad-4fc2-a0ae-fc146e0c5226", + "image": "image288.jpeg" + }, { + "chinese_style": "《白箱》", + "english_style": "Shirobako style", + "id": "67043ea7-f930-4144-b8de-6ad3d447e567", + "image": "image286.jpeg" + }, { + "chinese_style": "《百鬼屋》", + "english_style": "House of Hundred Ghosts style", + "id": "3f6b5402-3974-4fd8-83e7-ef88bdc4dad3", + "image": "image291.jpeg" + }, { + "chinese_style": "《端脑》", + "english_style": "Du Nao style", + "id": "dc7994f0-4318-4455-8f8d-e72554be17a9", + "image": "image292.jpeg" + }, { + "chinese_style": "《诛仙》", + "english_style": "Zhuxian style", + "id": "400a1638-0d7e-4a3b-a371-ec2ed1d27a11", + "image": "image294.jpeg" + }, { + "chinese_style": "《哪吒之魔童降世》", + "english_style": "Ne Zha style", + "id": "82517970-da4a-4f8b-aa90-84d84c09cbfb", + "image": "image295.jpeg" + }, { + "chinese_style": "《西游记》", + "english_style": "Journey to the West style", + "id": "3d898e60-ea86-4f20-90f2-f0c09c424b47", + "image": "image296.jpeg" + }, { + "chinese_style": "《封神纪》", + "english_style": "Fengshen Ji style", + "id": "25d49d46-9dc0-45ff-a704-dccdaded159f", + "image": "image289.jpeg" + }, { + "chinese_style": "《山海逆战》", + "english_style": "Shan Hai Ni Zhan style", + "id": "f5083376-cefc-40b3-a8d3-ad4cf3fad713", + "image": "image293.jpeg" + }, { + "chinese_style": "《百炼成神》", + "english_style": "Becoming a God style", + "id": "fd053b5e-1ce3-47bf-95e6-65a6caf739ec", + "image": "image290.jpeg" + }, { + "chinese_style": "《白蛇传》", + "english_style": "The Legend of White Snake style", + "id": "5cf1e3fd-9458-417c-bd7b-33d93a45958d", + "image": "image280.jpeg" + }, { + "chinese_style": "《妖神记》", + "english_style": "Chronicles of the Demon King style", + "id": "e6a1bdbe-8114-4393-a07b-080c8bbb3b1b", + "image": "image277.jpeg" + }, { + "chinese_style": "《镇魂街》", + "english_style": "Rakshasa Street style", + "id": "3dcaff26-29f4-43a1-8141-0ca108420d91", + "image": "image278.jpeg" + }, { + "chinese_style": "《斗罗大陆》", + "english_style": "Soul Land style", + "id": "c7303c09-1aa4-4156-9b21-3c63794d4e8e", + "image": "image276.jpeg" + }, { + "chinese_style": "《血族》", + "english_style": "Bloodline style", + "id": "02a2e278-4eb3-4384-a13a-80e1eef5b627", + "image": "image279.jpeg" + }], + "id": "fa957f58-129e-42cc-b80a-24859fc90789" + }, { + "sheet": 17, + "name": "电影风格", + "subStyle": [{ + "chinese_style": "黑白电影", + "english_style": "Black and white movies", + "id": "7bffd5d9-71e7-4443-99b7-d38cbe5853ee", + "image": "image309.jpeg" + }, { + "chinese_style": "科幻电影", + "english_style": "science fiction film", + "id": "f17c812e-aafd-4ac4-b6e4-36467f75c4e6", + "image": "image310.jpeg" + }, { + "chinese_style": "爱情电影", + "english_style": "romantic movies", + "id": "d2bac280-9bff-4582-a78e-b94a3f75950e", + "image": "image311.jpeg" + }, { + "chinese_style": "动作电影", + "english_style": "action movies", + "id": "a723ca3f-7f59-436b-b4aa-bd99f58bfe45", + "image": "image312.jpeg" + }, { + "chinese_style": "喜剧电影", + "english_style": "comedy movies", + "id": "1a39e88a-2e08-4adf-8859-76d7ac36f2fd", + "image": "image306.jpeg" + }, { + "chinese_style": "恐怖电影", + "english_style": "horror movies", + "id": "cafb6bde-4f43-4fbf-8bf4-9b9a2727c7bd", + "image": "image307.jpeg" + }, { + "chinese_style": "战争电影", + "english_style": "war movies", + "id": "64564b1d-69a2-45ff-b25e-3f073a45b76f", + "image": "image308.jpeg" + }, { + "chinese_style": "纪录片", + "english_style": "documentaries", + "id": "304e6b0f-1b30-4336-8f88-79b907d9592d", + "image": "image305.jpeg" + }, { + "chinese_style": "动画电影", + "english_style": "animated movies", + "id": "3ae766f0-a97b-4004-8a06-b5b8bd76f668", + "image": "image297.jpeg" + }, { + "chinese_style": "奇幻电影", + "english_style": "fantasy movies", + "id": "282b2144-8cf3-470e-9179-7f9419d12a1c", + "image": "image299.jpeg" + }, { + "chinese_style": "惊悚电影", + "english_style": "thriller movies", + "id": "ab55351f-3c55-4828-babc-a34e724d95a2", + "image": "image303.jpeg" + }, { + "chinese_style": "犯罪电影", + "english_style": "crime movies", + "id": "f95ea621-d040-47e5-b6e0-f6f326af1036", + "image": "image300.jpeg" + }, { + "chinese_style": "冒险电影", + "english_style": "adventure movies", + "id": "eb6ecf79-2d53-454b-8302-7cca5c9b591b", + "image": "image301.jpeg" + }, { + "chinese_style": "家庭电影", + "english_style": "family movies", + "id": "c2e2d144-8c87-4110-930b-fdfd41df9b30", + "image": "image302.jpeg" + }, { + "chinese_style": "历史剧", + "english_style": "historical dramas", + "id": "029cc87b-eeab-4f95-ac9f-425460ee9f08", + "image": "image298.jpeg" + }, { + "chinese_style": "音乐剧", + "english_style": "musical movies", + "id": "61993e49-68db-4be4-b8a9-908e1ac7b962", + "image": "image304.jpeg" + }, { + "chinese_style": "悬疑电影", + "english_style": "mystery movies", + "id": "98bf0ddc-4904-4576-9f93-db27363eee28", + "image": "image409.jpeg" + }, { + "chinese_style": "戏剧电影", + "english_style": "drama movies", + "id": "59885546-5b58-40c8-8202-ded895601539", + "image": "image410.jpeg" + }, { + "chinese_style": "运动电影", + "english_style": "sports movies", + "id": "42232865-7ffb-49e1-989b-efab01e44ac0", + "image": "image411.jpeg" + }], + "id": "5d5b2cfa-a417-4723-9931-a3abbac2b452" + }, { + "sheet": 18, + "name": "艺术风格", + "subStyle": [{ + "chinese_style": "幻想艺术风格", + "english_style": "Fantasy art style", + "id": "a7f0560f-fbaa-4fbe-abae-70401e6fedbe", + "image": "image333.jpeg" + }, { + "chinese_style": "复古漫画风格", + "english_style": "Retro comic style", + "id": "7fb47c08-d2e3-439d-9e5d-4a9e3886203e", + "image": "image338.jpeg" + }, { + "chinese_style": "抽象艺术风格", + "english_style": "Abstract art style", + "id": "a7e465c0-8c08-4407-928e-00ddcfc1e14d", + "image": "image331.jpeg" + }, { + "chinese_style": "极简主义风格", + "english_style": "Minimalist style", + "id": "2b4f5f05-9f9f-4605-8ea6-3e9f3e9390b7", + "image": "image335.jpeg" + }, { + "chinese_style": "涂鸦风格", + "english_style": "Graffiti style", + "id": "ca054eb1-ede6-48da-9832-46d2edb04020", + "image": "image336.jpeg" + }, { + "chinese_style": "浮世绘风格", + "english_style": "Ukiyo-e style", + "id": "d73397d8-6535-4a73-a6a8-2107c216c2ae", + "image": "image332.jpeg" + }, { + "chinese_style": "表现主义风格", + "english_style": "Expressionism style", + "id": "ef600238-917d-4bb2-a38d-6619dce4724d", + "image": "image337.jpeg" + }, { + "chinese_style": "超现实主义风格", + "english_style": "Surrealism style", + "id": "c4df7c3e-82b1-44dd-9c7a-6ce48c4c157d", + "image": "image334.jpeg" + }, { + "chinese_style": "装饰艺术风格", + "english_style": "Art Deco style", + "id": "33e5d594-dc86-4396-82d9-89544b356c69", + "image": "image341.jpeg" + }, { + "chinese_style": "未来主义风格", + "english_style": "Futurism style", + "id": "0a59d038-ff76-4575-aa38-616889b38361", + "image": "image344.jpeg" + }, { + "chinese_style": "像素艺术风格", + "english_style": "Pixel art style", + "id": "57e62d07-2d1a-450a-a16e-6641b64c9c07", + "image": "image346.jpeg" + }, { + "chinese_style": "漫画现实主义风格", + "english_style": "Comic realism style", + "id": "6f96a537-a952-4c98-adb5-02ca82025479", + "image": "image340.jpeg" + }, { + "chinese_style": "卡通渲染风格", + "english_style": "Cartoon rendering style", + "id": "0957f80e-2c3e-472a-8f05-263ff831c8ae", + "image": "image339.jpeg" + }, { + "chinese_style": "哥特式漫画风格", + "english_style": "Gothic comic style", + "id": "5ab38c3b-a63c-4852-85d0-5cde07fc900a", + "image": "image345.jpeg" + }, { + "chinese_style": "新古典主义风格", + "english_style": "Neoclassicism style", + "id": "ce5ee6e7-01d2-42b9-85aa-47b4503cfabc", + "image": "image342.jpeg" + }, { + "chinese_style": "浪漫主义风格", + "english_style": "Romanticism style", + "id": "38d106e0-2272-4964-8f83-84b9808d8d1d", + "image": "image343.jpeg" + }, { + "chinese_style": "街头艺术风格", + "english_style": "Street art style", + "id": "ef0a8d87-ba4f-48df-b2f9-11345eb75c10", + "image": "image319.jpeg" + }, { + "chinese_style": "概念艺术风格", + "english_style": "Concept art style", + "id": "347d3e35-5a70-451f-b6cf-58aaf339fc34", + "image": "image317.jpeg" + }, { + "chinese_style": "幻想漫画风格", + "english_style": "Fantasy comic style", + "id": "fdda76a9-25a5-47fa-9570-ec12c6c744c8", + "image": "image316.jpeg" + }, { + "chinese_style": "科幻风格", + "english_style": "Science fiction style", + "id": "8e26e6b3-c109-43c0-ae58-7f68ff050a88", + "image": "image320.jpeg" + }, { + "chinese_style": "西部风格", + "english_style": "Western style", + "id": "b23cf1e2-3449-48ae-b71d-160f081a7202", + "image": "image314.jpeg" + }, { + "chinese_style": "儿童插画风格", + "english_style": "Children's illustration style", + "id": "4572cc54-54e1-41b5-9d63-0b8e53a6bdb6", + "image": "image318.jpeg" + }, { + "chinese_style": "青春漫画风格", + "english_style": "Youth comic style", + "id": "06ccb7d6-d722-418e-ab6f-77f72c048814", + "image": "image315.jpeg" + }, { + "chinese_style": "历史题材漫画风格", + "english_style": "Historical comic style", + "id": "af31cb40-2f6a-486d-9e7b-667837360b15", + "image": "image313.jpeg" + }, { + "chinese_style": "民间艺术风格", + "english_style": "Folk art style", + "id": "750cca85-be64-42c4-b993-b53c414fd01c", + "image": "image325.jpeg" + }, { + "chinese_style": "艺术新潮流风格", + "english_style": "Art Nouveau style", + "id": "755ac85b-8c53-4674-a2ca-3ca86c588814", + "image": "image322.jpeg" + }, { + "chinese_style": "艺术装饰风格", + "english_style": "Art Deco style", + "id": "b20fc215-8631-4334-a345-27de5fbe83b5", + "image": "image328.jpeg" + }, { + "chinese_style": "艺术与工艺风格", + "english_style": "Arts and Crafts style", + "id": "b7bbf919-b6dc-4074-a42e-986b317dc43b", + "image": "image323.jpeg" + }, { + "chinese_style": "野兽派风格", + "english_style": "Fauvism style", + "id": "c8c19729-1cad-424e-8d89-79e024587100", + "image": "image326.jpeg" + }, { + "chinese_style": "立体主义风格", + "english_style": "Cubism style", + "id": "c1c2d744-3e88-4d78-8a91-0626caee0f21", + "image": "image324.jpeg" + }, { + "chinese_style": "原始主义风格", + "english_style": "Primitivism style", + "id": "a784d492-5c63-4ed0-849e-af7fc29ee76e", + "image": "image327.jpeg" + }, { + "chinese_style": "波普艺术风格", + "english_style": "Pop art style", + "id": "cd5726f6-6ef6-4cd8-a59e-8e06584ee6b7", + "image": "image321.jpeg" + }, { + "chinese_style": "后现代主义风格", + "english_style": "Postmodernism style", + "id": "f1f2c258-b5ba-41ba-994b-5f7ab3f180ae", + "image": "image329.jpeg" + }, { + "chinese_style": "超扁平风格", + "english_style": "Superflat style", + "id": "531ec980-a5e0-4126-ba9d-449fa8b3605b", + "image": "image330.jpeg" + }], + "id": "4dfa6a37-ea05-4a09-aabb-eed2c714830e" + }, { + "sheet": 19, + "name": "国风", + "subStyle": [{ + "chinese_style": "中国水墨画", + "english_style": "Chinese ink wash painting", + "id": "9aa7dced-46c5-4b9c-9159-41f3d9239a98", + "image": "image352.jpeg" + }, { + "chinese_style": "工笔花鸟画", + "english_style": "Fine-brushwork floral and bird painting", + "id": "e67ae511-04c0-4493-a696-a6799b07f2f8", + "image": "image347.jpeg" + }, { + "chinese_style": "青绿山水画", + "english_style": "Green and blue landscape painting", + "id": "46e39c6a-5df8-49e7-9eed-807cd3f14db2", + "image": "image349.jpeg" + }, { + "chinese_style": "敦煌壁画", + "english_style": "Dunhuang murals", + "id": "85561e1f-72dc-4c7e-a1ce-f70f5ccb4f5f", + "image": "image348.jpeg" + }, { + "chinese_style": "剪纸艺术", + "english_style": "Chinese paper-cut art", + "id": "7ebba49c-e8ef-45f8-bc68-e80036b92b62", + "image": "image350.jpeg" + }, { + "chinese_style": "年画", + "english_style": "New Year paintings", + "id": "e84038c0-0831-485e-beaa-d9247f960ec0", + "image": "image351.jpeg" + }], + "id": "aa51c366-fcaa-4063-84d7-ad5af8bca191" + }, { + "sheet": 20, + "name": "其他应用", + "subStyle": [{ + "chinese_style": "自然风光", + "english_style": "Natural scenery style", + "id": "75b472ed-192d-4120-87af-c38f353b938f", + "image": "image403.jpeg" + }, { + "chinese_style": "宇宙星空", + "english_style": "Space and stars theme", + "id": "a15f8591-0ce4-4d9d-9301-92b6f98b927d", + "image": "image404.jpeg" + }, { + "chinese_style": "城市建筑", + "english_style": "Urban architecture style", + "id": "be9d8a98-d011-4dd4-ace1-c55119691d0c", + "image": "image405.jpeg" + }, { + "chinese_style": "传统文化", + "english_style": "Traditional culture theme", + "id": "3e1e9539-4e2c-4ed5-82cc-84ec83a7f370", + "image": "image406.jpeg" + }, { + "chinese_style": "现代艺术", + "english_style": "Modern art style", + "id": "bc270c1a-ab1d-4e9d-a9a0-5413323802dd", + "image": "image407.jpeg" + }, { + "chinese_style": "民族风情", + "english_style": "Ethnic style", + "id": "43f968fd-e4d3-417a-b40d-a07c2dd691f7", + "image": "image401.jpeg" + }, { + "chinese_style": "古风仙韵", + "english_style": "Ancient charm style", + "id": "d00cead5-0991-40ed-a64a-5e0a8b5770a9", + "image": "image402.jpeg" + }, { + "chinese_style": "未来幻想", + "english_style": "Future fantasy style", + "id": "3537c9f9-a77f-4daf-84cc-73b260b2c155", + "image": "image408.jpeg" + }, { + "chinese_style": "科技机械", + "english_style": "Technology and machinery theme", + "id": "e83d74ec-697c-4962-8ad3-aa8bd4d85496", + "image": "image356.jpeg" + }, { + "chinese_style": "人物插画", + "english_style": "Character illustration style", + "id": "c1c6b6bb-d1ec-40b4-b703-a9ea67c73786", + "image": "image353.jpeg" + }, { + "chinese_style": "动漫卡通", + "english_style": "Anime and cartoon style", + "id": "73425a65-a3ae-4c51-a64c-670984165e32", + "image": "image357.jpeg" + }, { + "chinese_style": "游戏原画", + "english_style": "Game concept art style", + "id": "cddd0ead-0178-4b9e-86f9-2c83de6b57d0", + "image": "image358.jpeg" + }, { + "chinese_style": "影视剧照", + "english_style": "Film and TV stills style", + "id": "750f6d3b-7e5a-40d2-a581-c3d21ad4640b", + "image": "image355.jpeg" + }, { + "chinese_style": "广告插图", + "english_style": "Advertising illustration style", + "id": "9d95166e-8131-4a33-9ded-8a9c7bfddcb0", + "image": "image359.jpeg" + }, { + "chinese_style": "包装设计", + "english_style": "Packaging design style", + "id": "03aa78fa-3c6f-450d-b64c-b842a78f4237", + "image": "image360.jpeg" + }, { + "chinese_style": "平面海报", + "english_style": "Graphic poster style", + "id": "aaed015c-806c-4d8c-9fb4-7ed0d28098b5", + "image": "image354.jpeg" + }, { + "chinese_style": "网页UI", + "english_style": "Web UI design style", + "id": "063e6129-8f8b-4d61-a4f2-547342a279a3", + "image": "image364.jpeg" + }, { + "chinese_style": "品牌标识", + "english_style": "Brand identity design style", + "id": "5acd5018-661c-4983-8257-773217ba6951", + "image": "image361.jpeg" + }, { + "chinese_style": "时尚插画", + "english_style": "Fashion illustration style", + "id": "a9424c0e-2a33-40ae-b040-71127529de8e", + "image": "image365.jpeg" + }, { + "chinese_style": "儿童绘本", + "english_style": "Children's picture book style", + "id": "d2c5a700-1848-4341-93ea-75e6eae70dc2", + "image": "image363.jpeg" + }, { + "chinese_style": "科普漫画", + "english_style": "Popular science comic style", + "id": "21110cd9-34fd-4acf-86e5-18ea5250b16b", + "image": "image366.jpeg" + }, { + "chinese_style": "教育绘本", + "english_style": "Educational picture book style", + "id": "03fad4d9-2f97-4c83-9226-7f913cb22794", + "image": "image362.jpeg" + }, { + "chinese_style": "医学插图", + "english_style": "Medical illustration style", + "id": "6da6fa32-ded0-485f-a414-17b3d7fff6d2", + "image": "image367.jpeg" + }, { + "chinese_style": "建筑设计", + "english_style": "Architectural design style", + "id": "70c99e02-0578-4ba2-ab44-c49e354b1198", + "image": "image368.jpeg" + }, { + "chinese_style": "汽车设计", + "english_style": "Automotive design style", + "id": "04454eab-0491-4e38-a9a0-1476f4138ecb", + "image": "image370.jpeg" + }, { + "chinese_style": "工业设计", + "english_style": "Industrial design style", + "id": "c18d111c-f3e6-4df8-9867-df8af1207399", + "image": "image371.jpeg" + }, { + "chinese_style": "室内设计", + "english_style": "Interior design style", + "id": "4428d573-1829-4cad-9ce1-54c8dda6b7c2", + "image": "image374.jpeg" + }, { + "chinese_style": "时装设计", + "english_style": "Fashion design style", + "id": "90f7f936-8b54-4aae-bba1-ee6cdae5ce76", + "image": "image373.jpeg" + }, { + "chinese_style": "珠宝设计", + "english_style": "Jewelry design style", + "id": "1f9b2bd8-caa5-4f6c-ad87-0aa3ab5be760", + "image": "image369.jpeg" + }, { + "chinese_style": "家具设计", + "english_style": "Furniture design style", + "id": "b2d1bf95-5c92-4c9d-be02-cc5dcdeff625", + "image": "image372.jpeg" + }, { + "chinese_style": "平面设计", + "english_style": "Graphic design style", + "id": "761c2f31-2b3f-437b-9784-976aff089724", + "image": "image375.jpeg" + }, { + "chinese_style": "插图设计", + "english_style": "Illustration design style", + "id": "3887bd64-8f74-4994-bd0a-3f3798d0a336", + "image": "image376.jpeg" + }, { + "chinese_style": "动画设计", + "english_style": "Animation design style", + "id": "9961b135-7658-47c8-b8b6-94ee646345be", + "image": "image380.jpeg" + }, { + "chinese_style": "游戏设计", + "english_style": "Game design style", + "id": "4b95b12e-d27e-460c-b3c3-4bf7306adfca", + "image": "image377.jpeg" + }, { + "chinese_style": "用户界面", + "english_style": "User interface design style", + "id": "90a47637-a287-4f73-a6d3-e10b6cd52035", + "image": "image378.jpeg" + }, { + "chinese_style": "虚拟现实", + "english_style": "Virtual reality theme", + "id": "805a3511-4037-4981-b628-85b2c1c5805c", + "image": "image382.jpeg" + }, { + "chinese_style": "增强现实", + "english_style": "Augmented reality theme", + "id": "1126d0da-6610-4183-915c-e9fe695d44b1", + "image": "image381.jpeg" + }, { + "chinese_style": "人工智能", + "english_style": "Artificial intelligence theme", + "id": "c98ee53f-427c-4016-8745-b781ed180307", + "image": "image383.jpeg" + }, { + "chinese_style": "机器人科技", + "english_style": "Robotics and technology theme", + "id": "c6edebf7-f2be-4027-8620-888e0dec1e86", + "image": "image384.jpeg" + }, { + "chinese_style": "生物工程", + "english_style": "Biotechnology theme", + "id": "00425a0d-5e3d-4304-83be-f4653315abed", + "image": "image379.jpeg" + }, { + "chinese_style": "环境保护", + "english_style": "Environmental protection theme", + "id": "764a6b68-3530-4d45-bdbe-3db74c659dea", + "image": "image390.jpeg" + }, { + "chinese_style": "可持续发展", + "english_style": "Sustainable development theme", + "id": "7bf52103-ab9a-4fff-8250-42a5f8d32e73", + "image": "image386.jpeg" + }, { + "chinese_style": "社会公益", + "english_style": "Social welfare theme", + "id": "6edb9969-682c-4721-aa80-29b6ca583a57", + "image": "image389.jpeg" + }, { + "chinese_style": "医疗健康", + "english_style": "Medical and health theme", + "id": "e36cdc09-976a-43e5-921e-687950020ac6", + "image": "image391.jpeg" + }, { + "chinese_style": "教育培训", + "english_style": "Education and training theme", + "id": "402fbf92-ff82-422b-a12f-3595ff908197", + "image": "image387.jpeg" + }, { + "chinese_style": "金融经济", + "english_style": "Finance and economy theme", + "id": "e75bbc8c-ba12-47a8-9d42-1f2847533afd", + "image": "image388.jpeg" + }, { + "chinese_style": "科学研究", + "english_style": "Scientific research theme", + "id": "9cb82967-bf9e-4a6c-8a22-11e9b5b3d698", + "image": "image385.jpeg" + }, { + "chinese_style": "文化艺术", + "english_style": "Culture and art theme", + "id": "92fcc6e2-88a3-474d-b0ac-ab657e7605b6", + "image": "image392.jpeg" + }, { + "chinese_style": "体育运动", + "english_style": "Sports and fitness theme", + "id": "ecddba8f-d64e-431b-81fe-6a8234da6bca", + "image": "image395.jpeg" + }, { + "chinese_style": "旅游度假", + "english_style": "Travel and vacation theme", + "id": "7b826dfa-670b-4826-9d45-7803d2ee5c6a", + "image": "image400.jpeg" + }, { + "chinese_style": "美食烹饪", + "english_style": "Food and cooking theme", + "id": "2d72e89e-8208-4d19-ad8a-0f8e3718fb42", + "image": "image398.jpeg" + }, { + "chinese_style": "时尚美妆", + "english_style": "Fashion and beauty theme", + "id": "50acc1db-330c-413b-aa99-efcbda18c94d", + "image": "image393.jpeg" + }, { + "chinese_style": "婚礼庆典", + "english_style": "Wedding and celebration theme", + "id": "353a2699-8906-4d15-beac-1a942bf1e26e", + "image": "image394.jpeg" + }, { + "chinese_style": "家居生活", + "english_style": "Home and lifestyle theme", + "id": "1b9ce9cf-2c7f-43a4-a619-171856e8db41", + "image": "image399.jpeg" + }, { + "chinese_style": "母婴育儿", + "english_style": "Maternity and parenting theme", + "id": "df0f3682-82ae-4729-b469-25f0c1784364", + "image": "image396.jpeg" + }, { + "chinese_style": "科技创新", + "english_style": "Technological innovation theme", + "id": "1fa174c2-3557-4fec-bd03-1774561d494a", + "image": "image397.jpeg" + }], + "id": "cfd1b687-0043-4e39-bf8e-b8f4d4667016" + }], + /** + * 获取所有的生图风格 + * @returns {Array} 返回所有的风格数据 + */ + getImageStyle: function () { + return this.image_style; + }, + + /** + * 获取指定的的ID的风格数据,可以多个 + * @param {*} ids ID的数组 + * @returns + */ + getImageStyleObjectByIds: function (ids) { + let result = []; + if (!ids) { + ids = []; + } + let style = this.getAllSubStyle(); + for (let i = 0; i < ids.length; i++) { + const element = ids[i]; + for (let j = 0; j < style.length; j++) { + const item = style[j]; + if (item.id == element) { + result.push(item); + break; + } + } + } + return result; + }, + + /** + * 获取指定ID数组的风格提示词 + * @param {*} ids 需要拼接的id数组 + * @returns 返回拼接好的英文提示词字符串(会加上SD设置那边的权重) + */ + getImageStyleStringByIds: async function (ids) { + let res = ""; + let tmp = []; + let result = this.getImageStyleObjectByIds(ids); + for (let i = 0; i < result.length; i++) { + const element = result[i]; + tmp.push(element.english_style); + } + let weight = await SdSettingDefine.getSettingSettingProperty("style_weight", false); + weight = weight ? weight : 1; + tmp.map((item) => { + if (global.config.image_generate_category == "sd") { + res += `(${item}:${weight}),`; + } else { + res += `${item},`; + } + }); + return res; + }, + + /** + * + * @returns {Array} 返回所有的风格数据 + */ + getAllSubStyle: function () { + let subStyle = []; + this.image_style.forEach((item) => { + subStyle = subStyle.concat(item.subStyle); + }); + return subStyle; + }, + + /** + * 根据图像风格数据,返回选择菜单 + * @returns {Array} 返回所有的风格数据 + */ + getImageStyleMenu: function () { + let menu = []; + this.image_style.forEach((item) => { + menu.push({ + id: item.id, + label: item.name, + key: item.id, + }); + }); + return menu; + }, + + /** + * 获取指定的ID的下面数据的风格 + * @param {*} id 菜单的ID + */ + getImagePathById: function (id) { + try { + let index = this.image_style.findIndex((item) => item.id == id); + if (index < 0) { + throw new Error("没有找到指定的ID"); + } + let subStyle = this.image_style[index].subStyle; + return subStyle; + + } catch (error) { + throw error; + } + } + +} + +export { ImageStyleDefine } \ No newline at end of file diff --git a/src/define/setting/clipSetting.js b/src/define/setting/clipSetting.js new file mode 100644 index 0000000..eb99d2b --- /dev/null +++ b/src/define/setting/clipSetting.js @@ -0,0 +1,100 @@ +import { Tools } from "../../main/tools"; +import { define } from "../define"; +let tools = new Tools(); +const { v4: uuidv4 } = require('uuid'); // 引入UUID库来生成唯一标识符 + +export const ClipSetting = { + + + /** + * 保存剪映关键帧配置 + * @param {*} value 关键帧数据 + */ + async SaveKeyFrameSetting(value) { + try { + await tools.writeJsonFilePropertyValue(define.clip_setting, "key_frame", JSON.parse(value)); + return { + code: 1 + } + } catch (error) { + return { + code: 0, + message: `保存剪映关键帧配置:Error Message ${error.toString()}` + } + } + }, + + /** + * 获取当前关键帧的的下拉菜单 + */ + async GetKeyFrameOptions() { + return { + code: 1, + data: [{ + label: "上下", + value: "KFTypePositionY" + }, { + label: "左右", + value: "KFTypePositionX" + }, { + label: "缩放", + value: "KFTypeScale" + }] + } + }, + + /** + * 要删除的剪映设置 + * @param {*} property 判断的属性 + * @param {*} value 属性值 + * @returns + */ + async deleteClipSetting(property, value) { + try { + if (value.toString() == "0" || value.toString() == "1") { + return { + code: 0, + message: "当前项不删除!" + } + } + let text_style = await tools.getJsonFilePropertyValue(define.clip_setting, property, []); + let new_style = text_style.filter(item => item.id != value.toString()); + await tools.writeJsonFilePropertyValue(define.clip_setting, property, new_style); + return { + code: 1 + } + } catch (error) { + return { + code: 0, + message: `Error Message ${error.toString()}` + } + } + }, + + /** + * 添加背景音乐到配置 + * @param {窗口} win + * @param {传入的值} value + */ + async AddBackgroundMusicFolder(value) { + try { + let background_music_setting = await tools.getJsonFilePropertyValue(define.clip_setting, "background_music_setting", [], false); + let obj = { + name: value[0], + folder_path: value[1], + id: uuidv4() + } + background_music_setting.push(obj); + tools.writeJsonFilePropertyValue(define.clip_setting, "background_music_setting", background_music_setting, false); + return { + code: 1, + message: "添加成功" + } + } catch (error) { + return { + code: 0, + message: `Error Message ${error}` + } + } + } +} \ No newline at end of file diff --git a/src/define/setting/dynamicSetting.js b/src/define/setting/dynamicSetting.js new file mode 100644 index 0000000..2e523ee --- /dev/null +++ b/src/define/setting/dynamicSetting.js @@ -0,0 +1,119 @@ + +let fspromises = require('fs').promises; +import { get, cloneDeep } from 'lodash'; +import { define } from '../define'; + +export class DynamicSetting { + constructor(global) { + this.global = global; + } + + + /** + * 通过指定的类型,获取数据 + * @param {*} type default:在代码中写死的 dynamic:用户自定义的 all:写死的和自定义的合并返回 + * @param {*} mainType 主分类,gpt,tag这些 + * @param {*} property 返回书信的名称 gpt_options,gpt_model_options,gpt_auto_inference + * @param {*} defaultSetting 默认的设置,用于合并数据 + * @param {*} defaultData 默认数据,默认值为null + * @returns + */ + async getDataByTypeAndProperty(type, mainType, property, defaultSetting, defaultData = []) { + try { + let res = []; + // 获取自定义的GPT数据 + let dynamic_setting = JSON.parse(await fspromises.readFile(define.dynamic_setting, 'utf-8')); + let tags = get(dynamic_setting, mainType, {}); + let data = get(tags, property, defaultData); + + if (type == "default") { + // res = get(this, property, defaultData); + } else if (type == "dynamic") { + res = data; + } else if (type == "all") { + res = defaultSetting.concat(data); + } + else { + throw new Error(`不存在的类型 : ${value}`); + } + return { + code: 1, + data: res + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 保存 dynamic_setting 中主分支中指定属性的数据 + * @param {*} value 要保存的数据 + * @param {*} mainType 大的设置里面的主分支 + * @param {*} property 对应的属性 + * @param {*} callback 回调函数,可以对数据进行自定义的判断 + */ + async saveDataByTypeAndProperty(value, mainType, property, callback = null) { + try { + // 获取自定义的GPT数据 + let dynamic_setting = JSON.parse(await fspromises.readFile(define.dynamic_setting, 'utf-8')); + let tmp_gpt = get(dynamic_setting, mainType, {}); + let gpt = tmp_gpt[property] ? tmp_gpt[property] : []; + if (callback) { + callback(gpt); + } + + if (value.id) { + // 判断当前ID的数据是否存在,存在覆盖,不存在追加 + let index = gpt.findIndex(item => item.id == value.id); + if (index < 0) { + gpt.push(value); + } else { + gpt[index] = value; + } + } else { + value.id = uuidv4(); + gpt.push(value); + } + tmp_gpt[property] = gpt; + // 将修改后的数据保存 + dynamic_setting[mainType] = tmp_gpt; + // 写入文件 + await fspromises.writeFile(define.dynamic_setting, JSON.stringify(dynamic_setting)); + + } catch (error) { + throw error; + } + } + + /** + * 删除指定的属性中的数据 + * @param {*} id 要删除数据的ID + * @param {*} mainType 删除的主分支的类别 + * @param {*} property 删除的属性中的数据 + */ + async deleteDataByTypeAndProperty(id, mainType, property) { + try { + // 获取自定义的GPT数据 + let dynamic_setting = JSON.parse(await fspromises.readFile(define.dynamic_setting, 'utf-8')); + let tmp_data = get(dynamic_setting, mainType, {}); + let gpt = tmp_data[property] ? tmp_data[property] : []; + // 判断当前ID的数据是否存在,存在删除 + let index = gpt.findIndex(item => item.id == id); + if (index >= 0) { + gpt.splice(index, 1); + } + // 将修改后的数据保存 + dynamic_setting[mainType][property] = gpt; + // 写入文件 + await fspromises.writeFile(define.dynamic_setting, JSON.stringify(dynamic_setting)); + + } catch (error) { + throw error; + } + } + + +} \ No newline at end of file diff --git a/src/define/setting/imageSetting.js b/src/define/setting/imageSetting.js new file mode 100644 index 0000000..2eefdb4 --- /dev/null +++ b/src/define/setting/imageSetting.js @@ -0,0 +1,245 @@ +import { Tools } from "../../main/tools"; +import { define } from "../define"; +import path from "path"; +import { DEFINE_STRING } from "../define_string"; +import { get, has } from "lodash"; +let tools = new Tools(); +const { v4: uuidv4 } = require('uuid'); // 引入UUID库来生成唯一标识符 + +export const ImageSetting = { + + /** + * 获取自动保存图片的方式 + * @returns + */ + async GetAutoSaveImageClassifyOptions() { + return { + code: 1, + data: [{ + label: "不分类", + value: "one" + }, + // { + // label: "按模型", + // value: "model" + // }, + { + label: "按风格", + value: "style" + }, + { + label: "风格+模型", + value: "theme" + }] + } + }, + + /** + * 获取自动保存图片的方式(sd,mj,d3 等) + */ + async GetImageGenerateCategory() { + return { + code: 1, + data: [{ + label: "SD", + value: "sd" + }, + { + label: "MJ", + value: "mj" + }, + { + label: "D3", + value: "d3" + }] + } + }, + + /** + * 保存自动保存图片的设置 + */ + async SaveImageAutoSaveSetting(value) { + try { + value = JSON.parse(value); + await tools.writeJsonFilePropertyValue(define.img_base, "auto_save_image", value); + return { + code: 1, + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + }, + + /** + * 保存自动保存图片的设置 + */ + async GetImageAutoSaveSetting() { + try { + let res = await tools.getJsonFilePropertyValue(define.img_base, "auto_save_image", {}, false); + return { + code: 1, + data: res + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + }, + + /** + * 保存图片到指定文件夹,只是将任务添加到队列中 + */ + async SaveImageToOtherFolder(output = [], value) { + try { + let show = false; + if (value) { + value = JSON.parse(value); + show = false; + } else { + let auto_save_image = await tools.getJsonFilePropertyValue(define.img_base, "auto_save_image", {}, false); + value = { + save_match_count: auto_save_image.save_match_count, + save_folder: auto_save_image.main_save_folder + } + if (!auto_save_image.auto_save) { + return { + code: 1 + } + } + } + + let batch = DEFINE_STRING.QUEUE_BATCH.IMAGE_SAVE_TO_OTHER_FOLDER; + // 获取当前的所有的output文件夹 + if (output.length == 0) { + output = await tools.getSubFolderList(path.join(global.config.project_path, "tmp/bak/"), "start", "output_crop_"); + } + for (let i = 0; i < output.length; i++) { + const element = path.join(global.config.project_path, 'tmp/bak/' + output[i]); + // 获取指定的文件夹里面的文件 + let png_files = await tools.getFilesWithExtensions(element, ".png"); + console.log(png_files); + // 判断当前的png_files中的数据是不是大于value.save_match_count,大于的话,删除数组里面的数据 + if (value.save_match_count && png_files.length > value.save_match_count) { + // 删除数组 + png_files.splice(value.save_match_count); + } + + for (let j = 0; j < png_files.length; j++) { + const item = png_files[j]; + global.fileQueue.enqueue(async () => { + // 复制文件到指定的文件夹 + let dst = path.join(value.save_folder, `${Date.now().toString()}_${uuidv4().split('-')[0]}.png`); + + await tools.copyFileOrDirectory(item, dst); + }, `${batch}_${item}`, batch) + } + } + global.fileQueue.setBatchCompletionCallback(batch, (failedTasks) => { + if (failedTasks.length > 0) { + let message = ` + 转存任务都已完成。 + 但是以下任务执行失败: + ` + failedTasks.forEach(({ taskId, error }) => { + message += `${taskId}-, \n 错误信息: ${error}` + '\n'; + }); + + global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 0, + message: message + }) + } else { + if (show) { + global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 1, + message: "所有图片转存完成" + }) + } + } + }) + + return { + code: 1 + } + + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + }, + + /** + * 获取指定的配置文件里面指定的属性的数据 + * @param {*} value 执行方法必要的信息 + * 0 define中的指定属性(指定的配置文件) + * 1 要获取的什么属性信息 property,property 为null,赶回当前配置文件的所有数据 + * 2 是不是要校验属性不存在 + * 3 属性没有找到的默认值 + * @returns + */ + async GetDefineConfigJsonByProperty(value) { + try { + value = JSON.parse(value); + let defin_property = value[0]; + let property = value[1]; + let need_check = value[2]; + let default_data = value[3]; + // 判断define中的属性是不是存在 + let hasProperty = has(define, defin_property); + if (!hasProperty) { + throw new Error(`${defin_property} 属性不存在。`); + } + let data = await tools.getJsonFilePropertyValue(define[defin_property], property, default_data, need_check); + return { + code: 1, + data: data + } + } catch (error) { + return { + code: 0, + message: "获取配置信息失败,错误信息入下 : " + error.message.toString() + } + } + }, + + /** + * 保存指定的配置文件里面指定的属性的数据 + * @param {*} value + * 0 define中的指定属性(指定的配置文件) + * 1 要获取的什么属性信息 property,property 为null,赶回当前配置文件的所有数据 + * 2 是不是要校验属性不存在 + * 3 属性没有找到的默认值 + */ + async SaveDefineConfigJsonByProperty(value) { + try { + value = JSON.parse(value); + let defin_property = value[0]; + let property = value[1]; + let data = value[2]; + let need_check = value[3] ? value[3] : false; + // 判断define中的属性是不是存在 + let hasProperty = has(define, defin_property); + if (!hasProperty) { + throw new Error(`${defin_property} 属性不存在。`); + } + await tools.writeJsonFilePropertyValue(define[defin_property], property, data, need_check); + return { + code: 1, + message: "保存指定的配置成功" + } + } catch (error) { + return { + code: 0, + message: "保存配置信息失败,错误信息入下 : " + error.message.toString() + } + } + } + +} \ No newline at end of file diff --git a/src/define/setting/mjSetting.js b/src/define/setting/mjSetting.js new file mode 100644 index 0000000..50eac8c --- /dev/null +++ b/src/define/setting/mjSetting.js @@ -0,0 +1,268 @@ +import { Tools } from "../../main/tools"; +import { define } from "../define"; +import path from "path"; +import { DEFINE_STRING } from "../define_string"; +import { get, has } from "lodash"; +let tools = new Tools(); +const { v4: uuidv4 } = require('uuid'); // 引入UUID库来生成唯一标识符 + +export class MjSetting { + constructor(golbal) { + this.golbal = golbal; + } + + /** + * 返回mj生成图片方式的分类 + */ + async GetMJGenerateCategory() { + return { + code: 1, + data: [{ + label: "本地MJ", + value: "local_mj" + }, + { + label: "代理MJ(待开发)", + value: "remote_mj" + }, + { + label: "浏览器模式", + value: "browser_mj" + }, + { + label: "API模式(待开发)", + value: "api_mj" + } + ] + } + } + + /** + * 获取MJ的敏感词 + * @returns + */ + GetMJBadPrompt() { + return { + code: 1, + data: [ + { id: "c7285c9a-28bd-4f0f-b58e-95f5bc65a932", value: "name" }, + { id: "6aeac51d-ce80-4b18-82dc-20e6d32440a9", value: "xi" }, + { id: "29a8fd3d-4fc7-4dbd-a969-98d69cb5328d", value: "1488" }, + { id: "37156673-793c-44b4-b324-ebe123a9a78d", value: "-backed" }, + { id: "f610dd0a-f4d8-4926-ac32-4cab6c7b5a03", value: "-edge" }, + { id: "fcd9161f-6131-4d66-8570-ec91a5ba180d", value: "ahegao" }, + { id: "18f20df3-3e85-4de0-bf80-86d0d4e58b45", value: "anus" }, + { id: "ed0ede1e-32b3-454f-a2db-cae6b5a57592", value: "arrest" }, + { id: "b90948e0-6ee5-4ea3-a837-e233b3b17a78", value: "arse" }, + { id: "fc1ff9ee-86da-4179-a522-38e3efea11c5", value: "ass" }, + { id: "bb5cdd27-4c8a-40e8-b63d-ccb01dc2bb53", value: "au naturel" }, + { id: "97681e71-03ba-4438-8bb6-4d59e8f46565", value: "badonkers" }, + { id: "a9adb58c-6b50-4e41-b294-e73af4f4c503", value: "ballgag" }, + { id: "15ff35b4-7e87-4d42-bce3-3d5c56b46241", value: "bare" }, + { id: "3de673e4-c503-4939-9e25-8dabf9bab1ee", value: "barely dressed" }, + { id: "bb4587fc-0066-4f4c-918a-1a40acb3816b", value: "bathing" }, + { id: "851ffd2e-6c05-44ff-b797-834476274382", value: "behind bars" }, + { id: "591d8e96-91e4-41f9-bfe2-898f3268b737", value: "belle delphine" }, + { id: "7dba6fb9-45e2-45bf-b340-1d8941ab1a2a", value: "belly button" }, + { id: "3bbcdaec-14f7-408f-82ef-eed344093180", value: "big ass" }, + { id: "a395c2e0-6658-48df-8915-d6a97ed10bb2", value: "big but" }, + { id: "7beebbd8-0af8-4db7-83b2-c91dc70a3eb4", value: "bimbo" }, + { id: "fef6cc33-8dd2-41d6-8af7-6981f562c39a", value: "bleed" }, + { id: "84c72069-ece7-4a67-9530-54855d6daa6f", value: "blood" }, + { id: "d8aadcec-6c22-4871-8c60-c42bb4ad5a57", value: "bloodbath" }, + { id: "a52598ae-02da-4242-8ef7-27d94b8f67cf", value: "bloodshot" }, + { id: "7e6b51c1-c797-49e5-a91b-26e48fe3af8c", value: "bloody" }, + { id: "5fdbcbf2-4f41-4519-84f3-aba0f8146436", value: "bodily fluids" }, + { id: "e663e1b2-7679-4afb-9d30-4f9d4861e980", value: "booba" }, + { id: "5308fe0e-b166-4363-95a6-fde65cd67740", value: "boobs" }, + { id: "f1a1f6a8-0052-41c4-913d-d1b0998eea39", value: "booty" }, + { id: "831b1517-6ff5-4304-87b6-8b363af61035", value: "bosom" }, + { id: "ffa6f6e1-cce5-4502-b3f1-b1726f2394cf", value: "boudoir" }, + { id: "c98a9bb8-aa83-4a8a-a5c6-790b97dd5380", value: "bra" }, + { id: "932b660e-f18f-44f4-8013-afdb36e2e250", value: "breast" }, + { id: "e55c9024-5e8e-41ee-aba5-fb720535450e", value: "breasts" }, + { id: "4e9cbd9a-bca4-4aff-8ac5-94281832fd01", value: "brothel" }, + { id: "0c61a566-db04-4d88-8405-fe047881b318", value: "brown pudding" }, + { id: "2cd73ba3-07f0-414c-bd9e-e63bdb8b49c2", value: "bruises" }, + { id: "9781a033-fe82-4517-aa30-c694a223d810", value: "bunghole" }, + { id: "547fef1f-f6d0-41dc-8833-df8cefe47e5b", value: "busty" }, + { id: "806f997b-f087-4d72-83b7-726ded5bfb0c", value: "camisole" }, + { id: "bcfb32a8-bac5-4ea3-8f75-328679b6d4ec", value: "cannibal" }, + { id: "02b86218-ced6-417d-8a2d-d1c498950e12", value: "cannibalism" }, + { id: "4af55a8c-3f1d-4cc9-9b1d-95001a3af8d9", value: "car crash" }, + { id: "f7896ef4-995a-4672-953a-906375a85cf0", value: "censored" }, + { id: "4fa5fc83-6a98-4c19-9300-8f9ebdd02344", value: "clear" }, + { id: "4fe6bf80-b024-4ff8-b9a4-55493d3aecdf", value: "cleavage" }, + { id: "9ab736d4-22d4-4a32-a4e8-961c2514e3c6", value: "clunge" }, + { id: "277bacbb-e199-41c8-a579-acf4f6544a8a", value: "cocaine" }, + { id: "f5cb4db2-a011-408d-a251-e13ec0f4bfee", value: "coon" }, + { id: "04a46ee7-983c-4853-8feb-360163ad6df2", value: "corpse" }, + { id: "e8ac77ed-d9ad-4458-a1ea-42f673cae70c", value: "crack" }, + { id: "84f862b7-fdae-4691-84f6-d4387c41d469", value: "cronenberg" }, + { id: "6856cb18-e54e-4f90-aa40-c248bbe64fd3", value: "crotch" }, + { id: "54862391-6401-41bf-9f05-9f47edf0df6e", value: "crucified" }, + { id: "537acb42-53af-42e8-addc-a3c12454cc96", value: "crucifixion" }, + { id: "47bc62fa-cc6d-4d83-b3af-72a5cfc253f0", value: "cutting" }, + { id: "36f7dd13-40d5-497d-9387-2e2cbb4e9eef", value: "decapitate" }, + { id: "b0da9ca0-d94d-4017-b6e3-beb4b1a0dbca", value: "deepfake" }, + { id: "472103e3-63f6-44fe-a10b-442dbe570eb8", value: "dick" }, + { id: "6a8ef200-d7d0-4743-bc0e-479870221b60", value: "disturbing" }, + { id: "786dbd3e-9921-410a-a763-57f8d724645c", value: "dominatrix" }, + { id: "6fc5a206-38b2-458b-a2e5-60b4731c2221", value: "dong" }, + { id: "ca57c06b-9461-4927-9ef1-527fe82e1557", value: "erected" }, + { id: "2719310f-b0db-4ea0-a8d6-f27911b15ec3", value: "erotic" }, + { id: "a73b116a-1a89-4c6c-874a-18862b8fcdc7", value: "excrement" }, + { id: "7f760708-d39b-4dbd-b9d0-a4c74d281dd6", value: "explicit" }, + { id: "5b89d913-bd61-43b3-b0ba-8f8fbb7d6aa2", value: "fart" }, + { id: "3a161cb8-e1b3-4caf-be68-e8b0b4ba7b39", value: "farts" }, + { id: "dfbdbc1b-9837-47af-aa22-2f76386fa6ac", value: "fascist" }, + { id: "ed391e98-50cc-480f-8fd2-d376fcd198d3", value: "feces" }, + { id: "542b5b74-f23a-49bf-89ed-2790ff254e40", value: "flesh" }, + { id: "65bfb8a8-1f4b-4863-a4cc-ea5f31b26b65", value: "fuck" }, + { id: "4e33e652-e1a6-45e6-98c1-51173fd31531", value: "full frontal" }, + { id: "ffafe20d-9229-4213-a8b2-2739805fd053", value: "girth" }, + { id: "de266e28-bdd5-4c00-bb91-20bfa2bc1ad2", value: "gory" }, + { id: "7b239a5a-6a46-4418-8f0a-92a6a28c1737", value: "gruesome" }, + { id: "aeac4364-e425-4de6-9d7c-2e7b6ee69150", value: "guts" }, + { id: "a48660e2-6814-47cc-b650-92bef67bc391", value: "hardcore" }, + { id: "5504dfc9-f47b-4479-b71d-a7f3c5202b98", value: "hemoglobin" }, + { id: "7412f330-3e83-4a0b-8c66-9781e6a8f667", value: "hentai" }, + { id: "c165c0f7-af8c-410d-b319-d28149538c29", value: "heroin" }, + { id: "1947f939-05e7-487b-8024-4d83f8dfbc8e", value: "hitler" }, + { id: "8599b59d-c183-4aa7-b01c-9de40f4b1022", value: "honkers" }, + { id: "8a5b39e9-9d58-44d8-9d70-2f0c3baa7093", value: "honkey" }, + { id: "5189ff73-52c1-4e3b-a607-e11fc99224b7", value: "hooters" }, + { id: "35526006-14a6-44ed-8677-0bd81769f6ee", value: "horny" }, + { id: "2cb23d1b-ab8e-4aa4-bd6a-f1b8421a11bb", value: "hot" }, + { id: "670e0cb3-cec0-4c1f-a7ee-9702de55f765", value: "inappropriate" }, + { id: "90a79e0e-f834-44af-8271-cd698ded7f9a", value: "incest" }, + { id: "038290f1-542d-43b0-a66b-4b9252577e34", value: "infected" }, + { id: "5f18eb41-bfd8-4e24-a1e4-70bb0048abd7", value: "infested" }, + { id: "151d3d72-3338-4064-85a3-7b9509c0af02", value: "intimate" }, + { id: "35344f33-c914-476d-a51f-fa7521cb5e2d", value: "invisible clothes" }, + { id: "8a79c98f-74e9-4e9a-a793-c45d9a451b7e", value: "jail" }, + { id: "d0af7014-857a-4776-bcec-e77e45e989e8", value: "jav" }, + { id: "fbdf69e1-700e-4bc6-bce3-1c44c73aef22", value: "jerk off king at pic" }, + { id: "05c0a10b-c9b0-43e3-a1c6-3497654bd37e", value: "jinping" }, + { id: "184a1028-9e87-4cad-8c7f-56ab863b32bf", value: "khorne" }, + { id: "b3724772-c7ab-494f-8f06-1626f716e951", value: "kill" }, + { id: "236ae511-a63b-43a3-8cd7-9bb140f87894", value: "killing" }, + { id: "b3306590-a036-4481-9320-b4301a990f04", value: "kinbaku" }, + { id: "a5e7af9b-cf8c-4ee1-86e9-856631b2a9cb", value: "knob" }, + { id: "b90ab4e1-d92f-48c1-b7cc-4e2c05556d8e", value: "labia" }, + { id: "5a8c38c7-920d-4dad-b296-703fe1701393", value: "large bust" }, + { id: "11aa5afc-a82c-411f-b750-943db24a9373", value: "legs spread" }, + { id: "e5453d41-b0cb-448c-9f91-b67acf6baff2", value: "lingerie" }, + { id: "edaa68b9-bc57-4d47-81be-3193efdcef7b", value: "loli" }, + { id: "d4e8b240-720c-474e-9c13-d303d6cdf9bd", value: "lolita" }, + { id: "324eade1-736b-44a7-8eb0-3d5d0f1d8aee", value: "making love" }, + { id: "13677126-5db1-4e76-b31a-b3715b4cc0bd", value: "mammaries" }, + { id: "b6b33a69-d56e-450f-aa8f-3ab7e7d26bce", value: "manure" }, + { id: "df9c1303-1631-4ed5-8987-89fe1071e639", value: "massacre" }, + { id: "cd3479f3-a678-41dc-9310-291280235481", value: "mccurry" }, + { id: "3f3a9ddb-9453-4d56-86b5-1b11ad269ee8", value: "meth" }, + { id: "473623f9-7870-46de-9492-7900883b5619", value: "minge" }, + { id: "521f92ba-851a-4f5f-a64f-919a2ab1561e", value: "mommy milker" }, + { id: "3fac09ea-c275-453a-9404-6ec6f4df16da", value: "mong" }, + { id: "800e8d82-ac7d-4b29-9172-3b4ec5cce029", value: "mp5" }, + { id: "fc1b5708-8f7a-42d3-a7b4-9833872ca0a5", value: "naked" }, + { id: "06ef209f-2f1b-4a57-952d-3ae13f694efc", value: "naughty" }, + { id: "8e830471-4ce1-4d91-80bd-cd5b1884b632", value: "nazi" }, + { id: "22e45e19-bd23-45a4-bc91-e9f4cb26ab08", value: "negligee" }, + { id: "328a4e01-d6a7-4d5f-b67a-e9779dc6d99e", value: "nipple" }, + { id: "fddccbcd-9403-4428-8578-e8441ec041ea", value: "no clothes" }, + { id: "f67bb5a0-2b1c-4a1b-bcd9-493afb72f960", value: "no shirt" }, + { id: "c68ffce2-97cb-4c0a-8149-b515ae219edd", value: "nude" }, + { id: "f6be970b-c51f-4f22-adf3-2a6645fd462c", value: "oppai" }, + { id: "e62a37f7-f9ac-4dd9-a304-f0cd5f2450c9", value: "organs" }, + { id: "fa0ac77b-c48d-4b82-aad2-5c6fd63913f9", value: "orgy" }, + { id: "e21f5cb2-3979-4f19-8f97-3f3dd59ba5c7", value: "ovaries" }, + { id: "f86c9b71-f72f-4388-ae03-17163cb9f9c4", value: "patriotic" }, + { id: "ac101e34-22df-40c4-a5c5-118b4a2264e1", value: "penis" }, + { id: "b2985e10-d853-4015-9714-4d74cd5222c7", value: "petite" }, + { id: "fc528fdc-5896-41a6-b3fa-4ccc8a4aad24", value: "phallus" }, + { id: "e4faecad-5b79-4b78-a700-9b340ccd5424", value: "pinup" }, + { id: "878cbe81-bce5-4700-a975-2327304579c6", value: "playboy" }, + { id: "c0567b02-318e-4678-b571-5e1b23885b69", value: "pleasure" }, + { id: "e480e0d4-d4e1-4bdc-a333-0e7425c33b8e", value: "pleasures" }, + { id: "18997d5e-8435-46b7-ac73-f42ffa46ab0b", value: "poop" }, + { id: "575e3d5f-1484-4acf-bdbf-4e2e15fdf61c", value: "porn" }, + { id: "6b99a59d-c4d9-4694-aab3-b6638d309d23", value: "president xi" }, + { id: "77750235-e319-43e6-a437-c2da531ec29a", value: "prophet mohammed" }, + { id: "f106cc6c-1f22-4db1-9784-54cdcb1147d2", value: "provocative" }, + { id: "d3c87c63-386a-4587-a7ae-1410b7d9b7d2", value: "pus" }, + { id: "c8702cbe-f862-4064-b2b2-670656d938cb", value: "rear end" }, + { id: "25f40ed5-a626-4f1a-a9b3-daf455a12b1d", value: "reproduce" }, + { id: "157a3485-8229-413c-90d3-1d1144a11a89", value: "reticulum" }, + { id: "1c8df025-dd33-4861-92fa-4c723ff8ec64", value: "revealing clothing" }, + { id: "c3bc043a-654b-4a22-bfbf-3fc860aa12c6", value: "risque" }, + { id: "d62d6517-1608-45a1-b81b-2cf133a201b7", value: "rule34" }, + { id: "e93111c4-e6fd-4c97-ac9c-01dcc12cddc8", value: "sadist" }, + { id: "cbd76361-31c1-4792-938f-6ef75870fea0", value: "sakimichan" }, + { id: "cd33821b-c7ce-42d9-957c-8a7076c11b1c", value: "scantily clad" }, + { id: "1185419f-1da2-4345-ab96-8b9be4c6b46c", value: "seducing" }, + { id: "abdbe3b9-6061-48af-8039-b685e1bbbea6", value: "seduction" }, + { id: "6c0fd29a-4dbe-4f83-b1fc-f245715eb1bb", value: "seductive" }, + { id: "daac8577-daae-4591-8f97-c13ebec1ae8d", value: "seductive" }, + { id: "fab884a1-8da1-4007-bfca-a42bd82cfc71", value: "seductively" }, + { id: "f95621af-ea0b-4ef8-be4d-fc050afaab2c", value: "see through" }, + { id: "b1700d0f-519d-43df-9a6d-ed06c87e211b", value: "see-through" }, + { id: "9e1962c9-251e-4b9c-b47b-f7dc095f47be", value: "sensored" }, + { id: "cb3f6673-7905-4a3f-ae35-52727faa6058", value: "sensual" }, + { id: "237c669c-19c2-4b28-baab-b25b8a270e07", value: "sensuality" }, + { id: "91f13289-6bb5-4a63-865d-cee6a3c8f030", value: "sexi" }, + { id: "0f7aa60b-d534-4139-9720-a1606284e48c", value: "sex" }, + { id: "fee57fc0-4f3c-4c8b-b6ca-2b5507df6c2c", value: "sexual" }, + { id: "e0c4cb87-c47a-431a-a7c2-ef1cc74741a6", value: "sexualiz" }, + { id: "2b34561a-fa4e-4b45-b6eb-2412413e0628", value: "sexy" }, + { id: "6a95e61a-a456-4c94-9669-a03a476a68d8", value: "sexy female" }, + { id: "d4d1bdae-9aec-4471-8c60-1785d70443cd", value: "shag" }, + { id: "ac0d3234-9e95-45f0-a58f-39c8749c5ec8", value: "shibari" }, + { id: "d4d84dc7-5dda-4877-9382-e23055f218cf", value: "shirtless" }, + { id: "7ddb0d43-e514-48d3-af73-eddd0115cb08", value: "shit" }, + { id: "f3a9af97-18aa-4e34-8116-04106415ac7d", value: "silenced" }, + { id: "7b593fbf-9523-4a49-ad6a-dfb99716b175", value: "skimpy" }, + { id: "2f258d77-79d0-45c9-ad5a-fb4cf50defc5", value: "slaughter" }, + { id: "ccc038c8-acc0-4c51-ba06-0c36ecf41316", value: "slave" }, + { id: "64931d15-946c-4770-9f1a-d1857391acf1", value: "smut" }, + { id: "5148a37b-bac1-428f-aa62-9d274da1bf32", value: "sperm" }, + { id: "a391fdd7-3ae7-4151-8944-541babfec4e8", value: "stripped" }, + { id: "9d095f83-a7f2-4639-9041-49c973c85d43", value: "succubus" }, + { id: "fcf3b4b2-6afb-4680-8016-669423f6fcb3", value: "suicide" }, + { id: "f6d276ee-1900-431b-a3bb-b6a0d36b204b", value: "sultry" }, + { id: "c2054ea6-919b-4d38-b723-8a1d1de275b6", value: "surgery" }, + { id: "541365e2-0aeb-40e8-a7c3-e3e0c57f5812", value: "teratoma" }, + { id: "40761bbd-a415-41a7-b575-c9c23e637c65", value: "thick" }, + { id: "a58bf63e-602c-4070-a140-203b4db66c02", value: "thot" }, + { id: "7fbb0d25-6697-431c-b38c-1e16ae75eeee", value: "tied up" }, + { id: "e7bbaf6d-50a5-4826-867f-5769e883c3f0", value: "tight white" }, + { id: "ce2cb570-4717-4bc8-940c-7b2bc70968a4", value: "titty" }, + { id: "4f50541a-a6fd-4abd-9b4d-7f5e344c166c", value: "torture" }, + { id: "a9e9b16f-0604-4414-99ac-f2e31fa7b47c", value: "transparent" }, + { id: "de36c419-c30e-4bbd-a9d6-1b5f206c3bc7", value: "tryphophobia" }, + { id: "f50e070e-d2df-4b48-ace6-a782f32cdeba", value: "twerk" }, + { id: "5e3d1c80-5edd-4c27-9324-51924e46c487", value: "unclothed" }, + { id: "10f55a7e-2fcc-46f1-936a-0a07ebdea45a", value: "vagina" }, + { id: "d3bd0065-02ac-475a-bfb1-2a92965a95ab", value: "vein" }, + { id: "6a7574a8-ad8b-41fc-b70a-706bca5b219b", value: "veiny" }, + { id: "47dab584-b634-4d37-9c69-6a7635d3785e", value: "visceral" }, + { id: "ca3cf2ff-6606-4480-bbbd-14ed6e6e38f8", value: "vivisection" }, + { id: "01cb7168-ee13-414b-b3d4-6710936e38a9", value: "voluptuous" }, + { id: "6404e3e4-11d8-4764-9cdc-9218cfd099f8", value: "vomit" }, + { id: "f569881e-d0b2-4796-bb9c-d8ccdcaba3ff", value: "waifu" }, + { id: "ca5749bd-353c-4154-a80f-a3b86f1571af", value: "wang" }, + { id: "a0de75a0-f146-4c65-9178-2af86f989cc8", value: "warts" }, + { id: "de528ae1-d559-4035-a6cf-9fd0e6f9f75e", value: "wearing nothing" }, + { id: "8822ff40-2ef7-4a44-9c9c-a8f77cb78596", value: "wincest" }, + { id: "66fc1157-45c8-4725-a98b-84023bd04477", value: "with no shirt" }, + { id: "caf02471-0eca-4544-9ca8-7d30e7df0c02", value: "without clothes on" }, + { id: "225777f9-f873-41f1-a6a6-bfed93d2dfb2", value: "wound" }, + { id: "e442ed1f-88a6-42ec-a7aa-be195c675abf", value: "xxx" }, + { id: "ffb118e1-ea7a-4ba9-a629-e937a21137fc", value: "zedong" }, + { id: "2858c61a-0b40-4811-9730-248b98493ddd", value: "zero clothes" }, + { id: "d4b95284-98ce-45a9-b2ba-0de22c760996", value: "er lang zi" } + ] + } + } + +} \ No newline at end of file diff --git a/src/define/setting/sdSettingDefine.js b/src/define/setting/sdSettingDefine.js new file mode 100644 index 0000000..a63517c --- /dev/null +++ b/src/define/setting/sdSettingDefine.js @@ -0,0 +1,47 @@ +import { get } from "lodash"; +import { define } from "../define"; +let fspromises = require("fs").promises; + +// Create a shared object +export const SdSettingDefine = { + + /** + * 打开指定的SD setting文件 + * @returns + */ + openSettingJson: async function () { + try { + return JSON.parse(await fspromises.readFile(define.sd_setting, 'utf-8')); + } catch (error) { + throw error; + } + }, + + /** + * 获取setting设置的指定属性 + * @param {*} property 获取sd配置文件setting里面的属性,如果传入null,返回整个SD配置的setting属性 + * @returns + */ + getSettingSettingProperty: async function (property) { + // 加载通用配置 + let setting = await this.openSettingJson(); + if (!property) { + return get(setting, "setting", null); + } else + return get(setting.setting, property, null); + }, + + /** + * 获取webui设置的指定属性 + * @param {*} property 获取sd配置文件webui里面的属性,如果传入null,返回整个SD配置的setting属性 + * @returns + */ + getSettingWebuiProperty: async function (property) { + let setting = await this.openSettingJson(); + if (!property) { + return get(setting, "webui", null); + } else + return get(setting.webui, property, null); + } + +}; diff --git a/src/define/tagDefine.js b/src/define/tagDefine.js new file mode 100644 index 0000000..9bd7057 --- /dev/null +++ b/src/define/tagDefine.js @@ -0,0 +1,153 @@ + +let fspromises = require('fs').promises; +import { get, cloneDeep } from 'lodash'; +import { define } from './define'; +const { v4: uuidv4 } = require('uuid'); + +export class TagDefine { + constructor(global) { + this.global = global; + } + + /** + * 获取tag选择模式(标签和下拉select) + */ + async getTagSelectModel() { + return { + code: 1, + data: + [ + { label: "标签", value: "tag" }, + { label: "下拉", value: "drop" }, + ] + } + } + + + /** + * 通过指定的类型,获取数据 + * @param {*} type default:在代码中写死的 dynamic:用户自定义的 all:写死的和自定义的合并返回 + * @param {*} property 要返回的属性的名称,若是传入null,返回整个属性的数据 + * @param {*} defaultData 默认数据,默认值为null + * @returns + */ + async getTagDataByTypeAndProperty(type, property, defaultData = null) { + try { + let res = []; + // 获取自定义的GPT数据 + let tag_setting = JSON.parse(await fspromises.readFile(define.tag_setting, 'utf-8')); + let data = get(tag_setting, property, {}); + // 若是传入的属性名为null,直接返回当前tags里面的所有的数据 + if (property == null) { + data = tag_setting; + } + + if (type == "default") { + // res = get(this, property, defaultData); + } else if (type == "dynamic") { + res = data; + } else if (type == "all") { + let tmp_arr = cloneDeep(get([], property, defaultData)); + tmp_arr = tmp_arr.concat(data); + res = tmp_arr; + } + else { + throw new Error(`不存在的类型 : ${value}`); + } + return { + code: 1, + data: res + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 保存gpt指定的属性数据,判断value中的ID是不是存在,存在直接覆盖,不存在追加 + * @param {*} value + * @param {*} property + */ + async saveTagPropertyData(value) { + try { + let property = value[1]; + value = JSON.parse(value[0]); + // 获取自定义的GPT数据 + let tag_setting = JSON.parse(await fspromises.readFile(define.tag_setting, 'utf-8')); + let tag = get(tag_setting, property, []); + if (value.key) { + // 判断当前ID的数据是否存在,存在覆盖,不存在追加 + let index = tag.findIndex(item => item.key == value.key); + value.value = value.key; + if (index < 0) { + // 判断相同名字的数据是不是存在,存在报错 + if (tag.some(item => item.label == value.label)) { + throw new Error("已存在相同名称的数据,请修改名称后再保存"); + } + tag.push(value); + } else { + tag[index] = value; + } + } else { + // 判断相同名字的数据是不是存在,存在报错 + if (tag.some(item => item.label == value.label)) { + throw new Error("已存在相同名称的数据,请修改名称后再保存"); + } + value.key = uuidv4(); + value.value = value.key; + tag.push(value); + } + tag_setting[property] = tag; + // 写入文件 + await fspromises.writeFile(define.tag_setting, JSON.stringify(tag_setting)); + return { + code: 1, + message: "保存成功" + } + + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 删除自定义GPT指定属性中的指定ID的数据 + * @param {*} id + * @param {*} property + */ + async deleteTagPropertyData(value) { + try { + let property = value[1]; + let id = value[0]; + // 获取自定义的GPT数据 + let tag_setting = JSON.parse(await fspromises.readFile(define.tag_setting, 'utf-8')); + let tags = tag_setting[property] ? tag_setting[property] : []; + // 判断当前ID的数据是否存在,存在删除 + let index = tags.findIndex(item => item.key == id); + if (index >= 0) { + tags.splice(index, 1); + } + // 将修改后的数据保存 + tag_setting[property] = tags; + // 写入文件 + await fspromises.writeFile(define.tag_setting, JSON.stringify(tag_setting)); + return { + code: 1, + message: "删除成功" + } + + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + +} \ No newline at end of file diff --git a/src/main/IPCEvent/discordIpc.js b/src/main/IPCEvent/discordIpc.js new file mode 100644 index 0000000..735ad5c --- /dev/null +++ b/src/main/IPCEvent/discordIpc.js @@ -0,0 +1,108 @@ +import { ipcMain } from "electron"; +import { DEFINE_STRING } from "../../define/define_string"; +import { DiscordSimple } from "../discord/discordSimple"; +import { DiscordRequestListener } from "../discord/discordRequestLister"; + +/** + * 添加discord的ipc事件 + * @param {*} createWindow + */ +function DiscordIpc(global) { + let windows = global.newWindow.filter(item => item.hash === 'discord'); + if (windows.length <= 0) { + throw new Error("Discord窗口未找到"); + } + let thisWindow = windows[0]; + + // 创建网络请求人物监听器 + if (!thisWindow.win.RequestListener) { + thisWindow.win.RequestListener = new DiscordRequestListener(thisWindow.win); + thisWindow.win.RequestListener.start(); + } + + WinddowUrlRefresh(thisWindow); + GetSessionAuthorization(thisWindow); + + // 加载内部执行的方法 + let discordSimple = new DiscordSimple(thisWindow.win); + + // 获取discord窗口的url + ipcMain.handle(DEFINE_STRING.DISCORD.GET_DISCORD_WINDOW_URL, async (event, value) => { + // 调用指定的窗口,获取数据(相关的数据) + return thisWindow.win.webContents.getURL(); + }); +} + +/** + * 移除所有的DiscordIpc事件 + */ +function RemoveDiscordIpc() { + for (const key in DEFINE_STRING.DISCORD) { + if (Object.hasOwnProperty.call(DEFINE_STRING.DISCORD, key)) { + const element = DEFINE_STRING.DISCORD[key]; + ipcMain.removeHandler(element); + } + } +} + +// 添加一个初始化的方式,获取数据或者时写入数据 + +// 监听新增的url刷新事件 +function WinddowUrlRefresh(thisWindow) { + thisWindow.win.webContents.on('did-navigate-in-page', (event, url) => { + // 将当前的数据写道指定的界面中,对返回的数据进行分类 + // 判断是不是有channels。有的话就是获取到了数据 + let serviceID = null; + let channelID = null; + if (url.indexOf("/channels/") > 0) { + const regex = /\/channels\/(\d+)\/(\d+)/; + const match = url.match(regex); + if (match && match[1] && match[2]) { + serviceID = match[1]; + channelID = match[2]; + } + + global.newWindow[0].win.webContents.send(DEFINE_STRING.DISCORD.OPERATE_REFRASH_DISCORD_URL, { + code: 1, + type: DEFINE_STRING.DISCORD_SIMPLE_DATA_TYPE.URL, + data: { + url: url, + serviceID: serviceID, + channelID: channelID + } + }); + + } + + // 判断是不是需要登录(登录提示) + if (url.indexOf('/login') > 0) { + global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MAIN_NOTIFICATION, { + code: 0, + message: "请先登录Discord账号" + }); + } + }) +} + +// 获取session。Authorization,以及当当登录的User-Agent +function GetSessionAuthorization(thisWindow) { + thisWindow.win.RequestListener.AddRequestListener('GetSessionAuthorization', (details) => { + if (details.url.indexOf("channels") > 0) { + global.newWindow[0].win.webContents.send(DEFINE_STRING.DISCORD.OPERATE_REFRASH_DISCORD_URL, { + code: 1, + type: DEFINE_STRING.DISCORD_SIMPLE_DATA_TYPE.TOKEN, + data: { + authorization: details.requestHeaders.Authorization, + userAgent: details.requestHeaders["User-Agent"], + } + }); + } + }); +} + + + +export { + DiscordIpc, + RemoveDiscordIpc +} \ No newline at end of file diff --git a/src/main/IPCEvent/gptIpc.js b/src/main/IPCEvent/gptIpc.js new file mode 100644 index 0000000..b37d577 --- /dev/null +++ b/src/main/IPCEvent/gptIpc.js @@ -0,0 +1,45 @@ +import { ipcMain } from "electron"; +import { GPT } from "../Public/GPT"; +import { DEFINE_STRING } from '../../define/define_string' +let gpt = new GPT(global); + +function GptIpc() { + + // 获取默认或者是自定义的GPT服务商 + ipcMain.handle(DEFINE_STRING.GET_GPT_BUSINESS_OPTION, async (event, value) => await gpt.GetGPTBusinessOption(value)); + + // 获取默认的或者是自定义的GPT推理模型 + ipcMain.handle(DEFINE_STRING.GET_GPT_MODEL_OPTION, async (event, value) => await gpt.GetGPTModelOption(value)); + + // 获取默认的提示词推理模式或者是自定义的提示词推理模式 + ipcMain.handle(DEFINE_STRING.GET_GPT_AUTO_INFERENCE_OPTIONS, async (event, value) => await gpt.GetGptAutoInferenceOptions(value)); + + // 保存自定义的GPT服务商数据 + ipcMain.handle(DEFINE_STRING.SAVE_DYNAMIC_GPT_OPTION, async (event, value) => await gpt.SaveDynamicGPTOption(value)); + + // 删除自定义的GPT服务商数据 + ipcMain.handle(DEFINE_STRING.DELETE_DYNAMIC_GPT_OPTION, async (event, value) => await gpt.DeleteDynamicGPTOption(value)); + + // 测试当前的GPT是不是可以链接成功 + ipcMain.handle(DEFINE_STRING.TEST_GPT_CONNECTION, async (event, value) => await gpt.TestGPTConnection(value)); + + // 自定义GPT推理提示词测试输出 + ipcMain.handle(DEFINE_STRING.GENERATE_GPT_EXAMPLE_OUT, async (event, value) => await gpt.GenerateGptExampleOut(value)); + + // 获取GPT推理词设置 + ipcMain.handle(DEFINE_STRING.GET_CUSTOMIZE_GPT_PROMPT, async (event, value) => await gpt.GetCustomizeGptPrompt(value)); + + // 监听自动分析人物事件 + ipcMain.handle(DEFINE_STRING.AUTO_ANALYZE_CHARACTER, async (event, value) => await gpt.AutoAnalyzeCharacter(value)); + + // GPT推理关键词 + ipcMain.handle(DEFINE_STRING.GPT_PROMPT, async (event, value) => await gpt.GPTPrompt(value)); + + // 监听洗稿任务 + ipcMain.handle(DEFINE_STRING.AIMODIFY_ONE_WORD, async (event, value) => await gpt.AIModifyOneWord(value)); + +} + +export { + GptIpc +} \ No newline at end of file diff --git a/src/main/IPCEvent/imageGenerateIpc.js b/src/main/IPCEvent/imageGenerateIpc.js new file mode 100644 index 0000000..dfe1748 --- /dev/null +++ b/src/main/IPCEvent/imageGenerateIpc.js @@ -0,0 +1,47 @@ +import { + ipcMain +} from "electron"; +import { DEFINE_STRING } from '../../define/define_string' +import { + ImageGenerate +} from '../backPrompt/imageGenerate' +let imageGenerate = new ImageGenerate(global); + +function ImageGenerateIpc() { + // 监听获取任务列表 + ipcMain.handle(DEFINE_STRING.GET_GENERATE_TASK_LIST, async (event) => await imageGenerate.GetGenerateTaskList()); + + // 监听修改任务信息 + ipcMain.handle(DEFINE_STRING.MODIFY_IMAGE_TASK_LIST, async (event, value) => await imageGenerate.ModifyImageTaskList(value)); + + // 监听生成一次图片任务 + ipcMain.handle(DEFINE_STRING.GENERATE_IMAGWE_IN_SELECT_TASK, async (event, value) => await imageGenerate.GenerateImageInSelectTask(value)); + // 监听生成sd api json 的任务 + + ipcMain.handle(DEFINE_STRING.ADD_WEBUI_JSON, async (event) => await imageGenerate.AddWebuiJson()); + // 下载文件到指定位置 + + ipcMain.handle(DEFINE_STRING.DOWNLOAD_IMAGE_FILE, async (event, value) => await imageGenerate.DownloadImageFile(value)); + // 获取指定名字的prompt的配置文件 + + ipcMain.handle(DEFINE_STRING.GET_PROMPT_JSON, async (event, value) => await imageGenerate.GetPromptJson(value)); + // 修改后台队列任务的状态 + + ipcMain.handle(DEFINE_STRING.MODIFY_GENERATE_TASK_STATUS, async (event, value) => await imageGenerate.ModifyGenerateTaskStatus(value)); + // 监听获取基础数据 + + ipcMain.handle(DEFINE_STRING.GET_IAMGE_PROMPT_LIST, async (event) => { + // 获取最新的那个窗口 + let w = global.newWindow[global.newWindow.length - 1]; + let res = await imageGenerate.getFolderImageList(w, w.init_folder, true); + return res; + }) + + // 监听修改配置json + ipcMain.handle(DEFINE_STRING.MODIFY_INPUT_CROP_JSON, async (event, value) => await imageGenerate.ModifyInpurCropJson(value)); + +} + +export { + ImageGenerateIpc +} diff --git a/src/main/IPCEvent/mainIpc.js b/src/main/IPCEvent/mainIpc.js new file mode 100644 index 0000000..4a3fa38 --- /dev/null +++ b/src/main/IPCEvent/mainIpc.js @@ -0,0 +1,35 @@ +import { ipcMain } from "electron"; +const { BrowserWindow, BrowserView } = require('electron') +import { DEFINE_STRING } from "../../define/define_string"; +import { define } from "../../define/define"; +import { Tools } from "../tools"; +import { DiscordSimple } from "../discord/discordSimple"; +let tools = new Tools(); + + +function MainIpc(createWindow) { + + // 添加打开discord窗口的事件 + ipcMain.handle(DEFINE_STRING.MAIN.OPEN_DISCORD_WINDOW, async (event) => { + try { + + let discordSimple = new DiscordSimple(null); + discordSimple.CreateDiscordWindow(createWindow); + + return { + code: 1, + message: "打开discord窗口成功" + } + } catch (error) { + return { + code: 0, + message: "打开discord窗口失败" + } + } + + }); +} + +export { + MainIpc +} \ No newline at end of file diff --git a/src/main/IPCEvent/mjIpc.js b/src/main/IPCEvent/mjIpc.js new file mode 100644 index 0000000..796bdbd --- /dev/null +++ b/src/main/IPCEvent/mjIpc.js @@ -0,0 +1,78 @@ +import { ipcMain } from "electron" +import { DEFINE_STRING } from "../../define/define_string" +import { MjSimple } from "../discord/mjSimple" +import { TagCustomize } from "../Original/TagCustomize" +import { MJOriginalImageGenerate } from '../Original/MJOriginalImageGenerate' +import { PublicMethod } from "../Public/publicMethod" +import { DiscordSimple } from "../discord/discordSimple" +import { Tools } from "../tools" +import path from 'path' + +let mjSimple = new MjSimple(global) +let discordSimple = new DiscordSimple(null) +let tagCustomize = new TagCustomize(global); +let mJOriginalImageGenerate = new MJOriginalImageGenerate(global); +let publicMethod = new PublicMethod(global); +let tools = new Tools(); + + +function MjIpc() { + // 监听保存mj的文案配置信息 + ipcMain.handle(DEFINE_STRING.MJ.SAVE_WORD_SRT, async (event, value) => await mjSimple.SvaeMJWordSrt(value)); + + // 监听获取MJ的文件配置信息 + ipcMain.handle(DEFINE_STRING.MJ.GET_MJ_CONFIG_SRT_INFORMATION, async (event, value) => await mjSimple.GetMJConfigSrtInformation(value)); + + // 监听获取标签数据 + ipcMain.handle(DEFINE_STRING.MJ.GET_TAG_DATA_BY_TYPE_AND_PROPERTY, async (event, value) => await tagCustomize.GetTagDataByTypeAndProperty(value)); + + // 保存指定的标签数据 + ipcMain.handle(DEFINE_STRING.MJ.SAVE_TAG_PROPERTY_DATA, async (event, value) => await tagCustomize.SaveTagPropertyData(value)); + + // 删除指定的标签数据 + ipcMain.handle(DEFINE_STRING.MJ.DELETE_TAG_PROPERTY_DATA, async (event, value) => await tagCustomize.DeleteTagPropertyData(value)); + + // MJ 原创生图 + ipcMain.handle(DEFINE_STRING.MJ.ORIGINAL_MJ_IMAGE_GENERATE, async (event, value) => await mJOriginalImageGenerate.OriginalMJImageGenerate(value)); + + // 获取discord的频道机器人 + ipcMain.handle(DEFINE_STRING.MJ.GET_CHANNEL_ROBOTS, async (event, value) => await mjSimple.GetChannelRobots(value)); + + // 获取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()); + + // MJ生成的图片分割 + ipcMain.handle(DEFINE_STRING.MJ.IMAGE_SPLIT, async (event, value) => await mJOriginalImageGenerate.ImageSplit(value)); + + // 添加MJ敏感词 + ipcMain.handle(DEFINE_STRING.MJ.ADD_MJ_BAD_PROMPT, async (event, value) => await mjSimple.AddMJBadPrompt(value)); + + // 添加MJ敏感词检查 + ipcMain.handle(DEFINE_STRING.MJ.MJ_BAD_PROMPT_CHECK, async (event, value) => await mjSimple.MJBadPromptCheck(value)); + + // 获取已经生图完成的数据,并获取图片 + ipcMain.handle(DEFINE_STRING.MJ.GET_GENERATED_MJ_IMAGE_AND_SPLIT, async (event, value) => await mJOriginalImageGenerate.GetGeneratedMJImageAndSplit(value)); + + // 给图片链接,下载指定的图片并分割保存 + ipcMain.handle(DEFINE_STRING.MJ.DOWNLOAD_IMAGE_URL_AND_SPLIT, async (event, value) => await mJOriginalImageGenerate.DownloadImageUrlAndSplit(value)); + + /** + * 监听DISCORD界面创建消息,并修改数据 + */ + ipcMain.on(DEFINE_STRING.DISCORD.CREATE_MESSAGE, async (event, value) => await discordSimple.DiscordCreateMessage(value)); + + /** + * 监听DISCORD界面的更新消息,并修改数据 + */ + ipcMain.on(DEFINE_STRING.DISCORD.UPDATE_MESSAGE, async (event, value) => await discordSimple.DiscordUpdateMessage(value)); + + /** + * 监听DISCORD界面的删除消息,并修改数据 + */ + ipcMain.on(DEFINE_STRING.DISCORD.DELETE_MESSAGE, async (event, value) => await discordSimple.DiscordDeleteMessage(value)); +} + +export { + MjIpc +} \ No newline at end of file diff --git a/src/main/IPCEvent/originalImageGenerateIpc.js b/src/main/IPCEvent/originalImageGenerateIpc.js new file mode 100644 index 0000000..22136a0 --- /dev/null +++ b/src/main/IPCEvent/originalImageGenerateIpc.js @@ -0,0 +1,19 @@ +import { ipcMain } from "electron"; +import { DEFINE_STRING } from '../../define/define_string' +import { OriginalImageGenerate } from "../Original/OriginalImageGenerate"; +let originalImageGenerate = new OriginalImageGenerate(global); + +function OriginalImageGenerateIpc() { + // 监听自动生成单个配置的文件 + ipcMain.handle(DEFINE_STRING.ORIGINAL_ADD_WEBUI_JSON, async (event, value) => await originalImageGenerate.OriginalAddWebuiJson(value)); + + // 监听自动保存数据到json文件 + ipcMain.handle(DEFINE_STRING.AUTO_SAVE_DATA_JSON, async (event, value) => await originalImageGenerate.AutoSaveDataJson(value)); + + // SD原创单张图片生成 + ipcMain.handle(DEFINE_STRING.ORIGINAL_SD_SINGLE_IMAGE_GENERATE, async (event, value) => await originalImageGenerate.OriginalSDImageGenerate(value)); +} + +export { + OriginalImageGenerateIpc +} \ No newline at end of file diff --git a/src/main/IPCEvent/sdIpc.js b/src/main/IPCEvent/sdIpc.js new file mode 100644 index 0000000..67fb65e --- /dev/null +++ b/src/main/IPCEvent/sdIpc.js @@ -0,0 +1,18 @@ +import { ipcMain } from "electron"; +import { DEFINE_STRING } from '../../define/define_string' +import { SD } from "../Public/SD"; +let sd = new SD(global); + +function SdIpc() { + // 获取样式图片的子列表 + ipcMain.handle(DEFINE_STRING.GET_STYLE_IMAGE_SUB_LIST, async (event, value) => await sd.GetStyleImageSubList(value)); + + // 获取图片样式信息 + ipcMain.handle(DEFINE_STRING.GET_IMAGE_STYLE_INFOMATION, async (event, value) => await sd.GetImageStyleInfomation(value)); + + // 获取图片样式菜单 + ipcMain.handle(DEFINE_STRING.GET_IMAGE_STYLE_MENU, async (event) => await sd.GetImageStyleMenu()); +} +export { + SdIpc +} \ No newline at end of file diff --git a/src/main/IPCEvent/settingIpc.js b/src/main/IPCEvent/settingIpc.js new file mode 100644 index 0000000..f4696d4 --- /dev/null +++ b/src/main/IPCEvent/settingIpc.js @@ -0,0 +1,72 @@ +const { + ipcMain +} = require("electron") +import { DEFINE_STRING } from '../../define/define_string' +import { + Setting +} from '../setting/setting' +let setting = new Setting(global); + +function SettingIpc() { + + // 获取背景音乐配置列表 + ipcMain.handle(DEFINE_STRING.GET_BACKGROUND_MUSIC_CONFIG_LIST, async (event) => await setting.GetBackGroundMusicConfigList()); + + // 获取剪映关键帧配置列表 + ipcMain.handle(DEFINE_STRING.GET_KEYFRAME_OPTIONS, async (event) => await setting.GetKeyFrameOptions()); + // 保存剪映关键帧配置 + ipcMain.handle(DEFINE_STRING.SAVE_KEY_FRAME_SETTING, async (event, value) => await setting.SaveKeyFrameSetting(value)); + // 监听添加背景音乐文件 + ipcMain.handle(DEFINE_STRING.ADD_BACKGROUND_MUSIC_FOLDER, async (event, value) => await setting.AddBackgroundMusicFolder(value)) + // 删除剪映的样式设置 + ipcMain.handle(DEFINE_STRING.DELETE_DRAFT_TEXT_STYLE, async (event, value) => await setting.deleteClipSetting("text_style", value)); + + // 删除剪映的背景音乐设置 + ipcMain.handle(DEFINE_STRING.DELETE_CLIP_SETTING, async (event, value) => await setting.deleteClipSetting("background_music_setting", value)); + // 删除剪映的友情提示设置 + ipcMain.handle(DEFINE_STRING.DELETE_FRIENDLY_REMINDER, async (event, value) => await setting.deleteClipSetting("friendly_reminder_setting", value)); + + // 监听获取SD配置任务 + ipcMain.handle(DEFINE_STRING.INIT_SD_CONFIG, async (event, value) => await setting.InitSDConfig()); + + // 获取主页显示信息 + ipcMain.handle(DEFINE_STRING.GET_SHOW_MESSAGE, async (event) => await setting.GetShowMessage()) + // 获取关键帧的配置数据 + ipcMain.handle(DEFINE_STRING.GET_KEY_FRAME_CONFIG_DATA, async (event) => await setting.GetKeyFrameConfigData()); + + // 删除后台队列任务 + ipcMain.handle(DEFINE_STRING.DELETE_BACK_TASK, async (event, value) => await setting.RemoveTask(value)); + + // 获取自动保存图片的分类方式 + ipcMain.handle(DEFINE_STRING.GET_AUTO_SAVE_IMAGE_CLASSIFY_OPTIONS, async (event) => await setting.GetAutoSaveImageClassifyOptions()); + + // 保存图片自动保存的配置 + ipcMain.handle(DEFINE_STRING.SAVE_IMAGE_AUTO_SAVE_SETTING, async (event, value) => await setting.SaveImageAutoSaveSetting(value)); + + // 获取当前的自动保存图片的设置 + ipcMain.handle(DEFINE_STRING.GET_IMAGE_AUTO_SAVE_SETTING, async (event) => await setting.GetImageAutoSaveSetting()); + + // 开始手动保存图片 + ipcMain.handle(DEFINE_STRING.SAVE_IMAGE_TO_OTHER_FOLDER, async (event, value) => await setting.SaveImageToOtherFolder(value)); + // 检查机器码是否存在 + ipcMain.handle(DEFINE_STRING.CHECK_MACHINE_ID, async (event, value) => await setting.CheckMachineId(value)); + + //修改剪映草稿配置 + ipcMain.handle(DEFINE_STRING.MODIFY_SAMPLE_SETTING, async (event, value) => await setting.ModifySampleSetting(value)); + + // 获取选择角色场景模式的options + ipcMain.handle(DEFINE_STRING.MJ.GET_TAG_SELECT_MODEL, async (event) => await setting.GetRoleSceneModeOptions()); + + // 获取当前生成图片的生图方式(sd,mj,d3) + ipcMain.handle(DEFINE_STRING.GET_IMAGE_GENERATE_CATEGORY, async (event) => await setting.GetImageGenerateCategory()); + + // // 获取指定的配置文件里面指定的属性的数据 + ipcMain.handle(DEFINE_STRING.GET_DEFINE_CONFIG_JSON_BY_PROPERTY, async (event, value) => await setting.GetDefineConfigJsonByProperty(value)) + + // // 保存指定的配置文件里面指定的属性的数据 + ipcMain.handle(DEFINE_STRING.SAVE_DEFINE_CONFIG_JSON_BY_PROPERTY, async (event, value) => await setting.SaveDefineConfigJsonByProperty(value)) +} + +export { + SettingIpc +} \ No newline at end of file diff --git a/src/main/IPCEvent/translateIpc.js b/src/main/IPCEvent/translateIpc.js new file mode 100644 index 0000000..7c75eda --- /dev/null +++ b/src/main/IPCEvent/translateIpc.js @@ -0,0 +1,18 @@ +import { ipcMain } from "electron"; +import { DEFINE_STRING } from '../../define/define_string' +import { Translate } from '../Public/Translate' +let translate = new Translate(global); + +function TranslateIpc() { + // 监听添加任务到翻译队列的任务 + ipcMain.handle(DEFINE_STRING.TRANSLATE_PROMPT, async (event, value) => await translate.TranslatePrompt(value)); + + // 添加立即返回的翻译任务 + ipcMain.handle(DEFINE_STRING.TRANSLATE_RETURN_NOW, async (event, value) => await translate.TranslateReturnNow(value)); + + // 添加立即返回的翻译任务到队列中 + ipcMain.handle(DEFINE_STRING.MJ.TRANSLATE_RETURN_NOW_TASK, async (event, value) => await translate.TranslateReturnNowTask(value)); +} +export { + TranslateIpc +} \ No newline at end of file diff --git a/src/main/IPCEvent/videoGenerateIpc.js b/src/main/IPCEvent/videoGenerateIpc.js new file mode 100644 index 0000000..eebfd17 --- /dev/null +++ b/src/main/IPCEvent/videoGenerateIpc.js @@ -0,0 +1,27 @@ +import { ipcMain } from "electron"; +import { DEFINE_STRING } from '../../define/define_string' +import { VideoGenerate } from "../backPrompt/videoGenerate"; +let videoGenerate = new VideoGenerate(global); + +function VideoGenerateIpc() { + // 一键全自动前的条件检查 + ipcMain.handle(DEFINE_STRING.AUTO_CONDITION_CHECK, async (event, value) => await videoGenerate.CheckVideoGenerattionAllCondition(null, value, null)); + + // 开始全自动合成任务 + ipcMain.handle(DEFINE_STRING.ACTION_AUTO_VIDEO_TASK, async (event, value) => await videoGenerate.ActionAutoVideoTask(value)); + + // 获取设置好的配置 + ipcMain.handle(DEFINE_STRING.GET_VIDEO_GENERATE_CONFIG, async (event) => await videoGenerate.GetVideoGenerateConfig()); + + // 保存合成视频的基础配置 + ipcMain.handle(DEFINE_STRING.SAVE_VIDEO_SRT_AND_AUDIO_MESSAGE, async (event, value) => await videoGenerate.SaveVideoSrtAndAudioMessage(value)); + + // 监听自动和成视频任务 + ipcMain.handle(DEFINE_STRING.AUTO_GENERATION_VIDEO, async (event, value) => await videoGenerate.AutoGeneretionVideo(value)); + + // 获取子文件夹列表 + ipcMain.handle(DEFINE_STRING.GET_SUBFOLDER_LIST, async (event, value) => await videoGenerate.getSubFolderList(value)); +} +export { + VideoGenerateIpc +} \ No newline at end of file diff --git a/src/main/IPCEvent/writingIpc.js b/src/main/IPCEvent/writingIpc.js new file mode 100644 index 0000000..668dc1d --- /dev/null +++ b/src/main/IPCEvent/writingIpc.js @@ -0,0 +1,28 @@ +import { + ipcMain +} from "electron"; +import { DEFINE_STRING } from '../../define/define_string' +import { + Writing +} from '../backPrompt/writing' +let writing = new Writing(global); + +function WritingIpc() { + // 监听分镜时间的保存 + ipcMain.handle(DEFINE_STRING.SAVE_COPYWRITING_INFOMATION, async (event, value) => await writing.SaveCopywritingInformation(value)); + + // 监听获取当前项目下面的分镜文案 + ipcMain.handle(DEFINE_STRING.GET_PROJECT_WORD, async (event, value) => await writing.GetProjectWord()); + + // 获取config配置文件数据 + ipcMain.handle(DEFINE_STRING.GET_CONFIG_JSON, async (event, value) => await writing.GetConfigJson(value)); + + // 将指定的文案txt数组写入到指定的文件中 + ipcMain.handle(DEFINE_STRING.SAVE_WORD_TXT, async (event, value) => await writing.SaveWordTxt(value)); + + // 监听获取字幕时间 + ipcMain.handle(DEFINE_STRING.IMPORT_SRT_AND_GET_TIME, async (event, value) => await writing.ImportSrtAndGetTime(value)) +} +export { + WritingIpc +} diff --git a/src/main/Original/MJOriginalImageGenerate.js b/src/main/Original/MJOriginalImageGenerate.js new file mode 100644 index 0000000..8eecd88 --- /dev/null +++ b/src/main/Original/MJOriginalImageGenerate.js @@ -0,0 +1,287 @@ +import { DEFINE_STRING } from "../../define/define_string"; +import { AsyncQueue } from '../quene' +import { PublicMethod } from '../Public/publicMethod' +import { ImageStyleDefine } from '../../define/iamgeStyleDefine' +import { DiscordSimple } from "../discord/discordSimple"; +import { DiscordWorker } from "../discord/discordWorker"; +import { Tools } from "../tools"; +import path from 'path' +import sharp from 'sharp' +import { define } from "../../define/define"; +import { AwesomeRegx } from "awesome-js"; + +/** + * MJ原创生图的类 + */ +export class MJOriginalImageGenerate { + constructor(global) { + this.global = global; + this.pm = new PublicMethod(global); + this.discordWorker = new DiscordWorker(); + this.tools = new Tools(); + } + + /** + * 下载指定的图片地址并且分割 + * @param {*} value + */ + async DownloadImageUrlAndSplit(value) { + try { + value = JSON.parse(value); + let element = value[0]; + let iamge_url = value[1]; + let image_path = ""; + if (value.length > 2) { + image_path = value[2]; + } else { + image_path = path.join(global.config.project_path, `data\\MJOriginalImage\\${element.id}.png`); + } + // 判断是不是一个链接 + const urlRegex = /^(http|https):\/\/[^ "]+$/; + if (!urlRegex.test(iamge_url)) { + throw new Error("指定的图片地址不是一个链接"); + } + + // 这边开始下载对应的图片 + await this.tools.downloadFileUrl(iamge_url, image_path); + + // 将下载的图片进行分割 + let split_res = await this.ImageSplit(JSON.stringify([image_path, element.name])); + if (split_res.code == 0) { + throw new Error(split_res.message); + } + + element.image_click = iamge_url; + element.subImagePath = split_res.data.subImagePath; + element.outImagePath = split_res.data.outImagePath; + element['image_path'] = image_path + + return { + code: 1, + data: element + } + } catch (error) { + return { + code: 0, + message: "下载指定的图片地址并且分割错误,错误信息如下:" + error.message + } + } + } + + /** + * 获取已经生图完成的数据,并获取图片 + * @param {*} value + * @returns + */ + async GetGeneratedMJImageAndSplit(value) { + try { + value = JSON.parse(value); + let param = []; + // 循环数据,直传需要的数据 + for (let i = 0; i < value.length; i++) { + const element = value[i]; + param.push({ + id: element.id, + image_id: element.mj_message.image_id, + name: element.name, + }); + } + + // 判断窗口是不是开启 + let discordWin = await this.discordWorker.CheckDiscordWindowIsOpenAndLoad(); + // 执行采集图片的脚本 + // 开始写入 + let discordSimple = new DiscordSimple(discordWin); + // 开始执行脚本 + let result = await discordSimple.ExecuteScript(define.discordScript, `GetGeneratedMJImageAndSplit(${JSON.stringify(param)})`); + + let res = []; + result = JSON.parse(result); + // 将返回的数据进行分割 + for (let i = 0; i < result.length; i++) { + const element = result[i]; + let image_path = path.join(global.config.project_path, `data\\MJOriginalImage\\${element.image_id}.png`); + + + let ds = this.DownloadImageUrlAndSplit(JSON.stringify[element, element.result, image_path]); + if (ds.code == 0) { + throw new Error(ds.message); + } + + res.push(ds.data); + } + + // 全部分割完毕,返回 + return { + code: 1, + data: res + } + + } catch (error) { + return { + code: 0, + message: "获取已经生图完成的数据,并获取图片错误,错误信息如下" + error.message + } + } + } + + // MJ生成的图片分割 + async ImageSplit(value) { + try { + value = JSON.parse(value); + let inputPath = value[0]; + let r_name = value[1]; + let outputDir = path.join(this.global.config.project_path, `data\\MJOriginalImage`); + const metadata = await sharp(inputPath).metadata(); + const smallWidth = metadata.width / 2; + const smallHeight = metadata.height / 2; + let times = new Date().getTime(); + let imgs = []; + let first_p = path.join(this.global.config.project_path, `tmp\\output_crop_00001\\${r_name}`); + + for (let i = 0; i < 4; i++) { + const xOffset = i % 2 === 0 ? 0 : smallWidth; + const yOffset = Math.floor(i / 2) * smallHeight; + let out_file = path.join(outputDir, `/${r_name}_${times}_${i}.png`); + await sharp(inputPath) + .extract({ + left: xOffset, + top: yOffset, + width: smallWidth, + height: smallHeight + }) + .resize(smallWidth, smallHeight) + .toFile(out_file); + + imgs.push(out_file); + + // 将第一个图片复制一个到指定的位置 + if (i == 0) { + await this.tools.copyFileOrDirectory(out_file, first_p); + // 复制一份到input + let input_p = path.join(this.global.config.project_path, `tmp\\input_crop\\${r_name}`); + await this.tools.copyFileOrDirectory(out_file, input_p); + } + } + + return { + code: 1, + data: { + subImagePath: imgs, + outImagePath: first_p + } + } + + } catch (err) { + return { + code: 0, + message: "MJ图片切割错误,错误信息如下" + err.message + } + } + + } + + /** + * MJ 原创生图 + * @param {*} value + */ + async OriginalMJImageGenerate(value) { + try { + let data = value[0]; + if (value[1]) { + data = JSON.parse(data); + } + let show_global_message = value[2]; + let batch = DEFINE_STRING.QUEUE_BATCH.MJ_ORIGINAL_GENERATE_IMAGE; + + // 判断存放的文件夹是不是存在,不存在的话创建 + let outputDir = path.join(this.global.config.project_path, `data\\MJOriginalImage`); + + await this.tools.checkFolderExistsOrCreate(outputDir); + + let fileExist = await this.tools.checkExists(outputDir); + if (!fileExist) { + await this.tools.createDirectory(outputDir); + } + + // 检查this.global中是不是又mj队列,没有的话创建一个 + if (!this.global.mjGenerateQuene) { + this.global.mjGenerateQuene = new AsyncQueue(this.global, 1, true); + } + + let style_ids = await this.pm.GetConfigJson(JSON.stringify(["image_style", []]), false); + // let image_styles = await ImageStyleDefine.getImageStyleStringByIds(style_ids.data); + + // 替换风格的逻辑 + let current_task = null; + + for (let i = 0; i < data.length; i++) { + const element = data[i]; + let tasK_id = `${batch}_${element.name}_${element.id}`; + + this.global.mjGenerateQuene.enqueue(async () => { + try { + this.global.mjGenerateQuene.setCurrentCreateItem(element) + // 开始进行mj生图 + let prompt = element.prompt; + current_task = element.name; + // 判断窗口是不是开启 + + let discordW = await this.discordWorker.CheckDiscordWindowIsOpenAndLoad(); + + // 开始写入 + let discordSimple = new DiscordSimple(discordW); + await discordSimple.WritePromptToInput(prompt); + + // 发送命令完成(删除当前正在执行。开始下一个任务) + + } catch (error) { + throw error; + } + + + }, tasK_id, batch); + } + + // 判断该当前正在执行的人物队列数(小于设置的数量,开始一个任务) + this.global.mjGenerateQuene.startNextTask(); + + this.global.requestQuene.setBatchCompletionCallback(batch, (failedTasks) => { + if (failedTasks.length > 0) { + let message = ` + MJ生图任务都已完成。 + 但是以下任务执行失败: + ` + 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 + }) + } else { + if (show_global_message) { + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 1, + message: "所有MJ生图任务完成" + }) + } + } + }); + + + return { + code: 1, + } + + + } catch (error) { + return { + code: 0, + message: "MJ生图错误,错误信息如下" + error.message + } + } + } + +} \ No newline at end of file diff --git a/src/main/Original/OriginalImageGenerate.js b/src/main/Original/OriginalImageGenerate.js new file mode 100644 index 0000000..15f0388 --- /dev/null +++ b/src/main/Original/OriginalImageGenerate.js @@ -0,0 +1,355 @@ + +import { Tools } from "../tools"; +import path from "path"; +import { DEFINE_STRING } from "../../define/define_string"; +import { define } from "../../define/define"; +import { PublicMethod } from "../Public/publicMethod"; +import { SD } from "../Public/SD" +const util = require('util'); +import axios from "axios"; +const sharp = require('sharp'); +const { spawn, exec } = require('child_process'); +const execAsync = util.promisify(exec); +const { v4: uuidv4 } = require('uuid'); // 引入UUID库来生成唯一标识符 +let fspromises = require("fs").promises; +import { MD5 } from "crypto-js"; +import { ImageStyleDefine } from "../../define/iamgeStyleDefine"; + + +export class OriginalImageGenerate { + constructor(global) { + this.global = global; + this.tools = new Tools(); + this.pm = new PublicMethod(global); + this.sd = new SD(global); + } + + + + /** + * SD原创单张图片生成 + * @param {*} value 传入的参数 0 :原创界面的data数据信息,1:是否需要格式化,2:是否需要全局提示 + */ + async OriginalSDImageGenerate(value) { + try { + let data = value[0]; + if (value[1]) { + data = JSON.parse(data); + } + let show_global_message = value[2]; + // 判断输出的文件夹路径是不是存在,不存在创建 + let output_crop_path = path.join(this.global.config.project_path, "tmp/output_crop_1"); + // 检查文件是不是存在 + let isE = await this.tools.checkExists(output_crop_path); + if (!isE) { + output_crop_path = path.join(this.global.config.project_path, "tmp/output_crop_00001"); + } + await this.tools.checkFolderExistsOrCreate(output_crop_path); + let SdOriginalImage = path.join(this.global.config.project_path, 'data/SdOriginalImage'); + await this.tools.checkFolderExistsOrCreate(SdOriginalImage); + + // 获取当前的同用前缀后缀 + let config_json = await this.pm.GetConfigJson(JSON.stringify([null, {}])); + let prefix_prompt = config_json.data.prefix_prompt; + let suffix_prompt = config_json.data.suffix_prompt; + let batch = DEFINE_STRING.QUEUE_BATCH.SD_ORIGINAL_GENERATE_IMAGE; + let url = this.global.config.webui_api_url + 'sdapi/v1/txt2img'; + let sd_setting = JSON.parse(await fspromises.readFile(define.sd_setting, 'utf-8')); + + // 判断当前是不是有开修脸修手 + let ADetailer = { + args: sd_setting.adetailer + }; + let seed = sd_setting.setting.seed; + + let style_ids = await this.pm.GetConfigJson(JSON.stringify(["image_style", []]), false); + let image_styles = await ImageStyleDefine.getImageStyleStringByIds(style_ids.data); + // + console.log(image_styles); + + for (let i = 0; i < data.length; i++) { + const element = data[i]; + let adetailer = element.adetailer; + + let imageJson = JSON.parse(await fspromises.readFile(path.normalize(element.prompt_json), 'utf-8')); + // let prompt = image_styles + sd_setting.webui.prompt + ',' + element.prompt; + // // 添加前缀 + // if (prefix_prompt) { + // prompt = prefix_prompt + ',' + prompt; + // } + // // 添加后缀 + // if (suffix_prompt) { + // prompt = prompt + ',' + suffix_prompt; + // } + let prompt = imageJson.webui_config.prompt; + + + this.global.requestQuene.enqueue(async () => { + try { + // 开始请求 + let body = { + "prompt": prompt, + "negative_prompt": imageJson.webui_config.negative_prompt, + "seed": seed, + "sampler_name": imageJson.webui_config.sampler_name, + // 提示词相关性 + "cfg_scale": sd_setting.webui.cfg_scale, + "width": sd_setting.webui.width, + "height": sd_setting.webui.height, + "batch_size": sd_setting.setting.batch_size, + "n_iter": 1, + "steps": imageJson.webui_config.steps, + "save_images": false, + } + + // 判断是不是开启修脸修手 + if (adetailer) { + let ta = { + ADetailer: ADetailer + } + body.alwayson_scripts = ta; + } + const response = await axios.post(url, body); + let info = JSON.parse(response.data.info); + if (seed == -1) { + seed = info.seed; + } + let images = response.data.images; + let subImagePath = []; + let out_tmp_image_path = path.join(output_crop_path, `tmp_${element.name}`); + let out_image_path = path.join(output_crop_path, `${element.name}`); + + let input_image = path.join(this.global.config.project_path, `tmp/input_crop/${element.name}`); + + for (let j = 0; j < images.length; j++) { + const image = images[j]; + let imageData = Buffer.from(image.split(",", 1)[0], 'base64'); + // 写入数据(写入到当前当前项目文件下面的 data/SdOriginalImage 下面) + let image_path = path.join(this.global.config.project_path, `data/SdOriginalImage/${element.name.split('.')[0]}_${j}.png`); + let tmp_image_path = path.join(this.global.config.project_path, `data/SdOriginalImage/tmp_${element.name.split('.')[0]}_${j}.png`); + subImagePath.push(image_path); + await sharp(imageData) + .toFile(tmp_image_path) + .then(async () => { + // 生图成功,删除数据 + // 判断原本的图片文件是不是存在,存在删除 + await this.tools.deletePngAndDeleteExifData(tmp_image_path, image_path); + }).catch(err => { + throw err; + }); + // console.log("文生图成功" + image_path); + + // 将第一个张写出到指定的文件夹中 + if (j == 0) { + await sharp(imageData) + .toFile(out_tmp_image_path) + .then(async () => { + // 生图成功,删除数据 + await this.tools.deletePngAndDeleteExifData(out_tmp_image_path, out_image_path); + await this.tools.copyFileOrDirectory(out_image_path, input_image); + }) + .catch(err => { + // console.log(err) + throw err; + }); + } + } + // 将图片的信息写入到config.json文件中 + let index = config_json.data.srt_time_information.findIndex(item => item.id == element.id); + if (index < 0) { + throw new Error("没有找到指定的ID,请检查数据"); + } + config_json.data.srt_time_information[index].subImagePath = subImagePath; + config_json.data.srt_time_information[index].outImagePath = out_image_path; + this.global.fileQueue.enqueue(async () => { + await this.pm.SaveConfigJsonProperty([config_json.data.srt_time_information, "srt_time_information", false]); + }); + + // 返回数据,用于前台刷新,返回图片数据 + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SD_ORIGINAL_GENERATE_IMAGE_RETURN, { + code: 1, + id: element.id, + data: { + subImagePath: subImagePath, + outImagePath: out_image_path + } + }); + + + } catch (error) { + throw error; + } + + }, `${batch}_${element.name}`, batch); + } + + this.global.requestQuene.setBatchCompletionCallback(batch, (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 + }) + } else { + if (show_global_message) { + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 1, + message: "所有生图任务完成" + }) + } + } + }); + + + return { + code: 1, + } + + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + + /** + * 自动保存数据到json文件 + * @param {*} value 自动保存数据到json文件 + */ + async AutoSaveDataJson(value) { + try { + // 目前自动保存的信息,中文提示词,英文提示词,前缀,后缀 + value = JSON.parse(value); + for (let i = 0; i < value.length; i++) { + const element = value[i]; + // 将修改文件的的方法添加到修改文件队列中 + this.global.fileQueue.enqueue(async () => { + try { + if (element.prompt_json) { + let old_json = JSON.parse(await fspromises.readFile(path.normalize(element.prompt_json), 'utf-8')); + old_json.webui_config.prompt = element.prompt; + // old_json.adetailer = element.adetailer; + old_json.chinese_prompt = element.chinese_prompt; + // 前缀提示词 + old_json.prefix_prompt = element.prefix_prompt; + // 后缀提示词 + old_json.suffix_prompt = element.suffix_prompt; + old_json.adetailer = element.adetailer; + old_json.prompt = element.prompt; + await fspromises.writeFile(path.normalize(element.prompt_json), JSON.stringify(old_json)); + } + } catch (error) { + throw new Error(error); + } + }); + + // 判断是不是有图片。判断图片是不是符合格式(有些格式是file:// 开头的, 以时间结尾(都要删除)) + // 判断是不是有图片 + let file_regex = /^file:\/\//; + if (element.outImagePath && file_regex.test(element.outImagePath)) { + // 删除 "file://" 开头 + element.outImagePath = decodeURI(element.outImagePath); + element.outImagePath = element.outImagePath.replace(/^file:\/\//, '').replace(/\?time=.*$/, ''); + } + if (element.subImagePath && element.subImagePath.length > 0) { + for (let j = 0; j < element.subImagePath.length; j++) { + if (file_regex.test(element.subImagePath[j])) { + element.subImagePath[j] = decodeURI(element.subImagePath[j]); + element.subImagePath[j] = element.subImagePath[j].replace(/^file:\/\//, '').replace(/\?time=.*$/, ''); + } + } + } + } + + await this.tools.writeJsonFilePropertyValue(path.join(this.global.config.project_path, "scripts/config.json"), "srt_time_information", value, false); + + return { + code: 1 + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + + /** + * 将反推的图片的信息添加到一个json文件中 + */ + async OriginalAddWebuiJson(value) { + try { + let data = JSON.parse(value); + // 判断文件夹是不是存在 + let imput_crop_path = path.join(this.global.config.project_path, "tmp/input_crop"); + let isExist = await this.tools.checkExists(imput_crop_path); + if (!isExist) { + await fspromises.mkdir(imput_crop_path, { recursive: true }) + } + + // 判断当前的数据是不是相同 + // 读取所有txt文件 + let promptJson = await this.tools.getFilesWithExtensions(path.join(global.config.project_path, 'tmp/input_crop'), '.json'); + + // json 已经存在,不做后续处理 + if (data.length == promptJson.length) { + return { + code: 1, + data: path.join(this.global.config.project_path, "tmp/input_crop") + } + } + + let sd_config = JSON.parse(await fspromises.readFile(define.sd_setting, 'utf-8')); + + for (let i = 0; i < data.length; i++) { + const element = data[i]; + let name = String(element.no).padStart(5, '0') + ".png"; + // console.log(txtpath) + let obj = {} + obj.model = sd_config.setting.type; + obj.api = sd_config.setting.webui_api_url + 'sdapi/v1/txt2img'; + obj.name = name; + obj.webui_config = { + sampler_name: sd_config.webui.sampler_name, + 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: path.normalize(path.join(this.global.config.project_path, "tmp/input_crop/" + name)), + } + obj.adetailer = sd_config.webui.adetailer; + + let file_path = path.join(this.global.config.project_path, "tmp/input_crop/" + name + '.json'); + // 写入 + await fspromises.writeFile(file_path, JSON.stringify(obj)); + } + + return { + code: 1, + data: path.join(this.global.config.project_path, "tmp/input_crop") + } + + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + +} \ No newline at end of file diff --git a/src/main/Original/TagCustomize.js b/src/main/Original/TagCustomize.js new file mode 100644 index 0000000..cb37102 --- /dev/null +++ b/src/main/Original/TagCustomize.js @@ -0,0 +1,33 @@ +import { TagDefine } from "../../define/tagDefine"; +export class TagCustomize { + constructor(global) { + this.global = global; + this.tagDefine = new TagDefine(global); + } + + /** + * 获取默认的tag + * @param {*} value + */ + async GetTagDataByTypeAndProperty(value) { + return await this.tagDefine.getTagDataByTypeAndProperty(value[0], value[1]); + } + + /** + * 保存数据到指定的tag中 + * @param {*} value + * @returns + */ + async SaveTagPropertyData(value) { + return await this.tagDefine.saveTagPropertyData(value); + } + + /** + * 删除指定的tag数据 + * @param {*} value + * @returns + */ + async DeleteTagPropertyData(value) { + return await this.tagDefine.deleteTagPropertyData(value); + } +} \ No newline at end of file diff --git a/src/main/Public/GPT.js b/src/main/Public/GPT.js new file mode 100644 index 0000000..cd359a4 --- /dev/null +++ b/src/main/Public/GPT.js @@ -0,0 +1,448 @@ +import axios from "axios"; +import path from "path"; +import { DEFINE_STRING } from "../../define/define_string"; +import { define } from "../../define/define"; +let fspromises = require("fs").promises; +import { gptDefine } from "../../define/gptDefine"; + +export class GPT { + constructor(global) { + this.global = global; + } + + + /** + * 输出测试案例 + * @param {*} value 传入的值(整个数据) + */ + async GenerateGptExampleOut(value) { + try { + + let data = JSON.parse(value); + let message = gptDefine.CustomizeGptPrompt(data); + let content = await this.FetchGpt(message); + console.log(content); + return { + code: 1, + data: content + } + + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * GPT推理提示词的方法 + * @param {*} element 当前推理的句子 + * @param {*} gpt_count 设置的GPT上下文理解数量 + * @param {*} auto_analyze_character 当前的角色数据 + * @returns + */ + async GPTPromptGenerate(element, gpt_count, auto_analyze_character) { + try { + // 获取当前的推理模式 + let gpt_auto_inference = this.global.config.gpt_auto_inference; + let message = null; + if (gpt_auto_inference == "customize") { + // 自定义模式 + // 获取当前自定义的推理提示词 + let customize_gpt_prompt = (await gptDefine.getGptDataByTypeAndProperty("dynamic", "customize_gpt_prompt", [])).data; + let index = customize_gpt_prompt.findIndex(item => item.id == this.global.config.customize_gpt_prompt); + if (this.global.config.customize_gpt_prompt && index < 0) { + throw new Error("自定义推理默认要选择对应的自定义推理词"); + } + message = gptDefine.CustomizeGptPrompt(customize_gpt_prompt[index], element.after_gpt); + message.push({ + "role": "user", + "content": element.after_gpt + }) + } else { + // 内置模式 + // 获取 + let prefix_word = ""; + // 拼接一个word + let i = element.no - 1; + if (i <= gpt_count) { + prefix_word = this.all_data.filter((item, index) => index < i).map(item => item.after_gpt).join('\r\n'); + } else if (i > gpt_count) { + prefix_word = this.all_data.filter((item, index) => i - index <= gpt_count && i - index > 0).map(item => item.after_gpt).join('\r\n'); + } + + let suffix_word = ""; + let o_i = this.all_data.length - i; + if (o_i <= gpt_count) { + suffix_word = this.all_data.filter((item, index) => index > i).map(item => item.after_gpt).join('\r\n'); + } else if (o_i > gpt_count) { + suffix_word = this.all_data.filter((item, index) => index - i <= gpt_count && index - i > 0).map(item => item.after_gpt).join('\r\n'); + } + + let word = `${prefix_word}\r\n${element.after_gpt}\r\n${suffix_word}`; + let single_word = element.after_gpt; + + // 判断当前的格式 + if (["superSinglePrompt", 'onlyPromptMJ'].includes(this.global.config.gpt_auto_inference)) { + // 有返回案例的 + message = gptDefine.GetExamplePromptMessage(this.global.config.gpt_auto_inference); + // 加当前提问的 + message.push({ + "role": "user", + "content": single_word + }) + + } else { + // 直接返回,没有案例的 + message = [ + { + "role": "system", + "content": gptDefine.getSystemContentByType(this.global.config.gpt_auto_inference, { + textContent: word, + characterContent: auto_analyze_character + }) + }, + { + "role": "user", + "content": gptDefine.getUserContentByType(this.global.config.gpt_auto_inference, { + textContent: single_word, + wordCount: this.global.config.gpt_model && this.global.config.gpt_model.includes("gpt-4") ? '20' : '40' + }) + } + ] + } + } + + let res = await this.FetchGpt(message); + return res; + } catch (error) { + throw error; + } + } + + /** + * 将推理提示词添加到任务 + */ + async GPTPrompt(data) { + try { + console.log(data) + let value = JSON.parse(data[0]); + let show_global_message = data[1]; + this.all_data = JSON.parse(data[2]); + // 获取data中的after_gpt,然后使用换行符拼接成一个字符串 + // let word = value.map(item => item.after_gpt).join('\r\n'); + let batch = DEFINE_STRING.QUEUE_BATCH.SD_ORIGINAL_GPT_PROMPT; + + // 获取人物角色数据 + let config_json = JSON.parse(await fspromises.readFile(path.join(this.global.config.project_path, "scripts/config.json"), 'utf-8')); + let auto_analyze_character = config_json.auto_analyze_character; + let gpt_count = this.global.config.gpt_count ? this.global.config.gpt_count : 10; + for (let i = 0; i < value.length; i++) { + const element = value[i]; + this.global.requestQuene.enqueue(async () => { + try { + + let content = await this.GPTPromptGenerate(element, gpt_count, auto_analyze_character); + + if (content) { + content = content.replace(/\)\s*\(/g, ", ").replace(/^\(/, "").replace(/\)$/, "") + } + // 获取对应的数据,将数据返回前端事件 + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.GPT_GENERATE_PROMPT_RETURN, { + id: element.id, + gpt_prompt: content + }) + + this.global.fileQueue.enqueue(async () => { + // 将推理出来的数据写入执行的文件中 + let json_config = JSON.parse(await fspromises.readFile(element.prompt_json, 'utf-8')); + // 写入 + json_config.gpt_prompt = content; + await fspromises.writeFile(element.prompt_json, JSON.stringify(json_config)); + }) + } catch (error) { + throw error; + } + }, `${batch}_${element.id}`, batch); + } + + this.global.requestQuene.setBatchCompletionCallback(batch, (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 + }) + } else { + if (show_global_message) { + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 1, + message: "所有推理任务完成" + }) + } + } + }); + + return { + code: 1, + } + + + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 修改请求的参数 + * @param {*} data + * @returns + */ + ModifyData(gpt_url, data) { + let res = data; + if (gpt_url.includes("dashscope.aliyuncs.com")) { + res = { + "model": data.model, + "input": { + "messages": data.messages, + }, + "parameters": { + "result_format": "message" + } + } + } + return res; + } + + /** + * 获取返回的内容 + * @param {*} gpt_url GPT请求的内容 + * @param {*} res 请求返回的数据 + * @returns + */ + GetResponseContent(gpt_url, res) { + let content = ""; + if (gpt_url.includes("dashscope.aliyuncs.com")) { + content = res.data.output.choices[0].message.content; + } else { + + content = res.data.choices[0].message.content; + } + return content; + } + + /** + * 发送GPT请求 + * @param {*} message 请求的信息 + * @param {*} gpt_url gpt的url,默认在global中取 + * @param {*} gpt_key gpt的key,默认在global中取 + * @param {*} gpt_model gpt的model,默认在global中取 + * @returns + */ + async FetchGpt(message, + gpt_url = this.global.config.gpt_business, + gpt_key = this.global.config.gpt_key, + gpt_model = this.global.config.gpt_model) { + try { + + let data = { + "model": gpt_model, + "messages": message + }; + + data = this.ModifyData(gpt_url, data); + let config = { + method: 'post', + maxBodyLength: Infinity, + url: gpt_url, + headers: { + 'Authorization': `Bearer ${gpt_key}`, + 'Content-Type': 'application/json' + }, + data: JSON.stringify(data) + }; + + let res = await axios.request(config); + let content = this.GetResponseContent(gpt_url, res); + return content; + } catch (error) { + throw error; + } + } + + /** + * 自动分析文本,返回人物场景。角色。 + * @param {要分析的文本} value + * @returns + */ + async AutoAnalyzeCharacter(value) { + try { + let message = [ + { + "role": "system", + "content": gptDefine.getSystemContentByType("character", { textContent: value }) + }, + { + "role": "user", + "content": gptDefine.getUserContentByType("character", {}) + } + ] + let content = await this.FetchGpt(message); + + return { + code: 1, + data: content + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + + /** + * 获取GPT的服务商配置,默认的和自定义的 + * @returns + */ + async GetGPTBusinessOption(value) { + return await gptDefine.getGptDataByTypeAndProperty(value, "gpt_options", []); + } + + /** + * 获取GPT的模型配置,默认的和自定义的 + * @returns + */ + async GetGPTModelOption(value) { + return await gptDefine.getGptDataByTypeAndProperty(value, "gpt_model_options", []); + } + + /** + * 获取GPT的自动推理模式配置,默认的和自定义的 + * @returns + */ + async GetGptAutoInferenceOptions(value) { + return await gptDefine.getGptDataByTypeAndProperty(value, "gpt_auto_inference", []); + } + + /** + * 获取GPT的自动推理模式配置,默认的和自定义的 + * @returns + */ + async GetCustomizeGptPrompt(value) { + return await gptDefine.getGptDataByTypeAndProperty(value, "customize_gpt_prompt", []); + } + + /** + * 保存自定义的GPT服务商配置 + * @param {*} value 配置信息 0 : 传入的数据 1: 属性名称 + * @returns + */ + async SaveDynamicGPTOption(value) { + try { + let res = await gptDefine.saveDynamicGPTOption(value); + return { + code: 1, + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 删除指定Id的自定义GPT服务商配置 + * @param {*} value id 0 : 删除的数据 1: 属性名称 + * @returns + */ + async DeleteDynamicGPTOption(value) { + try { + let res = await gptDefine.deleteDynamicGPTOption(value); + return { + code: 1, + data: res + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * + * @param {Stirng} value 传入的GPT网址和key,判断是不是可以链接成功 + */ + async TestGPTConnection(value) { + try { + value = JSON.parse(value); + let message = [ + { + "role": "system", + "content": "你好" + }, + { + "role": "user", + "content": "你好" + } + ]; + + let content = await this.FetchGpt(message, value.gpt_business, value.gpt_key, value.gpt_model); + return { + code: 1, + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 单句洗稿 + * @param {文案参数} value + */ + async AIModifyOneWord(value) { + try { + + let message = [ + { + "role": "system", + "content": "You are ChatGPT, a large language model trained by OpenAI. Answer as concisely as possible." + }, + { + "role": "user", + "content": `请您扮演一个抖音网文改写专家,我会给你一句文案,请你不要改变文案的结构,不改变原来的意思,仅对文案进行同义转换改写,不要有奇怪的写法,说法通俗一点,不要其他的标点符号,每一小句话之间都是以句号连接,参考抖音网文解说,以下是文案:${value[1]}。` + } + ] + let content = await this.FetchGpt(message); + + return { + code: 1, + data: { no: value[0], content: content } + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + +} \ No newline at end of file diff --git a/src/main/Public/SD.js b/src/main/Public/SD.js new file mode 100644 index 0000000..995ddd3 --- /dev/null +++ b/src/main/Public/SD.js @@ -0,0 +1,274 @@ +import axios from "axios"; +import path from "path"; +import { DEFINE_STRING } from "../../define/define_string"; +import { define } from "../../define/define"; +import { ImageStyleDefine } from "../../define/iamgeStyleDefine"; +import { cloneDeep } from 'lodash'; +let fspromises = require("fs").promises; +const sharp = require('sharp'); +// const { +// createCanvas, +// loadImage +// } = require('canvas'); +import { SdSettingDefine } from "../../define/setting/sdSettingDefine"; +import { PublicMethod } from "./publicMethod"; +import { Tools } from "../tools"; + +export class SD { + constructor(global) { + this.global = global; + this.pm = new PublicMethod(global); + this.tools = new Tools(); + } + + /** + * 获取图片风格菜单 + * @returns 返回图片风格菜单 + * + * */ + async GetImageStyleMenu() { + try { + let style = ImageStyleDefine.getImageStyleMenu(); + return { + code: 1, + data: style + } + } catch (error) { + + } + } + + /** + * 获取指定的ID的风格信息,传入的是一个数组 + * @param {*} value id集合 + */ + async GetImageStyleInfomation(value) { + try { + if (value) { + value = JSON.parse(value); + } else { + value = []; + } + value = value ? value : []; + let style = ImageStyleDefine.getAllSubStyle(); + let tmp = []; + for (let i = 0; i < value.length; i++) { + const element = value[i]; + for (let j = 0; j < style.length; j++) { + const item = style[j]; + if (item.id == element) { + tmp.push(item); + break; + } + } + } + let newSubStyle = cloneDeep(tmp); + for (let i = 0; i < newSubStyle.length; i++) { + const element = newSubStyle[i]; + element.image = path.join(define.image_path, "style/" + element.image); + } + return { + code: 1, + data: newSubStyle + } + + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 获取指定ID的分类的子风格信息 + * @param {*} value ID + * @returns 返回ID对应的子风格的详细信息 + */ + async GetStyleImageSubList(value) { + try { + let subStyle = ImageStyleDefine.getImagePathById(value); + let newSubStyle = cloneDeep(subStyle); + for (let i = 0; i < newSubStyle.length; i++) { + const element = newSubStyle[i]; + element.image = path.join(define.image_path, "style/" + element.image); + } + return { + code: 1, + data: newSubStyle + } + + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 生成一次图片的方法。可以区分模式 + * @param {图片名称 } image + * @param {任务队列信息} task_list 301198499 + */ + async OneImageGeneration(image, task_list, seed = -1) { + let taskPath = path.join(this.global.config.project_path, "scripts/task_list.json") + try { + let imageJson = JSON.parse(await fspromises.readFile(image + '.json', 'utf-8')); + let sd_setting = JSON.parse(await fspromises.readFile(define.sd_setting, 'utf-8')); + let model = imageJson.model; + let image_json = JSON.parse(await fspromises.readFile(image + '.json', 'utf-8')); + let image_path = ""; + let target_image_path = ""; + + if (image_json.name) { + image_path = path.join(this.global.config.project_path, `tmp/${task_list.out_folder}/tmp_${image_json.name}`) + target_image_path = path.join(this.global.config.project_path, `tmp/${task_list.out_folder}/${image_json.name}`) + } else { + image_path = image.replaceAll("input_crop", task_list.out_folder).split(".png")[0] + "_tmp.png"; + target_image_path = image.replaceAll("input_crop", task_list.out_folder); + } + + // let prompt = ""; + // // 拼接提示词 + // if (task_list.image_style != null) { + // prompt += `((${task_list.image_style})),`; + // } + // if (task_list.lora != null) { + // prompt += `${task_list.lora},`; + // } + // let image_styles = await ImageStyleDefine.getImageStyleStringByIds(task_list.image_style_list ? task_list.image_style_list : []); + + // prompt = `${prompt}, ${image_styles}, ${imageJson.webui_config.prompt}`; + let prompt = imageJson.webui_config.prompt; + + // 判断当前是不是有开修脸修手 + let ADetailer = { + args: sd_setting.adetailer + }; + + if (model == "img2img") { + let web_api = this.global.config.webui_api_url + 'sdapi/v1/img2img' + let sd_config = imageJson["webui_config"]; + sd_config.prompt = prompt; + sd_config.seed = seed; + let im = await fspromises.readFile(image, 'binary'); + sd_config.init_images = [new Buffer.from(im, 'binary').toString('base64')]; + + if (imageJson.adetailer) { + let ta = { + ADetailer: ADetailer + } + sd_config.alwayson_scripts = ta; + } + sd_config.height = sd_setting.webui.height; + sd_config.width = sd_setting.webui.width; + + const response = await axios.post(web_api, sd_config); + let info = JSON.parse(response.data.info); + if (seed == -1) { + seed = info.seed; + } + + // 目前是单图出图 + let images = response.data.images; + let imageData = Buffer.from(images[0].split(",", 1)[0], 'base64'); + await sharp(imageData) + .toFile(image_path) + .then(async () => { + // console.log("图生图成功" + image_path); + await this.tools.deletePngAndDeleteExifData(image_path, target_image_path); + }) + .catch(err => { + throw new Error(err); + }); + return seed; + + } else if (model == "txt2img") { + let body = { + "prompt": prompt, + "negative_prompt": imageJson.webui_config.negative_prompt, + "seed": seed, + "sampler_name": imageJson.webui_config.sampler_name, + // 提示词相关性 + "cfg_scale": imageJson.webui_config.cfg_scale, + "width": sd_setting.webui.width, + "height": sd_setting.webui.height, + "batch_size": 1, + "n_iter": 1, + "steps": imageJson.webui_config.steps, + "save_images": false, + } + let web_api = this.global.config.webui_api_url + 'sdapi/v1/txt2img'; + + if (imageJson.adetailer) { + let ta = { + ADetailer: ADetailer + } + body.alwayson_scripts = ta; + } + const response = await axios.post(web_api, body); + let info = JSON.parse(response.data.info); + if (seed == -1) { + seed = info.seed; + } + // 目前是单图出图 + let images = response.data.images; + let imageData = Buffer.from(images[0].split(",", 1)[0], 'base64'); + await sharp(imageData) + .toFile(image_path) + .then(async () => { + // console.log("文生图成功" + image_path); + await this.tools.deletePngAndDeleteExifData(image_path, target_image_path); + }) + .catch(err => { + // console.log(err) + throw new Error(err); + }); + return seed; + } else { + throw new Error("SD 模式错误"); + } + + } catch (error) { + // 当前队列执行失败移除整个批次的任务 + this.global.requestQuene.removeTask(task_list.out_folder, null) + this.global.fileQueue.enqueue(async () => { + // 记录失败状态 + let task_list_json = JSON.parse(await fspromises.readFile(taskPath, 'utf-8')); + // 修改指定的列表的数据 + task_list_json.task_list.map(a => { + if (a.id == task_list.id) { + a.status = "error"; + a.errorMessage = error.toString(); + } + }) + // 写入 + await fspromises.writeFile(taskPath, JSON.stringify(task_list_json)); + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.IMAGE_TASK_STATUS_REFRESH, { + out_folder: task_list.out_folder, + status: "error" + }); + }) + throw error; + } + } + + /** + *文生图 + * @param {SD 请求的地址} url + * @param {SD请求的body} body + */ + async txt2img(url, body) { + + } + + /** + *图生图 + * @param {SD 请求的地址} url + * @param {SD请求的body} body + */ + async img2img(url, body) { + + } +} \ No newline at end of file diff --git a/src/main/Public/Translate.js b/src/main/Public/Translate.js new file mode 100644 index 0000000..efe2235 --- /dev/null +++ b/src/main/Public/Translate.js @@ -0,0 +1,1125 @@ +import { DEFINE_STRING } from "../../define/define_string"; +const tencentcloud = require("tencentcloud-sdk-nodejs") +import { define } from "../../define/define"; +import { MD5 } from "crypto-js"; +import axios from "axios"; +import path from "path"; +import { Tools } from "../tools"; +const alimt20181012 = require('@alicloud/alimt20181012'); +const OpenApi = require('@alicloud/openapi-client'); +const Util = require('@alicloud/tea-util'); +let fspromises = require("fs").promises; + +let { + Signer +} = require('@volcengine/openapi'); + +export class Translate { + constructor(global) { + this.global = global; + this.tools = new Tools(); + } + + /** + * 将当前的翻译任务添加到队列中 + * @param {*} value + * 0 第 0 个参数是要翻译的数据(数组) + * 1 第 1 个参数是源语言 + * 2 第 2 个参数是目标语言 + * 3 第 3 个参数是否分割(默认不分割false) + * 4 第 4 个参数是要不要全局弹窗提示 + * @returns + */ + async TranslateReturnNowTask(value) { + try { + + value = JSON.parse(value); + let data = value[0]; + let to = value[2]; + let batch = DEFINE_STRING.QUEUE_BATCH.TRANSLATE_RETURN_NOW_TASK; + for (let i = 0; i < data.length; i++) { + const element = data[i]; + // 添加任务到队列 + this.global.requestQuene.enqueue(async () => { + try { + let res = await this.TranslateReturnNow([element.gpt_prompt, value[1], to, value[3], value[4]]); + if (res.code != 1) { + throw new Error(res.message); + } + let res_p = null; + + if (!value[3]) { + if (to == "zh") { + res_p = res.data.map(item => item.dst).join(","); + } else { + res_p = res.data.map(item => item.src).join(","); + } + } else { + res_p = res.data; + } + + // 修改chinese_prompt + this.global.fileQueue.enqueue(async () => { + let json_path = path.join(this.global.config.project_path, `tmp/input_crop/${element.name}.json`); + let prompt_json = JSON.parse(await fspromises.readFile(json_path, 'utf-8')); + if (!value[3]) { + prompt_json.gpt_prompt = res_p; + } else { + prompt_json.chinese_prompt = res_p; + } + await fspromises.writeFile(json_path, JSON.stringify(prompt_json)); + }) + + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.TRANSLATE_RETURN_REFRESH, { + code: 1, + to: to, + rowId: element.id, + data: res_p, + }) + + + } catch (error) { + throw error; + } + + }, `${batch}_${element.name}`, batch) + } + // 监听总批次完成 + this.global.requestQuene.setBatchCompletionCallback(batch, (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 + }) + } else { + if (value[4]) { + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 1, + message: "翻译任务完成" + }) + } + } + }) + return { + code: 1, + message: "翻译任务已加入队列任务中" + } + } catch (error) { + return { + code: 0, + message: "翻译任务出错,错误信息: " + error.toString() + } + } + } + + /** + * + * @param {*} value 0:当前要翻译的字符串 + * 1:源语言 + * 2:目标语言 + * 3:是否拆分(以逗号拆分) + * [tags,'zh','en',false] + */ + async TranslateReturnNow(value) { + try { + // 百度翻译 + if (this.global.config.translation_business.includes("baidu")) { + return await this.TranslateReturnNowBaidu(value); + } else if (this.global.config.translation_business.includes("volcengine")) { + // 火山引擎 + return await this.TranslateReturnNowVolcengine(value); + } else if (this.global.config.translation_business.includes("tencent")) { + // 腾讯翻译 + return await this.TranslateReturnNowTencent(value); + } else if (this.global.config.translation_business.includes("aliyun")) { + return await this.TranslateReturnNowAliyun(value); + } + + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 添加翻译任务到队列中 + * @param { + * translateData :要翻译的数据 + * from : 源语言 + * to : 目标语言 + * window.id : 显示的窗体的ID + * isShow : 是不是提示 + * [translateData, from, to, window.id,isShow] + * } value + */ + async TranslatePrompt(value) { + try { + value[0] = JSON.parse(value[0]) + // baidu翻译 + if (this.global.config.translation_business.includes("baidu")) { + return await this.TranslatePromptBaidu(value); + } else if (this.global.config.translation_business.includes("volcengine")) { + // 火山引擎 + return await this.TranslatePromptVolcengine(value); + } else if (this.global.config.translation_business.includes("tencent")) { + // 腾讯翻译 + return await this.TranslatePromptTencent(value); + } else if (this.global.config.translation_business.includes("aliyun")) { + // 阿里云翻译 + return await this.TranslatePromptAliyun(value); + } + + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 阿里云翻译写入队列中 + * @param {*} value + */ + async TranslatePromptAliyun(value) { + try { + let win = this.global.newWindow.filter(item => item.id == value[3])[0]; + if (!win) { + win = this.global.newWindow[0]; + } + let translateData = value[0]; + let from = value[1]; + let to = value[2]; + let batch = DEFINE_STRING.QUEUE_BATCH.TRANSLATE_PROMPT; + + for (let i = 0; i < translateData.length; i++) { + const element = translateData[i]; + this.global.requestQuene.enqueue(async () => { + if (translateData.length > 5) { + await this.tools.delay(2000); + } + let arr_data = []; + if (to == "zh") { + let tmp_data = element.prompt; + arr_data = tmp_data.replaceAll('_', ' ').replaceAll(',', ',').split(","); + arr_data = arr_data.filter(item => item != '' && item != null); + } else if (to == "en") { + for (let j = 0; j < element.chinese_prompt.length; j++) { + const item = element.chinese_prompt[j]; + if (item != "" && item != null) { + arr_data.push(item.dst); + } + } + } + // 如果为空(直接返回) + if (arr_data.length <= 0) { + return; + } + + let req_data = {}; + for (let j = 0; j < arr_data.length; j++) { + const element = arr_data[j]; + req_data[j.toString()] = element; + } + + let config = new OpenApi.Config({ + accessKeyId: this.global.config.translation_app_id, + accessKeySecret: this.global.config.translation_secret, + }); + config.endpoint = `mt.cn-hangzhou.aliyuncs.com`; + + let client = new alimt20181012.default(config); + + let getBatchTranslateRequest = new alimt20181012.GetBatchTranslateRequest({ + apiType: 'translate_standard', + scene: 'general', + sourceLanguage: from, + targetLanguage: to, + formatType: 'text', + sourceText: JSON.stringify(req_data), + }); + let runtime = new Util.RuntimeOptions({}); + + // 复制代码运行请自行打印 API 的返回值 + let res = await client.getBatchTranslateWithOptions(getBatchTranslateRequest, runtime); + console.log(res); + + // 处理返回的数据 + // 检出返回的数据和输入的数据是不是一样的 + let translateList = res.body.translatedList; + if (translateList.length != arr_data.length) { + throw new Error("请求的数据长度和返回的数据长度不一致。请重试"); + } + + let res_data = []; + // { + // "src": "blush", + // "dst": "脸红" + // } + if (to == "zh") { + for (let j = 0; j < arr_data.length; j++) { + const item = arr_data[j]; + let res_tmp = translateList.find(item => item.index == j); + let obj = { + src: item, + dst: res_tmp.translated, + } + res_data.push(obj); + } + } else if (to == 'en') { + for (let j = 0; j < arr_data.length; j++) { + const item = arr_data[j]; + // 获取指定的index的返回数据 + let res_tmp = translateList.find(item => item.index == j); + let obj = { + src: res_tmp.translated, + dst: item + } + res_data.push(obj); + } + } + // 数据返回。写入本地配置文件 + // 修改chinese_prompt + this.global.fileQueue.enqueue(async () => { + let json_path = path.join(this.global.config.project_path, `tmp/input_crop/${element.name}.json`); + let prompt_json = JSON.parse(await fspromises.readFile(json_path, 'utf-8')); + prompt_json.chinese_prompt = res_data; + await fspromises.writeFile(json_path, JSON.stringify(prompt_json)); + }) + win.win.webContents.send(DEFINE_STRING.TRANSLATE_RETURN_REFRESH, { + code: 1, + to: to, + rowId: element.id, + data: res_data, + }) + + }, `${batch}_${element.name}`, batch) + } + // 监听总批次完成 + this.global.requestQuene.setBatchCompletionCallback(batch, (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 + }) + } else { + if (value[4]) { + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 1, + message: "批次翻译任务完成" + }) + } + } + }) + return { + code: 1, + message: "翻译任务已加入队列任务中" + } + + } catch (error) { + throw error; + } + } + + /** + * 阿里云翻译实时返回 + * @param {*} value + */ + async TranslateReturnNowAliyun(value) { + try { + // 判断该当前的翻译API + let from = value[1]; + let to = value[2]; + let ts_d = value[0].replaceAll("_", " ").replaceAll(',', ","); + let req_data = {}; + let req_count = 0; + let req_arr = []; + if (value[3]) { + let tmp_arr = ts_d.split(','); + for (let i = 0; i < tmp_arr.length; i++) { + const element = tmp_arr[i]; + if (element != '' && element != null) { + req_data[i.toString()] = element; + req_arr.push(element); + } + req_count += 1; + } + } else { + req_data["0"] = ts_d; + req_count = 1; + req_arr.push(ts_d); + } + if (req_count <= 0) { + throw new Error("没有传入数据"); + } + + let config = new OpenApi.Config({ + accessKeyId: this.global.config.translation_app_id, + accessKeySecret: this.global.config.translation_secret, + }); + config.endpoint = `mt.cn-hangzhou.aliyuncs.com`; + + let client = new alimt20181012.default(config); + + let getBatchTranslateRequest = new alimt20181012.GetBatchTranslateRequest({ + apiType: 'translate_standard', + scene: 'general', + sourceLanguage: from, + targetLanguage: to, + formatType: 'text', + sourceText: JSON.stringify(req_data), + }); + let runtime = new Util.RuntimeOptions({}); + + // 复制代码运行请自行打印 API 的返回值 + let res = await client.getBatchTranslateWithOptions(getBatchTranslateRequest, runtime); + console.log(res); + + // 处理返回的数据 + // 检出返回的数据和输入的数据是不是一样的 + let translateList = res.body.translatedList; + if (translateList.length != req_count) { + throw new Error("请求的数据长度和返回的数据长度不一致。请重试"); + } + // { + // "src": "blush", + // "dst": "脸红" + // } + // 数据处理 + let res_data = []; + for (let j = 0; j < req_arr.length; j++) { + const item = req_arr[j]; + let res_tmp = translateList.find(item => item.index == j); + if (to == "zh") { + let obj = { + src: item, + dst: res_tmp.translated + } + res_data.push(obj); + } else if (to == "en") { + let obj = { + src: res_tmp.translated, + dst: item + } + res_data.push(obj); + } + } + + // 直接返回数据 + return { + code: 1, + to: to, + data: res_data + } + } catch (error) { + throw error; + } + } + + /** + * 腾讯翻译实时返回 + * @param {*} value + */ + async TranslateReturnNowTencent(value) { + try { + // 判断该当前的翻译API + let from = value[1]; + let to = value[2]; + let ts_d = value[0].replaceAll("_", " ").replaceAll(',', ","); + let req_data = []; + if (value[3]) { + req_data = ts_d.split(','); + } else { + req_data.push(ts_d) + } + req_data = req_data.filter(item => item != "" && item != null); + if (req_data.length <= 0) { + throw new Error("没有传入数据"); + } + const CvmClient = tencentcloud.tmt.v20180321.Client; + const client = new CvmClient({ + credential: { + secretId: this.global.config.translation_app_id, + secretKey: this.global.config.translation_secret + }, + // 产品地域 + region: "ap-shanghai", + // 可选配置实例 + profile: { + signMethod: "TC3-HMAC-SHA256", // 签名方法 + httpProfile: { + reqMethod: "POST", // 请求方法 + reqTimeout: 30, // 请求超时时间,默认60s + }, + }, + }) + + let res = await client.TextTranslateBatch({ + SourceTextList: req_data, + Source: from, + Target: to, + ProjectId: 0 + }); + console.log(res); + + // 处理返回的数据 + // 检出返回的数据和输入的数据是不是一样的 + let translateList = res.TargetTextList; + if (translateList.length != req_data.length) { + throw new Error("请求的数据长度和返回的数据长度不一致。请重试"); + } + // { + // "src": "blush", + // "dst": "脸红" + // } + // 数据处理 + let res_data = []; + for (let j = 0; j < req_data.length; j++) { + const item = req_data[j]; + if (to == "zh") { + let obj = { + src: item, + dst: translateList[j] + } + res_data.push(obj); + } else if (to == "en") { + let obj = { + src: translateList[j], + dst: item + } + res_data.push(obj); + } + } + + // 直接返回数据 + return { + code: 1, + to: to, + data: res_data + } + } catch (error) { + throw error; + } + } + + /** + * 腾讯翻译将翻译的消息写入到队列中 + * @param {*} value + */ + async TranslatePromptTencent(value) { + try { + let win = this.global.newWindow.filter(item => item.id == value[3])[0]; + if (!win) { + win = this.global.newWindow[0]; + } + let translateData = value[0]; + let from = value[1]; + let to = value[2]; + let batch = DEFINE_STRING.QUEUE_BATCH.TRANSLATE_PROMPT; + let secretId = this.global.config.translation_app_id; + let secretKey = this.global.config.translation_secret; + const CvmClient = tencentcloud.tmt.v20180321.Client + const client = new CvmClient({ + credential: { + secretId: secretId, + secretKey: secretKey + }, + region: "ap-shanghai", + profile: { + signMethod: "TC3-HMAC-SHA256", // 签名方法 + httpProfile: { + reqMethod: "POST", // 请求方法 + reqTimeout: 30, // 请求超时时间,默认60s + }, + }, + }) + + for (let i = 0; i < translateData.length; i++) { + const element = translateData[i]; + this.global.requestQuene.enqueue(async () => { + if (translateData.length > 5) { + await this.tools.delay(2000); + } + let arr_data = []; + if (to == "zh") { + let tmp_data = element.prompt; + arr_data = tmp_data.replaceAll('_', ' ').replaceAll(',', ',').split(","); + arr_data = arr_data.filter(item => item != '' && item != null); + } else if (to == "en") { + for (let j = 0; j < element.chinese_prompt.length; j++) { + const item = element.chinese_prompt[j]; + if (item != "" && item != null) { + arr_data.push(item.dst); + } + } + } + // 如果为空(直接返回) + if (arr_data.length <= 0) { + return; + } + // 请求数据 + let req_data = { + Source: from, + Target: to, + SourceTextList: arr_data, + ProjectId: 0 + } + + let res = await client.TextTranslateBatch(req_data); + console.log(res); + + // 处理返回的数据 + // 检出返回的数据和输入的数据是不是一样的 + let translateList = res.TargetTextList; + if (translateList.length != arr_data.length) { + throw new Error("请求的数据长度和返回的数据长度不一致。请重试"); + } + + let res_data = []; + // { + // "src": "blush", + // "dst": "脸红" + // } + if (to == "zh") { + for (let j = 0; j < arr_data.length; j++) { + const item = arr_data[j]; + let obj = { + src: item, + dst: translateList[j] + } + res_data.push(obj); + } + } else if (to == 'en') { + for (let j = 0; j < arr_data.length; j++) { + const item = arr_data[j]; + let obj = { + src: translateList[j], + dst: item + } + res_data.push(obj); + } + } + // 数据返回。写入本地配置文件 + // 修改chinese_prompt + this.global.fileQueue.enqueue(async () => { + let json_path = path.join(this.global.config.project_path, `tmp/input_crop/${element.name}.json`); + let prompt_json = JSON.parse(await fspromises.readFile(json_path, 'utf-8')); + prompt_json.chinese_prompt = res_data; + await fspromises.writeFile(json_path, JSON.stringify(prompt_json)); + }) + win.win.webContents.send(DEFINE_STRING.TRANSLATE_RETURN_REFRESH, { + code: 1, + to: to, + rowId: element.id, + data: res_data, + }) + + }, `${batch}_${element.name}`, batch) + } + // 监听总批次完成 + this.global.requestQuene.setBatchCompletionCallback(batch, (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 + }) + } else { + if (value[4]) { + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 1, + message: "批次翻译任务完成" + }) + } + } + }) + return { + code: 1, + message: "翻译任务已加入队列任务中" + } + + } catch (error) { + throw error; + } + } + + /** + * 火山引擎翻译实时返回 + * @param {*} value + */ + async TranslateReturnNowVolcengine(value) { + try { + // 判断该当前的翻译API + let from = value[1]; + let to = value[2]; + let ts_d = value[0].replaceAll("_", " ").replaceAll(',', ","); + let req_data = []; + if (value[3]) { + req_data = ts_d.split(','); + } else { + req_data.push(ts_d) + } + if (req_data.length <= 0) { + throw new Error("没有传入数据"); + } + let signer = await this.GetVolcengineSinger(); + + let config = { + method: 'post', + maxBodyLength: Infinity, + url: `${this.global.config.translation_business}${signer}`, + headers: { + 'Content-Type': 'application/json' + }, + data: JSON.stringify({ + SourceLanguage: from, + TargetLanguage: to, + TextList: req_data + }) + }; + let res = await axios.request(config); + if (res.status != 200) { + throw new Error("请求错误。请检查网络"); + } + // 判断是不是有返回错误 + if (res.data.ResponseMetadata && res.data.ResponseMetadata.Error) { + let err = res.data.ResponseMetadata.Error; + throw new Error(`错误码: ${err.Code} 错误编号:${err.CodeN} 错误详细信息:${err.Message}`); + } + + // 处理返回的数据 + // 检出返回的数据和输入的数据是不是一样的 + let translateList = res.data.TranslationList; + if (translateList.length != req_data.length) { + throw new Error("请求的数据长度和返回的数据长度不一致。请重试"); + } + // { + // "src": "blush", + // "dst": "脸红" + // } + // 数据处理 + let res_data = []; + for (let j = 0; j < req_data.length; j++) { + const item = req_data[j]; + if (to == "zh") { + let obj = { + src: item, + dst: translateList[j].Translation + } + res_data.push(obj); + } else if (to == "en") { + let obj = { + src: translateList[j].Translation, + dst: item + } + res_data.push(obj); + } + } + + // 直接返回数据 + return { + code: 1, + to: to, + data: res_data + } + } catch (error) { + throw error; + } + } + + /** + * 火山引擎翻译所有数据队列返回 + * @param {*} value + */ + async TranslatePromptVolcengine(value) { + try { + let win = this.global.newWindow.filter(item => item.id == value[3])[0]; + if (!win) { + win = this.global.newWindow[0]; + } + let signer = await this.GetVolcengineSinger(); + let translateData = value[0]; + let from = value[1]; + let to = value[2]; + let batch = DEFINE_STRING.QUEUE_BATCH.TRANSLATE_PROMPT; + for (let i = 0; i < translateData.length; i++) { + const element = translateData[i]; + this.global.requestQuene.enqueue(async () => { + if (translateData.length > 5) { + await this.tools.delay(2000); + } + let arr_data = []; + if (to == "zh") { + let tmp_data = element.prompt; + arr_data = tmp_data.replaceAll('_', ' ').replaceAll(',', ',').split(","); + arr_data = arr_data.filter(item => item != '' && item != null); + } else if (to == "en") { + for (let j = 0; j < element.chinese_prompt.length; j++) { + const item = element.chinese_prompt[j]; + if (item != "" && item != null) { + arr_data.push(item.dst); + } + } + } + // 如果为空(直接返回) + if (arr_data.length <= 0) { + return; + } + // 开始请求 + let req_data = JSON.stringify({ + SourceLanguage: from, + TargetLanguage: to, + TextList: arr_data + }) + let config = { + method: "post", + maxBodyLength: Infinity, + url: `${this.global.config.translation_business}${signer}`, + headers: { + 'Content-Type': 'application/json' + }, + data: req_data + } + let res = await axios.request(config); + console.log(res); + if (res.status != 200) { + throw new Error("请求状态码错误。请检查网络"); + } + + // 判断是不是有返回错误 + if (res.data.ResponseMetadata && res.data.ResponseMetadata.Error) { + let err = res.data.ResponseMetadata.Error; + throw new Error(`错误码: ${err.Code} 错误编号:${err.CodeN} 错误详细信息:${err.Message}`); + } + + // 处理返回的数据 + // 检出返回的数据和输入的数据是不是一样的 + let translateList = res.data.TranslationList; + if (translateList.length != arr_data.length) { + throw new Error("请求的数据长度和返回的数据长度不一致。请重试"); + } + + let res_data = []; + // { + // "src": "blush", + // "dst": "脸红" + // } + if (to == "zh") { + for (let j = 0; j < arr_data.length; j++) { + const item = arr_data[j]; + let obj = { + src: item, + dst: translateList[j].Translation + } + res_data.push(obj); + } + } else if (to == 'en') { + for (let j = 0; j < arr_data.length; j++) { + const item = arr_data[j]; + let obj = { + src: translateList[j].Translation, + dst: item + } + res_data.push(obj); + } + } + // 数据返回。写入本地配置文件 + // 修改chinese_prompt + this.global.fileQueue.enqueue(async () => { + let json_path = path.join(this.global.config.project_path, `tmp/input_crop/${element.name}.json`); + let prompt_json = JSON.parse(await fspromises.readFile(json_path, 'utf-8')); + prompt_json.chinese_prompt = res_data; + await fspromises.writeFile(json_path, JSON.stringify(prompt_json)); + }) + win.win.webContents.send(DEFINE_STRING.TRANSLATE_RETURN_REFRESH, { + code: 1, + to: to, + rowId: element.id, + data: res_data, + }) + + }, `${batch}_${element.name}`, batch) + } + // 监听总批次完成 + this.global.requestQuene.setBatchCompletionCallback(batch, (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 + }) + } else { + if (value[4]) { + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 1, + message: "批次翻译任务完成" + }) + } + } + }) + return { + code: 1, + message: "翻译任务已加入队列任务中" + } + + } catch (error) { + throw error; + } + } + + /** + * 获取火山引擎请求的签名 + */ + async GetVolcengineSinger() { + try { + const openApiRequestData = { + method: "POST", + region: "cn-north-1", + params: { + Action: "TranslateText", + Version: "2020-06-01", + }, + Service: "translate" + } + + const credentials = { + accessKeyId: this.global.config.translation_app_id, + secretKey: this.global.config.translation_secret + } + + const signer = new Signer(openApiRequestData, "translate"); + + // 最终经过加签的 HTTP Query Params + const signedQueryString = signer.getSignUrl(credentials); + console.log(signedQueryString) + return signedQueryString; + + } catch (error) { + throw error; + } + } + + /** + * 百度引擎翻译翻译所有数据 + * @param {} value + * @returns + */ + async TranslatePromptBaidu(value) { + try { + let win = this.global.newWindow.filter(item => item.id == value[3])[0]; + if (!win) { + win = this.global.newWindow[0]; + } + let translateData = value[0]; + let from = value[1]; + let to = value[2]; + let batch = DEFINE_STRING.QUEUE_BATCH.TRANSLATE_PROMPT; + let appId = this.global.config.translation_app_id; + + // 添加一个频次判断是不是演示 + + for (let i = 0; i < translateData.length; i++) { + const element = translateData[i]; + this.global.requestQuene.enqueue(async () => { + try { + if (translateData.length > 5) { + await this.tools.delay(2000); + } + let ts_d = ""; + if (to == "zh") { + ts_d = element.prompt.replaceAll("_", " ").replaceAll(',', ",").replaceAll(',', "\n"); + } else if (to == "en") { + let tmp_arr = []; + // 中文转英文。重新拼接一下 + for (let j = 0; j < element.chinese_prompt.length; j++) { + const item = element.chinese_prompt[j]; + tmp_arr.push(item.dst); + } + ts_d = tmp_arr.join('\n'); + } + let salt = Date.now(); + let sign = MD5(`${this.global.config.translation_app_id}${ts_d}${salt}${this.global.config.translation_secret}`).toString(); + let res = await axios.get(this.global.config.translation_business, { + params: { + q: ts_d, + appid: appId, + salt: salt, + from: from, + to: to, + sign: sign + } + }); + if (res.status != 200) { + throw new Error("请求错误。请检查网络"); + } + // 判断是不是有错误码 + if (res.data.error_code) { + throw new Error(res.data.error_msg); + } + + let res_data = [] + // 将所有的数据协会到本地(然后发送消息到前台界面) + if (res.data.to == "zh") { + res_data = res.data.trans_result + } else { + // 直接在这边处理(前端不用处理) + for (let i = 0; i < res.data.trans_result.length; i++) { + const element = res.data.trans_result[i]; + let obj = { + src: element.dst, + dst: element.src + }; + res_data.push(obj); + } + } + + // 修改chinese_prompt + this.global.fileQueue.enqueue(async () => { + let json_path = path.join(this.global.config.project_path, `tmp/input_crop/${element.name}.json`); + let prompt_json = JSON.parse(await fspromises.readFile(json_path, 'utf-8')); + prompt_json.chinese_prompt = res_data; + await fspromises.writeFile(json_path, JSON.stringify(prompt_json)); + }) + + win.win.webContents.send(DEFINE_STRING.TRANSLATE_RETURN_REFRESH, { + code: 1, + to: to, + rowId: element.id, + data: res_data, + }) + + } catch (error) { + throw error; + } + }, `${batch}_${element.name}`, batch); + + } + // 监听总批次完成 + this.global.requestQuene.setBatchCompletionCallback(batch, (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 + }) + } else { + if (value[4]) { + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 1, + message: "批次翻译任务完成" + }) + } + } + }) + return { + code: 1, + message: "翻译任务已加入队列任务中" + } + } catch (error) { + throw error; + } + } + + /** + * 百度翻译引擎翻译单个数据。立即返回 + * @param {*} value + * @returns + */ + async TranslateReturnNowBaidu(value) { + try { + // 判断该当前的翻译API + let from = value[1]; + let to = value[2]; + let appId = this.global.config.translation_app_id; + let ts_d = value[0].replaceAll("_", " ").replaceAll(',', ","); + if (value[3]) { + ts_d = ts_d.replaceAll(',', "\n"); + } + let salt = Date.now(); + + let sign = MD5(`${this.global.config.translation_app_id}${ts_d}${salt}${this.global.config.translation_secret}`).toString(); + let res = await axios.get(this.global.config.translation_business, { + params: { + q: ts_d, + appid: appId, + salt: salt, + from: from, + to: to, + sign: sign + } + }); + if (res.status != 200) { + throw new Error("请求错误。请检查网络"); + } + // 判断是不是有错误码 + if (res.data.error_code) { + throw new Error(res.data.error_msg); + } + + let res_data = [] + // 将所有的数据协会到本地(然后发送消息到前台界面) + if (res.data.to == "zh") { + res_data = res.data.trans_result + } else { + // 直接在这边处理(前端不用处理) + for (let i = 0; i < res.data.trans_result.length; i++) { + const element = res.data.trans_result[i]; + let obj = { + src: element.dst, + dst: element.src + }; + res_data.push(obj); + } + } + + // 直接返回数据 + return { + code: 1, + to: to, + data: res_data + } + } catch (error) { + throw error; + } + } + +} \ No newline at end of file diff --git a/src/main/Public/clipDraft.js b/src/main/Public/clipDraft.js new file mode 100644 index 0000000..53bdee6 --- /dev/null +++ b/src/main/Public/clipDraft.js @@ -0,0 +1,850 @@ +import { define } from "../../define/define"; +import path from "path"; +import { Tools } from "../tools"; +const { v4: uuidv4 } = require('uuid'); +const fspromises = require("fs").promises; +const mm = require('music-metadata'); +const wavFileInfo = require('wav-file-info'); +let tools = new Tools(); +import { PublicMethod } from './publicMethod' +import { cloneDeep } from "lodash"; +const compressing = require("compressing"); + +export class ClipDraft { + constructor(global, value) { + this.speedId = null; + this.canvasesId = null; + this.soundChannelId = null; + this.vocalSeparationsId = null; + this.materialVideoId = null; + this.tracksSegmentsId = null; + this.trackTypeId = null; + this.materialAnimationsId = null; + this.materialsTextID = null; + this.materialsBeatsID = null; + this.textId = null; + this.friendlyReminderId = null; + this.draft_json = null; + this.one_duration_time = 5000000; + this.text_end_time = 0; + this.iamge_end_time = 0; + this.dubbing_emd_time = 0; + this.draft_duration_time = 0; + this.global = global; + this.value = value; + this.pm = new PublicMethod(global); + } + + async InitData() { + this.draft_name = this.global.config.project_name + '_' + this.value[0]; + let draft_path = path.join(this.global.config.draft_path, this.draft_name); + await fspromises.rm(draft_path, { recursive: true, force: true }); + await compressing.zip.uncompress(define.draft_temp_path, path.join(this.global.config.draft_path, this.global.config.project_name + '_' + this.value[0])); + this.draftPath = path.join(draft_path, "draft_content.json"); + this.image_dir = path.join(this.global.config.project_path, `tmp/${this.value[0]}`); + this.srtPath = this.value[1].srt_path; + this.style_id = this.value[1].draft_srt_style; + this.num = 1; + this.mp3_path = this.value[1].audio_path; + this.friendlyReminderId = this.value[1].friendly_reminder; + this.srt_information = (await this.pm.GetConfigJson(JSON.stringify(["srt_time_information", []]))).data; + } + + /** + * 加载默认的草稿 + * @returns + */ + async LoadDraftJson() { + let draft_json = JSON.parse(await fspromises.readFile(this.draftPath)); + this.draft_json = draft_json; + // console.log(this.draft_json); + } + + /** + * 添加speed + */ + async AddSpeeds() { + // 获取speed的模板地址 + let speed_json = JSON.parse(await fspromises.readFile(define.clip_speed_temp_path)); + // console.log(speed_json) + // 设置ID + let speedID = uuidv4().toUpperCase(); + this.speedId = speedID; + speed_json.id = speedID; + return speed_json; + } + + /** + * 添加Canvases + */ + async AddCanvases() { + let canvases_json = JSON.parse(await fspromises.readFile(define.add_canvases_temp_path)); + // console.log(canvases_json); + // 设置ID + let canvasesId = uuidv4().toUpperCase(); + this.canvasesId = canvasesId; + canvases_json.id = canvasesId; + return canvases_json; + } + + /** + * 添加soundchannel + * @returns + */ + async AddSoundChannelMapping() { + let soundChannelMapping_json = JSON.parse(await fspromises.readFile(define.add_sound_channel_mappings_temp_path)); + // console.log(soundChannelMapping_json) + let sound_channel_mappings_tmp_ID = uuidv4().toUpperCase(); + this.soundChannelId = sound_channel_mappings_tmp_ID; + soundChannelMapping_json.id = sound_channel_mappings_tmp_ID; + return soundChannelMapping_json; + } + + /** + * 添加 vocal_separations + */ + async AddVocalSeparations() { + let vocal_separations_json = JSON.parse(await fspromises.readFile(define.add_vocal_separations_temp_path)); + // console.log(vocal_separations_json); + let vocalSeparationId = uuidv4().toUpperCase(); + this.vocalSeparationsId = vocalSeparationId; + vocal_separations_json.id = vocalSeparationId; + return vocal_separations_json; + } + + /** + * 添加一个文件到原材料地址 + * @param {图片文件地址} imagePath + */ + async AddMaterialVideo(imagePath) { + let materialVideoTmpJson = JSON.parse(await fspromises.readFile(define.add_material_video_temp_path)); + // console.log(materialVideoTmpJson); + let materialId = uuidv4().toUpperCase(); + this.materialVideoId = materialId; + materialVideoTmpJson.id = materialId; + + // 获取输入的图片宽高 + // let image = await Jimp.read(imagePath); + // let width = image.bitmap.width; + // let height = image.bitmap.height; + materialVideoTmpJson.width = 1000; + materialVideoTmpJson.height = 1000; + + materialVideoTmpJson.path = imagePath; + let image_name = path.basename(imagePath); + materialVideoTmpJson.material_name = image_name; + + return materialVideoTmpJson; + } + + /** + * 添加一个轨道 + * @returns + */ + async AddTracksSegments() { + let tracksJson = JSON.parse(await fspromises.readFile(define.add_tracks_segments_temp_path)); + // console.log(tracksJson); + let tracksSegmentsId = uuidv4().toUpperCase(); + tracksJson.id = tracksSegmentsId; + tracksJson.extra_material_refs = []; + tracksJson.extra_material_refs.push(this.speedId); + tracksJson.extra_material_refs.push(this.canvasesId); + tracksJson.extra_material_refs.push(this.soundChannelId); + tracksJson.extra_material_refs.push(this.vocalSeparationsId); + tracksJson.material_id = this.materialVideoId; + tracksJson.target_timerange.start = this.num * tracksJson.target_timerange.duration; + return tracksJson; + } + + /** + * 新建一个track + * @param {track的类型} type + */ + async AddTracks(type) { + let tracks_json = JSON.parse(await fspromises.readFile(define.add_tracks_type_temp_path)); + let track_type_id = uuidv4(); + this.trackTypeId = track_type_id; + tracks_json.id = this.trackTypeId; + tracks_json.type = type; + return tracks_json; + } + + /** + * 添加单个图片到轨道 + */ + async AddOneImageToDraft(image_path) { + // 添加 canvases + let canvanses = await this.AddCanvases(); + this.draft_json.materials.canvases.push(canvanses) + + // 添加 sound_channel_mappings + let sound_channel = await this.AddSoundChannelMapping(); + this.draft_json.materials.sound_channel_mappings.push(sound_channel) + + // 添加 speeds + let speeds = await this.AddSpeeds(); + this.draft_json.materials.speeds.push(speeds); + + // 添加 vocal_separations + let vocal_sep = await this.AddVocalSeparations(); + this.draft_json.materials.vocal_separations.push(vocal_sep); + + // 添加视频 materials 下面的 Videos + let video = await this.AddMaterialVideo(image_path); + this.draft_json.materials.videos.push(video); + + // 添加track轨道 + let segment = await this.AddTracksSegments(); + return segment; + // this.draft_json.tracks.segments.push(segment); + } + + /** + * 将所有的文件全部都写轨道上面 + */ + async AddAllImageToTracks() { + let img_dir = path.normalize(this.image_dir); + let files = await fspromises.readdir(img_dir) + let imageFiles = files.filter(file => /\.(png)$/i.test(file)); + imageFiles.sort(); + imageFiles = imageFiles.map(item => path.join(img_dir, item)) + // console.log(imageFiles); + + // 创建一个tracks + let tracks_json = await this.AddTracks("video"); + //往tracks里面的segments添加图片数据 + for (let i = 0; i < imageFiles.length; i++) { + const image_path = imageFiles[i]; + let segment = await this.AddOneImageToDraft(image_path); + tracks_json.segments.push(segment); + // console.log(tracks_json); + } + + this.draft_json.tracks.push(tracks_json); + // 修改持续时间 + let duration_time = imageFiles.length * this.one_duration_time; + this.iamge_end_time = duration_time; + } + + /** + * 添加materials中的material_animations + */ + async AddMaterialAnimations() { + let material_animations = JSON.parse(await fspromises.readFile(define.add_material_animations_temp_path)); + let material_animations_id = uuidv4(); + this.materialAnimationsId = material_animations_id; + material_animations.id = material_animations_id; + return material_animations; + } + + /** + * 为字幕添加样式 + */ + async AddTextStyle(material_text_json) { + try { + let clip_setting = JSON.parse(await fspromises.readFile(define.clip_setting)); + let text_style = clip_setting.text_style.filter(item => item.id != "0" && item.id != "1"); + + // 添加默认样式 + let c = JSON.parse(material_text_json.content); + let data = JSON.parse(`[{\"size\":7.882736,\"fill\":{\"content\":{\"solid\":{\"color\":[1,1,1]}}},\"range\":[0,5]}]`); + data[0].range = [0, c.text.length]; + c["styles"] = data; + material_text_json.content = JSON.stringify(c); + return material_text_json; + + // 判断是不是添加样式添加样式 + if (this.style_id == "0") { + return material_text_json; + } else if (this.style_id == "1") { + // 随机 + const randomIndex = Math.floor(Math.random() * text_style.length); + this.style_id = text_style[randomIndex].id; + } + let style = text_style.filter(item => item.id == this.style_id)[0]; + let content = JSON.parse(material_text_json.content); + + // 修改范围 + let textstring = content.text; + let length = textstring.length; + style.style[0].range = [0, length]; + + content.styles = style.style; + material_text_json.content = JSON.stringify(content); + let path = style.style[0].font.path; + let id = style.style[0].font.id; + let font_size = style.font_size; + let fonts = style.fonts; + let style_name = style.style_name; + material_text_json.fonts.id = uuidv4(); + material_text_json.font_category_id = id; + material_text_json.fonts.path = path; + material_text_json.fonts.title = fonts; + material_text_json.check_flag = font_size; + material_text_json.title = fonts; + material_text_json.font_size = font_size; + material_text_json.style_name = style_name; + return material_text_json; + } catch (error) { + throw error; + } + } + + /** + * 获得一个单的materialsText + */ + async AddMaterialsText(textString) { + let material_text_json = JSON.parse(await fspromises.readFile(define.add_material_text_temp_path)); + let material_text_id = uuidv4(); + this.materialsTextID = material_text_id; + material_text_json.id = material_text_id; + + // 设置内容 + let content = JSON.parse(material_text_json.content); + content.text = textString; + material_text_json.content = JSON.stringify(content); + + material_text_json = await this.AddTextStyle(material_text_json); + return material_text_json; + } + + async ModifyTextClipTransform(text_segments) { + // console.log(text_segments); + + let clip_setting = JSON.parse(await fspromises.readFile(define.clip_setting)); + let text_style = clip_setting.text_style; + if (text_style.length <= 0) + return text_segments; + let style = text_style.filter(item => item.id == this.style_id)[0]; + text_segments.clip = style.clip; + return text_segments; + + } + + /** + * 添加一个字幕到tracks + * @returns + */ + async AddOneTextToDraft(timeObj) { + try { + + // 添加 materials 中的 material_animations + let material_animattions = await this.AddMaterialAnimations(); + this.draft_json.materials.material_animations.push(material_animattions); + + // 添加 materials 下面的texts + let material_text = await this.AddMaterialsText(timeObj.text); + this.draft_json.materials.texts.push(material_text); + + let text_segments = JSON.parse(await fspromises.readFile(define.add_track_text_segments_temp_path)); + let textId = uuidv4(); + this.textId = textId; + text_segments.id = textId; + text_segments.extra_material_refs = [this.materialAnimationsId]; + text_segments.material_id = this.materialsTextID; + text_segments.target_timerange.start = timeObj.start; + text_segments.target_timerange.duration = timeObj.end - timeObj.start; + + // 修改样式偏移量 + text_segments = await this.ModifyTextClipTransform(text_segments); + + return text_segments; + + } catch (error) { + return { + code: 0, + message: `Error Message ${error}` + } + } + } + + /** + * 添加所有的text到tracks里面 + */ + async AddAllTextToTrack() { + // 添加一个tracks + let new_tracks = await this.AddTracks("text"); + // 计算时间 + let srt_data = (await fspromises.readFile(this.srtPath)).toString("utf-8"); + const entries = srt_data.replace(/\r\n/g, '\n').split('\n\n'); + let data = entries.map(entry => { + const lines = entry.split('\n'); + if (lines.length >= 3) { + const times = lines[1]; + const text = lines.slice(2).join(' '); + const [start, end] = times.split(' --> ').map(time => { + const [hours, minutes, seconds] = time.split(':'); + const [sec, millis] = seconds.split(','); + return ((parseInt(hours) * 3600 + parseInt(minutes) * 60 + parseInt(sec)) * 1000 + parseInt(millis)) * 1000; + }); + return { start, end, text }; + } + }).filter(entry => entry); + + for (let i = 0; i < data.length; i++) { + const text = data[i]; + let text_se = await this.AddOneTextToDraft(text); + // console.log(text_se); + new_tracks.segments.push(text_se); + if (i == data.length - 1) { + this.text_end_time = text.end; + } + } + // console.log(this.draft_json) + this.draft_json.tracks.push(new_tracks); + } + + /** + * 添加 materials下面的 beats + */ + async AddMaterialsBeats() { + let beats_json = JSON.parse(await fspromises.readFile(define.add_materials_beats_tmp_path)); + let materialsBeatsID = uuidv4(); + this.materialsBeatsID = materialsBeatsID; + beats_json.id = materialsBeatsID; + return beats_json; + } + + + async getAudioDuration(filePath) { + const ext = filePath.split('.').pop().toLowerCase(); + + switch (ext) { + case 'mp3': + try { + const metadata = await mm.parseFile(filePath); + return metadata.format.duration; + } catch (error) { + throw new Error(error); + } + + case 'wav': + return new Promise((resolve, reject) => { + wavFileInfo.infoByFilename(filePath, (err, info) => { + if (err) { + reject(err); + } else { + resolve(info.duration); + } + }); + }); + + default: + throw new Error("不支持的文件类型"); + } + } + + /** + * 添加 materials 下面的 audios + */ + async AddMaterialsAudios(musicPath) { + try { + let audios_json = JSON.parse(await fspromises.readFile(define.add_materials_audios_tmp_path)); + let mp3_name = path.basename(musicPath); + let time = await this.getAudioDuration(path.normalize(musicPath)); + let duration_time = time * 1000000; + if (this.audios_duration_time == undefined) { + this.audios_duration_time = duration_time; + } + let audiosID = uuidv4(); + this.materialsAudiosID = audiosID; + audios_json.id = audiosID; + audios_json.name = mp3_name; + audios_json.duration = duration_time; + audios_json.path = musicPath; + console.log(audios_json) + return audios_json; + + } catch (error) { + throw new Error(error); + } + } + + /** + * 添加tracks下面的audios下面的Segments + */ + async AddAudioTracksSegments() { + try { + let audio_segments = JSON.parse(await fspromises.readFile(define.add_tracks_audio_segments_tmp_path)); + let audioId = uuidv4(); + this.tracksAudioId = audioId; + audio_segments.id = audioId; + audio_segments.material_id = this.materialsAudiosID; + audio_segments.extra_material_refs = []; + audio_segments.extra_material_refs.push(this.speedID); + audio_segments.extra_material_refs.push(this.materialsBeatsID); + audio_segments.extra_material_refs.push(this.soundChannelId); + audio_segments.extra_material_refs.push(this.vocalSeparationsId); + audio_segments.source_timerange.duration = this.audios_duration_time; + audio_segments.target_timerange.duration = this.audios_duration_time; + return audio_segments; + } catch (error) { + throw new Error(error); + } + } + + /** + * 添加配音 + */ + async AddDubbingMusic(musicPath) { + // 添加speeds + let speeds = await this.AddSpeeds(); + this.draft_json.materials.speeds.push(speeds); + + // 添加beats + let beats = await this.AddMaterialsBeats(); + this.draft_json.materials.beats.push(beats); + + // 添加 sound_channel_mappings + let sound_channel_mappings = await this.AddSoundChannelMapping(); + this.draft_json.materials.sound_channel_mappings.push(sound_channel_mappings) + + // 添加 materials 下面的 audios + let audios = await this.AddMaterialsAudios(musicPath); + this.draft_json.materials.audios.push(audios); + + // 添加一个track + let tracks_json = await this.AddTracks("audio"); + + let audio_segments_json = await this.AddAudioTracksSegments(); + tracks_json.segments.push(audio_segments_json); + this.draft_json.tracks.push(tracks_json); + } + + /** + * 添加背景音乐 + * @param {背景音乐的ID} background_music_id + */ + async AddRandomBackfroundMusic(background_music_id) { + try { + // 获取背景音乐文件夹 + let clip_setting_json = JSON.parse(await fspromises.readFile(define.clip_setting)); + let setting = clip_setting_json.background_music_setting.filter(item => item.id == background_music_id); + console.log(setting); + let folder_path = setting[0].folder_path; + console.log(folder_path); + let files = await tools.getFilesWithExtensions(folder_path, [".mp3", ".wav"]); + if (files.length == 0) { + throw new Error("背景音乐文件夹下面未存在数据"); + } + // 获取随机的数据 + const randomIndex = Math.floor(Math.random() * files.length); + let musicPath = files[randomIndex]; + + // 添加speeds + let speeds = await this.AddSpeeds(); + this.draft_json.materials.speeds.push(speeds); + + // 添加beats + let beats = await this.AddMaterialsBeats(); + this.draft_json.materials.beats.push(beats); + + // 添加 sound_channel_mappings + let sound_channel_mappings = await this.AddSoundChannelMapping(); + this.draft_json.materials.sound_channel_mappings.push(sound_channel_mappings) + + // 添加 materials 下面的 audios + let audios = await this.AddMaterialsAudios(musicPath); + // audios.duration = this.text_end_time; + this.draft_json.materials.audios.push(audios); + + // 添加一个track + let tracks_json = await this.AddTracks("audio"); + let audio_segments_json = await this.AddAudioTracksSegments(); + // 修改 + audio_segments_json.source_timerange.duration = this.audios_duration_time; + audio_segments_json.target_timerange.duration = this.audios_duration_time; + tracks_json.segments.push(audio_segments_json); + this.draft_json.tracks.push(tracks_json); + + } catch (error) { + throw new Error(error); + } + } + + /** + * 添加温馨提示 + */ + async AddFriendlyReminder() { + // 直接push + try { + + return; + + let friendlyReminder = null; + let friendlyReminderSetting = JSON.parse(await fspromises.readFile(define.clip_setting)).friendly_reminder_setting; + friendlyReminderSetting = friendlyReminderSetting.filter(item => item.id != "0" && item.id != "1"); + if (friendlyReminderSetting.length <= 0) { + return; + } + + if (this.friendlyReminderId == "0") { + return; + } else if (this.friendlyReminderId == "1") { + // 获取随机的数据 + const randomIndex = Math.floor(Math.random() * friendlyReminderSetting.length); + friendlyReminder = friendlyReminderSetting[randomIndex]; + } else { + friendlyReminder = friendlyReminderSetting.filter(item => item.id == this.friendlyReminderId); + } + + // 添加 materials 下面的 material_animations + this.draft_json.materials.material_animations.push(friendlyReminder.material_animations); + // 添加 materials下面的texts + this.draft_json.materials.texts.push(friendlyReminder.texts); + // 添加 tracks + let track = friendlyReminder.tracks; + // 修改持续时间 + track.segments[0].target_timerange.duration = this.audios_duration_time; + this.draft_json.tracks.push(track); + } catch (error) { + throw new Error(error); + } + } + + /** + * 修改草稿的持续时间 + */ + async ModifyDurationTime() { + + let max_time = Math.max(this.iamge_end_time, this.text_end_time, this.audios_duration_time); + this.draft_json.duration = max_time; + this.draft_json.canvas_config.height = 1440; + this.draft_json.canvas_config.width = 1920; + this.draft_json.canvas_config.ratio = "4:3"; + } + + /** + * 将文件写道指定的位置 + */ + async WriteDraftFile() { + await fspromises.writeFile(this.draftPath, JSON.stringify(this.draft_json)); + } + + async find_draft_node(nodes, type, value) { + for (let index = 0; index < nodes.length; index++) { + let node = nodes[index]; + if (node[type] == value) { + return node + } + } + } + + /** + * 将草稿图片和文字对齐 + */ + async AlginDraftImgToText() { + // 所有的字幕轨道里面的数据,读取出来 + let img_nodes = (await this.find_draft_node(this.draft_json.tracks, "type", "video")).segments; + + //将最后一个数据修改为背景音乐的最后时间 + this.srt_information[this.srt_information.length - 1].end_time = this.audios_duration_time / 1000; + + // 开始对齐 + for (let i = 0; i < this.srt_information.length; i++) { + if (img_nodes.length < i) { + break; + } + const element = this.srt_information[i]; + let duration = 0; + if (i + 1 < this.srt_information.length) { + duration = (this.srt_information[i + 1].start_time - element.start_time - 1) * 1000; + } else { + duration = (element.end_time - element.start_time) * 1000; + } + img_nodes[i].source_timerange.duration = duration; + img_nodes[i].target_timerange.duration = duration; + img_nodes[i].target_timerange.start = element.start_time * 1000; + } + } + + /** + * 通过 key_frame 返回关键帧数据 + * @param {*} key_frame 关键帧配置 + */ + async GetFrameData(key_frame) { + if (key_frame.key_frame == "KFTypePositionY") { + return key_frame.up_down_key_frame; + } else if (key_frame.key_frame == "KFTypePositionX") { + return key_frame.left_right_key_frame; + } else if (key_frame.key_frame == "KFTypeScale") { + return key_frame.scale_key_frame; + } else { + return { + "default_scale": 100, + "start_position": 0, + "end_position": 0 + } + } + } + + /** + * 图片添加关键帧 + */ + async AddKeyFarme() { + let img_nodes = (await this.find_draft_node(this.draft_json.tracks, "type", "video")).segments; + let key_frame_tmp_data = JSON.parse(await fspromises.readFile(define.add_keyframe_tmp_path, "utf-8")); + // 添加关键帧 + // 将最后一个数据修改为背景音乐的最后时间 + this.srt_information[this.srt_information.length - 1].end_time = this.audios_duration_time / 1000; + + let key_frame_setting = await tools.getJsonFilePropertyValue(define.clip_setting, "key_frame", null, false); + // 判断关键帧配置是不是存在。不存在直接结束 + if (key_frame_setting == null) { + return; + } + let key_frame_pos = await this.GetFrameData(key_frame_setting); + let isFixedSpeed = key_frame_setting.isFixedSpeed; + let key_frame_time = key_frame_setting.key_frame_time * 1000000; + let isDown = true; + let scale_rate = key_frame_pos.default_scale / 100; + + // 获取通用的关键帧配置,然后添加到每一个图片上面(可以设置时间。当前图片的持续实现小于设置的时间。会计算不要过快) + for (let i = 0; i < img_nodes.length; i++) { + let element = img_nodes[i]; + let image_duartion = cloneDeep(element.source_timerange.duration); + + let up_pos = Math.abs(key_frame_pos.start_position); + let down_pos = Math.abs(key_frame_pos.end_position); + + if (key_frame_setting.key_frame == "KFTypePositionY") { + + + // 勾选了匀速。需要计算时间(计算比例) + + if (isFixedSpeed && image_duartion < key_frame_time) { + let time_rate = image_duartion / key_frame_time; + up_pos = up_pos * time_rate; + down_pos = down_pos * time_rate; + } + let key_frame_tmp = cloneDeep(key_frame_tmp_data) + let up_pos_rate = isDown ? (up_pos / this.draft_json.canvas_config.height) : (0 - up_pos / this.draft_json.canvas_config.height) + key_frame_tmp.id = uuidv4(); + key_frame_tmp.keyframe_list[0].id == uuidv4(); + key_frame_tmp.keyframe_list[0].values = [up_pos_rate]; + + let dow_pos_rate = isDown ? (0 - down_pos / this.draft_json.canvas_config.height) : (down_pos / this.draft_json.canvas_config.height) + key_frame_tmp.keyframe_list[1].id = uuidv4(); + key_frame_tmp.keyframe_list[1].time_offset = image_duartion; + key_frame_tmp.keyframe_list[1].values = [dow_pos_rate]; + + key_frame_tmp.property_type = key_frame_setting.key_frame; + + // 修改缩放倍率 + element.clip.scale.x = scale_rate; + element.clip.scale.y = scale_rate; + element.clip.transform.y = dow_pos_rate; + isDown = !isDown; + element.common_keyframes.push(key_frame_tmp); + } else if (key_frame_setting.key_frame == "KFTypePositionX") { + // 勾选了匀速。需要计算时间(计算比例) + if (isFixedSpeed && image_duartion < key_frame_time) { + let time_rate = image_duartion / key_frame_time; + up_pos = up_pos * time_rate; + down_pos = down_pos * time_rate; + } + let key_frame_tmp = cloneDeep(key_frame_tmp_data) + let up_pos_rate = isDown ? (up_pos / this.draft_json.canvas_config.width) : (0 - up_pos / this.draft_json.canvas_config.width) + key_frame_tmp.id = uuidv4(); + key_frame_tmp.keyframe_list[0].id == uuidv4(); + key_frame_tmp.keyframe_list[0].values = [up_pos_rate]; + + let dow_pos_rate = isDown ? (0 - down_pos / this.draft_json.canvas_config.width) : (down_pos / this.draft_json.canvas_config.width) + key_frame_tmp.keyframe_list[1].id = uuidv4(); + key_frame_tmp.keyframe_list[1].time_offset = image_duartion; + key_frame_tmp.keyframe_list[1].values = [dow_pos_rate]; + + key_frame_tmp.property_type = key_frame_setting.key_frame; + + // 修改缩放倍率 + element.clip.scale.x = scale_rate; + element.clip.scale.y = scale_rate; + element.clip.transform.x = dow_pos_rate; + isDown = !isDown; + element.common_keyframes.push(key_frame_tmp); + } + else if (key_frame_setting.key_frame == "KFTypeScale") { + if (isFixedSpeed && image_duartion < key_frame_time) { + let time_rate = image_duartion / key_frame_time; + // 计算方式和上面的不同 + 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; + } + + // 修改上面的数据,添加Y轴缩放 + let key_frame_tmp = cloneDeep(key_frame_tmp_data) + let up_pos_rate = isDown ? up_pos / 100 : down_pos / 100; + key_frame_tmp.id = uuidv4(); + key_frame_tmp.keyframe_list[0].id == uuidv4(); + key_frame_tmp.keyframe_list[0].values = [up_pos_rate]; + + let dow_pos_rate = isDown ? down_pos / 100 : up_pos / 100; + key_frame_tmp.keyframe_list[1].id = uuidv4(); + key_frame_tmp.keyframe_list[1].time_offset = image_duartion; + key_frame_tmp.keyframe_list[1].values = [dow_pos_rate]; + + key_frame_tmp.property_type = key_frame_setting.key_frame + "X"; + + // 修改上面的数据,添加Y轴缩放 + // 修改缩放倍率 + element.clip.scale.x = isDown ? up_pos : dow_pos_rate; + element.clip.scale.y = isDown ? up_pos : dow_pos_rate; + element.clip.transform.x = 0; + element.common_keyframes.push(key_frame_tmp); + + key_frame_tmp = cloneDeep(key_frame_tmp) + key_frame_tmp.id = uuidv4(); + key_frame_tmp.keyframe_list[0].id == uuidv4(); + key_frame_tmp.keyframe_list[1].id = uuidv4(); + key_frame_tmp.property_type = key_frame_setting.key_frame + "Y"; + element.common_keyframes.push(key_frame_tmp); + + isDown = !isDown; + } + } + } + + + + /** + * 添加草稿 + */ + async addDraft() { + try { + await this.InitData(); + await this.LoadDraftJson(); + await this.AddAllImageToTracks(); + await this.AddAllTextToTrack(); + await this.AddDubbingMusic(path.normalize(this.value[1].audio_path)); + if (this.value[1].background_music != "" && this.value[1].background_music != undefined && this.value[1].background_music != null) { + await this.AddRandomBackfroundMusic(this.value[1].background_music); + } + + // 添加温馨提示 + // await this.AddFriendlyReminder(); + + + await this.ModifyDurationTime(); + + // 对齐草稿数据 + await this.AlginDraftImgToText(); + + // 添加关键帧 + await this.AddKeyFarme(); + + await this.WriteDraftFile(); + return { + code: 1, + draft_name: this.draft_name + } + } catch (error) { + return { + code: 0, + message: `An error occurred: ${error}` + } + } + } + +} \ No newline at end of file diff --git a/src/main/Public/publicMethod.js b/src/main/Public/publicMethod.js new file mode 100644 index 0000000..29d0220 --- /dev/null +++ b/src/main/Public/publicMethod.js @@ -0,0 +1,335 @@ +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(); + } + + /** + * 修改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 {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 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; + }) + } + + + /** + * 高清指定的文件夹 + * @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; + } + } + + /** + * 生成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'); + + // 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; + } + } + + /** + * 获取当前项目的生图任务列表 + */ + 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) { + 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; + } + } +} \ No newline at end of file diff --git a/src/main/backPrompt/imageGenerate.js b/src/main/backPrompt/imageGenerate.js new file mode 100644 index 0000000..1571cce --- /dev/null +++ b/src/main/backPrompt/imageGenerate.js @@ -0,0 +1,493 @@ + +import { Tools } from "../tools"; +import path from "path"; +import { DEFINE_STRING } from "../../define/define_string"; +import { define } from "../../define/define"; +import { PublicMethod } from "../Public/publicMethod"; +import { SD } from "../Public/SD" +const util = require('util'); +const { spawn, exec } = require('child_process'); +import axios from "axios"; +const sharp = require('sharp'); +const execAsync = util.promisify(exec); +const { v4: uuidv4 } = require('uuid'); // 引入UUID库来生成唯一标识符 +let fspromises = require("fs").promises; +import { MD5 } from "crypto-js"; +import { ImageSetting } from "../../define/setting/imageSetting"; + + +export class ImageGenerate { + constructor(global) { + this.global = global; + this.tools = new Tools(); + this.pm = new PublicMethod(global); + this.sd = new SD(global); + } + + /** + * 获取指定名称的提示词json文件数据 + * @param {*} value + */ + async GetPromptJson(value) { + try { + let json_path = path.join(this.global.config.project_path, "tmp/input_crop/" + value + ".json"); + let isExist = await this.tools.checkExists(json_path); + if (!isExist) { + throw new Error("提示词文件不存在"); + } + let res = JSON.parse(await fspromises.readFile(json_path, 'utf-8')); + return { + value: 1, + data: res + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 修改指定任务队列的状态 + * @param {*} value 0 使用什么查找(id。out_folder,) 1查找的值 2 状态值 + * @returns + */ + async ModifyGenerateTaskStatus(value) { + try { + await this.pm.ModifyTaskStatus(value[0], value[1], value[2]); + return { + code: 1 + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + + + /** + * 修改本地的参数 + * @param {修改json的参数} value + */ + async ModifyInpurCropJson(value) { + try { + value = JSON.parse(value); + let prompt = value.prompt; + // 重绘幅度 + let denoising_strength = value.denoising_strength; + let json_path = path.join(path.join(global.config.project_path, 'tmp/input_crop'), value.name + ".json"); + let old_json = JSON.parse(await fspromises.readFile(json_path, 'utf-8')); + old_json.webui_config.prompt = prompt; + old_json.webui_config.denoising_strength = denoising_strength; + old_json.model = value.model; + old_json.adetailer = value.adetailer; + old_json.chinese_prompt = value.chinese_prompt; + + if (value.modify_old) { + old_json.webui_config.init_images = value.modify_old; + } + + await fspromises.writeFile(json_path, JSON.stringify(old_json)); + return { + code: 1 + } + } catch (error) { + throw new Error(error); + } + } + + /** + * 返回文件夹里的所有的图片,以及其他信息 + * @param {图片文件夹} value + * @returns + */ + async getFolderImageList(mainWindow, value, isReturn) { + try { + let img_dir = path.normalize(value); + let base_name = path.basename(img_dir); + let tmp = path.dirname(img_dir); + let input_path = path.join(tmp, "input_crop") + // console.log(tmp, input_path) + let files = await fspromises.readdir(img_dir) + let imageFiles = files.filter(file => /\.(png)$/i.test(file)); + imageFiles.sort(); + + let res = []; + let task_list_json = JSON.parse(await fspromises.readFile(path.join(this.global.config.project_path, 'scripts/task_list.json'), 'utf-8')); + // 处理数据 + for (let i = 0; i < imageFiles.length; i++) { + const img = imageFiles[i]; + let imput_path = path.join(input_path, img); + let img_json = path.join(input_path, img + '.json'); + // 判断文件是不是存在 + let prompt_json = JSON.parse(await fspromises.readFile(img_json)); + + let output_list = await this.pm.getSubFolderList(path.join(this.global.config.project_path, "tmp"), 'start', 'output_crop'); + let output_image_list = []; + for (let i = 0; i < output_list.length; i++) { + const item = output_list[i]; + // 找到找到文件对应的任务列表的样式和lora + let task_list = task_list_json.task_list.filter(a => a.out_folder == item); + let output_1 = path.join(tmp, item); + let obj = { + id: uuidv4(), + img_path: path.join(output_1, img), + image_style: task_list[0].image_style, + lora: task_list[0].lora + } + output_image_list.push(obj); + + } + let main_task_list = task_list_json.task_list.filter(a => a.out_folder == base_name); + let obj = { + name: img, + id: uuidv4(), + sampler_name: prompt_json.webui_config.sampler_name, + prompt: prompt_json.webui_config.prompt, + chinese_prompt: prompt_json.chinese_prompt, + negative_prompt: prompt_json.webui_config.negative_prompt, + denoising_strength: prompt_json.webui_config.denoising_strength, + seed: prompt_json.webui_config.seed, + image: path.join(img_dir, img), + oldImage: prompt_json.webui_config.init_images, + output_list: output_image_list, + model: prompt_json.model, + image_style: main_task_list[0].image_style, + lora: main_task_list[0].lora, + image_style_list: main_task_list[0].image_style_list, + adetailer: prompt_json.adetailer, + width: prompt_json.webui_config.width, + height: prompt_json.webui_config.height + } + res.push(obj) + // 获取提示词 + } + if (isReturn) { + return { + code: 1, + windowID: mainWindow.id, + value: res + } + } else { + mainWindow.webContents.send(DEFINE_STRING.RETURN_IMAGE_PROMPT, { + code: 1, + windowID: mainWindow.id, + value: res + }) + } + } catch (error) { + return { + code: 0, + message: `Error message ${error.toString()}` + } + } + } + + /** + * 将反推的图片的信息添加到一个json文件中 + */ + async AddWebuiJson() { + try { + return await this.pm.AddWebuiJson(); + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 修改任务队列数据 + * @param {替换后的值} value + */ + async ModifyImageTaskList(value) { + try { + let res = await this.pm.ModifyImageTaskList(value); + if (res) { + return { + code: 1, + message: "替换成功" + } + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 获取生成图片的任务队列(可以添加部分判断) + */ + async GetGenerateTaskList() { + try { + return await this.pm.GetImageTask() + } catch (error) { + return { + code: 0, + message: error.message + } + } + } + + /** + * 生成任务中的队列 + * @param {传入所有执行生图队列的任务} value + */ + async GenerateImageInSelectTask(value) { + try { + let batch = DEFINE_STRING.QUEUE_BATCH.SD_BACKSTEP_GENERATE_IMAGE + let taskPath = path.join(this.global.config.project_path, 'scripts/task_list.json'); + let task_list_json = JSON.parse(await fspromises.readFile(taskPath, 'utf-8')); + let auto_save_image = await this.tools.getJsonFilePropertyValue(define.img_base, "auto_save_image", {}, false); + let png_files = []; + // 读取队列中的任务,然后添加队列 + for (let i = 0; i < value.length; i++) { + const element = value[i]; + let task_list = task_list_json.task_list.filter(item => item.id == element)[0]; + let seed = -1; + let images = await this.tools.getFilesWithExtensions(path.join(this.global.config.project_path, 'tmp/input_crop'), '.png'); + await fspromises.mkdir(path.join(this.global.config.project_path, 'tmp/' + task_list.out_folder), { recursive: true }); + if (images.length <= 0) { + throw new Error("未检测到抽帧图片。请检查"); + } + if (images.length > auto_save_image.save_match_count) { + png_files = await this.tools.getFilesWithExtensions(auto_save_image.main_save_folder, '.png'); + } + this.global.requestQuene.enqueue(async () => { + let res = await this.sd.OneImageGeneration(images[0], task_list, seed); + let tmp_seed = -1; + if (seed == -1) { + tmp_seed = res; + } + for (let j = 1; j < images.length; j++) { + const item = images[j]; + + let has_permission = false; + // 判断权限 + let permission = this.global.permission; + + if (permission && permission.length >= 0) { + if (permission.indexOf(DEFINE_STRING.PERMISSIONS.AUTO_SAVE_IMAGE_PERMISSION) >= 0) { + has_permission = true; + } + } else { + has_permission = true; + } + + if (auto_save_image.save_match_count && j >= auto_save_image.save_match_count && has_permission && auto_save_image.auto_match) { + // 现在随机匹配视频 + // 获取指定的文件夹中的图片 + let randomData = png_files[Math.floor(Math.random() * png_files.length)]; + let base_name = path.basename(item); + let copy_path = path.join(this.global.config.project_path, 'tmp/' + task_list.out_folder, base_name); + await this.tools.copyFileOrDirectory(randomData, copy_path); + } else { + this.global.requestQuene.enqueue(async () => { + await this.sd.OneImageGeneration(item, task_list, tmp_seed); + }, `${task_list.out_folder}_${images[j]}`, batch, task_list.out_folder) + } + } + + }, `${task_list.out_folder}_${images[0]}`, batch, task_list.out_folder) + // } + task_list.status = 'queue'; + + // 开始批次执行(全部刷新) + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.IMAGE_TASK_STATUS_REFRESH, task_list); + + // 判断是不是还有批次执行的任务 + // 监听子批次完成(修改当前批次的状态) + this.global.requestQuene.setSubBatchCompletionCallback(batch, task_list.out_folder, async (failedTasks) => { + console.log(failedTasks) + if (failedTasks.length > 0) { + + } else { + // 判断是不是有错误。没有错误的话。直接修改状态。有错误直接记录错误(写入一个就行) + task_list_json = JSON.parse(await fspromises.readFile(taskPath, 'utf-8')); + // 全部执行完毕之后,修改 + task_list_json.task_list.map(a => { + if (a.out_folder == task_list.out_folder) { + a.status = "ok"; + } + }) + // 写入 + await fspromises.writeFile(taskPath, JSON.stringify(task_list_json)); + + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.IMAGE_TASK_STATUS_REFRESH, { + out_folder: task_list.out_folder, + status: "ok" + }); + + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, { + out_folder: task_list.out_folder, + status: "ok" + }) + } + }) + } + + // 监听总批次完成 + this.global.requestQuene.setBatchCompletionCallback(batch, (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 + }) + } else { + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 1, + message: "所有生成任务完成" + }) + } + }) + // 写回 + await fspromises.writeFile(taskPath, JSON.stringify(task_list_json)); + return { + code: 1, + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 批量高清文件夹 + * @param {项目下面的文件夹的值} value + */ + async ImproveResolution(value) { + try { + let batch = DEFINE_STRING.QUEUE_BATCH.LOCAL_IMAGE_IMPROVE; + + // 加入队列 + for (let i = 0; i < value.length; i++) { + const folder = value[i]; + this.global.requestQuene.enqueue(async () => { + await this.pm.ImproveFolder(folder); + }, folder, batch) + + // 添加队列后修改状态 + await this.pm.ModifyTaskStatus('out_folder', folder, "video_improving"); + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, { + out_folder: folder, + status: "video_improving" + }) + } + + global.requestQuene.setBatchCompletionCallback(batch, async (failedTasks) => { + + let permission = this.global.permission; + // 判断权限 + if (permission && permission.length >= 0) { + if (permission.indexOf(DEFINE_STRING.PERMISSIONS.AUTO_SAVE_IMAGE_PERMISSION) >= 0) { + // 在高清前,先将要高清的图片保存 + let res = await ImageSetting.SaveImageToOtherFolder(value, null); + if (res.code == 0) { + return res; + } + } + } else { + // 在高清前,先将要高清的图片保存 + let res = await ImageSetting.SaveImageToOtherFolder(value, null); + if (res.code == 0) { + return res; + } + } + + + 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 + }) + } else { + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 1, + message: "所有任务高清完成" + }) + } + }) + return { + code: 1 + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 下载文件到指定位置 + * @param {*} value 0: 源图片地址 1: 类型 2: 目标文件地址 + */ + async DownloadImageFile(value) { + try { + let type = value[1]; + let img_file = value[0]; + let target_file = value[2]; + if (type == "cover") { + // 下载封面 + // 判断封面是不是存在 + let cover_path = path.join(this.global.config.project_path, 'data/封面'); + let isExist = await this.tools.checkExists(cover_path); + if (!isExist) { + await fspromises.mkdir(cover_path, { recursive: true }); + } + // 复制 + await fspromises.copyFile(img_file, path.join(cover_path, Date.now() + '.png')); + return { + code: 1, + message: "保存成功!" + } + } else if (type == "replace") { + if (!target_file) { + throw new Error("目标文件地址不存在"); + } + await fspromises.copyFile(path.normalize(decodeURIComponent(img_file)), path.normalize(decodeURIComponent(target_file))); + await this.tools.copyFileOrDirectory(decodeURIComponent(img_file), decodeURIComponent(target_file).replace("output_crop_1", "input_crop")); + return { + code: 1, + } + } + + else { + return { + code: 0, + message: "参数错误" + } + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } +} \ No newline at end of file diff --git a/src/main/backPrompt/videoGenerate.js b/src/main/backPrompt/videoGenerate.js new file mode 100644 index 0000000..a1be12a --- /dev/null +++ b/src/main/backPrompt/videoGenerate.js @@ -0,0 +1,556 @@ +import path from "path"; +import { define } from "../../define/define"; +import { Tools } from "../tools"; +import { PublicMethod } from "../Public/publicMethod"; +import { func } from '../func' +import { DEFINE_STRING } from "../../define/define_string"; +const util = require('util'); +const { spawn, exec } = require('child_process'); +const execAsync = util.promisify(exec); +const fspromises = require("fs").promises; +import { SD } from "../Public/SD" + +export class VideoGenerate { + constructor(global) { + this.global = global; + this.tools = new Tools(); + this.pm = new PublicMethod(global); + this.sd = new SD(global); + } + + /** + * 获取之前的基础配置 + */ + async GetVideoGenerateConfig() { + try { + let res = await this.tools.getJsonFilePropertyValue(path.join(this.global.config.project_path, "scripts/config.json"), "video_config", {}, false); + return { + code: 1, + data: res + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 保存合成视频的基础信息(Srt,audio,background) + * @param {*} value 保存合成视频的基础信息(Srt,audio,background) + */ + async SaveVideoSrtAndAudioMessage(value) { + try { + value = JSON.parse(value); + await this.tools.writeJsonFilePropertyValue(path.join(this.global.config.project_path, "scripts/config.json"), "video_config", value); + return { + code: 1 + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + *全自动合成视频的任务(出图、高清、合成视频) + * @param {传入的需要执行的task_list的任务} value + */ + async ActionAutoVideoTask(value) { + try { + // 开始添加队列任务 + // 生图 + // 将当前的所有任务添加到队列中 + await this.pm.AddWebuiJson(); + let batch = DEFINE_STRING.QUEUE_BATCH.AUTO_VIDEO_GENERATE; + let taskPath = path.join(this.global.config.project_path, "scripts/task_list.json"); + + // // 修改数据(保存srt字幕文件位置。配音文件位置。背景音乐文件) + // this.global.fileQueue.enqueue(async () => { + // let config_json = JSON.parse(await fspromises.readFile(path.join(this.global.config.project_path, "scripts/config.json"), 'utf-8')); + // config_json.srt_path = value[1].srt_path; + // config_json.audio_path = value[1].audio_path; + // config_json.background_music = value[1].background_music; + // await fspromises.writeFile(path.join(this.global.config.project_path, "scripts/config.json"), JSON.stringify(config_json)); + // }) + + await this.tools.writeJsonFilePropertyValue(path.join(this.global.config.project_path, "scripts/config.json"), "video_config", value[1]); + + // 便利所有的队列任务 + for (let i = 0; i < value[0].length; i++) { + // 将所有的数据天添加到队列(总的大队列,有很多的小队列) + // 将所有生图任务添加到队列中 + const task_list = value[0][i]; + let seed = -1; + let subBatchId = `${task_list.out_folder}_image` + let images = await this.tools.getFilesWithExtensions(path.join(this.global.config.project_path, 'tmp/input_crop'), '.png'); + await fspromises.mkdir(path.join(this.global.config.project_path, 'tmp/' + task_list.out_folder), { recursive: true }); + if (images.length <= 0) { + throw new Error("未检测到抽帧图片。请检查"); + } + this.global.requestQuene.enqueue(async () => { + let res = await this.sd.OneImageGeneration(images[0], task_list, seed); + let tmp_seed = -1; + if (seed == -1) { + tmp_seed = res; + } + for (let j = 1; j < images.length; j++) { + const element = images[j]; + this.global.requestQuene.enqueue(async () => { + await this.sd.OneImageGeneration(element, task_list, tmp_seed); + }, `${task_list.out_folder}_${images[j]}`, batch, subBatchId) + } + + }, `${task_list.out_folder}_${images[0]}`, batch, subBatchId) + // } + task_list.status = 'queue'; + task_list["isAuto"] = "true"; + await this.pm.ModifyImageTaskList([task_list]); + // 修改状态 + // await this.pm.ModifyTaskStatus("id", task_list.id, "queue"); + // this.global.fileQueue.enqueue(async () => { + // let task_json = JSON.parse(await fspromises.readFile(taskPath, 'utf-8')); + // let index = task_json.task_list.findIndex(item => item.id == task_list.id); + // task_json.task_list[index] = task_list; + // await fspromises.writeFile(taskPath, JSON.stringify(task_json)); + // }) + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, task_list) + + // 判断是不是还有批次执行的任务 + // 监听子批次完成(修改当前批次的状态) + this.global.requestQuene.setSubBatchCompletionCallback(batch, subBatchId, async (failedTasks) => { + console.log(failedTasks) + if (failedTasks.length > 0) { + // 之前的任务出现错误 + // 执行错误 + } else { + // 判断是不是有错误。没有错误的话。直接修改状态。有错误直接记录错误(写入一个就行) + task_list.status = "ok"; + await this.pm.ModifyTaskStatus("id", task_list.id, 'ok'); + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, task_list) + console.log(subBatchId + "生图执行完毕。可以开始执行高清") + + // 添加高清队列 + // task_list + this.global.requestQuene.enqueue(async () => { + await this.pm.ImproveFolder(task_list.out_folder); + }, `${task_list.out_folder}_improve`, batch, `${task_list.out_folder}_improve`); + // 添加队列后修改状态 + task_list.status = "video_improving" + await this.pm.ModifyTaskStatus('out_folder', task_list.out_folder, "video_improving"); + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, task_list) + + // 监听高清任务完成 + this.global.requestQuene.setSubBatchCompletionCallback(batch, `${task_list.out_folder}_improve`, async (failedTasks) => { + console.log(failedTasks) + if (failedTasks.length > 0) { + // 之前的任务出现错误 + // 执行错误 + } else { + + console.log(task_list.out_folder + "高清完成,可以开始合成视频"); + // 添加生成视频队列 + this.global.requestQuene.enqueue(async () => { + let video_config = JSON.parse(await fspromises.readFile(define.video_config, 'utf-8')); + await this.AutoGeneretionOneVide(task_list.out_folder, video_config, value); + }, `${task_list.out_folder}_video`, batch, `${task_list.out_folder}_video`); + task_list.status = "video_queue"; + // 添加后修改状态 + await this.pm.ModifyTaskStatus('out_folder', task_list.out_folder, "video_queue"); + + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, task_list) + + // 监听生成视频任务完成 + this.global.requestQuene.setSubBatchCompletionCallback(batch, `${task_list.out_folder}_video`, async (failedTasks) => { + console.log(failedTasks) + if (failedTasks.length > 0) { + // 之前的任务出现错误 + // 执行错误 + } else { + console.log(task_list.out_folder + "合成视频完成"); + // 添加生成视频队列 + task_list.status = "video_ok"; + // 添加后修改状态 + await this.pm.ModifyTaskStatus('out_folder', task_list.out_folder, "video_ok"); + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, task_list) + } + }) + + } + }) + } + }) + } + + // 监听总批次完成 + this.global.requestQuene.setBatchCompletionCallback(batch, 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 + }) + } else { + console.log("所有的自动生成任务完成"); + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 1, + message: "所有自动任务完成" + }) + } + + this.global.fileQueue.enqueue(async () => { + // 读取最新的数据删除 + // 将自动化标识删除 + let task_json = JSON.parse(await fspromises.readFile(taskPath, 'utf-8')); + for (let i = 0; i < task_json.task_list.length; i++) { + let task_list = task_json.task_list[i]; + task_list["isAuto"] = "false"; + await this.pm.ModifyImageTaskList([task_list]); + } + }) + }) + return { + code: 1, + message: "自动任务添加到队列中" + } + + } catch (error) { + console.error(error) + return { + code: 0, + message: error.message + } + } + } + + /** + * 获取文件夹下面的子文件夹,添加判断条件 + * @param {value} value + * @returns + */ + async getSubFolderList(value) { + try { + let folder = await this.pm.getSubFolderList(path.join(this.global.config.project_path, "tmp"), value[0], value[1]); + // 找到所有的数据(查询状态返回) + let task_path = path.join(this.global.config.project_path, "scripts/task_list.json"); + let isExist = await this.tools.checkExists(task_path); + let data = []; + if (!isExist) { + for (let i = 0; i < folder.length; i++) { + const element = folder[i]; + let obj = { + folder: element, + status: "unkown error" + } + data.push(obj); + } + } else { + let task_list = JSON.parse(await fspromises.readFile(task_path, 'utf-8'))["task_list"]; + // 查询状态 + for (let i = 0; i < folder.length; i++) { + const element = folder[i]; + let index = task_list.findIndex(item => item.out_folder == element); + if (index < 0) { + let obj = { + folder: element, + status: "unkown error" + } + data.push(obj); + } else { + let status = task_list[index].status; + let obj = { + folder: element, + status: status + } + data.push(obj); + } + } + } + return { + code: 1, + data: data + } + } catch (error) { + return { + code: 0, + message: `Error Message ${error}` + } + } + } + + /** + * 自动生成一个视频 + * @param {视频生成图片的文件夹} element + * @param {视频配置} video_config + * @param {参数。第一个值为数组,为生成的图片文件。第二个参数是配置} value + */ + async AutoGeneretionOneVide(element, video_config, value) { + try { + let background_music = ""; + // 读取背景音乐的路径 + if (value[1].background_music != "") { + let background_music_config = (await func.getClipSetting("background_music_setting")).value; + let background_music_filter = background_music_config.filter(item => item.id == value[1].background_music); + if (background_music_filter.length <= 0) { + throw new Error("背景音乐对应的配置没有找到"); + } else { + background_music = background_music_filter[0].folder_path; + } + } + + // 随机获取字幕设置 + let ass_config = video_config.assConfig; + let ass_random_index = Math.floor(Math.random() * ass_config.length); + let watermark_config = video_config.watermarkConfig; + let watermark_random_index = Math.floor(Math.random() * watermark_config.length); + + // 对每个视频生成配置文件并将其添加到配置文件中 + let obj = { + srt_path: value[1].srt_path, + // 字幕样式(需要随机) + srt_style: ass_config[ass_random_index], + audio_path: value[1].audio_path, + background_music_folder: background_music, + // 水印设置(需要随机) + friendly_reminder: watermark_config[watermark_random_index], + video_resolution_x: video_config.video_resolution_x, + video_resolution_y: video_config.video_resolution_y, + outpue_file: path.join(this.global.config.project_path, this.global.config.project_name + element + ".mp4"), + image_folder: path.join(this.global.config.project_path, 'tmp/' + element), + srt_config: path.join(this.global.config.project_path, 'scripts/config.json'), + mp4_file_txt: path.join(this.global.config.project_path, `scripts/${element}.txt`), + status: "no", + audio_sound_size: video_config.audioSoundSize, + background_music_sound_size: video_config.backgroundMusicSoundSize, + keyFrame: video_config.keyframe, + frameRate: video_config.frameRate, + bitRate: video_config.bitRate + } + // 将配置文件写入 + let project_config_path = path.join(this.global.config.project_path, `scripts/${element}.json`); + await fspromises.writeFile(project_config_path, JSON.stringify(obj)); + // let task_list = JSON.parse(await fspromises.readFile(path.join(this.global.config.project_path,'scripts/task_'))); + let scriptPath = path.join(define.scripts_path, 'Lai.exe'); + // 执行生成图片的脚本 + let script = `cd "${define.scripts_path}" && "${scriptPath}" -c "${project_config_path.replaceAll('\\', '/')}"`; + const output = await execAsync(script, { maxBuffer: 1024 * 1024 * 10, encoding: 'utf-8' }); + if (output.stderr != '') { + obj.status = "video_error"; + obj.stdout = output.stdout; + obj.stderr = output.stderr; + await this.pm.ModifyTaskStatus('out_folder', element, "video_error"); + throw new Error(output.stderr); + } else { + obj.status = "video_ok"; + obj.stdout = output.stdout; + obj.stderr = output.stderr; + await this.pm.ModifyTaskStatus('out_folder', element, "video_ok"); + // 将写出的视频中的exif数据删除 + // await this.tools.deletePngAndDeleteExifData(obj.outpue_file, path.join(this.global.config.project_path, this.global.config.project_name + "_" + element.split('_')[element.split('_').length - 1] + ".mp4")); + } + + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, { + out_folder: element, + status: obj.status + }) + } catch (error) { + //手动修改 + let task_list_json = JSON.parse(await fspromises.readFile(path.join(this.global.config.project_path, "scripts/task_list.json"), 'utf-8')); + let index = task_list_json.task_list.findIndex(item => item.out_folder == element); + if (index < 0) { + throw new Error("未找到对应的任务"); + } + task_list_json.task_list[index].status = "video_error"; + task_list_json.task_list[index].errorMessage = error.toString(); + // 写回 + await fspromises.writeFile(path.join(this.global.config.project_path, "scripts/task_list.json"), JSON.stringify(task_list_json)); + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, { + out_folder: element, + status: "video_error" + }) + throw error; + } + } + + /** + * 添加自动合成任务到队列中去 + * @param {} value + */ + async AutoGeneretionVideo(value) { + try { + // 先检查所有的条件 + let batch = DEFINE_STRING.QUEUE_BATCH.AUTO_VIDEO_GENERATE_SINGLE; + // console.log(value); + let video_config = JSON.parse(await fspromises.readFile(define.video_config, 'utf-8')); + let res = await this.CheckVideoGenerattionAllCondition(video_config, value[1], value[0]); + if (res.code == 0) { + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, res); + return res; + } + for (let i = 0; i < value[0].length; i++) { + const element = value[0][i]; + this.global.requestQuene.enqueue(async () => { + await this.AutoGeneretionOneVide(element, video_config, value) + }, element, batch); + + // 添加队列后修改状态 + await this.pm.ModifyTaskStatus('out_folder', element, "video_queue"); + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH, { + out_folder: element, + status: "video_queue" + }) + } + + this.global.requestQuene.setBatchCompletionCallback(batch, (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 + }) + } else { + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 1, + message: "所有生成视频任务已完成" + }) + } + }) + return { + code: 1 + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 检测生成视频条件的必要条件 + * @param {生成视频配置文件} video_config + * @param {生成视频的基础配置} simpleData + * @param {输出文件夹位置,为null,检查input文件里面的图片文件是不是和配置文件中的图片数量一致} out_folder + * @returns + */ + async CheckVideoGenerattionAllCondition(video_config, simpleData, out_folder) { + let message = ""; + if (video_config == null) { + video_config = JSON.parse(await fspromises.readFile(define.video_config, 'utf-8')); + } + // 基础信息检测 + if (video_config.audioSoundSize == null) { + message += "配音大小不能为空" + '\n'; + } + if (video_config.backgroundMusicSoundSize == null) { + message += "背景音乐音量大学不能为空" + '\n'; + } + if (video_config.video_resolution_x == null) { + message += "生成视频的宽度不能为空" + '\n'; + } + if (video_config.video_resolution_y == null) { + message += "生成视频的高度不能为空" + '\r\n'; + } + if (video_config.offsetValue == null) { + message += "视频的上下偏移量不能为空" + '\n'; + } + if (video_config.frameRate == null) { + message += "生成视频的帧率不能为空" + '\n'; + } + if (video_config.bitRate == null) { + message += "生成视频码率的不能为空" + '\n'; + } + + // 判断字幕列表中是不是有数据 + if (video_config.assConfig == null || video_config.assConfig.length <= 0) { + message += "字幕设置最少包含一条" + '\n'; + } + if (video_config.watermarkConfig == null || video_config.watermarkConfig.length <= 0) { + message += "水印设置最少包含一条" + '\n'; + } + // 判断背景音乐文件夹中是不是存在。并且检查其中是不是有音乐文件 + if (simpleData.background_music == "") { + message += "背景音乐文件夹路径不能为空" + '\n'; + } + // 判断背景音乐文件夹是不是存在 + if (await this.tools.checkExists(simpleData.background_music)) { + message += "背景音乐文件夹不存在" + '\n'; + } + // 判断里面是不是有MP3或者是wav + let clip_json = JSON.parse(await fspromises.readFile(define.clip_setting, 'utf-8'))["background_music_setting"]; + let background_music_obj = clip_json.filter(item => item.id == simpleData.background_music)[0]; + let mp3_file = await this.tools.getFilesWithExtensions(background_music_obj.folder_path, '.mp3'); + let wav_file = await this.tools.getFilesWithExtensions(background_music_obj.folder_path, '.wav'); + if (mp3_file.length <= 0 && wav_file.length <= 0) { + message += "背景文件夹中没有 MP3 或 WAV 文件" + '\n'; + } + + let config_path = path.join(this.global.config.project_path, 'scripts/config.json'); + let isE = await this.tools.checkExists(config_path); + if (!isE) { + message += "配置文件不存在。请先导入字幕文件。并调整时间轴。" + } else { + // 判断文案时间信息和图片信息是不是相同 + let config_json = JSON.parse(await fspromises.readFile(config_path, 'utf-8')); + let len = config_json["srt_time_information"].length; + if (out_folder == null) { + // 判断输入文件中的配置文件中的数量是不是对上 + let img_l = await this.tools.getFilesWithExtensions(path.join(this.global.config.project_path, "tmp/input_crop"), '.png'); + if (img_l.length != len) { + message += `input_crop 文件里面图片和文案信息对不上。检查是不是图片数量不对` + } + // 判断是不是有tag文件 + let tag_txt = await this.tools.getFilesWithExtensions(path.join(this.global.config.project_path, "tmp/input_crop"), '.txt'); + let c_j = await this.tools.getFilesWithExtensions(path.join(this.global.config.project_path, "tmp/input_crop"), '.json'); + if (tag_txt.length > 0) { + if (tag_txt.length != img_l.length) { + message += "反推的tag文件和图片的数量对不上。" + "\n"; + } + } else if (c_j.length > 0) { + if (c_j.length != img_l.length) { + message += "已存在的配置文件和图片的数量对不上。" + "\n"; + } + } else { + message += "好像没有反推呢" + "\n"; + } + } else { + // 判断当前的输入的 out_folder 中图片数量是不是可以和配置文件中能否对上 + for (let i = 0; i < out_folder.length; i++) { + const element = out_folder[i]; + let image_l = await this.tools.getFilesWithExtensions(path.join(this.global.config.project_path, "tmp/" + element), '.png'); + if (image_l.length != len) { + message += `${element} 文件里面图片和文案信息对不上。检查是不是图片数量不对` + } + } + } + } + if (message != '') { + let res = { + code: 0, + message: message + } + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, res) + return res; + } + return { + code: 1, + } + } +} \ No newline at end of file diff --git a/src/main/backPrompt/writing.js b/src/main/backPrompt/writing.js new file mode 100644 index 0000000..17f03eb --- /dev/null +++ b/src/main/backPrompt/writing.js @@ -0,0 +1,301 @@ +let path = require("path"); +let fspromises = require("fs").promises; +import { Tools } from "../tools"; +import { DEFINE_STRING } from "../../define/define_string"; +import { PublicMethod } from "../Public/publicMethod"; +import { define } from "../../define/define"; +import { get, has } from "lodash"; +import { ClipSetting } from "../../define/setting/clipSetting"; +const { v4: uuidv4 } = require('uuid'); // 引入UUID库来生成唯一标识符 +let tools = new Tools(); + +export class Writing { + constructor(global) { + this.global = global + this.pm = new PublicMethod(global); + } + + /** + * 将文案信息写入到本地的文案文件中 + * @param {*} value + */ + async SaveWordTxt(value) { + try { + let word_path = path.join(global.config.project_path, "文案.txt"); + await tools.writeArrayToFile(value, word_path); + return { + code: 1, + message: "保存成功" + } + } catch (error) { + throw new Error(error); + } + } + + /** + * 将分镜的时间信息添加道配置文件中 + * @param {*} value 是一个数组,0 :写入的数据 1:写入的属性 2:是否需要解析 + */ + async SaveCopywritingInformation(value) { + try { + return await this.pm.SaveConfigJsonProperty(value); + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 获取Config.json文件中指定的属性 + * @param {Array} value 传入的值 0 : 需要获取的属性 1: 返回的默认值 + * @returns + */ + async GetConfigJson(value) { + try { + return await this.pm.GetConfigJson(value, false); + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 获取当前项目下面的文案 + */ + async GetProjectWord() { + try { + // 先判断当前的项目文件下面是不是又配置文件。没有才读取文案 + let srt_config_path = path.join(global.config.project_path, "scripts/config.json"); + let isExist = await tools.checkExists(srt_config_path); + let data = null; + let isImformation = false; + if (isExist) { + let config_1 = JSON.parse(await fspromises.readFile(srt_config_path)); + isImformation = has(config_1, 'srt_time_information'); + if (isImformation) { + data = JSON.parse(await fspromises.readFile(srt_config_path)).srt_time_information; + } + } + + if (!isExist || !isImformation) { + let word_path = path.join(global.config.project_path, "文案.txt"); + let isExistWord = await tools.checkExists(word_path); + if (!isExistWord) { + return { + code: 0, + message: "没有文案文件" + } + } + let data = await fspromises.readFile(word_path, { encoding: 'utf-8' }); + let lines = data.split(/\r?\n/); + // 打印或返回这个数组 + // console.log(lines); + // 判断是不是有洗稿后的文件 + let new_srt_path = path.join(global.config.project_path, "new_word.txt"); + let isExistAfterGPTWord = await tools.checkExists(new_srt_path); + let after_data = null; + if (isExistAfterGPTWord) { + after_data = (await fspromises.readFile(new_srt_path, { encoding: 'utf-8' })).split(/\r?\n/); + } + // 判断抽帧文件是不是存在 + // 返回图片信息 + let old_image_path_list = await tools.getFilesWithExtensions(path.join(global.config.project_path, "tmp/input_crop"), '.png'); + let res = []; + let lastId = ''; + // 处理数据 + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + let id = uuidv4(); + let after_gpt = null; + if (after_data != null) { + after_gpt = after_data[i]; + } + + let img_path = null; + if (old_image_path_list != null) { + img_path = old_image_path_list[i]; + } + let obj = { + no: i + 1, + id: id, + lastId: lastId, + word: line, + old_image: img_path, + after_gpt: after_gpt, + start_time: null, + end_time: null, + timeLimit: null, + subValue: [] + } + res.push(obj); + lastId = id; + } + return { + code: 1, + type: 0, + data: res + } + } else { + let data = JSON.parse(await fspromises.readFile(srt_config_path)).srt_time_information; + return { + code: 1, + type: 1, + data: data + } + } + + } catch (error) { + throw new Error(error); + } + } + + /** + * 搭导入srt。然后加载时间轴。完全匹配失败的将会还是会导入然后手动手动切换 + * @param {文案洗稿界面信息} textData + */ + async ImportSrtAndGetTime(data) { + let textData = data[0]; + let init_num = textData.length; + let srt_path = data[1]; + let current_text = ""; + try { + if (!srt_path) { + // 获取项目下面的所有的srt + let srtfiles = await tools.getFilesWithExtensions(global.config.project_path, '.srt'); + if (srtfiles.length <= 0) { + throw new Error("没有SRT文件"); + } + srt_path = srtfiles[0]; + } + let srt_data = (await fspromises.readFile(srt_path, 'utf-8')).toString("utf-8"); + const entries = srt_data.replace(/\r\n/g, '\n').split('\n\n'); + let data = entries.map(entry => { + const lines = entry.split('\n'); + if (lines.length >= 3) { + const times = lines[1]; + const text = lines.slice(2).join(' '); + const [start, end] = times.split(' --> ').map(time => { + const [hours, minutes, seconds] = time.split(':'); + const [sec, millis] = seconds.split(','); + return ((parseInt(hours) * 3600 + parseInt(minutes) * 60 + parseInt(sec)) * 1000 + parseInt(millis)); + }); + return { start, end, text, id: uuidv4() }; + } + }).filter(entry => entry); + // 开始匹配(洗稿后的) + let srt_list = []; + let srt_obj = null + let text_count = 0; + let tmp_str = ""; + for (let i = 0; i < data.length;) { + let srt_value = data[i].text; + current_text = `字幕: “${srt_value}” 和文案第${text_count + 1} 行数据 “${textData[text_count].after_gpt}” 数据不匹配(检查一下上下文)`; + let start_time = data[i].start; + let end_time = data[i].end; + let obj = { + start_time, + end_time, + srt_value, + id: data[i].id + }; + // 判断当前字幕是不是在当前句 + // 不能用简单的包含,而是将数据进行去除特殊符号拼接后判断是不是相同 + tmp_str += srt_value; + if (tools.removePunctuationIncludingEllipsis(textData[text_count].after_gpt).startsWith(tools.removePunctuationIncludingEllipsis(tmp_str))) { + if (srt_obj == null) { + srt_obj = {} + srt_obj.id = uuidv4(); + srt_obj.start_time = start_time; + srt_obj.value = srt_value; + srt_obj.subValue = [obj]; + } + else { + srt_obj.value = srt_obj.value + srt_value; + srt_obj.subValue = [...srt_obj.subValue, obj]; + } + textData[text_count].start_time = srt_obj.start_time; + textData[text_count].subValue = srt_obj.subValue + srt_list.push(obj); + i++; + } else { + // 判断下一句文件是不是以当当前巨开头。是的话继续。不是的话。直接返回后面的所有信息 + if (tools.removePunctuationIncludingEllipsis(textData[text_count + 1].after_gpt).startsWith(tools.removePunctuationIncludingEllipsis(srt_value))) { + textData[text_count].end_time = srt_list[srt_list.length - 1].end_time; + text_count++; + srt_obj = null; + tmp_str = "" + } else { + // 将下面的数据直接 添加到textData后面。 + // 修改当前行数据的结束事件为 + if (srt_list.length > 0) { + textData[text_count].end_time = srt_list[srt_list.length - 1].end_time; + text_count++; + } + // 将后面的数据直接添加 + let lastId = textData[textData.length - 1].id; + for (let j = i; j < data.length; j++) { + // 直接修改原有数据 + if (text_count < init_num) { + textData[text_count].subValue = [{ + start_time: data[j].start, + end_time: data[j].end, + id: data[j].id, + srt_value: data[j].text + }] + textData[text_count].start_time = data[j].start; + textData[text_count].end_time = data[j].end; + text_count++; + } + else { + let id = uuidv4(); + // 添加 + let obj = { + no: j + 1, + id: id, + word: null, + lastId: lastId, + old_image: path.normalize(define.zhanwei_image), + after_gpt: null, + start_time: data[j].start, + end_time: data[j].end, + subValue: [{ + start_time: data[j].start, + end_time: data[j].end, + id: data[j].id, + srt_value: data[j].text + }] + } + lastId = id; + textData.push(obj); + } + } + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 0, + message: current_text + }) + return { + code: 1, + data: textData + } + } + } + } + // 最后对齐 + textData[textData.length - 1].end_time = srt_list[srt_list.length - 1].end_time + // 返回数据 + return { + code: 1, + data: textData + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } +} \ No newline at end of file diff --git a/src/main/discord/discordApi.js b/src/main/discord/discordApi.js new file mode 100644 index 0000000..9550ab1 --- /dev/null +++ b/src/main/discord/discordApi.js @@ -0,0 +1,490 @@ +const axios = require('axios'); +// import { Midjourney as mApi} from "midjourney"; +// const MJapi2 = require('midjourney'); +// const { midjourney } = require('midjourney') +// const Midjourney = require('midjourney'); +// ES5 的模块引入方式 +const fetch = require("node-fetch"); + +// ES6 的模块引入方式 +// import fetch from "node-fetch"; + +export class DiscordAPI { + constructor(mj_setting) { + // https://discord.com/api/v9/channels/1208362852482809939/messages?limit=20 + this.apiClient = axios.create({ + baseURL: 'https://discord.com' + }); + this.DiscordBaseUrl = 'https://discord.com'; + this.ServerId = mj_setting.serviceID; + this.ChannelId = mj_setting.channelID; + this.userToken = mj_setting.token; + this.botId = mj_setting.select_robot?.botId; + this.commandId = mj_setting.select_robot?.commandId; + this.versionId = mj_setting.select_robot?.versionId; + this.versionName = mj_setting.select_robot?.versionName; + this.botName = mj_setting.select_robot?.botName; + } + + // 提交任务 + async imagine(data) { + + // let req_data = { + // "token": this.userToken, + // "method": "post", + // "api_url": "/mj/submit/imagine", + // "data":data + // } + + // const response = await this.apiClient.post('/api/v3/req_mj_api', req_data); + // await this.interactions(data.prompt); + return await this.interactions(data.prompt) + // return { + // code:1, + // result:'taskid_'+new Date().getTime() + // } + // return response.data; + + } + async channelList() { + axios.get(`https://discord.com/api/v9/channels/${this.ChannelId}/messages?limit=20`, { + method: 'get', + headers: { + "Authorization": this.userToken + } + }) + .then(response => { + // 请求成功处理 + console.log(typeof response.data); + let eList = [] + let flg = false; + let job_id = ''; + let type = ''; + if (response && response.data) { + try { + response.data.forEach(element => { + flg = false; + type = ''; + if (element.attachments && element.attachments.length) { + const arr = element.attachments[0].filename.split("_"); + job_id = arr[arr.length - 1].replace(".png", ''); + if (element.components) { + element.components.forEach(e2 => { + e2.components.forEach(e3 => { + if (e3.label == 'U1') { + flg = true; + type = 'U1' + } else if (e3.label && e3.label.indexOf('Upscale') > -1) { + flg = true; + type = 'Upscale' + } + }) + }); + } + let t = eList.find((e) => { + return e.filename == element.attachments[0].filename; + }) + + if (!t) { + eList.push( + { + flg: flg, job_id: job_id, filename: element.attachments[0].filename, + url: element.attachments[0].url, + proxy_url: element.attachments[0].proxy_url, + type: type, + timestamp: element.timestamp + }) + } + + // console.log({flg:flg,job_id:job_id,filename:element.attachments[0].filename}) + } else { + console.log({ flg: flg }) + } + + }); + } catch (error) { + console.log('异常2', error) + } + // console.log(eList) + // 8e7406df-bf0c-4e3d-8e49-b2bb8e2c263d + // 5abedc71-ba80-4756-8ddc-489c927d3acd + } + }).catch(error => { + // 请求失败处理 + console.error(error); + }); + } + // 混合 + async blend(data) { + + let req_data = { + "token": this.userToken, + "method": "post", + "api_url": "/mj/submit/blend", + "data": data + } + + const response = await this.apiClient.post('/api/v3/req_mj_api', req_data); + return response.data; + + } + + + // 反推 + async describe(data) { + + let req_data = { + "token": this.userToken, + "method": "post", + "api_url": "/mj/submit/describe", + "data": data + } + + const response = await this.apiClient.post('/api/v3/req_mj_api', req_data); + return response.data; + + } + + // 获取任务 + async getTaskId(task_id) { + let req_data = { + "token": this.userToken, + "method": "get", + "api_url": `/mj/task/${task_id}/fetch`, + "data": {} + } + const response = await this.apiClient.post('/api/v3/req_mj_api', req_data); + return response.data; + } + + //获取seed + async imageSeed(task_id) { + let req_data = { + "token": this.userToken, + "method": "get", + "api_url": `/mj/task/${task_id}/image-seed`, + "data": {} + } + const response = await this.apiClient.post('/api/v3/req_mj_api', req_data); + return response.data; + + } + + //账号创建 + async account_create(data) { + let req_data = { + "token": this.userToken, + "method": "post", + "api_url": '/mj/account/create', + "data": data + } + const response = await this.apiClient.post('/api/v3/req_mj_api', req_data, { timeout: 20000 }); + return response.data; + } + + //账号创建 + async account_fetch(cid) { + let req_data = { + "token": this.userToken, + "method": "get", + "api_url": `/mj/account/${cid}/fetch`, + "data": {} + } + const response = await this.apiClient.post('/api/v3/req_mj_api', req_data); + return response.data; + + } + + //账号同步信息 + async account_asyn_info(cid) { + let req_data = { + "token": this.userToken, + "method": "post", + "api_url": `/mj/account/${cid}/sync-info`, + "data": {} + } + const response = await this.apiClient.post('/api/v3/req_mj_api', req_data, { timeout: 20000 }); + return response.data; + } + + //账号删除信息 + async account_del_info(cid) { + let req_data = { + "token": this.userToken, + "method": "delete", + "api_url": `/mj/account/${cid}/delete`, + "data": {} + } + const response = await this.apiClient.post('/api/v3/req_mj_api', req_data); + return response.data; + } + + + //执行动作 + async action(data) { + let req_data = { + "token": this.userToken, + "method": "post", + "api_url": '/mj/submit/action', + "data": data + } + const response = await this.apiClient.post('/api/v3/req_mj_api', req_data); + return response.data; + } + + // 确认弹窗 + async modal(data) { + let req_data = { + "token": this.userToken, + "method": "post", + "api_url": '/mj/submit/modal', + "data": data + } + const response = await this.apiClient.post('/api/v3/req_mj_api', req_data); + return response.data; + + } + + async interactions(prompt) { + // 直接自己调用 + prompt = prompt.trim(); + // prompt = "4k,8k,best quality, masterpiece, woman, divorced, leaving fast-paced city life, serene expression, walking away from cityscape, bustling streets, entering tranquil countryside, peaceful surroundings, rejuvenating atmosphere, , --niji 5 --ar 4:3" + var payload = {}; + if (this.botName == 'niji') { + payload = { + "type": 2, + "application_id": this.botId, + "guild_id": this.ServerId, + "channel_id": this.ChannelId, + "session_id": this.userToken, + "data": { + "version": this.versionId, + "id": this.commandId, + "name": "imagine", + "type": 1, + "options": [ + { + "type": 3, + "name": "prompt", + "value": prompt + } + ], + "application_command": { + "id": this.commandId, + "type": 1, + "application_id": this.botId, + "version": this.versionId, + "name": "imagine", + "description": "Create images with Midjourney", + "options": [ + { + "type": 3, + "name": "prompt", + "description": "The prompt to imagine", + "required": true, + "description_localized": "The prompt to imagine", + "name_localized": "prompt" + } + ], + "integration_types": [ + 0 + ], + "global_popularity_rank": 1, + "description_localized": "Create images with Midjourney", + "name_localized": "imagine" + }, + "attachments": [ + + ] + }, + // "nonce": "1210857131343872000", + "analytics_location": "slash_ui" + } + } else { + payload = { + "type": 2, + // "application_id":"1022952195194359889",//niji + "application_id": this.botId, + "guild_id": this.ServerId, + "channel_id": this.ChannelId, + "session_id": this.userToken, + "data": { + "version": this.versionId, + "id": this.commandId, + "name": "imagine", "type": 1, + "options": + [{ + "type": 3, + "name": "prompt", + "value": prompt + }], + "application_command": { + "id": this.commandId, + "type": 1, + "application_id": this.botId, + "version": this.versionId, + "name": "imagine", + "description": "Create images with Niji journey", + "options": [{ "type": 3, "name": "prompt", "description": "The prompt to imagine", "required": true, "description_localized": "The prompt to imagine", "name_localized": "prompt" }], + "integration_types": [0], "global_popularity_rank": 1, "description_localized": "Create images with Niji journey", "name_localized": "imagine" + }, + "attachments": [] + }, + "analytics_location": "slash_ui" + } + } + + let response = { + status: 200, + data: {} + }; + + + try { + const headers = { + "Content-Type": "application/json", + Authorization: this.userToken, + }; + await fetch(`${this.DiscordBaseUrl}/api/v9/interactions`, { + method: "POST", + body: JSON.stringify(payload), + headers: headers, + }).then(res => res.json()).then(res => { + response.data = res; + }).catch(e => { + console.error("请求失败了,详细信息:" + JSON.stringify(e)); + response = { + status: 500, + data: JSON.stringify(e) + }; + }); + console.log('response结果') + console.log(response) + // if (response.status == 204) { + // //成功 + + // } + if (response.status >= 400) { + console.error("api.error.config", { + payload: JSON.stringify(payload) + }); + } + return { + code: response.status, + response: response + }; + } + catch (error) { + console.error(error); + return 500; + } + return; + const client = new Midjourney.Midjourney({ + ServerId: this.ServerId, + ChannelId: this.ChannelId, + SalaiToken: this.userToken, + Debug: true, + fetch: fetch, + Ws: true, //enable ws is required for remix mode (and custom zoom) + }); + await client.init(); + console.log('mjmj_begin2', prompt); + // const prompt = + // "Christmas dinner with spaghetti with family in a cozy house, we see interior details , simple blue&white illustration"; + //imagine + const Imagine = await client.Imagine( + prompt, + (uri, progress) => { + client.Close(); + + console.log("loading", uri, "progress", progress); + return + } + ); + console.log(Imagine); + if (!Imagine) { + console.log("no message"); + console.log('mjmj_end2') + return; + } + console.log('mjmj_end') + client.Close(); + return + + } + + /** + * 获取频道内的机器人 + * @returns 返回机器人列表 + */ + async getBotList() { + try { + + const headers = { + 'Host': 'discord.com', + 'Connection': 'keep-alive', + 'authorization': this.userToken, + } + + await fetch('https://discord.com/api/v9/guilds/1182523906855284826/application-command-index', { + method: 'GET', + headers: headers, + }) + .then(response => { + response.json() + } + ) + .then(data => { + console.log(data) + }) + .catch(error => { + console.error('Error:', error) + }) + + + } catch (error) { + throw new Error(error); + } + } + + + async getMjMsgList() { + // const headers = { + // "Content-Type": "application/json", + // Authorization:this.userToken, + // }; + let response = { + status: 200, + data: {} + }; + // // `https://discord.com/api/v9/channels/${mj_channelId}/messages?limit=10 + // await fetch(`${this.DiscordBaseUrl}/api/v9/channels/${this.ChannelId}/messages?limit=50`, { + // method: "GET", + // headers: headers, + // }).then(res => res.json()).then(res => { + // response.data=res; + // }).catch(e => { + // console.error("请求失败了,详细信息:" + JSON.stringify(e)); + // response ={ + // status:500, + // data:JSON.stringify(e) + // }; + // }); + // console.log('getMjMsgList_response结果') + // // console.log(response) + + // return response; + axios.get(`https://discord.com/api/v9/channels/${this.ChannelId}/messages?limit=20`, { + method: 'get', + headers: { + "Authorization": this.userToken + } + }).then(res => { + response.data = res; + }).catch(error => { + // 请求失败处理 + console.error(error); + }); + + } +} diff --git a/src/main/discord/discordRequestLister.js b/src/main/discord/discordRequestLister.js new file mode 100644 index 0000000..edab354 --- /dev/null +++ b/src/main/discord/discordRequestLister.js @@ -0,0 +1,52 @@ + +export class DiscordRequestListener { + constructor(thisWindow) { + this.listeners = {}; + this.thisWindow = thisWindow; + } + + /** + * 添加网络请求前的监听人物 + * @param {*} key 存储的属性名称 + * @param {*} listener 执行的方法 + * @returns + */ + async AddRequestListener(key, listener) { + // 判断当前key是不是存在 + if (this.listeners[key]) { + return; + } + this.listeners[key] = listener; + } + + /** + * 移除指定的key事件 + * @param {*} key + */ + async RemoveRequestListener(key) { + if (this.listeners[key]) { + delete this.listeners[key]; + } + } + + /** + * 监听指定的窗口的网络请求 + */ + async start() { + // 获取session + // 获取Authorization + // 获取User-Agent + const mySession = this.thisWindow.webContents.session; // 获取 session + // 使用 webRequest API 监听请求 + mySession.webRequest.onBeforeSendHeaders((details, callback) => { + + for (const key in this.listeners) { + if (Object.hasOwnProperty.call(this.listeners, key)) { + const element = this.listeners[key]; + element(details); + } + } + callback({ cancel: false, requestHeaders: details.requestHeaders }); + }); + } +} \ No newline at end of file diff --git a/src/main/discord/discordScript.js b/src/main/discord/discordScript.js new file mode 100644 index 0000000..fdb4b6b --- /dev/null +++ b/src/main/discord/discordScript.js @@ -0,0 +1,406 @@ +// @noBytecode + +/** + * 获取Discord的消息输入框,并聚焦 + * @returns 返回获取的消息输入框 + */ +function getInputFoucs() { + let selector = 'div[contenteditable="true"][class^="markup_"]'; + const inputElement = document.querySelector(selector) // as HTMLInputElement; + if (!inputElement) { + throw new Error('没有找到对应的消息输入框'); + } + inputElement.focus() + return inputElement; +} + +/** + * 获取指定 image_id 的图片 + */ +function GetGeneratedMJImageAndSplit(str) { + let res = []; + for (let i = 0; i < str.length; i++) { + const element = str[i]; + let image_id = element.image_id; + let links = document.getElementsByTagName('a'); + // 创建一个空数组来存储包含特定字符串的链接 + let result = []; + // 遍历所有的链接 + for (let i = 0; i < links.length; i++) { + // 如果链接的href属性包含特定的字符串,就把它添加到结果数组中 + if (links[i].href.includes(image_id)) { + result.push(links[i].href); + } + } + if (result.length > 0) { + res.push({ + id: element.id, + image_id: element.image_id, + result: result[0], + name: element.name + }); + } + return JSON.stringify(res); + } +} + +window['updateObserver'] = {}; + +/** + * 获取Discord的消息输入框的X,Y位置,每次输入前都要检测一下 + */ +function GetMessageInputPosition() { + try { + let inputElement = getInputFoucs(); + const rect = inputElement.getBoundingClientRect(); + // 计算鼠标点击位置(假设点击在元素中心) + const mouseX = rect.left + rect.width / 2; + const mouseY = rect.top + rect.height / 2; + sightingTelescope(mouseX, mouseY) + return { mouseX, mouseY }; + } catch (error) { + console.log(error) + throw error; + } +} + + +/** + * 瞄准镜 + */ +function sightingTelescope(x, y) { + var div = document.createElement('div'); + div.style.position = 'absolute'; + div.style.left = (x - 1) + "px"; + div.style.top = (y - 15) + "px"; + div.style.width = '30px'; + div.style.height = '30px'; + div.style.zIndex = '9999'; + div.style.border = '1px dashed green'; + div.style.color = 'green'; + div.style.textAlign = 'center'; + div.style.fontWeight = '600'; + div.style.borderRadius = '50%'; + div.style.fontSize = '30px'; + div.textContent = '+'; + document.body.appendChild(div); + setTimeout(function () { + div.parentNode.removeChild(div); + }, 3000); +} + +/** + * 判断discord中的输入框中是不是有数据直接返回 + * 有数据返回true,无数据返回false + */ +function GetMessageInputValue() { + let inputElement = getInputFoucs(); + // 判断是不是为空 + let emptyElement = inputElement.querySelector('span[class^="emptyText_"]'); + if (emptyElement) { + return false; + } else { + return true; + + } +} + +/** + * 监听指定的元素 + */ +function MutationObserverElement() { + // 观察的节点 + let messageList = document.querySelector('ol[class^="scrollerInner_"][data-list-id^="chat-message"]'); + + // 观察器的配置(需要观察什么变动) + const config = { childList: true, subtree: true }; + + // 当观察到变动时执行的回调函数 + const callback = function (mutationsList, observer) { + for (let mutation of mutationsList) { + if (mutation.type === 'childList') { + if (mutation.addedNodes.length) { + // 判断当前此修改是不是包含发送的消息 + for (let i = 0; i < mutation.addedNodes.length; i++) { + const element = mutation.addedNodes[i]; + let id = element.id; + if (id && id.includes('chat-messages-')) { + let data = {}; + let id_arr = id.split('-'); + data["message_id"] = id_arr[id_arr.length - 1]; + data["channel_id"] = id_arr[id_arr.length - 2]; + data["tiamspan"] = new Date().getTime(); + + // 获取消息的ID + let data_list = element.querySelector('div[data-list-item-id^="chat-messages"]'); + if (!data_list) { + return; + } + // 判断下面是不是有数据 + + let content_data = data_list.querySelector('div[class^="contents_"]')?.querySelector('div[id^="message-content"]'); + + if (!content_data) { + return; + } + // 判断下面是不是有元素 + let has_data = content_data.hasChildNodes(); + + // 找到之后,再重新找节点,创建数据 + let mainCurrentNode = { + "currentNode": data_list, + "firstNode": content_data + } + + let res = getMessageData(mainCurrentNode); + for (let d in res) { + data[d] = res[d]; + } + + // 对应的元素存在,就是一个新消息 返回 + if (!has_data) { + console.log("LAItool 新增消息", element) + data.code = 1; + window.discord.CreateMessage(JSON.stringify(data)) + MutationObserverUpdateElement(id) + } else { + // 判断下面是不是有 + let wrapper = content_data.querySelector('div[class^="wrapper"]'); + // 判断下面是不是strong元素 + let strong = content_data.querySelector('strong'); + + if (!wrapper && strong) { + console.log("LAItool 新增消息", element); + data.code = 1; + window.discord.CreateMessage(JSON.stringify(data)) + MutationObserverUpdateElement(id); + } + } + } + } + } + if (mutation.removedNodes.length) { + // 判断当前此修改是不是包含发送的消息 + for (let i = 0; i < mutation.removedNodes.length; i++) { + const element = mutation.removedNodes[i]; + let id = element.id; + if (id && id.includes('chat-messages-')) { + let data = {}; + let id_arr = id.split('-'); + data["message_id"] = id_arr[id_arr.length - 1]; + data["channel_id"] = id_arr[id_arr.length - 2]; + data["tiamspan"] = new Date().getTime(); + + // 获取消息的ID + let data_list = element.querySelector('div[data-list-item-id^="chat-messages"]'); + if (!data_list) { + return; + } + // 判断下面是不是有数据 + + let content_data = data_list.querySelector('div[class^="contents_"]')?.querySelector('div[id^="message-content"]'); + + if (!content_data) { + return; + } + // 判断下面是不是有元素 + let has_data = content_data.hasChildNodes(); + + // 找到之后,再重新找节点,创建数据 + let mainCurrentNode = { + "currentNode": data_list, + "firstNode": content_data + } + + let res = getMessageData(mainCurrentNode); + for (let d in res) { + data[d] = res[d]; + } + + // 对应的元素存在,就是一个新消息 返回 + if (!has_data) { + console.log("LAItool 删除消息", element) + + // MutationObserverUpdateElement(id) + data.code = 1; + window.discord.DeleteMessage(JSON.stringify(data)) + + stopUpdateObserver(id) + } else { + // 判断下面是不是有 + let wrapper = content_data.querySelector('div[class^="wrapper"]'); + // 判断下面是不是strong元素 + let strong = content_data.querySelector('strong'); + + if (!wrapper && strong) { + console.log("LAItool 删除消息", element) + data.code = 1; + window.discord.DeleteMessage(JSON.stringify(data)) + stopUpdateObserver(id); + } + } + } + } + } + } + } + }; + + // 创建一个观察器实例并传入回调函数 + window.observer = new MutationObserver(callback); + + // 以上述配置开始观察目标节点 + window.observer.observe(messageList, config); +} + + +// 往上找到指定的标签 +function findParentNode(startNode) { + let data = {}; + let currentNode = startNode; + + while (currentNode !== null) { + + if (!data["currentNode"] && currentNode.id && currentNode.id.startsWith('message-content')) { + data["firstNode"] = currentNode; + } + + if (currentNode.getAttribute && currentNode.getAttribute('data-list-item-id') && currentNode.getAttribute('data-list-item-id').startsWith('chat-messages')) { + data["currentNode"] = currentNode; + return data; + } + currentNode = currentNode.parentNode; + } + + return data; +} + +function gatherNodeData(node) { + let result = node.textContent || ''; // 获取当前节点的文本内容 + return result; + // 遍历所有子节点 +} + +// 获取一个数据的当前消息的数据 +function getMessageData(mainData) { + if (!mainData["currentNode"]) { + window.discord.UpdateMessage(JSON.stringify({ code: 0, message: "没有找到对应的消息" })) + return; + } + // 获取当前的消息ID + + let res = {}; + + let data_arr = mainData["currentNode"].getAttribute('data-list-item-id')?.split('-'); + let message_id = data_arr[data_arr.length - 1]; + let channel_id = data_arr[data_arr.length - 2]; + res["message_id"] = message_id; + res["channel_id"] = channel_id; + + // 判断是不是又违规的消息 + let text = mainData["currentNode"].textContent.toLowerCase().includes("Banned prompt detected"); + + + if (text) { + res["error"] = "Banned prompt detected"; + res.code = 1; + window.discord.UpdateMessage(JSON.stringify(res)) + } + + // 获取提示词相关的数据 + // 开始拼接提示词数据 + let message_prompt = null; + if (!mainData["firstNode"]) { + message_prompt = null; + } else { + message_prompt = gatherNodeData(mainData["firstNode"]); + } + res["message_prompt"] = message_prompt; + + // 判断是不是有图片信息 + let image_content = mainData["currentNode"].querySelector('div[id^="message-accessories-' + message_id + '"]') + ?.querySelector('div[class^="visualMediaItemContainer"]') + ?.querySelector('div[class^="imageWrapper"]'); + + let image_click = null; + let image_show = null; + if (image_content) { + // 最后的图片信息 + image_click = image_content.querySelector('a').href; + image_show = image_content.querySelector('a').getAttribute("data-safe-src"); + } + res["image_click"] = image_click; + res["image_show"] = image_show; + return res; + +} + + +function MutationObserverUpdateElement(elementId) { + // 观察的节点 + let messageList = document.querySelector('li[id^="' + elementId + '"]'); + + // 观察器的配置(需要观察什么变动) + const config = { + characterData: true, + subtree: true + }; + + // 当观察到变动时执行的回调函数 + const callback = function (mutationsList, observer) { + // 判断当前节点是不是有更新 + for (let mutation of mutationsList) { + if (mutation.type === 'characterData') { + console.log(mutation) + console.log("LAITool 修改消息: " + 'The ' + mutation.attributeName + ' attribute was modified.', mutation.target); + + + // 往上找数据,开始获取数据 + let mainData = findParentNode(mutation.target); + + let res = getMessageData(mainData); + + console.log("LAITool 修改消息", res); + res.code = 1; + window.discord.UpdateMessage(JSON.stringify(res)); + + } + } + + }; + if (!window['updateObserver'][elementId]) { + window['updateObserver'][elementId] = new MutationObserver(callback) + } + + // 以上述配置开始观察目标节点 + window['updateObserver'][elementId].observe(messageList, config); +} + +// 开始监听 +function startObserving() { + // 判断当前是不是有观察器 + if (window.observer) { + return; + } + debugger + // 没有开始监听 + MutationObserverElement(); + console.log("开始监听") + return "开始监听"; +} + +/** + * 停止监听 + */ +function stopObserver() { + window.observer.disconnect(); +} + +/** + * 停止监听 + */ +function stopUpdateObserver(elementId) { + if (window['updateObserver'][elementId]) { + window['updateObserver'][elementId].disconnect(); + } +} \ No newline at end of file diff --git a/src/main/discord/discordSimple.js b/src/main/discord/discordSimple.js new file mode 100644 index 0000000..e82cfc1 --- /dev/null +++ b/src/main/discord/discordSimple.js @@ -0,0 +1,780 @@ +let fspromises = require("fs").promises; +import path from "path"; +import { define } from "../../define/define"; +import { Tools } from "../tools"; +import { once } from "events"; +import { DiscordRequestListener } from "./discordRequestLister"; +import { DEFINE_STRING } from "../../define/define_string"; + +/** + * 对DisCord窗口进行操作的方法 + */ +export class DiscordSimple { + constructor(win) { + this.win = win; + this.tools = new Tools(); + this.script = define.discordScript; + } + + + /** + * 创建discord窗口 + * @param {*} createWindow 创建的函数(其实没有必要穿) + * @returns 返回创建的窗体的示例 + */ + async CreateDiscordWindow(createWindow) { + try { + // 判断是不是打开了discord窗口 + let index = global.newWindow.findIndex((item) => item.hash == "discord"); + if (index != -1) { + return { + code: 0, + message: "已经打开了discord窗口" + } + } + // 要增加判断(可以加载到指定的界面) + // 判断是不是有MJ的对应的配置,没有的话加载到默认的界面,有的话加载到指定的界面 + let mj_config = await this.tools.getJsonFilePropertyValue(define.img_base, "mj_config", null, false); + let url = 'https://discord.com/app'; + if (mj_config && mj_config.serverID && mj_config.channelID) { + url = `https://discord.com/channels/${mj_config.serverID}/${mj_config.channelID}`; + } + let w = await createWindow("discord", null, url); + return w; + + } catch (error) { + throw error; + } + + } + + /** + * 监听界面刷新完毕事件 + */ + async WaitWindowFinishLoad(discordWindow) { + try { + async function waitForEvent(emitter, eventName, timeout) { + const eventPromise = once(emitter, eventName); + + const timeoutPromise = new Promise((_, reject) => { + const timer = setTimeout(() => { + clearTimeout(timer); + reject(new Error('Timeout Open Discord Dialog')); + }, timeout); + }); + + await Promise.race([eventPromise, timeoutPromise]); + } + + // 使用方法(监听窗口启动,如果10秒没有启动,使用代码关闭,移除队列) + await waitForEvent(discordWindow.webContents, 'did-finish-load', 10000); + return { + code: 1 + } + } catch (error) { + // 关闭窗口 + discordWindow.win.close(); + throw error; + } + } + + /** + * 初始化DisCord的配置文件 + */ + async InitData() { + if (this.mj_config) return; + // 初始化配置文件,若是没有配置文件,则创建一个配置文件 + let mj_config_default = { + serviceID: null, + channelID: null, + authorization: null, + userAgent: null + } + // 判断是不是有对应的mj的配置,没有的话就返回默认值 + let mj_config = await this.tools.getJsonFilePropertyValue(define.img_base, "mj_config", mj_config_default, false); + this.mj_config = mj_config; + } + + // 在每次输入之前获取指定的位置 + // 获取当前界面中Input的位置 + /** + * 获取当前界面中Input的位置 + */ + async GetInputPosition() { + try { + await this.InitData(); + await this.tools.delay(10000) + let result = await this.ExecuteScript(this.script, 'GetMessageInputPosition()'); + this.x = result.mouseX; + this.y = result.mouseY; + } catch (error) { + throw error; + } + } + + /** + * 封装一个执行脚本的方法 + * @param {*} scriptpath 要执行的脚本的路径 + * @param {*} funcname 执行脚本的方法名(要暴露出来) + */ + async ExecuteScript(scriptpath, funcname = "") { + try { + await this.InitData(); + // let script = await fspromises.readFile(scriptpath, 'utf-8'); + let script = ` + // @noBytecode + + /** + * 获取Discord的消息输入框,并聚焦 + * @returns 返回获取的消息输入框 + */ + function getInputFoucs() { + let selector = 'div[contenteditable="true"][class^="markup_"]'; + const inputElement = document.querySelector(selector) // as HTMLInputElement; + if (!inputElement) { + throw new Error('没有找到对应的消息输入框'); + } + inputElement.focus() + return inputElement; + } + + /** + * 获取指定 image_id 的图片 + */ + function GetGeneratedMJImageAndSplit(str) { + let res = []; + for (let i = 0; i < str.length; i++) { + const element = str[i]; + let image_id = element.image_id; + let links = document.getElementsByTagName('a'); + // 创建一个空数组来存储包含特定字符串的链接 + let result = []; + // 遍历所有的链接 + for (let i = 0; i < links.length; i++) { + // 如果链接的href属性包含特定的字符串,就把它添加到结果数组中 + if (links[i].href.includes(image_id)) { + result.push(links[i].href); + } + } + if (result.length > 0) { + res.push({ + id: element.id, + image_id: element.image_id, + result: result[0], + name: element.name + }); + } + return JSON.stringify(res); + } + } + + window['updateObserver'] = {}; + + /** + * 获取Discord的消息输入框的X,Y位置,每次输入前都要检测一下 + */ + function GetMessageInputPosition() { + try { + let inputElement = getInputFoucs(); + const rect = inputElement.getBoundingClientRect(); + // 计算鼠标点击位置(假设点击在元素中心) + const mouseX = rect.left + rect.width / 2; + const mouseY = rect.top + rect.height / 2; + sightingTelescope(mouseX, mouseY) + return { mouseX, mouseY }; + } catch (error) { + console.log(error) + throw error; + } + } + + + /** + * 瞄准镜 + */ + function sightingTelescope(x, y) { + var div = document.createElement('div'); + div.style.position = 'absolute'; + div.style.left = (x - 1) + "px"; + div.style.top = (y - 15) + "px"; + div.style.width = '30px'; + div.style.height = '30px'; + div.style.zIndex = '9999'; + div.style.border = '1px dashed green'; + div.style.color = 'green'; + div.style.textAlign = 'center'; + div.style.fontWeight = '600'; + div.style.borderRadius = '50%'; + div.style.fontSize = '30px'; + div.textContent = '+'; + document.body.appendChild(div); + setTimeout(function () { + div.parentNode.removeChild(div); + }, 3000); + } + + /** + * 判断discord中的输入框中是不是有数据直接返回 + * 有数据返回true,无数据返回false + */ + function GetMessageInputValue() { + let inputElement = getInputFoucs(); + // 判断是不是为空 + let emptyElement = inputElement.querySelector('span[class^="emptyText_"]'); + if (emptyElement) { + return false; + } else { + return true; + + } + } + + /** + * 监听指定的元素 + */ + function MutationObserverElement() { + // 观察的节点 + let messageList = document.querySelector('ol[class^="scrollerInner_"][data-list-id^="chat-message"]'); + + // 观察器的配置(需要观察什么变动) + const config = { childList: true, subtree: true }; + + // 当观察到变动时执行的回调函数 + const callback = function (mutationsList, observer) { + for (let mutation of mutationsList) { + if (mutation.type === 'childList') { + if (mutation.addedNodes.length) { + // 判断当前此修改是不是包含发送的消息 + for (let i = 0; i < mutation.addedNodes.length; i++) { + const element = mutation.addedNodes[i]; + let id = element.id; + if (id && id.includes('chat-messages-')) { + let data = {}; + let id_arr = id.split('-'); + data["message_id"] = id_arr[id_arr.length - 1]; + data["channel_id"] = id_arr[id_arr.length - 2]; + data["tiamspan"] = new Date().getTime(); + + // 获取消息的ID + let data_list = element.querySelector('div[data-list-item-id^="chat-messages"]'); + if (!data_list) { + return; + } + // 判断下面是不是有数据 + + let content_data = data_list.querySelector('div[class^="contents_"]')?.querySelector('div[id^="message-content"]'); + + if (!content_data) { + return; + } + // 判断下面是不是有元素 + let has_data = content_data.hasChildNodes(); + + // 找到之后,再重新找节点,创建数据 + let mainCurrentNode = { + "currentNode": data_list, + "firstNode": content_data + } + + let res = getMessageData(mainCurrentNode); + for (let d in res) { + data[d] = res[d]; + } + + // 对应的元素存在,就是一个新消息 返回 + if (!has_data) { + console.log("LAItool 新增消息", element) + data.code = 1; + window.discord.CreateMessage(JSON.stringify(data)) + MutationObserverUpdateElement(id) + } else { + // 判断下面是不是有 + let wrapper = content_data.querySelector('div[class^="wrapper"]'); + // 判断下面是不是strong元素 + let strong = content_data.querySelector('strong'); + + if (!wrapper && strong) { + console.log("LAItool 新增消息", element); + data.code = 1; + window.discord.CreateMessage(JSON.stringify(data)) + MutationObserverUpdateElement(id); + } + } + } + } + } + if (mutation.removedNodes.length) { + // 判断当前此修改是不是包含发送的消息 + for (let i = 0; i < mutation.removedNodes.length; i++) { + const element = mutation.removedNodes[i]; + let id = element.id; + if (id && id.includes('chat-messages-')) { + let data = {}; + let id_arr = id.split('-'); + data["message_id"] = id_arr[id_arr.length - 1]; + data["channel_id"] = id_arr[id_arr.length - 2]; + data["tiamspan"] = new Date().getTime(); + + // 获取消息的ID + let data_list = element.querySelector('div[data-list-item-id^="chat-messages"]'); + if (!data_list) { + return; + } + // 判断下面是不是有数据 + + let content_data = data_list.querySelector('div[class^="contents_"]')?.querySelector('div[id^="message-content"]'); + + if (!content_data) { + return; + } + // 判断下面是不是有元素 + let has_data = content_data.hasChildNodes(); + + // 找到之后,再重新找节点,创建数据 + let mainCurrentNode = { + "currentNode": data_list, + "firstNode": content_data + } + + let res = getMessageData(mainCurrentNode); + for (let d in res) { + data[d] = res[d]; + } + + // 对应的元素存在,就是一个新消息 返回 + if (!has_data) { + console.log("LAItool 删除消息", element) + + // MutationObserverUpdateElement(id) + data.code = 1; + window.discord.DeleteMessage(JSON.stringify(data)) + + stopUpdateObserver(id) + } else { + // 判断下面是不是有 + let wrapper = content_data.querySelector('div[class^="wrapper"]'); + // 判断下面是不是strong元素 + let strong = content_data.querySelector('strong'); + + if (!wrapper && strong) { + console.log("LAItool 删除消息", element) + data.code = 1; + window.discord.DeleteMessage(JSON.stringify(data)) + stopUpdateObserver(id); + } + } + } + } + } + } + } + }; + + // 创建一个观察器实例并传入回调函数 + window.observer = new MutationObserver(callback); + + // 以上述配置开始观察目标节点 + window.observer.observe(messageList, config); + } + + + // 往上找到指定的标签 + function findParentNode(startNode) { + let data = {}; + let currentNode = startNode; + + while (currentNode !== null) { + + if (!data["currentNode"] && currentNode.id && currentNode.id.startsWith('message-content')) { + data["firstNode"] = currentNode; + } + + if (currentNode.getAttribute && currentNode.getAttribute('data-list-item-id') && currentNode.getAttribute('data-list-item-id').startsWith('chat-messages')) { + data["currentNode"] = currentNode; + return data; + } + currentNode = currentNode.parentNode; + } + + return data; + } + + function gatherNodeData(node) { + let result = node.textContent || ''; // 获取当前节点的文本内容 + return result; + // 遍历所有子节点 + } + + // 获取一个数据的当前消息的数据 + function getMessageData(mainData) { + if (!mainData["currentNode"]) { + window.discord.UpdateMessage(JSON.stringify({ code: 0, message: "没有找到对应的消息" })) + return; + } + // 获取当前的消息ID + + let res = {}; + + let data_arr = mainData["currentNode"].getAttribute('data-list-item-id')?.split('-'); + let message_id = data_arr[data_arr.length - 1]; + let channel_id = data_arr[data_arr.length - 2]; + res["message_id"] = message_id; + res["channel_id"] = channel_id; + + // 判断是不是又违规的消息 + let text = mainData["currentNode"].textContent.toLowerCase().includes("Banned prompt detected"); + + + if (text) { + res["error"] = "Banned prompt detected"; + res.code = 1; + window.discord.UpdateMessage(JSON.stringify(res)) + } + + // 获取提示词相关的数据 + // 开始拼接提示词数据 + let message_prompt = null; + if (!mainData["firstNode"]) { + message_prompt = null; + } else { + message_prompt = gatherNodeData(mainData["firstNode"]); + } + res["message_prompt"] = message_prompt; + + // 判断是不是有图片信息 + let image_content = mainData["currentNode"].querySelector('div[id^="message-accessories-' + message_id + '"]') + ?.querySelector('div[class^="visualMediaItemContainer"]') + ?.querySelector('div[class^="imageWrapper"]'); + + let image_click = null; + let image_show = null; + if (image_content) { + // 最后的图片信息 + image_click = image_content.querySelector('a').href; + image_show = image_content.querySelector('a').getAttribute("data-safe-src"); + } + res["image_click"] = image_click; + res["image_show"] = image_show; + return res; + + } + + + function MutationObserverUpdateElement(elementId) { + // 观察的节点 + let messageList = document.querySelector('li[id^="' + elementId + '"]'); + + // 观察器的配置(需要观察什么变动) + const config = { + characterData: true, + subtree: true + }; + + // 当观察到变动时执行的回调函数 + const callback = function (mutationsList, observer) { + // 判断当前节点是不是有更新 + for (let mutation of mutationsList) { + if (mutation.type === 'characterData') { + console.log(mutation) + console.log("LAITool 修改消息: " + 'The ' + mutation.attributeName + ' attribute was modified.', mutation.target); + + + // 往上找数据,开始获取数据 + let mainData = findParentNode(mutation.target); + + let res = getMessageData(mainData); + + console.log("LAITool 修改消息", res); + res.code = 1; + window.discord.UpdateMessage(JSON.stringify(res)); + + } + } + + }; + if (!window['updateObserver'][elementId]) { + window['updateObserver'][elementId] = new MutationObserver(callback) + } + + // 以上述配置开始观察目标节点 + window['updateObserver'][elementId].observe(messageList, config); + } + + // 开始监听 + function startObserving() { + // 判断当前是不是有观察器 + if (window.observer) { + return; + } + debugger + // 没有开始监听 + MutationObserverElement(); + console.log("开始监听") + return "开始监听"; + } + + /** + * 停止监听 + */ + function stopObserver() { + window.observer.disconnect(); + } + + /** + * 停止监听 + */ + function stopUpdateObserver(elementId) { + if (window['updateObserver'][elementId]) { + window['updateObserver'][elementId].disconnect(); + } + } + `; + this.win.webContents.focus(); + let result = await this.win.webContents.executeJavaScript(`${script}\n${funcname}`); + return result; + } catch (error) { + throw error; + } + } + + /** + * 每句提示词输入之前,删除现在的数据 + */ + async onDelete() { + await this.InitData(); + // 执行脚本判断是不是又数据,有的话删除数据 + let res = await this.ExecuteScript(this.script, "GetMessageInputValue()") + // 有数据,删除 + if (res) { + // 发送全选事件 + this.win.webContents.sendInputEvent({ type: 'keyDown', keyCode: 'A', modifiers: ['Control'] }); + this.win.webContents.sendInputEvent({ type: 'keyUp', keyCode: 'A', modifiers: ['Control'] }); + await this.tools.delay(300) // 等待全选完成 + // 发送删除事件 + this.win.webContents.sendInputEvent({ type: 'keyDown', keyCode: 'Delete' }); + this.win.webContents.sendInputEvent({ type: 'keyUp', keyCode: 'Delete' }); + // 判断是不是被删除 + do { + await this.tools.delay(300); + res = await this.ExecuteScript(this.script, "GetMessageInputValue()") + } + while (res); + } + } + + + /** + * 将提示词写入到指定的input中(一句) + * @param {*} prompt + */ + async WritePromptToInput(prompt) { + try { + await this.InitData(); + + await this.GetInputPosition(); + + // 判断当前的输入框中是不是又数据,又的话删除数据 + await this.onDelete(); + + // 当前选择的机器人命令 + let command = "/imagine"; + // 循环写入数据 + for (let i = 0; i < command.length; i++) { + const key = command[i]; + let simpleWait = Math.floor(Math.random() * (150)); + await this.tools.delay(simpleWait) + + this.win.webContents.sendInputEvent({ type: 'char', keyCode: key }); + } + let simpleWait = Math.floor(Math.random() * (5000)) + 1000; + await this.tools.delay(simpleWait) + // 写完之后,执行enter + this.win.webContents.sendInputEvent({ type: 'keyDown', keyCode: 'Enter' });; + + + // 循环写入数据 + for (let i = 0; i < prompt.length; i++) { + const key = prompt[i]; + if (key == "") { + let spaceTime = Math.floor(Math.random() * (500 - 100)) + 100; + await this.tools.delay(spaceTime) + } else { + let simpleWait = Math.floor(Math.random() * (150)); + await this.tools.delay(simpleWait) + } + + this.win.webContents.sendInputEvent({ type: 'char', keyCode: key }); + + } + // 执行命令 + let res = await this.ExecuteScript(this.script, 'startObserving()'); + console.log(res); + + simpleWait = Math.floor(Math.random() * (1000)); + await this.tools.delay(simpleWait) + + // + // 写完之后,执行enter + this.win.webContents.sendInputEvent({ type: 'keyDown', keyCode: 'Enter' }); + this.win.webContents.sendInputEvent({ type: 'keyUp', keyCode: 'Enter' }); + + // 开始监听网络请求 + + } catch (error) { + throw error; + } + + } + + sendChangeMessage(data) { + global.newWindow[0].win.webContents.send(DEFINE_STRING.DISCORD.MAIN_DISCORD_MESSAGE_CHANGE, data); + } + + /** + * discord创建消息,并更新数据 + * @param {*} Value + */ + async DiscordCreateMessage(value) { + try { + value = JSON.parse(value); + + let currentCreateItem = global.mjGenerateQuene.getCurrentCreateItem(); + console.log("LAITOOL 创建数据: ", value); + value.type = "created" + + // 判断是不是是不是错误数据 + if (value.error) { + // 先移除任务 + global.mjGenerateQuene.removeTaskProgress((taskProgress) => { + return taskProgress.filter(item => item?.message_id != value.message_id); + }) + + // 在将当前任务设置为空 + global.mjGenerateQuene.setCurrentCreateItem(null); + // 开始下一个任务 + global.mjGenerateQuene.startNextTask(); + } + + + // 判断当前是不是有提示词 + if ((value.image_click == null || value.image_click == "") && (value.image_show == null || value.image_show == "") && value.message_prompt == "") { + return; + } + + // 这是一个生成完成了(通过图片ID判断) + if ((value.image_click != null && value.image_click != '') && value.message_prompt != "") { + // 获取图片的ID + let image_regex = /([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})/i; + let image_match = value.image_click.match(image_regex); + + if (image_match) { + value["image_id"] = image_match[1]; + } + + let image_path = path.join(global.config.project_path, `data\\MJOriginalImage\\${value.image_id}.png`); + + // 这边开始下载对应的图片 + await this.tools.downloadFileUrl(value.image_click, image_path); + + value["image_path"] = image_path; + // 注意这边要移除掉id + value.id = null; + value.type = "finished" + } else { + if (currentCreateItem) { + currentCreateItem["message_id"] = value.message_id; + // 修改数据 + global.mjGenerateQuene.setCurrentCreateItem(currentCreateItem); + // let currentCreateItem = { id: "6075f067-d824-45a4-9213-86e8f254cfd9" }; + value.id = currentCreateItem.id + } + } + + // 获取获取 + this.sendChangeMessage(value) + + // 创建或者是完成之后,开始下一个任务。 + + // 判断是不是创建(创建的话直接判断) + // 获取正在执行的任务,自己保存的,不是设置的。现在正在后台执行的mj任务 + // 如果是创建。创建成功,直接删除当前数据 + if (value.type == "created") { + global.mjGenerateQuene.setCurrentCreateItem(null); + } + + global.mjGenerateQuene.startNextTask(); + + } catch (error) { + this.sendChangeMessage({ + code: 0, + message: "MJ创建消息保存失败: " + error.toString() + }) + } + } + + /** + * 监听discord的更新消息。并修改数据 + * @param {*} value + */ + async DiscordUpdateMessage(value) { + try { + value = JSON.parse(value); + // 接收到discord的消息 + console.log("LAITOOL 更新数据: ", value); + value.type = "updated"; + + // 更新的时候,修改数据(判断是不是有进度) + let regex = /\((\d+)%\)/; + let match = value["message_prompt"].match(regex); + if (match) { + value.progress = parseInt(match[1]); + } + // 判断是不是又图片,有的话。固定图片ID,并且只固定一次(前端固定吧) + if (value.image_click) { + let image_regex = /([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})/i; + let image_match = value.image_click.match(image_regex); + + if (image_match) { + value["image_id"] = image_match[1]; + } + } + this.sendChangeMessage(value) + + } catch (error) { + this.sendChangeMessage({ + code: 0, + message: "MJ更新消息保存失败: " + error.toString() + }) + } + } + + /** + * 监听discord的删除消息。并修改数据 + * @param {*} value + */ + async DiscordDeleteMessage(value) { + try { + value = JSON.parse(value) + if (value['image_click'] == null && value['image_show'] == null && value['message_prompt'] == "") { + return; + } + console.log("LAITOOL 删除数据: ", value) + value.type = "delete" + this.sendChangeMessage(value) + + // 这边可能要做判断(判断是不是开启下一个) + + // 删除当前消息ID对应的历史任务(传入一个构造函数,函数的参数是当前所有的历史任务) + global.mjGenerateQuene.removeTaskProgress((taskProgress) => { + return taskProgress.filter(item => item?.message_id != value.message_id); + }) + + + } catch (error) { + this.sendChangeMessage({ + code: 0, + message: 'MJ删除数据保存失败 :' + error.toString() + }) + } + } +} \ No newline at end of file diff --git a/src/main/discord/discordWorker.js b/src/main/discord/discordWorker.js new file mode 100644 index 0000000..810fecb --- /dev/null +++ b/src/main/discord/discordWorker.js @@ -0,0 +1,85 @@ +import { DiscordSimple } from "./discordSimple"; +import { Tools } from "../tools"; +import { define } from "../../define/define"; + +/** + * discord中的一些公用的方法 + */ +export class DiscordWorker { + constructor() { + this.tools = new Tools(); + } + + /** + * 初始化DisCord的配置文件 + */ + async InitData() { + if (this.mj_config) return; + // 初始化配置文件,若是没有配置文件,则创建一个配置文件 + let mj_config_default = { + serviceID: null, + channelID: null, + authorization: null, + userAgent: null + } + // 判断是不是有对应的mj的配置,没有的话就返回默认值 + let mj_config = await this.tools.getJsonFilePropertyValue(define.img_base, "mj_config", mj_config_default, false); + this.mj_config = mj_config; + } + + /** + * 通过hash判断指定的窗口是不是开启 + * @param {*} hash 指定界面的hash + * @returns true/false + */ + CheckDiscordWindowIsOpen(hash) { + try { + let index = global.newWindow.findIndex(item => item.hash === hash); + if (index == -1) { + return null; + } else { + return global.newWindow[index].win + } + } catch (error) { + throw error; + } + } + + // 判断当前的Doscord界面是不是开启,没有开启的话开启并加载到设置指定的界面 + async CheckDiscordWindowIsOpenAndLoad() { + try { + let discordW = this.CheckDiscordWindowIsOpen('discord'); + if (!discordW) { + // 自动打开窗口(调用方法) + let mainSimple = new DiscordSimple(global.newWindow[0].win); + discordW = await mainSimple.CreateDiscordWindow(global.createWindow); + //等待窗口加载完毕(接收消息-一直阻塞) + await mainSimple.WaitWindowFinishLoad(discordW); + } + // 切换到指定的界面 + // 获取当前配置serverID和channelID是不是当前界面是一样的 + + await this.InitData(); + + let url = discordW.webContents.getURL(); + const regex = /\/channels\/(\d+)\/(\d+)/; + const match = url.match(regex); + let serviceID = null; + let channelID = null; + if (match && match[1] && match[2]) { + serviceID = match[1]; + channelID = match[2]; + } + if (!(serviceID && channelID && this.mj_config.serviceID === serviceID && this.mj_config.channelID === channelID)) { + // 重新加载url + // 重新拼接url + await discordW.webContents.loadURL(`https://discord.com/channels/${this.mj_config.serviceID}/${this.mj_config.channelID}`) + // 等待界面加载完毕 + } + return discordW; + } catch (error) { + throw error; + } + } + +} \ No newline at end of file diff --git a/src/main/discord/mjSimple.js b/src/main/discord/mjSimple.js new file mode 100644 index 0000000..e2da33b --- /dev/null +++ b/src/main/discord/mjSimple.js @@ -0,0 +1,199 @@ +let path = require('path'); +import { Tools } from "../tools"; +import { DiscordAPI } from "./discordApi"; +import { MjSetting } from "../../define/setting/mjSetting"; +import { DynamicSetting } from "../../define/setting/dynamicSetting"; +import { AwesomeHelp } from "awesome-js" + +export class MjSimple { + constructor(global) { + this.global = global; + this.tools = new Tools(); + this.mjSetting = new MjSetting(global); + this.dynamicSetting = new DynamicSetting(global); + } + + /** + * 保存文案的基础信息 + * @param {*} value 参数信息 + * @returns + */ + async SvaeMJWordSrt(value) { + try { + let mj_config = path.join(this.global.config.project_path, "scripts/mj_config.json"); + await this.tools.checkJsonFileExistsOrCreate(mj_config); + this.tools.writeJsonFilePropertyValue(path.join(this.global.config.project_path, "scripts/mj_config.json"), value[1], value[0], false); + return { + code: 1, + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + // 获取MJ配置的字幕信息 + async GetMJConfigSrtInformation() { + try { + let mj_config = path.join(this.global.config.project_path, "scripts/mj_config.json"); + let res = await this.tools.getJsonFilePropertyValue(mj_config, "srt_time_information", [], false); + return { + code: 1, + data: res + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + // 获取频道机器人 + async GetChannelRobots(value) { + // let + try { + value = JSON.parse(value); + let discordAPI = new DiscordAPI(value); + let res = await discordAPI.getBotList(); + + + } catch (error) { + return { + code: 0, + message: "获取频道机器人失败, 错误信息如下:" + error.toString() + } + } + } + + // 获取MJ生图的方式 + async GetMJGenerateCategory() { + return this.mjSetting.GetMJGenerateCategory(); + } + + // 保存MJ敏感词 + async AddMJBadPrompt(value) { + try { + await this.dynamicSetting.saveDataByTypeAndProperty(value, "mj", "bad_prompt", (data) => { + // 判断当前数据在默认的敏感词数据中是不是存在。 + let default_bad_prompt = this.mjSetting.GetMJBadPrompt().data; + let index = default_bad_prompt.findIndex(item => item.value.toLowerCase() == value.value.toLowerCase()); + if (index >= 0) { + throw new Error("当前敏感词已存在默认的敏感词中"); + } + // 在判断当前数据在自定义的数据中是不是存在 + index = data.findIndex(item => item.value.toLowerCase() == value.value.toLowerCase()); + if (index >= 0) { + throw new Error("当前敏感词已存在自定义的敏感词中"); + } + + }); + return { + code: 1, + message: "添加铭感词成功" + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + // 获取MJ所有的敏感词 + async GetMJBadPrompt() { + try { + let default_bad_prompt = this.mjSetting.GetMJBadPrompt().data; + let data = await this.dynamicSetting.getDataByTypeAndProperty("all", 'mj', 'bad_prompt', default_bad_prompt, []); + return { + code: 1, + data: data + } + } catch (error) { + return { + code: 0, + message: "获取敏感词失败, 错误信息如下:" + error.toString() + } + } + } + + /** + * 检查当前出入数据所有的敏感词 + * @param {*} data + * @returns + */ + async MJBadPromptCheck(data) { + try { + data = JSON.parse(data); + // 获取所有的敏感词 + let bad_prompts = await this.GetMJBadPrompt(); + if (bad_prompts.code == 0) { + throw new Error(bad_prompts.message); + } + bad_prompts = bad_prompts.data.data; + let bad_prompts_string = []; + for (let i = 0; i < bad_prompts.length; i++) { + const element = bad_prompts[i]; + bad_prompts_string.push(element.value); + } + let bad_prompt_ids = []; + + let badPromptMap = AwesomeHelp.makeSensitiveMap(bad_prompts_string); + + for (let i = 0; i < data.length; i++) { + const element = data[i]; + let prompt = element.prompt; + if (!prompt || prompt == "") { + continue; + } + // 判断是不是存在敏感词 + let res = AwesomeHelp.checkSensitiveWord(prompt.toLowerCase(), false, badPromptMap); + + // 输出Map中的所有的key字符串 + console.log(badPromptMap.keys()); + // 判断当前数据的位置 + for (let [key, value] of res.entries()) { + let ket_length = key.length; + + for (let j = 0; j < value.length; j++) { + const item = value[j]; + let location = item.location; + + // 判断执行位置之前是不是空格或者是, + let start = location - 1; + let end = location + ket_length; + let start_check = prompt.toLowerCase()[start] == ' ' || prompt.toLowerCase()[start] == ','; + let end_check = prompt.toLowerCase()[end] == ' ' || prompt.toLowerCase()[end] == ','; + if (start_check && end_check) { + // 这个位置是敏感词 + bad_prompt_ids.push({ + id: element.id, + no: element.no + }); + } + } + } + + console.log(res); + + + } + + console.log(bad_prompt_ids) + return { + code: 1, + data: bad_prompt_ids + } + + + } catch (error) { + return { + code: 0, + message: "检查敏感词失败, 错误信息如下:" + error.toString() + } + } + } + +} \ No newline at end of file diff --git a/src/main/func.js b/src/main/func.js new file mode 100644 index 0000000..b552748 --- /dev/null +++ b/src/main/func.js @@ -0,0 +1,1122 @@ +const fspromises = require("fs").promises; +const { clipboard, shell, ipcRenderer } = require('electron'); +const sharp = require('sharp'); +const path = require("path"); +const util = require('util'); +const { spawn, exec } = require('child_process'); +const execAsync = util.promisify(exec); +const { v4: uuidv4 } = require('uuid'); // 引入UUID库来生成唯一标识符 +const EventEmitter = require('events'); +import { define } from "../define/define"; +import axios from "axios"; +const { machineId } = require('node-machine-id') +import { DEFINE_STRING } from "../define/define_string"; +import { ClipDraft } from "./Public/clipDraft"; +import { Tools } from "./tools"; +import { PublicMethod } from "./Public/publicMethod" +import { ImageStyleDefine } from "../define/iamgeStyleDefine"; +let tools = new Tools(); +let pm = new PublicMethod(global); + +/** + * 获取对应的轨道 + */ +function find_draft_node(nodes, type, value) { + for (let index = 0; index < nodes.length; index++) { + let node = nodes[index]; + if (node[type] == value) { + return node + } + } +} + +/** + * 判断文件夹是不是存在 + * @param {文件夹地址} folderPath + * @returns true/false + */ +async function isDirectory(folderPath) { + try { + const stats = await fspromises.stat(folderPath); + return stats.isDirectory(); + } catch (error) { + if (error.code === 'ENOENT') { + return false; + } + throw error; + } +} + +/** + * 保存新的字幕 + * @param {洗稿后的值} value + */ +async function SaveNewWord(value) { + let new_txt = path.join(global.config.project_path, "new_word.txt") + // 写到一个新的txt文件里面 + let dataString = await tools.writeArrayToFile(value, new_txt); + clipboard.writeText(dataString); + return { + code: 1 + } +} + +/** + * 提取草稿中的温馨提示,全部提取直接用 + * @param {} value + */ +async function GetDraftFriendlyReminder(value) { + try { + // console.log(value); + let draft_content_json_path = path.join(global.config.draft_path, `${value[0]}/draft_content.json`); + let old_friendly_reminder_json = await getClipSetting("friendly_reminder_setting"); + // 判断当前的名称是不是存在 + if (old_friendly_reminder_json.code == 0) { + throw new Error(old_friendly_reminder_json.message) + } + let filter_value = old_friendly_reminder_json.value.filter(item => item.name == value[1]); + if (filter_value.length > 0) { + return { + code: 0, + message: "名字重复" + } + } + // 开始提取 + let draft_json = JSON.parse(await fspromises.readFile(draft_content_json_path)); + // console.log(draft_json) + let material_animations = draft_json.materials.material_animations[0]; + let texts = draft_json.materials.texts[0]; + let tracks = draft_json.tracks[1]; + let text_value = JSON.parse(texts.content).text; + let obj = { + id: uuidv4(), + name: value[1], + material_animations, + texts, + tracks, + text_value: text_value + } + // console.log(obj) + // 开始写入 + let clip_setting_json = JSON.parse(await fspromises.readFile(define.clip_setting)); + clip_setting_json.friendly_reminder_setting.push(obj); + await fspromises.writeFile(define.clip_setting, JSON.stringify(clip_setting_json)); + return { + code: 1 + } + } catch (error) { + throw new Error(error); + } + +} + +/** + * 执行单张重绘的任务 + * @param {执行操作的window} window + * @param {传入的值} value + * @returns + */ +async function ReGenerateImageOne(window, value) { + // console.log(value) + // 将任务加入队列 + + let sd_setting = JSON.parse(await fspromises.readFile(define.sd_setting, 'utf-8')); + global.requestQuene.enqueue(async () => { + let id = value[1].id; + try { + // 请求一次 + let headers = { "Accept": "application/json", "Content-Type": "application/json" }; + let image_path = value[1].image; + let json_path = path.join(path.dirname(path.dirname(image_path)), "input_crop/" + value[1].name + ".json"); + let json = JSON.parse(await fspromises.readFile(json_path, 'utf-8')); + + let tmp_image_path = image_path.split(".png")[0] + "_tmp.png"; + + let image_styles = await ImageStyleDefine.getImageStyleStringByIds(value[1].image_style_list ? value[1].image_style_list : []); + + let prompt = image_styles; + // 拼接提示词 + if (value[1].image_style != null) { + prompt += `((${value[1].image_style})),`; + } + if (value[1].lora != null) { + prompt += `${value[1].lora},`; + } + prompt += value[1].prompt; + let model = value[1].model; + + // 判断当前是不是有开修脸修手 + let ADetailer = { + args: sd_setting.adetailer + }; + // 判断请求的模式 + if (model == "img2img") { + let web_api = global.config.webui_api_url + 'sdapi/v1/img2img' + let sd_config = json["webui_config"]; + sd_config["seed"] = -1 + // 拼接后的提示词 + sd_config.prompt = prompt; + let init_image = sd_config.init_images; + let im = await fspromises.readFile(init_image, 'binary'); + + sd_config.init_images = [new Buffer.from(im, 'binary').toString('base64')]; + + sd_config.denoising_strength = value[1].denoising_strength; + + if (value[1].adetailer) { + let ta = { + ADetailer: ADetailer + } + sd_config.alwayson_scripts = ta; + } + sd_config.height = sd_setting.webui.height; + sd_config.width = sd_setting.webui.width; + + const response = await axios.post(web_api, sd_config); + // console.log(response); + + // 目前是单图出图 + let images = response.data.images; + let imageData = Buffer.from(images[0].split(",", 1)[0], 'base64'); + sharp(imageData) + .toFile(tmp_image_path) + .then(async () => { + // console.log("图生图成功" + image_path); + await tools.deletePngAndDeleteExifData(tmp_image_path, image_path); + window[0].win.webContents.send(DEFINE_STRING.REGENERATE_IMAGE_RETUN, { id, code: 1, type: value[2] }); + }) + .catch(err => { + throw new Error(err); + }); + + } else if (model == "txt2img") { + let body = { + "prompt": prompt, + "negative_prompt": value[1].negative_prompt, + "seed": -1, + "sampler_name": value[1].sampler_name, + // 提示词相关性 + "cfg_scale": json.webui_config.cfg_scale, + "width": sd_setting.webui.width, + "height": sd_setting.webui.height, + "batch_size": 1, + "n_iter": 1, + "steps": json.webui_config.steps, + "save_images": false, + } + let web_api = global.config.webui_api_url + 'sdapi/v1/txt2img' + if (value[1].adetailer) { + let ta = { + ADetailer: ADetailer + } + body.alwayson_scripts = ta; + } + const response = await axios.post(web_api, body); + // console.log(response); + + // 目前是单图出图 + let images = response.data.images; + let imageData = Buffer.from(images[0].split(",", 1)[0], 'base64'); + sharp(imageData) + .toFile(tmp_image_path) + .then(async () => { + // // console.log("生图成功" + image_path); + await tools.deletePngAndDeleteExifData(tmp_image_path, image_path); + window[0].win.webContents.send(DEFINE_STRING.REGENERATE_IMAGE_RETUN, { id, code: 1, type: value[2] }); + }) + .catch(err => { + throw new Error(err); + }); + + } else { + throw new Error("SD 模式错误"); + } + } catch (error) { + window[0].win.webContents.send(DEFINE_STRING.REGENERATE_IMAGE_RETUN, { + id, + code: 0, + type: value[2], + message: `Error Message ${error}` + }); + return; + } + }, value[1].id, DEFINE_STRING.QUEUE_BATCH.SD_BACKSTEP_GENERATE_IMAGE) + return { + code: 1, + message: "加入队列成功" + } +} + +/** + * 添加草稿 + * @param {*} value + */ +async function addDraft(value) { + try { + let clip = new ClipDraft(global, value); + let res = await clip.addDraft(); + + return res; + } catch (error) { + return { + code: 0, + message: `An error occurred: ${error}` + } + } +} + +/** + * + * @returns 返回获取的字体样式的列表 + */ +async function getClipSetting(style_name) { + try { + let clip_setting = JSON.parse(await fspromises.readFile(define.clip_setting)); + return { + code: 1, + value: clip_setting[style_name] + } + } catch (error) { + return { + code: 0, + message: `Error message ${error, toString()}` + } + } +} + +/** + * 获取剪映的草稿字体设置 + * @param {传入草稿文件夹} value + * @returns 返回样式字符串 + */ +async function getDraftTextStyle(value) { + let draft_path = path.join(global.config.draft_path, value[1].toString()); + + try { + // 判断当前的名字是不是存在 + let name = value[0]; + // 直接保存 + let clip_setting = await fspromises.readFile(define.clip_setting); + let clip_setting_json = JSON.parse(clip_setting); + let exist_style = clip_setting_json.text_style; + let isExist = false; + exist_style.forEach(item => { + if (item.name == name) { + isExist = true; + } + }); + if (isExist) { + return { + code: 0, + message: "预设样式名称已存在" + } + } + + + let draft_config = JSON.parse(await fspromises.readFile(path.join(draft_path, 'draft_content.json'))); + let text = draft_config.materials.texts[0] + let content = text.content; + let text_json = JSON.parse(content); + let style = text_json.styles; + let srt_node = find_draft_node(draft_config.tracks, "type", "text").segments[0]; + let clip = srt_node.clip; + + let obj = { + name: value[0], + id: uuidv4(), + style, + font_size: text.font_size, + fonts: text.fonts.length > 0 ? text.fonts[0].title : "", + style_name: text.style_name, + clip, + ratio: draft_config.canvas_config.ratio + } + let text_style = clip_setting_json.text_style; + text_style.push(obj); + await fspromises.writeFile(define.clip_setting, JSON.stringify(clip_setting_json)); + + return { + code: 1, + } + } catch (error) { + return { + code: 0, + message: `Error message ${error.toString()}` + + } + } + return; +} + + +/** + * 文案对齐 + * @param {分镜的数据} value + */ +async function alginDraftImgToText(value) { + let draft_path = path.join(global.config.draft_path, value[0]); + let text_value = value[1]; + + try { + // 读取草稿 + let draft_config = await fspromises.readFile(path.join(draft_path, 'draft_content.json')); + // 获取字幕轨道 + let draft_config_json = JSON.parse(draft_config); + + // 所有的字幕轨道里面的数据,读取出来 + // 循环的时候,判断当前字幕是不是在第一行 + let srt_nodes = find_draft_node(draft_config_json.tracks, "type", "text").segments; + let img_nodes = find_draft_node(draft_config_json.tracks, "type", "video").segments; + + let srt_list = []; + let srt_obj = null + let new_srt_list = [] + let text_count = 0; + for (let i = 0; i < srt_nodes.length;) { + const element = srt_nodes[i]; + let material_id = element.material_id; + // 获取字幕内容,里面包含样式和内容 + let srt_content = JSON.parse(find_draft_node(draft_config_json.materials.texts, "id", material_id).content); + let srt_value = srt_content.text; + // console.log(srt_value) + let start_time = element.target_timerange.start; + let end_time = element.target_timerange.start + element.target_timerange.duration; + let obj = { + start_time, + end_time, + srt_value + }; + + // 判断当前字幕是不是在当前句 + if (tools.removePunctuationIncludingEllipsis(value[1][text_count]).includes(tools.removePunctuationIncludingEllipsis(srt_value))) { + if (srt_obj == null) { + srt_obj = {} + srt_obj.start_time = start_time; + srt_obj.value = srt_value; + } + else { + srt_obj.value = srt_obj.value + srt_value; + } + srt_list.push(obj); + i++; + } else { + srt_obj.end_time = srt_list[srt_list.length - 1].end_time; + text_count++; + new_srt_list.push(srt_obj) + srt_obj = null; + } + } + // 最后要和音频对齐 + srt_obj.end_time = srt_list[srt_list.length - 1].end_time + let audio_nodes = find_draft_node(draft_config_json.tracks, "type", "audio"); + if (audio_nodes != null) { + let endTime = audio_nodes.segments[0].target_timerange.duration; + srt_obj.end_time = endTime; + } + new_srt_list.push(srt_obj) + + // 开始对齐 + for (let i = 0; i < new_srt_list.length; i++) { + if (img_nodes.length < i) { + break; + } + if (i == 96) { + + } + const element = new_srt_list[i]; + let duration = 0; + if (i + 1 < new_srt_list.length) { + duration = new_srt_list[i + 1].start_time - element.start_time - 1; + } else { + duration = element.end_time - element.start_time; + } + img_nodes[i].source_timerange.duration = duration; + img_nodes[i].target_timerange.duration = duration; + img_nodes[i].target_timerange.start = element.start_time; + } + + + let draft_config_string = JSON.stringify(draft_config_json); + await fspromises.writeFile(path.join(draft_path, 'draft_content.json'), draft_config_string); + return { + code: 1 + } + } catch (error) { + // console.log(error) + return define.error = { + code: 0, + message: `error message ${error}` + } + } + +} + +let pyrunner; + +function createPythonRunner(mainWindow, define) { + if (!pyrunner) { + pyrunner = new func.PythonRunner(mainWindow, define); + } + return pyrunner; +} + +/** + * 执行剪映图片对齐脚本 + */ +function alignDraftImage(mainWindow, value) { + pyrunner = createPythonRunner(mainWindow, define); + let draft_path = path.join(global.config.draft_path, value) + pyrunner.runScript(path.join(define.scripts_path, "03_align_draft_image.py"), [draft_path]) +} + +/** + * 抽取关键帧 + * @param {窗口} mainWindow + * @param {数组,第一个值为剪映草稿位置,第二个值为,输出目录} value + */ +async function getFrame(value) { + try { + // let scriptPath = path.join(define.scripts_path, '00_clip.py'); + // // 执行生成图片的脚本 + // let script = `cd ${define.scripts_path} && python ${scriptPath} "${project_config_path}"`; + let draft_path = path.join(global.config.draft_path, value[0]).replaceAll("\\", "/"); + let out_dir = path.join(value[1]).replaceAll("\\", "/") + let package_path = define.package_path.replaceAll("\\", "/"); + // let command = `${path.join(define.scripts_path, "05_getgrame.exe")} "${draft_path}" "${out_dir}" "${package_path}"` + let command = `"${path.join(define.scripts_path, "Lai.exe")}" -k "${draft_path}" "${out_dir}" "${package_path}"` + const output = await execAsync(command, { maxBuffer: 1024 * 1024 * 10, encoding: 'utf-8' }); + global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 1, + message: "剪映关键帧抽取成功" + }) + return { + code: 1, + message: output.stdout + } + } catch (error) { + global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 0, + message: error.toString() + }) + return { + code: 0, + message: error.toString() + } + } +} + +/** + * 反推调用脚本的方法 + * @param {调用的窗口} win + */ +async function PushBackPrompt() { + try { + let py_path = path.join(define.scripts_path, "Lai.exe"); + let sd_config_path = define.sd_setting; + let script = `cd "${define.scripts_path}" && "${py_path}" -p "${sd_config_path.replaceAll('\\', '/')}" "input" "${global.config.project_path}"`; + const output = await execAsync(script, { maxBuffer: 1024 * 1024 * 10, encoding: 'utf-8' }); + global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 1, + message: "反推成功" + }) + return { + code: 1, + data: output.stdout + } + } catch (error) { + global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { + code: 0, + message: "反推错误。详情请见错误信息!" + }) + return { + code: 0, + message: error.toString() + } + } +} + +/** + * 执行Python脚本的类,包括了对python脚本的监听 + */ +class PythonRunner extends EventEmitter { + constructor(mainWindow, define) { + super(); + this.mainWindow = mainWindow; + this.define = define; + } + + runScript(scriptPath, args = []) { + const pythonProcess = spawn('python', [scriptPath, ...args]); + + // 监听Python脚本的标准输出 + pythonProcess.stdout.on('data', (data) => { + // console.log(data.toString("utf-8")) + this.mainWindow.webContents.send(DEFINE_STRING.PYTHON_OUTPUT, data.toString("utf-8")); + }); + + // 监听Python脚本的标准错误输出 + pythonProcess.stderr.on('data', (data) => { + this.mainWindow.webContents.send(DEFINE_STRING.PYTHON_OUTPUT, data.toString("utf-8")); + }); + + // 监听子进程关闭事件 + pythonProcess.on('close', (code) => { + let closeMessage = `Python script exited with code ${code}`; + // console.log(closeMessage); + this.mainWindow.webContents.send(DEFINE_STRING.PYTHON_CLOSE, closeMessage); + }); + + // 监听子进程错误事件 + pythonProcess.on('error', (err) => { + let errorMessage = `Python script error: ${err}`; + this.mainWindow.webContents.send(DEFINE_STRING.PYTHON_OUTPUT, errorMessage); + }); + } +} + +/** + * 判断当前文件夹下面的所有文件夹 + * @param {需要获取的文件地址} srcPath + * @returns + */ +async function getDirectories(srcPath) { + try { + const filesAndDirectories = await fspromises.readdir(srcPath, { withFileTypes: true }); + const directories = filesAndDirectories + .filter(dirent => dirent.isDirectory()) + .map(dirent => fspromises.stat(path.join(srcPath, dirent.name))); + + const directoryStats = await Promise.all(directories); + // 将目录和它们的状态对象组合成一个数组 + const directoriesWithStats = filesAndDirectories + .filter(dirent => dirent.isDirectory()) + .map((dirent, index) => ({ + name: dirent.name, + ctime: directoryStats[index].ctime + })); + + // 按创建时间排序,最新的在前 + directoriesWithStats.sort((a, b) => b.ctime - a.ctime); + + // 提取排序后的目录名称 + const sortedDirectories = directoriesWithStats.map(dirent => dirent.name); + return sortedDirectories; + } catch (error) { + console.error('Error reading directories:', error); + throw error; // 或者根据需要处理错误 + } +} + +/** + * 读取剪映草稿列表 + * @returns 返回剪映草稿列表 + */ +async function getDraftFileList() { + let draft_path = global.config.draft_path + let res = await getDirectories(draft_path) + return res; +} + +/** + * 修改SD配置 + */ +async function SaveSDConfig(value) { + try { + let sd_config = JSON.parse((await fspromises.readFile(define.sd_setting, "utf-8")).toString()); + global.config.webui_api_url = value.webui_api_url || value.webui_api_url == '' ? value.webui_api_url : global.config.webui_api_url; + sd_config.setting.webui_api_url = value.webui_api_url || value.webui_api_url == "" ? value.webui_api_url : sd_config.setting.webui_api_url; + sd_config.setting.type = value.type ? value.type : sd_config.setting.type; + sd_config.webui.prompt = value.prompt || value.prompt == "" ? value.prompt : sd_config.webui.prompt; + sd_config.webui.negative_prompt = value.negative_prompt || value.negative_prompt == "" ? value.negative_prompt : sd_config.webui.negative_prompt; + sd_config.webui.denoising_strength = value.denoising_strength || value.denoising_strength == "" ? value.denoising_strength : sd_config.webui.denoising_strength; + sd_config.webui.sampler_name = value.sampler_name ? value.sampler_name : sd_config.webui.sampler_name; + sd_config.webui.steps = value.steps ? value.steps : sd_config.webui.steps; + sd_config.webui.width = value.width ? value.width : sd_config.webui.width; + sd_config.webui.height = value.height ? value.height : sd_config.webui.height; + sd_config.webui.cfg_scale = value.cfg_scale ? value.cfg_scale : sd_config.webui.cfg_scale; + sd_config.webui.adetailer = value.adetailer ? value.adetailer : sd_config.webui.adetailer; + sd_config.setting.batch_size = value.batch_size ? value.batch_size : sd_config.setting.batch_size; + sd_config.setting.style_weight = value.style_weight ? value.style_weight : sd_config.setting.style_weight; + + await fspromises.writeFile(define.sd_setting, JSON.stringify(sd_config)); + return { + code: 1, + message: "保存成功" + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } +} + +/** + * 保存生成视频的简单配置 + */ +async function SaveGeneralSetting(value) { + try { + // 先读取 + let config_data = JSON.parse((await fspromises.readFile(define.video_config, 'utf-8')).toString()); + await fspromises.writeFile(define.video_config, JSON.stringify(value)); + return { + code: 1, + message: "保存成功" + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } +} + +/** + * 获取合成视频的配置信息。包含基本设置。字幕设置。音频设置。水印设置 + */ +async function GetVideoConfigMessage() { + try { + let data = JSON.parse((await fspromises.readFile(define.video_config, 'utf-8')).toString()); + return { + code: 1, + data: data + } + } catch (error) { + return { + code: 0, + message: error.message + } + } +} + +/** + * 获取当前系统安装了的字体 + * 使用python脚本实现 + */ +async function GetSystemInstallFontName() { + try { + // 执行python + let scriptPath = path.join(define.scripts_path, 'Lai.exe'); + // let scriptPath = path.join(define.scripts_path, '00_clip.exe'); + // 执行生成图片的脚本 + let script = `cd "${define.scripts_path}" && "${scriptPath}" -f "${define.video_config.replaceAll("\\", "/")}"`; + const output = await execAsync(script, { maxBuffer: 1024 * 1024 * 10, encoding: 'utf-8' }); + return { + code: 1, + } + + } catch (error) { + return { + code: 0, + message: error + } + } +} + +/** + * 保存字幕的配置信息 + */ +async function SaveAssConfig(value) { + try { + + let video_config = JSON.parse(await fspromises.readFile(define.video_config, 'utf8')); + // 判断ID是不是存在。存在的话直接修改。不存在创建 + if (value[1].id == null) { + value[1].id = uuidv4(); + video_config[value[0]].push(value[1]); + } else { + let index = video_config[value[0]].findIndex(item => item.id == value[1].id); + if (index !== -1) { + let old = video_config[value[0]][index]; + old.fontName = value[1].fontName; + old.fontSize = value[1].fontSize; + old.fontColor = value[1].fontColor; + old.transparent = value[1].transparent; + old.positionX = value[1].positionX; + old.positionY = value[1].positionY; + if (value[0] == "watermarkConfig") { + old.showText = value[1].showText; + } + } + } + await fspromises.writeFile(define.video_config, JSON.stringify(video_config)); + return { + code: 1, + message: "添加成功" + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } +} + +/** + * 删除视频配置的指定ID + */ +async function DeleteVideoConfig(value) { + // console.log(value) + try { + let video_config = JSON.parse(await fspromises.readFile(define.video_config, 'utf-8')); + video_config[value[0]] = video_config[value[0]].filter(item => item.id != value[1]); + await fspromises.writeFile(define.video_config, JSON.stringify(video_config)); + return { + code: 1 + } + } catch (error) { + return { + code: 0, + message: error + } + } +} + +/** + * 添加生图任务队列 + * @param {传入的值} value + */ +async function AddImageTask(value) { + try { + + // 判断文件目录是不是存在 + let json_path = path.join(global.config.project_path, "scripts/task_list.json"); + // 判断文件是不是存在 + let isExit = await tools.checkExists(json_path); + let json_data = {}; + if (!isExit) { + const dirPath = path.dirname(json_path); + let dirIsExit = await tools.checkExists(dirPath); + if (!dirIsExit) { + await fspromises.mkdir(dirPath, { recursive: true }); + } + await fspromises.writeFile(json_path, '{}'); + } + let task_list = []; + let task_list_data = await pm.GetImageTask(); + if (task_list_data.code == 0) { + return task_list_data; + } + // 获取当前的最大的任务编号 + let current_no = 0; + if (task_list_data.data != null && task_list_data.data.task_list != null) { + + if (task_list_data.data.task_list.length > 0) { + const maxNoObject = task_list_data.data.task_list.reduce((max, obj) => obj.no > max.no ? obj : max, task_list_data.data.task_list[0]); + current_no = maxNoObject.no; + task_list = task_list_data.data.task_list; + } + } + // 循环输出轮次,往里面添加数据 + for (let i = 0; i < value.output_rounds; i++) { + task_list.push({ + id: uuidv4(), + no: current_no + i + 1, + lora: value.lora, + out_folder: 'output_crop_' + String(current_no + i + 1).padStart(5, '0'), + image_style: value.image_style, + image_style_list: value.image_style_list, + status: "wait" + }) + } + // 写入 + task_list_data.data.task_list = task_list; + let write_data = task_list_data.data; + await fspromises.writeFile(json_path, JSON.stringify(write_data)); + return { + code: 1, + data: write_data + } + } catch (error) { + return { + code: 0, + message: error + } + } + +} + +/** + * 删除指定ID的值 + * @param {ID} value + */ +async function DeleteImageTaskList(value) { + try { + // 判断当前的状态。是不是可以删除。正在生成的文件不能删除 + // 目前先是直接删除 + let task_list = JSON.parse(await fspromises.readFile(path.join(global.config.project_path, 'scripts/task_list.json'), 'utf-8')); + + // 判断状态,删除指定的输出文件夹 + let d_t = task_list.task_list.filter(item => item.id == value)[0]; + // ok 状态删除对应的输出文件夹 + if (d_t.status == "ok" || d_t.status == "error" || d_t.status.startsWith("video")) { + await fspromises.rm(path.join(global.config.project_path, 'tmp/' + d_t.out_folder), { recursive: true, force: true }); + } + + let new_data = task_list.task_list.filter(item => item.id != value); + task_list.task_list = new_data; + await fspromises.writeFile(path.join(global.config.project_path, 'scripts/task_list.json'), JSON.stringify(task_list)); + + return { + code: 1 + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + +} + +/** + * 获取指定的机械码 + */ +async function GetMachineId() { + try { + let id = await machineId(true); + return { + code: 1, + value: id + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } +} + + +/** + * 获取不想要的提示词 + */ +async function GetBadPrompt() { + try { + let sd_config = JSON.parse(await fspromises.readFile(define.sd_setting, 'utf-8')); + return { + code: 1, + value: sd_config.tag.badPrompt + } + + } catch (error) { + return { + code: 0, + message: error.toString() + } + } +} + +/** + * 保存不想要的提示词 + */ +async function SaveBadPrompt(value) { + try { + let tag = value.join(','); + // 写入 + let sd_config = JSON.parse(await fspromises.readFile(define.sd_setting, 'utf-8')); + sd_config.tag.badPrompt = tag; + await fspromises.writeFile(define.sd_setting, JSON.stringify(sd_config)); + return { + code: 1, + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } +} + +/** + * 一键删除不想要的值 + */ +async function DeleteBadPrompt() { + try { + let sd_config = JSON.parse(await fspromises.readFile(define.sd_setting, 'utf-8')); + let badPrompt = sd_config.tag.badPrompt; + let badPrompts = []; + if (badPrompt != null) { + badPrompts = badPrompt.split(','); + } + // 修改所有的提示词 + let promptPath = await tools.getFilesWithExtensions(path.join(global.config.project_path, 'tmp/input_crop'), '.txt'); + for (let i = 0; i < promptPath.length; i++) { + const item = promptPath[i]; + let txtStr = await fspromises.readFile(item, 'utf-8'); + let tags = txtStr.split(','); + tags = tags.filter(d => !badPrompts.includes(d)); + // 重新写入 + await fspromises.writeFile(item, tags.join(',')); + } + return { + code: 1, + } + + } catch (error) { + return { + code: 0, + message: error.toString() + } + } +} + + +/** + * 打开购买 GPT 的网址 + */ +async function openGptBuyUrl(value) { + // console.log(value) + if (value == "https://api.openai-hk.com/v1/chat/completions") { + OpenUrl('https://openai-hk.com/?i=10196') + } +} + +/** + * 打开传入的网址 + * @param {} value + */ +async function OpenUrl(value) { + shell.openExternal(value) +} + +/** + * 获取ADetailer配置列表 + */ +async function GetADetailerList() { + try { + console.log(123); + let sd_setting = JSON.parse(await fspromises.readFile(define.sd_setting, 'utf-8')); + return { + code: 1, + data: sd_setting.adetailer + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + +} + +/** + * 保存ADetailer数据信息 + */ +async function SaveADetailerConfig(value) { + try { + let sd_config = JSON.parse(await fspromises.readFile(define.sd_setting, 'utf-8')); + sd_config.adetailer = value; + await fspromises.writeFile(define.sd_setting, JSON.stringify(sd_config)); + return { + code: 1, + message: "保存成功" + } + + } catch (error) { + return { + code: 0, + message: error.toString() + } + } +} + +/** + * 开始分镜 + */ +async function StartStoryboarding(value) { + try { + // 判断文件夹是不是存在,不存在创建 + let frame_path = path.join(global.config.project_path, "data/frame"); + let isExist = await tools.checkExists(frame_path); + if (isExist) { + await tools.deleteFileOrDirectory(frame_path); + await fspromises.mkdir(frame_path, { recursive: true }); + } else { + await fspromises.mkdir(frame_path, { recursive: true }); + } + let tmp_path = path.join(global.config.project_path, "tmp"); + isExist = await tools.checkExists(tmp_path); + if (!isExist) { + await fspromises.mkdir(tmp_path, { recursive: true }); + } + let input_path = path.join(global.config.project_path, "tmp/input_crop"); + isExist = await tools.checkExists(input_path); + if (isExist) { + await tools.deleteFileOrDirectory(input_path); + await fspromises.mkdir(input_path, { recursive: true }); + } else { + await fspromises.mkdir(input_path, { recursive: true }); + } + + global.newWindow[0].win.webContents.send(DEFINE_STRING.GET_FRAME_RETUN, { code: 1, data: "正在调用进程。请勿关闭程序" }) + let cc = `${path.join(define.scripts_path, 'Lai.exe')}`; + let child = spawn(cc, ["-a", value.video_path, frame_path, input_path, value.sensitivity], { encoding: 'utf-8' }); + child.on('error', console.error) + child.stdout.on('data', (data) => { + console.log(data.toString()); + global.newWindow[0].win.webContents.send(DEFINE_STRING.GET_FRAME_RETUN, { code: 1, data: data.toString() }) + }) + child.stderr.on('data', (data) => { + console.log('stderr=', data.toString()) + global.newWindow[0].win.webContents.send(DEFINE_STRING.GET_FRAME_RETUN, { code: 1, data: data.toString() }) + }) + + child.on('close', async (data) => { + console.log('data=', data.toString()) + // 判断该当前文件夹下面是不是有文案文件。有的话判断最后一行是不是空 + let isE = await tools.checkExists(path.join(global.config.project_path, "data/文案.txt")); + if (isE) { + let lines = (await fspromises.readFile(path.join(global.config.project_path, "data/文案.txt"), 'utf-8')).split(/\r?\n/); + let lastLine = lines[lines.length - 1]; + if (lastLine == "") { + lines = lines.slice(0, -1); + } + await fspromises.writeFile(path.join(global.config.project_path, "文案.txt"), lines.join('\n'), 'utf-8'); + } + global.newWindow[0].win.webContents.send(DEFINE_STRING.GET_FRAME_RETUN, { code: 1, data: data.toString(), type: 0 }) + if (data == 0) { + global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { code: 1, message: "分镜、抽帧、语音识别完成!" }) + } else { + global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { code: 0, message: "分镜错误。请看详细信息!" }) + } + }) + } catch (error) { + global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { code: 0, message: error.toString() }) + return { + code: 0, message: error.toString() + } + } +} + +export const func = { + getDraftFileList, + PythonRunner, + getFrame, + alignDraftImage, + alginDraftImgToText, + getDraftTextStyle, + getClipSetting, + addDraft, + ReGenerateImageOne, + PushBackPrompt, + GetDraftFriendlyReminder, + SaveNewWord, + SaveSDConfig, + SaveGeneralSetting, + GetVideoConfigMessage, + GetSystemInstallFontName, + SaveAssConfig, + DeleteVideoConfig, + AddImageTask, + DeleteImageTaskList, + GetMachineId, + GetBadPrompt, + SaveBadPrompt, + DeleteBadPrompt, + openGptBuyUrl, + GetADetailerList, + SaveADetailerConfig, + OpenUrl, + StartStoryboarding +} \ No newline at end of file diff --git a/src/main/index.js b/src/main/index.js new file mode 100644 index 0000000..225be32 --- /dev/null +++ b/src/main/index.js @@ -0,0 +1,434 @@ +import { app, shell, BrowserWindow, ipcMain, dialog, nativeTheme } from 'electron' +import path, { join } from 'path' +import { electronApp, optimizer, is } from '@electron-toolkit/utils' +import icon from '../../resources/icon.ico?asset' +import { define } from '../define/define.js' +import { func } from './func.js' +import { AsyncQueue } from "./quene.js" +import { DEFINE_STRING } from '../define/define_string.js' +const fspromises = require("fs").promises; +const { v4: uuidv4 } = require('uuid'); +const { version } = require('../../package.json') + +import { Tools } from './tools.js' +import { ImageGenerate } from './backPrompt/imageGenerate.js' +import { Setting } from './setting/setting.js' +import { has, isEmpty } from 'lodash' + +// ipc +import { SettingIpc } from './IPCEvent/settingIpc.js' +import { ImageGenerateIpc } from './IPCEvent/imageGenerateIpc.js' +import { WritingIpc } from './IPCEvent/writingIpc.js' +import { VideoGenerateIpc } from './IPCEvent/videoGenerateIpc' +import { TranslateIpc } from './IPCEvent/translateIpc.js' +import { GptIpc } from './IPCEvent/gptIpc.js' +import { MjIpc } from './IPCEvent/mjIpc.js' +import { OriginalImageGenerateIpc } from './IPCEvent/originalImageGenerateIpc' +import { SdIpc } from './IPCEvent/sdIpc.js' +import { DiscordIpc, RemoveDiscordIpc } from './IPCEvent/discordIpc.js' +import { MainIpc } from './IPCEvent/mainIpc.js' + +let tools = new Tools(); +let imageGenerate = new ImageGenerate(global); +let setting = new Setting(global); + + +async function InitData(gl) { + let res = await setting.getSettingDafultData(); + gl.config = res; + gl.requestQuene = new AsyncQueue(gl, res.task_number); + gl.fileQueue = new AsyncQueue(gl, 1); + return res; +} + +function setIpcHandler(hash) { + if (hash == "discord") { + DiscordIpc(global); + } +} + +function removeIpcHandler(hash) { + if (hash == "discord") { + RemoveDiscordIpc(); + } +} + +async function createWindow(hash = "ShowMessage", data, url = null) { + // Create the browser window. + global.currentHash = hash; + + let mainWindow = new BrowserWindow({ + width: 900, + height: 670, + title: 'LAITool', + icon: '../../resources/icon.ico', + show: false, + autoHideMenuBar: true, + ...(process.platform === 'linux' ? { icon } : {}), + webPreferences: { + preload: join(__dirname, '../preload/index.js'), + sandbox: false, + nodeIntegration: (hash == 'discord' ? false : true), // 在网页中集成Node + nodeIntegrationInWorker: true, + webSecurity: false, + partition: "persist:my-partition", + } + }) + + mainWindow.myID = uuidv4(); + + mainWindow.on('ready-to-show', () => { + mainWindow.show() + }) + + mainWindow.webContents.setWindowOpenHandler((details) => { + shell.openExternal(details.url) + return { action: 'deny' } + }) + + // HMR for renderer base on electron-vite cli. + // Load the remote URL for development or the local html file for production. + // 判断是不是加载外部网页 + if (url) { + mainWindow.loadURL(url) + } else { + if (is.dev && process.env['ELECTRON_RENDERER_URL']) { + mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL'] + "/#/" + hash); + mainWindow.webContents.openDevTools(); + } else { + if (hash != "") { + mainWindow.loadURL(`file://${path.join(__dirname, '../renderer/index.html')}#/${hash}`) + } else { + mainWindow.loadFile(join(__dirname, '../renderer/index.html')) + } + } + } + + mainWindow.on("closed", () => { + // 判断指定的窗口,移除指定的监听 + removeIpcHandler(hash); + global.newWindow = global.newWindow.filter(item => item.id != mainWindow.id) + }) + + // 创建一个新的窗口,添加对应的监听 + + global.newWindow.push({ + hash, + id: mainWindow.id, + win: mainWindow, + init_folder: data + }) + + setIpcHandler(hash); + await InitData(global); + return mainWindow; +} + +let mainWindow; +global.createWindow = createWindow; + +// This method will be called when Electron has finished +// initialization and is ready to create browser windows. +// Some APIs can only be used after this event occurs. +app.whenReady().then(async () => { + // Set app user model id for windows + electronApp.setAppUserModelId('com.electron') + + // Default open or close DevTools by F12 in development + // and ignore CommandOrControl + R in production. + // see https://github.com/alex8088/electron-toolkit/tree/master/packages/utils + app.on('browser-window-created', (_, window) => { + optimizer.watchWindowShortcuts(window) + }) + + global.newWindow = []; + mainWindow = createWindow('ShowMessage', null) + + //判断是不是又配置文件,没有的话,将temp中的基础配置加载 + // 判断文件夹是不是存在 + let config_p = path.dirname(define.config_path); + let isE = await tools.checkExists(config_p); + // 文件夹存在判断json文件数量 + let ex_json = []; + if (isE) { + let ex_json_path = await tools.getFilesWithExtensions(config_p, '.json'); + for (let i = 0; i < ex_json_path.length; i++) { + const element = ex_json_path[i]; + ex_json.push(path.basename(element)); + } + } else { + await fspromises.mkdir(config_p, { recursive: true }); + } + + // 判断文件是不是存在,不存在添加 + if (ex_json.length != 5) { + let temp_path = path.join(path.dirname(define.draft_temp_path), 'config'); + let tmp_json_path = await tools.getFilesWithExtensions(temp_path, ".json"); + for (let i = 0; i < tmp_json_path.length; i++) { + const element = tmp_json_path[i]; + if (!ex_json.includes(path.basename(element))) { + await fspromises.copyFile(element, path.join(config_p, path.basename(element))) + } + } + } + + // 判断动态文件是不是存在 + tools.checkJsonFileExistsOrCreate(path.join(define.dynamic_setting)); + // 判断标签文件是不是存在 + tools.checkJsonFileExistsOrCreate(path.join(define.tag_setting)); + + app.on('activate', function () { + // On macOS it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (BrowserWindow.getAllWindows().length === 0) mainWindow = createWindow('ShowMessage', null) + + }) +}) + +// Quit when all windows are closed, except on macOS. There, it's common +// for applications and their menu bar to stay active until the user quits +// explicitly with Cmd + Q. +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit() + } +}) + +SettingIpc(); +ImageGenerateIpc(); +WritingIpc(); +VideoGenerateIpc(); +TranslateIpc(); +GptIpc(); +SdIpc(); +MjIpc(); +MainIpc(createWindow); +OriginalImageGenerateIpc(); + + +ipcMain.handle('dark-mode:toggle', (event, value) => { + if (value) { + nativeTheme.themeSource = value; + } else { + nativeTheme.themeSource = "system"; + } + return nativeTheme.shouldUseDarkColors +}) + +// In this file you can include the rest of your app"s specific main process +// code. You can also put them in separate files and require them here. + +ipcMain.handle(DEFINE_STRING.GET_SETTING_Dafault_DATA, async (event) => { + return await InitData(global); +}) + +ipcMain.handle(DEFINE_STRING.GET_DRAFT_FILE_LIST, async (event) => { + let res = await func.getDraftFileList(); + return res; +}) + + + +ipcMain.handle(DEFINE_STRING.SELECT_FOLDER, async (event, value = null) => { + let po = ['openDirectory']; + if (value && !isEmpty(value.multi)) { + po.push('multiSelections'); + } + let { filePaths } = await dialog.showOpenDialog({ + properties: po, + defaultPath: value && !isEmpty(value.defaultPath) ? value.defaultPath : "" + }) + return filePaths; +}) + +ipcMain.handle(DEFINE_STRING.SELECT_FILE, async (event, value) => { + try { + let { filePaths } = await dialog.showOpenDialog({ + properties: ['openFile'], + filters: [ + { name: "fileName", extensions: value } + ] + }) + return { + code: 1, + value: filePaths[0] + } + + } catch (error) { + return { + code: 0, + message: `Error Message ${error}` + } + } +}) + + +ipcMain.handle(DEFINE_STRING.GET_DRAFT_TEXT_STYLE, async (event, value) => { + let res = await func.getDraftTextStyle(value); + return res; +}) + + +ipcMain.handle(DEFINE_STRING.GET_TEXT_STYLE_LIST, async (event) => { + let res = await func.getClipSetting("text_style"); + return res; +}) + +ipcMain.handle(DEFINE_STRING.GET_FRIENDLY_REMINDER_LIST, async (event) => { + let res = await func.getClipSetting("friendly_reminder_setting"); + return res; +}) +ipcMain.handle(DEFINE_STRING.GET_FRIENDLY_REMINDER_DRAFT, async (event, value) => { + let res = await func.GetDraftFriendlyReminder(value); + return res; +}) + + + +ipcMain.handle(DEFINE_STRING.ADD_DRAFT, async (event, value) => { + let res = await func.addDraft(value); + return res; +}) + +// 获取当前版本 +ipcMain.handle(DEFINE_STRING.GET_VERSION, async (event) => version); + +// 监听保存SD配置 +ipcMain.handle(DEFINE_STRING.SAVE_SD_CONFIG, async (event, value) => await func.SaveSDConfig(value)) + +// 监听保存生成视频的简单配置 +ipcMain.handle(DEFINE_STRING.SAVE_GENERAL_SETTING, async (event, value) => await func.SaveGeneralSetting(value)); + +// 获取当前的视频合成配置信息 +ipcMain.handle(DEFINE_STRING.GET_VIDEO_CONFIG_MESSAGE, async (event) => await func.GetVideoConfigMessage()); + +// 监听保存字幕的是指信息 +ipcMain.handle(DEFINE_STRING.SAVE_ASS_CONFIG, async (event, value) => await func.SaveAssConfig(value)); + +// 监听获取当前系统安装的字体 +ipcMain.handle(DEFINE_STRING.GET_SYSTEM_INSTALL_FONTNAME, async (event) => await func.GetSystemInstallFontName()); + +// 监听删除视频配置任务(删除指定ID的值) +ipcMain.handle(DEFINE_STRING.DELETE_VIDEO_CONFIG, async (event, value) => await func.DeleteVideoConfig(value)); + +// 监听添加生图任务信息 +ipcMain.handle(DEFINE_STRING.ADD_IMAGE_TASK_LIST, async (event, value) => await func.AddImageTask(value)); + +// 监听删除生成图片列表中的信息 +ipcMain.handle(DEFINE_STRING.DELETE_IMAGE_TASK_LIST, async (event, value) => await func.DeleteImageTaskList(value)); + +// 监听获取加密的机械码任务 +ipcMain.handle(DEFINE_STRING.GET_MACHINE_ID, async (event, value) => await func.GetMachineId()); + +// 监听获取不想要的提示词任务 +ipcMain.handle(DEFINE_STRING.GET_BAD_PROMPT, async (event) => await func.GetBadPrompt()); + +// 保存不想要的提示词 +ipcMain.handle(DEFINE_STRING.SAVE_BAD_PROMPT, async (event, value) => await func.SaveBadPrompt(value)); + +// 一键删除不想要的值 +ipcMain.handle(DEFINE_STRING.DELETE_BAD_PROMPT, async (event) => await func.DeleteBadPrompt()); + +// 监听反推任务 +ipcMain.handle(DEFINE_STRING.PUSH_BACK_PROMPT, async (event) => await func.PushBackPrompt()); + +// 打开GPT购买界面 +ipcMain.on(DEFINE_STRING.OPEN_GPT_BUY_URL, async (event, value) => await func.openGptBuyUrl(value)); + +// 监听打开任意网站的任务 +ipcMain.on(DEFINE_STRING.OPEN_URL, async (event, value) => await func.OpenUrl(value)); + +// 监听抽帧任务 +ipcMain.handle(DEFINE_STRING.GET_FRAME, async (event, value) => await func.getFrame(value)); + +// 监听获取ADtailer列表的任务 +ipcMain.handle(DEFINE_STRING.GET_ADETAILER_LIST, async (event) => await func.GetADetailerList()); + +// 监听保存ADtailer数据 +ipcMain.handle(DEFINE_STRING.SAVE_DETAILER_CONFIG, async (event, value) => await func.SaveADetailerConfig(value)); + +// 分镜识别。语音识别 +ipcMain.handle(DEFINE_STRING.START_STORY_BOARDING, async (event, value) => await func.StartStoryboarding(value)); + +// 保存试用结束时间 +ipcMain.on(DEFINE_STRING.SAVE_TRIAL_END_TIME, (event, value) => { + global.endTime = value.endTime; + global.permissions = value.permissions; +}); + +// 获取当前机器的权限 +ipcMain.handle(DEFINE_STRING.GET_PERMISSION, async (event) => { + return { + code: 1, + endTime: global.endTime, + permissions: global.permissions + } +}) + +// 试用文件资源打开指定的文件夹 +ipcMain.on(DEFINE_STRING.OPEN_FOLDER, (event, value) => shell.openPath(path.join(global.config.project_path, "tmp/" + value))); + +// 监听字幕的保存 +ipcMain.handle(DEFINE_STRING.SAVE_NEW_WORD, async (event, value) => { + return await func.SaveNewWord(value); +}) + +/** + * 监听字幕对齐任务,通过前端传过来的数据 + */ +ipcMain.handle(DEFINE_STRING.ALIGN_DRAFT_IMG_TO_TEXT, async (event, value) => { + return await func.alginDraftImgToText(value); +}) + +/** + * 监听单张重绘任务 + */ +ipcMain.handle(DEFINE_STRING.RE_GENERATE_IAMGE_ONE, async (event, value) => { + console.log(value[0]); + let newWindow = global.newWindow.filter(item => item.id == value[0]); + let res = await func.ReGenerateImageOne(newWindow, value) + return res; +}) + +/** + * 监听文件夹高清任务 + */ +ipcMain.handle(DEFINE_STRING.IMPROVE_IMAGE_RESOULTION, async (event, value) => { + let res = await imageGenerate.ImproveResolution(value); + return res; +}) + +/** + * 监听刷新窗口的事件 + */ +ipcMain.handle(DEFINE_STRING.REFRASH_IMAGWE_DATA, async (event, value) => { + console.log(value) + let newWindow = global.newWindow.filter(item => item.id == value[0]); + let img_dir = path.join(global.config.project_path, "tmp/" + value[1]); + let res = await imageGenerate.getFolderImageList(newWindow, img_dir, true); + return res; +}) + +// 监听打开全局窗口事件 +ipcMain.on(DEFINE_STRING.SHOW_GLOABAL_MESSAGE_DIALOG, (event, value) => { + global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, value) +}) + +/** + * 监听一个窗口,返回窗口创建成功后需要的基础数据 + */ +ipcMain.on(DEFINE_STRING.SHOW_NEW_WINDOW, async (event, value) => { + let newW = createWindow(value[0], value[1]); +}) + +// 监听程序关闭 +ipcMain.on(DEFINE_STRING.QUIT_APP, (event) => { + app.quit(); +}) + +/** + * 监听图片对齐任务 + */ +ipcMain.on(DEFINE_STRING.ALIGN_DRAFT_IMG, async (event, value) => { + func.alignDraftImage(mainWindow, value) +}) diff --git a/src/main/quene.js b/src/main/quene.js new file mode 100644 index 0000000..d8ca11a --- /dev/null +++ b/src/main/quene.js @@ -0,0 +1,299 @@ +import { DEFINE_STRING } from "../define/define_string"; +import { Tools } from "./tools"; +export class AsyncQueue { + constructor(global, concurrencyLimit = 1, manualMode = false) { + this.global = global; + this.tasks = []; + this.concurrencyLimit = concurrencyLimit; + this.manualMode = manualMode; + this.currentConcurrency = 0; + // 扩展批次完成状态对象以支持子批次 + this.batchCompletion = {}; + this.taskDeadline = global.endTime; + this.showEndTime = true; + this.tools = new Tools(); + this.currentCreateItem = null; + + // 只有在手动模式下才会使用。要设置当前正在执行的任务,将正在执行的任务添加到里面,需要在任务完成之后手动移除 + this.taskProgress = []; + } + + async enqueue(task, taskId, batchId, subBatchId = 'default') { + if (!this.batchCompletion[batchId]) { + this.batchCompletion[batchId] = { remaining: 0, subBatches: {}, callback: null, failedTasks: [] }; + } + if (!this.batchCompletion[batchId].subBatches[subBatchId]) { + this.batchCompletion[batchId].subBatches[subBatchId] = { remaining: 0, failedTasks: [] }; + } + + this.batchCompletion[batchId].remaining++; + this.batchCompletion[batchId].subBatches[subBatchId].remaining++; + this.tasks.push({ task, taskId, batchId, subBatchId }); + if (!this.manualMode) { + this.process(); + } + } + + setBatchCompletionCallback(batchId, callback) { + if (this.batchCompletion[batchId]) { + this.batchCompletion[batchId].callback = callback; + } + } + + setSubBatchCompletionCallback(batchId, subBatchId, callback) { + if (this.batchCompletion[batchId]) { + this.batchCompletion[batchId].subBatches[subBatchId].callback = callback; + } + } + + setTaskDeadline(deadline) { + this.taskDeadline = deadline; + } + + async process() { + + // 判断是不是有机器码检测的标识 + if (!this.global.CheckMachineId) { + // throw new Error("Machine ID not detected, please check the machine ID."); + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { code: 0, message: "请联系管理员激活" }); + return; + } + + if (this.global.endTime && new Date(Date.now()).toISOString() > this.global.endTime) { + this.tasks = []; + if (this.showEndTime) { + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MESSAGE_DIALOG, { code: 0, message: "试用时间已到,请联系客服" }); + } + this.showEndTime = false; + return; + } + + while (this.tasks.length > 0 && this.currentConcurrency < this.concurrencyLimit) { + const { task, taskId, batchId, subBatchId } = this.tasks.shift(); + this.currentConcurrency++; + task().then(() => { + this.currentConcurrency--; + this.handleTaskCompletion(batchId, subBatchId, null); + if (!this.manualMode) { + this.process(); + } + }).catch((error) => { + // 判断是不是网络请求,不是网络请求直接报错 + let retryCount = 0; + const maxRetryCount = 5; + let retryTask = async () => { + if (retryCount < maxRetryCount) { + retryCount++; + await this.tools.delay(2000); + this.global.newWindow[0].win.webContents.send(DEFINE_STRING.SHOW_MAIN_NOTIFICATION, + { code: 0, message: `生图失败,共5次尝试,目前第${retryCount}次` }); + task().then(() => { + this.currentConcurrency--; + this.handleTaskCompletion(batchId, subBatchId, null); + if (!this.manualMode) { + this.process(); + } + }).catch((error) => { + retryTask(); + }); + } else { + // console.error(`Task ${taskId} failed after ${maxRetryCount} retries`); + this.currentConcurrency--; + this.handleTaskCompletion(batchId, subBatchId, { taskId, error }); + if (!this.manualMode) { + this.process(); + } + } + } + + if ([DEFINE_STRING.QUEUE_BATCH.SD_BACKSTEP_GENERATE_IMAGE, DEFINE_STRING.QUEUE_BATCH.SD_ORIGINAL_GENERATE_IMAGE].includes(batchId)) { + retryTask(); + } else { + console.error('An error occurred in task ' + taskId + ':', error); + // 出现报错。直接停掉当前对应的的子批次 + this.currentConcurrency--; + this.handleTaskCompletion(batchId, subBatchId, { taskId, error }); + if (!this.manualMode) { + this.process(); + } else { + // 将当前的设置删除,将历史人物删除 + this.setCurrentCreateItem(null); + this.taskProgress = []; + } + } + + }); + } + } + + // 任务完成执行的函数,用于处理任务完成后的状态更新等 + handleTaskCompletion(batchId, subBatchId, taskError) { + const batch = this.batchCompletion[batchId]; + const subBatch = this.batchCompletion[batchId].subBatches[subBatchId]; + + if (taskError) { + batch.failedTasks.push(taskError); + subBatch.failedTasks.push(taskError); + // 删除整个子批次 + this.removeTask(batchId, null, subBatchId) + } + this.batchCompletion[batchId].remaining--; + this.batchCompletion[batchId].subBatches[subBatchId].remaining--; + + // 子批次完成 + if (this.batchCompletion[batchId].subBatches[subBatchId].remaining === 0) { + console.log(`Sub-batch ${subBatchId} in batch ${batchId} completed.`); + const callback = this.batchCompletion[batchId].subBatches[subBatchId].callback; + if (callback) { + callback(this.batchCompletion[batchId].subBatches[subBatchId].failedTasks); + } + this.batchCompletion[batchId].subBatches[subBatchId] = { remaining: 0, callback: null, failedTasks: [] }; + } + + if (this.batchCompletion[batchId].remaining === 0) { + const callback = this.batchCompletion[batchId].callback; + if (callback) { + callback(this.batchCompletion[batchId].failedTasks); + } + this.batchCompletion[batchId] = { remaining: 0, subBatches: {}, callback: null, failedTasks: [] }; + } + } + + // 移除任务 + removeTask(batchId, taskId, subBatchId = 'default') { + try { + + if (!this.batchCompletion[batchId]) { + throw new Error(`Batch ${batchId} does not exist.`); + } + + // 获取当前批次的所有的任务 + let initialCount = this.tasks.filter(item => item.batchId === batchId).length; + let finalCount = initialCount; + + // 首先,判断是否指定了taskId来决定是移除单个任务还是整个批次 + if (taskId == null) { + // 删除整个批次 + this.tasks = this.tasks.filter(item => item.batchId !== batchId); + finalCount = this.tasks.filter(item => item.batchId === batchId).length; + } else if (taskId == 'all') { + // 删除所有的指定的子批次 + this.tasks = this.tasks.filter(item => !(item.subBatchId == subBatchId && item.batchId == batchId)); + finalCount = this.tasks.filter(item => item.subBatchId == subBatchId && item.batchId == batchId).length; + } else { + // 删除指定的任务,需要考虑subBatchId + this.tasks = this.tasks.filter(item => !(item.taskId === taskId && item.batchId === batchId && item.subBatchId === subBatchId)); + finalCount = this.tasks.filter(item => item.taskId === taskId && item.batchId === batchId && item.subBatchId === subBatchId).length; + } + // 在移除后再次计算该批次的任务数量 + // const finalCount = this.tasks.length; + // 使用两次计数的差值更新 remaining + const removedTasks = initialCount - finalCount; + if (removedTasks > 0) { + this.batchCompletion[batchId].remaining -= removedTasks; + if (this.batchCompletion[batchId].subBatches[subBatchId]) { + this.batchCompletion[batchId].subBatches[subBatchId].remaining -= removedTasks; + this.batchCompletion[batchId].subBatches[subBatchId].callback = null; + } + } + + // 检查并处理完整批次和小批次的完成状态 + const batch = this.batchCompletion[batchId]; + // 判断子批次的数量 + const subBatch = this.batchCompletion[batchId].subBatches[subBatchId]; + // 子批次完成 + if (subBatch && subBatch.remaining == 0 && subBatch.callback) { + subBatch.callback(subBatch.failedTasks) + delete this.batchCompletion[batchId].subBatches[subBatchId]; // 清理批次完成状态 + } + // 总批次完成 + if (batch && batch.remaining === 0 && batch.callback) { + const callback = batch.callback; + callback(batch.failedTasks); + delete this.batchCompletion[batchId]; // 清理批次完成状态 + } else { + // 遍历小批次,看是否有需要清理的 + for (let subBatchId in batch.subBatches) { + const subBatch = batch.subBatches[subBatchId]; + if (subBatch.remaining === 0) { + // 这里可以进行小批次完成后的处理,比如调用小批次的特定回调 + console.log(`Sub-batch ${subBatchId} in batch ${batchId} completed.`); + // 可以选择删除空的小批次状态,如果不需要保留它的完成记录 + delete batch.subBatches[subBatchId]; + } + } + } + return { + code: 1 + } + + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + // 获取失败的任务 + getFailedTasks(batchId, subBatchId = 'default') { + if (this.batchCompletion[batchId] && this.batchCompletion[batchId].subBatches[subBatchId]) { + return this.batchCompletion[batchId].subBatches[subBatchId].failedTasks; + } + return []; + } + + // 手动开启下一个任务 + async startNextTask() { + // 判断当前是不是有任务正在执行 + if (this.currentCreateItem) { + return; + } + console.log("调用开始下一个任务", this.taskProgress) + if (this.manualMode && this.tasks.length > 0 && this.currentConcurrency < this.concurrencyLimit && this.taskProgress.length < 3) { + this.process(); + } + } + + // 修改currentItem + setCurrentCreateItem(item) { + this.currentCreateItem = item; + if (item) { + // 判断相同的ID的任务是否存在,存在则不添加 + let index = this.taskProgress.findIndex(task => task.id === item.id); + if (index == -1) { + this.taskProgress.push(item); + } else { + // 直接修改 + this.taskProgress[index] = item; + } + } + + } + + // 获取currentItem + getCurrentCreateItem() { + return this.currentCreateItem; + } + + // 获取当前正在执行的任务数量 + getCurrentConcurrency() { + return this.currentConcurrency; + } + + // 获取当前任务的限制任务数量 + getConcurrencyLimit() { + return this.concurrencyLimit + } + + // 获取当前正在执行的任务对象() + getTaskProgress() { + return this.taskProgress; + } + + // 删除自动设置的任务 + removeTaskProgress(callback) { + this.taskProgress = callback(this.taskProgress); + console.log("删除对应消息的任务", this.taskProgress) + } +} \ No newline at end of file diff --git a/src/main/setting/setting.js b/src/main/setting/setting.js new file mode 100644 index 0000000..5d926b4 --- /dev/null +++ b/src/main/setting/setting.js @@ -0,0 +1,332 @@ +const fspromises = require("fs").promises; +import path from "path"; +import axios from "axios"; +const { JSDOM } = require('jsdom'); +import { define } from "../../define/define"; +import { Tools } from "../tools"; +import { ClipSetting } from "../../define/setting/clipSetting"; +import { ImageSetting } from "../../define/setting/imageSetting"; +import { DEFINE_STRING } from "../../define/define_string"; +import { TagDefine } from "../../define/tagDefine"; + +let tagDefine = new TagDefine(global); +export class Setting { + constructor(global) { + this.global = global; + this.tools = new Tools(); + } + + //#region 剪映设置 + + /** + * 添加背景音乐文件夹设置 + * @param {*} value + */ + async AddBackgroundMusicFolder(value) { + return await ClipSetting.AddBackgroundMusicFolder(value); + } + + /** + * 获取剪映背景音乐配置列表 + */ + async GetBackGroundMusicConfigList() { + try { + let res = await this.tools.getJsonFilePropertyValue(define.clip_setting, "background_music_setting", []); + return { + code: 1, + value: res + } + } catch (error) { + return { + code: 0, + error: error.toString() + } + } + } + + /** + * 删除剪辑配置里面对应ID的数据 + * @param {要删除的样式ID} value + */ + async deleteClipSetting(property, value) { + return ClipSetting.deleteClipSetting(property, value); + } + + /** + * 获取剪映的关键帧配置 + * @returns + */ + async GetKeyFrameConfigData() { + try { + let key_frame = await this.tools.getJsonFilePropertyValue(define.clip_setting, "key_frame", null, false); + return { + code: 1, + data: key_frame + } + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 获取剪映关键帧配置 + * @returns + */ + async GetKeyFrameOptions() { + return await ClipSetting.GetKeyFrameOptions(); + } + + async SaveKeyFrameSetting(value) { + return await ClipSetting.SaveKeyFrameSetting(value); + } + + //#endregion + + + //#region 图片设置 + /** + * 获取自动保存图片的存储文件的方式 + * @returns + */ + async GetAutoSaveImageClassifyOptions() { + return await ImageSetting.GetAutoSaveImageClassifyOptions(); + } + + /** + * 保存自动保存图片的设置 + * @param {*} value + * @returns + */ + async SaveImageAutoSaveSetting(value) { + return await ImageSetting.SaveImageAutoSaveSetting(value); + } + + /** + * 获取自动保存图片的设置 + * @param {*} value + * @returns + */ + async GetImageAutoSaveSetting(value) { + return await ImageSetting.GetImageAutoSaveSetting(value); + } + + /** + * 手动另存文件夹 + * @returns + */ + async SaveImageToOtherFolder(value) { + return await ImageSetting.SaveImageToOtherFolder([], value); + } + + + //#endregion + + + /** + * 移除任务 + * @param {*} value + */ + async RemoveTask(value) { + if (value[0] == DEFINE_STRING.QUEUE_BATCH.IMAGE_SAVE_TO_OTHER_FOLDER) { + this.global.fileQueue.removeTask(value[0], value[1], value[2]) + } else { + this.global.requestQuene.removeTask(value[0], value[1], value[2]) + if (this.global.mjGenerateQuene) { + this.global.mjGenerateQuene.removeTask(value[0], value[1], value[2]) + } + } + } + /** + * 加载SD配置文件 + */ + async InitSDConfig() { + try { + let sd_config = JSON.parse(await fspromises.readFile(define.sd_setting, 'utf-8')); + return { + code: 1, + data: { + webui_api_url: sd_config.setting.webui_api_url, + type: sd_config.setting.type, + sampler_name: sd_config.webui.sampler_name, + prompt: sd_config.webui.prompt, + negative_prompt: sd_config.webui.negative_prompt, + denoising_strength: sd_config.webui.denoising_strength, + steps: sd_config.webui.steps, + width: sd_config.webui.width, + height: sd_config.webui.height, + adetailer: sd_config.webui.adetailer, + batch_size: sd_config.setting.batch_size, + seed: sd_config.setting.seed, + style_weight: sd_config.setting.style_weight, + cfg_scale: sd_config.webui.cfg_scale, + } + } + } catch (error) { + return { + code: 0, + message: error + } + } + } + + + /** + * 获取主页显示的信息 + */ + async GetShowMessage() { + try { + let res = await axios.get('https://share.weiyun.com/1EPtoGg8'); + const dom = new JSDOM(res.data, { + runScripts: "dangerously", + resources: "usable", + }); + + // 创建一个函数来异步获取syncData + async function getSyncData() { + // 创建一个Promise来等待onload事件 + await new Promise((resolve, reject) => { + dom.window.onload = () => { + resolve(); + }; + + // 设置一个超时,以防onload事件永远不触发 + setTimeout(() => { + reject(new Error('Loading timed out')); + }, 5000); // 10秒超时 + }); + + // 返回syncData对象 + return dom.window.syncData; + } + + // 使用异步函数并处理结果 + let re = await getSyncData(); + return { + code: 1, + data: re + } + + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 初始化配置 + */ + async getSettingDafultData() { + // 加载通用配置 + let data = await fspromises.readFile(define.config_path, "utf-8"); + let sd_data = await fspromises.readFile(define.sd_setting, 'utf-8'); + let config_json_date = JSON.parse(data); + config_json_date.webui_api_url = JSON.parse(sd_data).setting.webui_api_url; + return config_json_date; + } + + /** + * 修改配置文件中的剪映的草稿位置 + * @param {剪映的草稿位置} value + * @returns + */ + async ModifySampleSetting(value) { + try { + value = JSON.parse(value); + // 当前的配置文件的内容就是global.config的内容 + // 直接修改 global.config的内容即可 + // 传入的value是一个对象,需要遍历其中的所有属性,并将属性值进行修改 + for (let key in value) { + this.global.config[key] = value[key]; + } + await fspromises.writeFile(define.config_path, JSON.stringify(this.global.config)); + return { + code: 1, + message: "保存成功" + } + } catch (error) { + return { + cdoe: "0", + message: "保存失败,错误信息如下:" + '\n' + error.toString() + } + } + } + + /** + * 检查机器码是不是存在 + * @param {*} value + * @returns + */ + async CheckMachineId(value) { + try { + // 判断机器码是不是存在 + let res = await axios.post('http://api.yu-zhile.com/GetMachineStatus', { + machineId: value + }) + if (res.status != 200) { + throw new Error("请求错误"); + } + if (res.data.code == 0) { + throw new Error(res.data.message); + } + + this.global.endTime = res.data.endTime; + this.global.permissions = res.data.permissions; + this.global.CheckMachineId = true; + return { + code: 1, + } + + } catch (error) { + return { + code: 0, + message: error.toString() + } + } + } + + /** + * 获取选择角色场景模式的options + * @returns + */ + async GetRoleSceneModeOptions() { + return tagDefine.getTagSelectModel(); + } + + /** + * 获取生图的类别(sd,mj,d3) + * @returns + */ + async GetImageGenerateCategory() { + return ImageSetting.GetImageGenerateCategory(); + } + + //#region SD设置 + + //#endregion + + //#region MJ设置 + + /** + * 获取指定的配置文件里面指定的属性的数据 + * @param {*} value + */ + async GetDefineConfigJsonByProperty(value) { + return ImageSetting.GetDefineConfigJsonByProperty(value); + } + + + /** + * 保存指定的配置文件里面指定的属性的数据 + */ + async SaveDefineConfigJsonByProperty(value) { + return ImageSetting.SaveDefineConfigJsonByProperty(value); + } + + + //#endregion +} \ No newline at end of file diff --git a/src/main/tools.js b/src/main/tools.js new file mode 100644 index 0000000..6827595 --- /dev/null +++ b/src/main/tools.js @@ -0,0 +1,326 @@ +const fspromises = require("fs").promises; +const { net } = require('electron'); +import path from "path"; +const util = require('util'); +const { spawn, exec } = require('child_process'); +const execAsync = util.promisify(exec); +import { define } from "../define/define"; +import { get, has, set } from "lodash"; +import axios from "axios"; + +export class Tools { + constructor() { } + + /** + * 判断判断文件夹或者是文件是不是存在 + * @param {文件或者是文件夹的路径} filePath + * @returns + */ + async checkExists(filePath) { + try { + await fspromises.access(filePath); + return true; // 文件或目录存在 + } catch (error) { + return false; // 文件或目录不存在 + } + } + + + /** + * 判断json文件是不是存在,不存在的话,协议一个空的json文件 + * @param {*} filePath 文件地址 + */ + async checkJsonFileExistsOrCreate(filePath) { + try { + if (!(await this.checkExists(filePath))) { + // 判断传入的json文件的父文件夹是不是存在,不存在的话,创建 + let parentFolder = path.dirname(filePath); + if (!(await this.checkExists(parentFolder))) { + // 创建文件夹 + await fspromises.mkdir(parentFolder, { recursive: true }); + } + await fspromises.writeFile(filePath, "{}"); + } + } catch (error) { + throw new Error(error); + } + } + + /** + * 删除目标图片,然后将原图片的exif信息删除,然后将原图片复制到目标图片地址 + * @param {*} source 原图片地址 + * @param {*} target 目标图片地址 + */ + async deletePngAndDeleteExifData(source, target) { + try { + let exiftool = path.join(define.package_path, 'exittool/exiftool.exe'); + await this.deleteFileOrDirectory(target); + let script = `"${exiftool}" -all= -overwrite_original "${source}" -o "${target}"`; + const output = await execAsync(script, { maxBuffer: 1024 * 1024 * 10, encoding: 'utf-8' }); + } catch (error) { + throw error; + } + } + + /** + * 复制文件或者是文件夹到指定的位置 + * @param {*} src 源文件或者是文件夹 + * @param {*} dest 目标文件或者是文件夹 + */ + async copyFileOrDirectory(src, dest) { + try { + let stats = await fspromises.stat(src); + if (stats.isDirectory()) { + await fspromises.mkdir(dest, { recursive: true }); + let items = await fspromises.readdir(src); + let promises = items.map(item => this.copyFileOrDirectory(path.join(src, item), path.join(dest, item))); + await Promise.all(promises); + } else if (stats.isFile()) { + await fspromises.copyFile(src, dest); + } + } + catch (error) { + throw new Error(error); + } + } + + /** + * 延时多少秒 + * @param {等待时间} time + * @returns + */ + async delay(time) { + return new Promise(resolve => setTimeout(resolve, time)); + } + + /** + * 判断指定路径的文件夹是不是存在,如果不存在则创建 + */ + async checkFolderExistsOrCreate(folderPath) { + try { + if (!(await this.checkExists(folderPath))) { + await fspromises.mkdir(folderPath, { recursive: true }); + } + } catch (error) { + throw new Error(error); + } + } + + /** + * 获取指定路径下面的指定的拓展的文件 + * @param {指定的文件夹路径} folderPath + * @param {后缀名} extensions + * @returns + */ + async getFilesWithExtensions(folderPath, extensions) { + try { + let entries = await fspromises.readdir(folderPath, { withFileTypes: true }); + let files = []; + // 使用Promise.all来并行处理所有的stat调用 + const fileStats = await Promise.all(entries.map(async (entry) => { + const entryPath = path.join(folderPath, entry.name); + if (entry.isFile()) { + return { + name: entry.name, + path: entryPath, + isFile: true, + }; + } else { + return { + isFile: false, + }; + } + })); + + // 过滤出文件并且满足扩展名要求的文件 + files = fileStats.filter(fileStat => fileStat.isFile && extensions.includes(path.extname(fileStat.name).toLowerCase())); + + // 对files数组进行排序,基于文件名 + files.sort((a, b) => a.name.localeCompare(b.name)); + + // 返回文件名数组 + return files.map(fileStat => path.join(folderPath, fileStat.name)); + } catch (error) { + throw new Error(error); + } + } + + /** + * 去除字符串中的所有标点符号,包括英文和中文的标点,以及省略号。 + * + * @param {string} sentence 待处理的字符串。 + * @return {string} 去除标点后的字符串。 + */ + removePunctuationIncludingEllipsis(sentence) { + // 扩展正则表达式以包含中文标点符号和省略号 + // 注意英文省略号可能由三个连续点表示,也可能直接使用特殊的省略号字符 + const punctuationRegExp = /[., \/#!$%\^&\*;:{}=\-_`~()\[\],。、;:?!‘’“”()【】《》…]+/g; + + // 使用正则表达式的replace方法替换掉所有匹配到的标点符号为空字符串 + return sentence.replace(punctuationRegExp, ''); + } + + + /** + * 将一个数组写到一个txt文件中 + * @param {数据数组} dataArray + * @param {txt文件地址} filePath + */ + async writeArrayToFile(dataArray, filePath) { + try { + // 将数组转换为字符串,每个元素后面加上换行符 + const dataString = dataArray.join('\n'); + // 使用fs.writeFile异步写入文件 + await fspromises.writeFile(filePath, dataString); + return dataString + } catch (error) { + throw new Error(error); + } + } + + /** + * 删除指定的文件夹和文件地址(删除文件夹会删除文件夹里面的所有的文件) + * @param {文件或者文件夹的地址} dir + */ + async deleteFileOrDirectory(dir) { + let isExist = await this.checkExists(dir); + if (isExist) { + let stats = await fspromises.stat(dir); + if (stats.isDirectory()) { + let items = await fspromises.readdir(dir); + let promises = items.map(item => this.deleteFileOrDirectory(path.join(dir, item))); + await Promise.all(promises); + await fspromises.rmdir(dir); + } else if (stats.isFile()) { + await fspromises.unlink(dir); + } + } + } + + /** + * 获取指定的json文件,并获取指定的属性的值(传入的属性值为null,返回全部。) + * 传入的property不为null,返回全部的json文件,检查是不是要判断传入的属性是不是存在。 + * 要检查属性是不是存在,传入的checkProperty为true,不检查传入的checkProperty为false + * checkProperty为true。若值不存在会抛出错误。为false。不存在直接返回null + * @param {*} filePath json文件地址 + * @param {*} property 属性名称 + * @param {*} defaultValue 默认值(默认为null) + * @param {*} checkProperty 是否检查属性是不是存在(默认为true,若为false,不存在直接返回设置的默认值) + * @returns + */ + async getJsonFilePropertyValue(filePath, property, defaultValue = null, checkProperty = true) { + try { + let isExist = await this.checkExists(filePath); + if (!isExist) { + throw new Error("文件不存在,请先添加"); + } + let config = JSON.parse(await fspromises.readFile(filePath, 'utf-8')); + let d = null; + if (property) { + if (checkProperty) { + if (!has(config, property)) { + throw new Error(`${property} 属性不存在,请检查是不是少了什么步骤`); + } + } + d = get(config, property, defaultValue) + + } else { + d = config; + } + return d; + } catch (error) { + throw error; + } + } + + /** + * 通过地址获取指定地址的json文件,然后写入指定的属性的值(判断是不是要检查属性是不是存在) + * @param {*} filePath 要写入的文件地址 + * @param {*} property 写入的属性名 + * @param {*} value 写入的属性的值 + * @param {*} checkProperty 是否检查属性是不是存在(默认为false,不检查直接写入-覆盖或新增。若需要检查。值不存在,会抛出错误) + */ + async writeJsonFilePropertyValue(filePath, property, value, checkProperty = false) { + try { + let isExist = await this.checkExists(filePath); + if (!isExist) { + throw new Error("文件不存在,请先添加"); + } + let config = JSON.parse(await fspromises.readFile(filePath, 'utf-8')); + if (checkProperty) { + if (!has(config, property)) { + throw new Error(`${property} 属性不存在,添加失败`); + } + } + set(config, property, value); + await fspromises.writeFile(filePath, JSON.stringify(config)); + } catch (error) { + throw error; + } + } + + /** + * 获取指定文件夹下面特定条件的文件夹 + * @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; + } + } + + /** + * 使用chromium下载文件 + * @param {*} url + * @param {*} filePath + * @returns + */ + async downloadFileUrl(url, filePath) { + return new Promise((resolve, reject) => { + const request = net.request({ + method: 'GET', + url: url + }); + + request.on('response', (response) => { + const chunks = []; + response.on('data', (chunk) => chunks.push(chunk)); + response.on('end', async () => { + try { + await fspromises.writeFile(filePath, Buffer.concat(chunks)); + console.log('File downloaded successfully'); + resolve(); + } catch (err) { + reject(err); + } + }); + }); + + request.on('error', (error) => { + reject(error); + }); + + request.end(); + }); + } +} \ No newline at end of file diff --git a/src/preload/discordIndex.js b/src/preload/discordIndex.js new file mode 100644 index 0000000..4c771c9 --- /dev/null +++ b/src/preload/discordIndex.js @@ -0,0 +1,28 @@ +import { contextBridge, ipcRenderer } from 'electron' +import { DEFINE_STRING } from '../define/define_string.js'; +// Custom APIs for renderer + +let events = []; +const api = { + // 创建MJ消息 + CreateMessage: (value) => ipcRenderer.send(DEFINE_STRING.DISCORD.CREATE_MESSAGE, value), + + // MJ消息更新 + UpdateMessage: (value) => ipcRenderer.send(DEFINE_STRING.DISCORD.UPDATE_MESSAGE, value), + + // MJ消息删除 + DeleteMessage: (value) => ipcRenderer.send(DEFINE_STRING.DISCORD.DELETE_MESSAGE, value), +} +// Use `contextBridge` APIs to expose Electron APIs to +// renderer only if context isolation is enabled, otherwise +// just add to the DOM global. +if (process.contextIsolated) { + try { + contextBridge.exposeInMainWorld('api', api) + } catch (error) { + console.error(error) + } +} else { + window.api = api +} + diff --git a/src/preload/index.js b/src/preload/index.js new file mode 100644 index 0000000..1a5d62b --- /dev/null +++ b/src/preload/index.js @@ -0,0 +1,463 @@ +import { contextBridge, ipcRenderer } from 'electron' +import { electronAPI } from '@electron-toolkit/preload' +import { DEFINE_STRING } from '../define/define_string.js'; +// Custom APIs for renderer + +let events = []; +const api = { + //#region 基础状态 + // 获取版本信息 + GetVersion: async (callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.GET_VERSION)), + //#endregion + // 保存通用设置 + ModifySampleSetting: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.MODIFY_SAMPLE_SETTING, value)), + //保存SD配置 + SaveSDConfig: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.SAVE_SD_CONFIG, value); + callback(res); + }, + // 保存生成时间的普通设置 + SaveGeneralSetting: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.SAVE_GENERAL_SETTING, value); + callback(res); + }, + // 获取视频的配置信息设置 + GetVideoConfigMessage: async (callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.GET_VIDEO_CONFIG_MESSAGE); + callback(res); + }, + + // 加载SD设置 + InitSDConfig: async (callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.INIT_SD_CONFIG); + callback(res); + }, + + // 保存任务列表信息 + AddImageTask: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.ADD_IMAGE_TASK_LIST, value); + callback(res); + }, + + // 修改任务队列信息(修改的数据是一个数组。可以添加多个和单个) + ModifyImageTaskList: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.MODIFY_IMAGE_TASK_LIST, value)), + // 开始自动话任务 + ActionAutoVideoTask: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.ACTION_AUTO_VIDEO_TASK, value)), + + // 获取生成图片的队列任务 + GetGenerateTaskList: async (callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.GET_GENERATE_TASK_LIST); + callback(res); + }, + + // 删除生成图片列表的消息 + DeleteImageTaskList: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.DELETE_IMAGE_TASK_LIST, value); + callback(res); + }, + + // 分镜语音识别消息 + StartStoryboarding: async (value) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.START_STORY_BOARDING, value); + }, + + // 获取设置的初始数据 + getSettingDafultData: async (callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.GET_SETTING_Dafault_DATA)), + + // 获取草稿地址 + getDraftFileList: async (callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.GET_DRAFT_FILE_LIST) + callback(res); + }, + + // 选择文件夹 + selectFolder: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.SELECT_FOLDER, value)), + + // 选择指定拓展名的文件 + SelectFile: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.SELECT_FILE, value)), + + getDraftTextStyle: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.GET_DRAFT_TEXT_STYLE, value); + callback(res); + }, + getTextStyleList: async (callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.GET_TEXT_STYLE_LIST); + callback(res); + }, + deleteDraftTextStyle: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.DELETE_DRAFT_TEXT_STYLE, value); + callback(res); + }, + deleteClipSetting: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.DELETE_CLIP_SETTING, value); + callback(res); + }, + deleteClipStettingFriendlyReminder: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.DELETE_FRIENDLY_REMINDER, value); + callback(res); + }, + // 添加草稿 + addDraft: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.ADD_DRAFT, value); + callback(res); + }, + // 自动合成视频 + AutoGenerateVideo: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.AUTO_GENERATION_VIDEO, value); + callback(res); + }, + // 获取项目地址项目的所有的输出文件地址 + getSubFolderList: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.GET_SUBFOLDER_LIST, value); + callback(res); + }, + // 提取草稿的温馨提示内容 + GetFriendlyReminder: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.GET_FRIENDLY_REMINDER_DRAFT, value); + callback(res); + }, + // 获取温馨提示列表 + getFriendlyReminderList: async (callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.GET_FRIENDLY_REMINDER_LIST); + callback(res); + }, + // 获取剪映背景音乐配置 + GetBackgroundMusicConfigList: async (callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.GET_BACKGROUND_MUSIC_CONFIG_LIST)), + // 添加背景音乐文件夹 + AddBackgroundMusicFolder: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.ADD_BACKGROUND_MUSIC_FOLDER, value) + callback(res); + }, + // 反写json文件的数据 + ModifyInpurCropJson: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.MODIFY_INPUT_CROP_JSON, value); + callback(res); + }, + + // AI 洗稿 + AIModifyOneWord: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.AIMODIFY_ONE_WORD, value) + callback(res); + }, + + // 导入字幕。对齐显示 + ImportSrtAndGetTime: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.IMPORT_SRT_AND_GET_TIME, value); + callback(res); + }, + + // 获取本地安装的字体 + GetSystemInstallFontName: async (callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.GET_SYSTEM_INSTALL_FONTNAME); + callback(res); + }, + + // 保存字幕设置 + SaveAssConfig: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.SAVE_ASS_CONFIG, value); + callback(res); + }, + + // 删除字幕设置 + DeleteVideoConfig: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.DELETE_VIDEO_CONFIG, value); + callback(res); + }, + + // 保存洗稿后的文案 + SaveNewWord: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.SAVE_NEW_WORD, value); + callback(res); + }, + + // 监听分镜的时间信息 + SaveCopywritingInformation: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.SAVE_COPYWRITING_INFOMATION, value); + callback(res); + }, + + // 获取不想要的提示词 + GetBadPrompt: async (callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.GET_BAD_PROMPT); + callback(res); + }, + + /** + * 保存不想要的提示词 + */ + SaveBadPrompt: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.SAVE_BAD_PROMPT, value); + callback(res); + }, + + /** + * 一键删除不想要的值 + */ + DeleteBadPrompt: async (callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.DELETE_BAD_PROMPT); + callback(res); + }, + + // 一次反推 + GenerateImageInSelectTask: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.GENERATE_IMAGWE_IN_SELECT_TASK, value); + callback(res); + }, + + // 显示新的窗口 + showNewWindow: (value) => { + ipcRenderer.send(DEFINE_STRING.SHOW_NEW_WINDOW, value); + }, + + // 获取机械码 + GetMachineId: async (callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.GET_MACHINE_ID); + callback(res); + }, + + // 获取ADetalier配置列表 + GetADetailerList: async (callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.GET_ADETAILER_LIST); + callback(res); + }, + + // 保存 ADetailer 数据 + SaveADetailerConfig: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.SAVE_DETAILER_CONFIG, value); + callback(res); + }, + + // 抽帧 + getFrame: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.GET_FRAME, value) + callback(res); + }, + + //反推提示词 + PushBackPrompt: async (callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.PUSH_BACK_PROMPT) + callback(res) + }, + + // 打开指定的url,在默认浏览器中 + OpenUrl: (value) => ipcRenderer.send(DEFINE_STRING.OPEN_URL, value), + + // 生成json文件 + AddWebuiJson: async (callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.ADD_WEBUI_JSON); + callback(res); + }, + ReGenerateImage: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.RE_GENERATE_IAMGE_ONE, value); + callback(res); + }, + ImproveResolution: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.IMPROVE_IMAGE_RESOULTION, value); + callback(res); + }, + alginDraftImg: (value, callback) => { + ipcRenderer.send(DEFINE_STRING.ALIGN_DRAFT_IMG, value) + ipcRenderer.on(DEFINE_STRING.PYTHON_OUTPUT, (event, value) => { + callback(DEFINE_STRING.PYTHON_OUTPUT, value) + }) + + ipcRenderer.on(DEFINE_STRING.PYTHON_CLOSE, (event, value) => { + callback(DEFINE_STRING.PYTHON_CLOSE, value) + }) + }, + alginDraftImgToText: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.ALIGN_DRAFT_IMG_TO_TEXT, value) + callback(res); + }, + getImagePromptList: async (callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.GET_IAMGE_PROMPT_LIST); + callback(res); + }, + RefreshImageData: async (value, callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.REFRASH_IMAGWE_DATA, value); + callback(res); + }, + GetProjectWord: async (callback) => { + let res = await ipcRenderer.invoke(DEFINE_STRING.GET_PROJECT_WORD); + callback(res); + }, + // 获取当前的主页使用界面信息 + GetShowMessage: async (callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.GET_SHOW_MESSAGE)), + // 立即返回的翻译任务 + TranslateReturnNow: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.TRANSLATE_RETURN_NOW, value)), + // 添加翻译添加翻译任务到队列中 + TranslatePrompt: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.TRANSLATE_PROMPT, value)), + // 添加事件监听 + setEventListen: (value, callback) => { + ipcRenderer.on(value[0], (event, value) => { + callback(value); + }) + }, + // 打开discord窗口 + OpenDiscordWindow: async (callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.MAIN.OPEN_DISCORD_WINDOW)), + + // 获取设置的GPT提示词的咒语 + GetCustomizeGptPrompt: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.GET_CUSTOMIZE_GPT_PROMPT, value)), + // 生成GPT自定义提示词的案例输出 + GenerateGptExampleOut: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.GENERATE_GPT_EXAMPLE_OUT, value)), + //GetPermission 获取机器的权限 + GetPermission: async (callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.GET_PERMISSION)), + // 保存图片到指定的文件夹 + SaveImageToOtherFolder: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.SAVE_IMAGE_TO_OTHER_FOLDER, value)), + // 获取当前的自动保存图片的设置 + GetImageAutoSaveSetting: async (callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.GET_IMAGE_AUTO_SAVE_SETTING)), + // 保存图片自动保存设置 + SaveImageAutoSaveSetting: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.SAVE_IMAGE_AUTO_SAVE_SETTING, value)), + // 获取当前自动保存图片的方式 + GetAutoSaveImageClassifyOptions: async (callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.GET_AUTO_SAVE_IMAGE_CLASSIFY_OPTIONS)), + // 修改生图任务状态 + ModifyGenerateTaskStatus: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.MODIFY_GENERATE_TASK_STATUS, value)), + // 删除指定的后台任务 + DeleteBackTask: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.DELETE_BACK_TASK, value)), + // 保存生成视频的基础配置(srt地址,配音,背景音乐文件夹等) + SaveVideoSrtAndAudioMessage: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.SAVE_VIDEO_SRT_AND_AUDIO_MESSAGE, value)), + // 保存关键帧配置 + SaveKeyFrameSetting: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.SAVE_KEY_FRAME_SETTING, value)), + // 获取关键帧打帧方式列表 + GetKeyFrameOptions: async (callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.GET_KEYFRAME_OPTIONS)), + // 获取关键帧的配置文件 + GetKeyFrameConfigData: async (callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.GET_KEY_FRAME_CONFIG_DATA)), + // 保存文案数组到指定的文件 + saveWordTxt: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.SAVE_WORD_TXT, value)), + // 判断该当前的是否可以链接成功 + TestGPTConnection: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.TEST_GPT_CONNECTION, value)), + // 删除自定义的GPT服务商设置 + DeleteDynamicGptOption: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.DELETE_DYNAMIC_GPT_OPTION, value)), + // 保存自定义的GPT服务商设置 + SaveDynamicGptOption: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.SAVE_DYNAMIC_GPT_OPTION, value)), + // 获取当前默认的推理模式或者是自定义的推理模式 + getGptAutoInferenceOptions: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.GET_GPT_AUTO_INFERENCE_OPTIONS, value)), + // 获取当前的GPT和自定义的GPT模型 + getGptModelOption: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.GET_GPT_MODEL_OPTION, value)), + // 获取默认的GPT和自定义的GPT + getGptBusinessOption: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.GET_GPT_BUSINESS_OPTION, value)), + // 获取指定的风格菜单 + GetImageStyleMenu: async (callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.GET_IMAGE_STYLE_MENU)), + // 获取指定的风格ID对应的数据 + GetImageStyleInfomation: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.GET_IMAGE_STYLE_INFOMATION, value)), + // 获取指定的图片风格下面的图片数据 + getStyleImageSubList: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.GET_STYLE_IMAGE_SUB_LIST, value)), + // SD 原创生成单个图片 + OriginalSDImageGenerate: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.ORIGINAL_SD_SINGLE_IMAGE_GENERATE, value)), + // 自动保存数据到json文件事件 + AutoSaveDataJson: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.AUTO_SAVE_DATA_JSON, value)), + // GPT推理 + GPTPrompt: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.GPT_PROMPT, value)), + // 获取 prompt 的json配置文件 + GetPromptJson: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.GET_PROMPT_JSON, value)), + // SD原创添加配置文件 + OriginalAddWebuiJson: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.ORIGINAL_ADD_WEBUI_JSON, value)), + //获取文件的配置文件 + GetConfigJson: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.GET_CONFIG_JSON, value)), + // 自动分析人物事件 + AutoAnalyzeCharacter: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.AUTO_ANALYZE_CHARACTER, value)), + // 获取生成视频的基础设置 + GetVideoGenerateConfig: async (callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.GET_VIDEO_GENERATE_CONFIG)), + // 移除事件 + removeEventListen: (eventName) => ipcRenderer.removeAllListeners(eventName), + // 一键自动化的条件检测 + AutoConditionCheck: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.AUTO_CONDITION_CHECK, value)), + // 下载文件到指定的文件夹 + DownloadImageFile: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.DOWNLOAD_IMAGE_FILE, value)), + + // 检查机器码是不是存在 + CheckMachineId: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.CHECK_MACHINE_ID, value)), + // 保存试用结束 + SaveTrialEndTime: (value) => ipcRenderer.send(DEFINE_STRING.SAVE_TRIAL_END_TIME, value), + // 打开购买GPT地址 + openGptBuyUrl: (value) => ipcRenderer.send(DEFINE_STRING.OPEN_GPT_BUY_URL, value), + // 打开指定的文件夹 + OpenFolder: (value) => ipcRenderer.send(DEFINE_STRING.OPEN_FOLDER, value), + // 退出软件 + QuitApp: () => ipcRenderer.send(DEFINE_STRING.QUIT_APP), + // 获取当前的生图方式,包含sd,mj,d3等 + GetImageGenerateCategory: async (callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.GET_IMAGE_GENERATE_CATEGORY)), + + // 获取指定的配置文件里面指定的属性的数据 + GetDefineConfigJsonByProperty: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.GET_DEFINE_CONFIG_JSON_BY_PROPERTY, value)), + + // 保存指定的配置文件里指定的属性的数据 + SaveDefineConfigJsonByProperty: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.SAVE_DEFINE_CONFIG_JSON_BY_PROPERTY, value)), + + // 打开全局提示框 + showGlobalMessageDialog: (value) => ipcRenderer.send(DEFINE_STRING.SHOW_GLOABAL_MESSAGE_DIALOG, value), + + // 打开全局通知框 + showGlobalNotificationDialog: (value) => ipcRenderer.send(DEFINE_STRING.SHOW_MAIN_NOTIFICATION, value), +} + +const mj = { + // 保存文案信息到mj的配置文件 + SvaeMJWordSrt: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.MJ.SAVE_WORD_SRT, value)), + // 获取MJ配置文件的字幕信息 + GetMJConfigSrtInformation: async (callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.MJ.GET_MJ_CONFIG_SRT_INFORMATION)), + // 获取标签集的基础信息 + GetTagDataByTypeAndProperty: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.MJ.GET_TAG_DATA_BY_TYPE_AND_PROPERTY, value)), + // 保存数据到标签集中 + SaveTagPropertyData: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.MJ.SAVE_TAG_PROPERTY_DATA, value)), + // 删除指定的标签数据 + DeleteTagPropertyData: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.MJ.DELETE_TAG_PROPERTY_DATA, value)), + // 获取选择标签的模式option列表 + GetTagSelectModel: async (callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.MJ.GET_TAG_SELECT_MODEL)), + // 将翻译任务添加到后台队列中 + TranslateReturnNowTask: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.MJ.TRANSLATE_RETURN_NOW_TASK, value)), + // MJ原创生图 + OriginalMJImageGenerate: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.MJ.ORIGINAL_MJ_IMAGE_GENERATE, value)), + // 获取当前对话频道的机器人列表 + GetChannelRobots: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.MJ.GET_CHANNEL_ROBOTS, value)), + + // 获取MJ生图的方式 + GetMJGenerateCategory: async (callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.MJ.GET_MJ_GENERATE_CATEGORY)), + + // MJ生成的图片分割 + ImageSplit: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.MJ.IMAGE_SPLIT, value)), + + // 添加MJ敏感词 + AddMjBadPrompt: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.MJ.ADD_MJ_BAD_PROMPT, value)), + // 添加MJ敏感词检查 + MJBadPromptCheck: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.MJ.MJ_BAD_PROMPT_CHECK, value)), + + // 获取已经生图完成的数据,并获取图片 + GetGeneratedMJImageAndSplit: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.MJ.GET_GENERATED_MJ_IMAGE_AND_SPLIT, value)), + + // 给图片链接,下载指定的图片并分割保存 + DownloadImageUrlAndSplit : async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.MJ.DOWNLOAD_IMAGE_URL_AND_SPLIT, value)), +} + +const discord = { + // 创建MJ消息 + CreateMessage: (value) => ipcRenderer.send(DEFINE_STRING.DISCORD.CREATE_MESSAGE, value), + + // MJ消息更新 + UpdateMessage: (value) => ipcRenderer.send(DEFINE_STRING.DISCORD.UPDATE_MESSAGE, value), + + // MJ消息删除 + DeleteMessage: (value) => ipcRenderer.send(DEFINE_STRING.DISCORD.DELETE_MESSAGE, value), +} +// Use `contextBridge` APIs to expose Electron APIs to +// renderer only if context isolation is enabled, otherwise +// just add to the DOM global. +if (process.contextIsolated) { + try { + contextBridge.exposeInMainWorld('electron', electronAPI) + contextBridge.exposeInMainWorld('api', api) + contextBridge.exposeInMainWorld('mj', mj) + contextBridge.exposeInMainWorld('discord', discord) + contextBridge.exposeInMainWorld('darkMode', { + toggle: (value) => ipcRenderer.invoke('dark-mode:toggle', value), + }) + } catch (error) { + console.error(error) + } +} else { + window.electron = electronAPI + window.api = api; + window.mj = mj; + window.discord = discord; +} + diff --git a/src/renderer/index.html b/src/renderer/index.html new file mode 100644 index 0000000..e0a17ac --- /dev/null +++ b/src/renderer/index.html @@ -0,0 +1,17 @@ + + + + + + LAITool 123 + + + + + +
+ + + + diff --git a/src/renderer/src/App.vue b/src/renderer/src/App.vue new file mode 100644 index 0000000..60d2eb6 --- /dev/null +++ b/src/renderer/src/App.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/src/renderer/src/assets/css/styles.less b/src/renderer/src/assets/css/styles.less new file mode 100644 index 0000000..0a6dcfc --- /dev/null +++ b/src/renderer/src/assets/css/styles.less @@ -0,0 +1,207 @@ +body { + display: flex; + flex-direction: column; + font-family: + Roboto, + -apple-system, + BlinkMacSystemFont, + 'Helvetica Neue', + 'Segoe UI', + 'Oxygen', + 'Ubuntu', + 'Cantarell', + 'Open Sans', + sans-serif; + color: #86a5b1; + width: 100%; + height: 100%; +} + +* { + padding: 0; + margin: 0; +} + +ul { + list-style: none; +} + +code { + font-weight: 600; + padding: 3px 5px; + border-radius: 2px; + background-color: #26282e; + font-family: + ui-monospace, + SFMono-Regular, + SF Mono, + Menlo, + Consolas, + Liberation Mono, + monospace; + font-size: 85%; +} + +a { + color: #9feaf9; + font-weight: 600; + cursor: pointer; + text-decoration: none; + outline: none; +} + +a:hover { + border-bottom: 1px solid; +} + +#app { + flex: 1; + display: flex; + flex-direction: column; + margin: 0 auto; + padding: 0; + width: 100%; + height: 100%; +} + +.versions { + margin: 0 auto; + float: none; + clear: both; + overflow: hidden; + font-family: 'Menlo', 'Lucida Console', monospace; + color: #c2f5ff; + line-height: 1; + transition: all 0.3s; + + li { + display: block; + float: left; + border-right: 1px solid rgba(194, 245, 255, 0.4); + padding: 0 20px; + font-size: 13px; + opacity: 0.8; + + &:last-child { + border: none; + } + } +} + +.hero-logo { + margin-top: -0.4rem; + transition: all 0.3s; +} + +@media (max-width: 840px) { + .versions { + display: none; + } + + .hero-logo { + margin-top: -1.5rem; + } +} + +.hero-text { + font-weight: 400; + color: #c2f5ff; + text-align: center; + margin-top: -0.5rem; + margin-bottom: 10px; +} + +@media (max-width: 660px) { + .hero-logo { + display: none; + } + + .hero-text { + margin-top: 20px; + } +} + +.hero-tagline { + text-align: center; + margin-bottom: 14px; +} + +.links { + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 24px; + font-size: 18px; + font-weight: 500; + + a { + font-weight: 500; + } + + .link-item { + padding: 0 4px; + } +} + +.features { + display: flex; + flex-wrap: wrap; + margin: -6px; + + .feature-item { + width: 33.33%; + box-sizing: border-box; + padding: 6px; + } + + article { + background-color: rgba(194, 245, 255, 0.1); + border-radius: 8px; + box-sizing: border-box; + padding: 12px; + height: 100%; + } + + span { + color: #d4e8ef; + word-break: break-all; + } + + .title { + font-size: 17px; + font-weight: 500; + color: #c2f5ff; + line-height: 22px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .detail { + font-size: 14px; + font-weight: 500; + line-height: 22px; + margin-top: 6px; + } +} + +@media (max-width: 660px) { + .features .feature-item { + width: 50%; + } +} + +@media (max-width: 480px) { + .links { + flex-direction: column; + line-height: 32px; + + .link-dot { + display: none; + } + } + + .features .feature-item { + width: 100%; + } +} \ No newline at end of file diff --git a/src/renderer/src/assets/icons.svg b/src/renderer/src/assets/icons.svg new file mode 100644 index 0000000..8ef8044 --- /dev/null +++ b/src/renderer/src/assets/icons.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/renderer/src/components/Backstep/BatchSaveImageSetting.vue b/src/renderer/src/components/Backstep/BatchSaveImageSetting.vue new file mode 100644 index 0000000..a7be859 --- /dev/null +++ b/src/renderer/src/components/Backstep/BatchSaveImageSetting.vue @@ -0,0 +1,224 @@ + + + diff --git a/src/renderer/src/components/Backstep/CopyWriting.vue b/src/renderer/src/components/Backstep/CopyWriting.vue new file mode 100644 index 0000000..a4cfcad --- /dev/null +++ b/src/renderer/src/components/Backstep/CopyWriting.vue @@ -0,0 +1,623 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Backstep/GetFrame.vue b/src/renderer/src/components/Backstep/GetFrame.vue new file mode 100644 index 0000000..75d979a --- /dev/null +++ b/src/renderer/src/components/Backstep/GetFrame.vue @@ -0,0 +1,190 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/src/components/Backstep/OneKeyMatrix.vue b/src/renderer/src/components/Backstep/OneKeyMatrix.vue new file mode 100644 index 0000000..0d93bae --- /dev/null +++ b/src/renderer/src/components/Backstep/OneKeyMatrix.vue @@ -0,0 +1,387 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Backstep/PushBackPrompt.vue b/src/renderer/src/components/Backstep/PushBackPrompt.vue new file mode 100644 index 0000000..c254885 --- /dev/null +++ b/src/renderer/src/components/Backstep/PushBackPrompt.vue @@ -0,0 +1,99 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Backstep/ReGenerate.vue b/src/renderer/src/components/Backstep/ReGenerate.vue new file mode 100644 index 0000000..e8f20f2 --- /dev/null +++ b/src/renderer/src/components/Backstep/ReGenerate.vue @@ -0,0 +1,495 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Backstep/VideoGenerate.vue b/src/renderer/src/components/Backstep/VideoGenerate.vue new file mode 100644 index 0000000..136fbdc --- /dev/null +++ b/src/renderer/src/components/Backstep/VideoGenerate.vue @@ -0,0 +1,26 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Backstep/oneImageReDrwa.vue b/src/renderer/src/components/Backstep/oneImageReDrwa.vue new file mode 100644 index 0000000..7cca218 --- /dev/null +++ b/src/renderer/src/components/Backstep/oneImageReDrwa.vue @@ -0,0 +1,647 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Clip/AddDraft.vue b/src/renderer/src/components/Clip/AddDraft.vue new file mode 100644 index 0000000..b4980f5 --- /dev/null +++ b/src/renderer/src/components/Clip/AddDraft.vue @@ -0,0 +1,45 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Clip/AlignDraft.vue b/src/renderer/src/components/Clip/AlignDraft.vue new file mode 100644 index 0000000..c484da6 --- /dev/null +++ b/src/renderer/src/components/Clip/AlignDraft.vue @@ -0,0 +1,122 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Components/CheckMachineId.vue b/src/renderer/src/components/Components/CheckMachineId.vue new file mode 100644 index 0000000..7587831 --- /dev/null +++ b/src/renderer/src/components/Components/CheckMachineId.vue @@ -0,0 +1,83 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/src/components/Components/GenerateAllImages.vue b/src/renderer/src/components/Components/GenerateAllImages.vue new file mode 100644 index 0000000..842592a --- /dev/null +++ b/src/renderer/src/components/Components/GenerateAllImages.vue @@ -0,0 +1,461 @@ + + + + + diff --git a/src/renderer/src/components/Components/ManageBadPrompt.vue b/src/renderer/src/components/Components/ManageBadPrompt.vue new file mode 100644 index 0000000..3d45c9a --- /dev/null +++ b/src/renderer/src/components/Components/ManageBadPrompt.vue @@ -0,0 +1,120 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Components/ModifyPromptChinese.vue b/src/renderer/src/components/Components/ModifyPromptChinese.vue new file mode 100644 index 0000000..eeeb45a --- /dev/null +++ b/src/renderer/src/components/Components/ModifyPromptChinese.vue @@ -0,0 +1,213 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Components/ModifyVideoAssSetting.vue b/src/renderer/src/components/Components/ModifyVideoAssSetting.vue new file mode 100644 index 0000000..1a2326a --- /dev/null +++ b/src/renderer/src/components/Components/ModifyVideoAssSetting.vue @@ -0,0 +1,59 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Components/SDADetailerSetting.vue b/src/renderer/src/components/Components/SDADetailerSetting.vue new file mode 100644 index 0000000..fab55fe --- /dev/null +++ b/src/renderer/src/components/Components/SDADetailerSetting.vue @@ -0,0 +1,94 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Components/SelectDraft.vue b/src/renderer/src/components/Components/SelectDraft.vue new file mode 100644 index 0000000..a8ad82e --- /dev/null +++ b/src/renderer/src/components/Components/SelectDraft.vue @@ -0,0 +1,36 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Components/SelectImageStyle.vue b/src/renderer/src/components/Components/SelectImageStyle.vue new file mode 100644 index 0000000..3e53f56 --- /dev/null +++ b/src/renderer/src/components/Components/SelectImageStyle.vue @@ -0,0 +1,154 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Components/ShowImageTag.vue b/src/renderer/src/components/Components/ShowImageTag.vue new file mode 100644 index 0000000..f1a8b82 --- /dev/null +++ b/src/renderer/src/components/Components/ShowImageTag.vue @@ -0,0 +1,57 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Home/Home.vue b/src/renderer/src/components/Home/Home.vue new file mode 100644 index 0000000..bcd6dde --- /dev/null +++ b/src/renderer/src/components/Home/Home.vue @@ -0,0 +1,327 @@ + + + + \ No newline at end of file diff --git a/src/renderer/src/components/Home/ReDrawImageWD.vue b/src/renderer/src/components/Home/ReDrawImageWD.vue new file mode 100644 index 0000000..8c63860 --- /dev/null +++ b/src/renderer/src/components/Home/ReDrawImageWD.vue @@ -0,0 +1,744 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/src/components/Home/ShowMessage.vue b/src/renderer/src/components/Home/ShowMessage.vue new file mode 100644 index 0000000..e4b552f --- /dev/null +++ b/src/renderer/src/components/Home/ShowMessage.vue @@ -0,0 +1,44 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Original/Components/AddCharacterTag.vue b/src/renderer/src/components/Original/Components/AddCharacterTag.vue new file mode 100644 index 0000000..826acf2 --- /dev/null +++ b/src/renderer/src/components/Original/Components/AddCharacterTag.vue @@ -0,0 +1,173 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Original/Components/AddPrefixTags.vue b/src/renderer/src/components/Original/Components/AddPrefixTags.vue new file mode 100644 index 0000000..be59345 --- /dev/null +++ b/src/renderer/src/components/Original/Components/AddPrefixTags.vue @@ -0,0 +1,86 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Original/Components/AddSceneTags.vue b/src/renderer/src/components/Original/Components/AddSceneTags.vue new file mode 100644 index 0000000..933e8bb --- /dev/null +++ b/src/renderer/src/components/Original/Components/AddSceneTags.vue @@ -0,0 +1,141 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Original/Components/AddStyleTags.vue b/src/renderer/src/components/Original/Components/AddStyleTags.vue new file mode 100644 index 0000000..5935cfa --- /dev/null +++ b/src/renderer/src/components/Original/Components/AddStyleTags.vue @@ -0,0 +1,144 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Original/Components/AddSuffixTags.vue b/src/renderer/src/components/Original/Components/AddSuffixTags.vue new file mode 100644 index 0000000..188b54c --- /dev/null +++ b/src/renderer/src/components/Original/Components/AddSuffixTags.vue @@ -0,0 +1,86 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Original/Components/CharacterAnalyze.vue b/src/renderer/src/components/Original/Components/CharacterAnalyze.vue new file mode 100644 index 0000000..6a227ee --- /dev/null +++ b/src/renderer/src/components/Original/Components/CharacterAnalyze.vue @@ -0,0 +1,139 @@ + + + + \ No newline at end of file diff --git a/src/renderer/src/components/Original/Components/CharacterTags.vue b/src/renderer/src/components/Original/Components/CharacterTags.vue new file mode 100644 index 0000000..d787353 --- /dev/null +++ b/src/renderer/src/components/Original/Components/CharacterTags.vue @@ -0,0 +1,354 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Original/Components/DataTableCharacterAndScene.vue b/src/renderer/src/components/Original/Components/DataTableCharacterAndScene.vue new file mode 100644 index 0000000..6da84ef --- /dev/null +++ b/src/renderer/src/components/Original/Components/DataTableCharacterAndScene.vue @@ -0,0 +1,287 @@ + + + diff --git a/src/renderer/src/components/Original/Components/DataTableGptPromptRow.vue b/src/renderer/src/components/Original/Components/DataTableGptPromptRow.vue new file mode 100644 index 0000000..fcfdac6 --- /dev/null +++ b/src/renderer/src/components/Original/Components/DataTableGptPromptRow.vue @@ -0,0 +1,220 @@ + + + diff --git a/src/renderer/src/components/Original/Components/DataTableParameterRow.vue b/src/renderer/src/components/Original/Components/DataTableParameterRow.vue new file mode 100644 index 0000000..70d63dd --- /dev/null +++ b/src/renderer/src/components/Original/Components/DataTableParameterRow.vue @@ -0,0 +1,80 @@ + + + diff --git a/src/renderer/src/components/Original/Components/DataTablePromptRow.vue b/src/renderer/src/components/Original/Components/DataTablePromptRow.vue new file mode 100644 index 0000000..34b6257 --- /dev/null +++ b/src/renderer/src/components/Original/Components/DataTablePromptRow.vue @@ -0,0 +1,221 @@ + + + diff --git a/src/renderer/src/components/Original/Components/DataTableShowGenerateImage.vue b/src/renderer/src/components/Original/Components/DataTableShowGenerateImage.vue new file mode 100644 index 0000000..2f266ff --- /dev/null +++ b/src/renderer/src/components/Original/Components/DataTableShowGenerateImage.vue @@ -0,0 +1,254 @@ + + + diff --git a/src/renderer/src/components/Original/Components/EditWord.vue b/src/renderer/src/components/Original/Components/EditWord.vue new file mode 100644 index 0000000..2ba79a7 --- /dev/null +++ b/src/renderer/src/components/Original/Components/EditWord.vue @@ -0,0 +1,70 @@ + + + diff --git a/src/renderer/src/components/Original/Components/ImportWordAndSrt.vue b/src/renderer/src/components/Original/Components/ImportWordAndSrt.vue new file mode 100644 index 0000000..3d0504a --- /dev/null +++ b/src/renderer/src/components/Original/Components/ImportWordAndSrt.vue @@ -0,0 +1,562 @@ + + + diff --git a/src/renderer/src/components/Original/Components/InputDialogContent.vue b/src/renderer/src/components/Original/Components/InputDialogContent.vue new file mode 100644 index 0000000..3c3f952 --- /dev/null +++ b/src/renderer/src/components/Original/Components/InputDialogContent.vue @@ -0,0 +1,29 @@ + + + diff --git a/src/renderer/src/components/Original/Components/PromptSetting.vue b/src/renderer/src/components/Original/Components/PromptSetting.vue new file mode 100644 index 0000000..ed89c4c --- /dev/null +++ b/src/renderer/src/components/Original/Components/PromptSetting.vue @@ -0,0 +1,307 @@ + + + diff --git a/src/renderer/src/components/Original/DataTable.vue b/src/renderer/src/components/Original/DataTable.vue new file mode 100644 index 0000000..ca20c32 --- /dev/null +++ b/src/renderer/src/components/Original/DataTable.vue @@ -0,0 +1,926 @@ + + + diff --git a/src/renderer/src/components/Original/MainPage.vue b/src/renderer/src/components/Original/MainPage.vue new file mode 100644 index 0000000..f07e728 --- /dev/null +++ b/src/renderer/src/components/Original/MainPage.vue @@ -0,0 +1,99 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Original/MenuButton.vue b/src/renderer/src/components/Original/MenuButton.vue new file mode 100644 index 0000000..0e6e4eb --- /dev/null +++ b/src/renderer/src/components/Original/MenuButton.vue @@ -0,0 +1,369 @@ + + + diff --git a/src/renderer/src/components/Setting/ClipSetting.vue b/src/renderer/src/components/Setting/ClipSetting.vue new file mode 100644 index 0000000..f4d35fc --- /dev/null +++ b/src/renderer/src/components/Setting/ClipSetting.vue @@ -0,0 +1,310 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Setting/Components/AddGptOption.vue b/src/renderer/src/components/Setting/Components/AddGptOption.vue new file mode 100644 index 0000000..15b6818 --- /dev/null +++ b/src/renderer/src/components/Setting/Components/AddGptOption.vue @@ -0,0 +1,274 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/src/components/Setting/Components/AddGptPrompts.vue b/src/renderer/src/components/Setting/Components/AddGptPrompts.vue new file mode 100644 index 0000000..5230b1c --- /dev/null +++ b/src/renderer/src/components/Setting/Components/AddGptPrompts.vue @@ -0,0 +1,298 @@ + + + + + diff --git a/src/renderer/src/components/Setting/Components/BackgroundMusic.vue b/src/renderer/src/components/Setting/Components/BackgroundMusic.vue new file mode 100644 index 0000000..b9557e5 --- /dev/null +++ b/src/renderer/src/components/Setting/Components/BackgroundMusic.vue @@ -0,0 +1,160 @@ + + \ No newline at end of file diff --git a/src/renderer/src/components/Setting/Components/KeyFrameSetting.vue b/src/renderer/src/components/Setting/Components/KeyFrameSetting.vue new file mode 100644 index 0000000..dee9ab1 --- /dev/null +++ b/src/renderer/src/components/Setting/Components/KeyFrameSetting.vue @@ -0,0 +1,185 @@ + + \ No newline at end of file diff --git a/src/renderer/src/components/Setting/MJSetting.vue b/src/renderer/src/components/Setting/MJSetting.vue new file mode 100644 index 0000000..8ac98ba --- /dev/null +++ b/src/renderer/src/components/Setting/MJSetting.vue @@ -0,0 +1,347 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Setting/SDSetting.vue b/src/renderer/src/components/Setting/SDSetting.vue new file mode 100644 index 0000000..1441568 --- /dev/null +++ b/src/renderer/src/components/Setting/SDSetting.vue @@ -0,0 +1,132 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Setting/Setting.vue b/src/renderer/src/components/Setting/Setting.vue new file mode 100644 index 0000000..0471eec --- /dev/null +++ b/src/renderer/src/components/Setting/Setting.vue @@ -0,0 +1,379 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/components/Setting/VideoGenerateSetting.vue b/src/renderer/src/components/Setting/VideoGenerateSetting.vue new file mode 100644 index 0000000..54e33df --- /dev/null +++ b/src/renderer/src/components/Setting/VideoGenerateSetting.vue @@ -0,0 +1,520 @@ + + \ No newline at end of file diff --git a/src/renderer/src/main.js b/src/renderer/src/main.js new file mode 100644 index 0000000..c1b07a3 --- /dev/null +++ b/src/renderer/src/main.js @@ -0,0 +1,37 @@ +import { createApp } from 'vue' +import { createRouter, createWebHashHistory } from 'vue-router'; +import App from './App.vue' +import { Home } from '@vicons/ionicons5'; +const app = createApp(App); + +const routes = [ + { + path: "/", + component: () => import('./components/Home/Home.vue'), + children: [ + + { path: "/global_setting", name: "global_setting", component: () => import('./components/Setting/Setting.vue') }, + { path: "/clip_setting", name: "clip_setting", component: () => import('./components/Setting/ClipSetting.vue') }, + { path: "/getframe", name: "getframe", component: () => import('./components/Backstep/GetFrame.vue') }, + { path: "/pushBackPrompt", name: "pushBackPrompt", component: () => import('./components/Backstep/PushBackPrompt.vue') }, + { path: "/regenerate", name: "regenerate", component: () => import('./components/Backstep/ReGenerate.vue') }, + { path: "/align_draft", name: "align_draft", component: () => import('./components/Clip/AlignDraft.vue') }, + { path: "/add_draft", name: "add_draft", component: () => import('./components/Clip/AddDraft.vue') }, + { path: "/VideoGenerate", name: "VideoGenerate", component: () => import('./components/Backstep/VideoGenerate.vue') }, + { path: "/sd_setting", name: "sd_setting", component: () => import('./components/Setting/SDSetting.vue') }, + { path: "/copywriting", name: "copywriting", component: () => import('./components/Backstep/CopyWriting.vue') }, + { path: "/videogeneratesetting", name: "videogeneratesetting", component: () => import('./components/Setting/VideoGenerateSetting.vue') }, + { path: "/ShowMessage", name: "ShowMessage", component: () => import('./components/Home/ShowMessage.vue') }, + { path: "/sdoriginal", name: "sdoriginal", component: () => import('./components/Original/MainPage.vue') }, + { path: "/mj_setting", name: "mj_setting", component: () => import('./components/Setting/MJSetting.vue') }, + ] + }, + { path: "/ReDrawImage", component: () => import('./components/Home/ReDrawImageWD.vue'), }, +] +const router = createRouter({ + history: createWebHashHistory(), + routes +}) +app.use(router); + +app.mount('#app') diff --git a/src/renderer/styles.css b/src/renderer/styles.css new file mode 100644 index 0000000..48beb8b --- /dev/null +++ b/src/renderer/styles.css @@ -0,0 +1,7 @@ +@media (prefers-color-scheme: dark) { + body { background: #333; color: white; } + } + + @media (prefers-color-scheme: light) { + body { background: #ddd; color: black; } + } \ No newline at end of file