Initial commit 添加MJ功能

This commit is contained in:
2024-05-15 12:57:15 +08:00
commit 74009113fa
602 changed files with 43708 additions and 0 deletions
+68
View File
@@ -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
};
+172
View File
@@ -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"
}
}
+421
View File
@@ -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 answerYou 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
作为角色 <Role>,每一次输出都要严格遵守<Rules>,一步一步思考,按顺序执行<Workflow> ,使用默认 <Language> ,下面是小说文本:`,
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
最后再强调,你作为角色 <Pico>,每一次输出都要严格遵守<Rules>,一步一步慢慢思考,参考<Examples>的格式,一步一步思考,按顺序执行<Rules>,不需要做解释说明,只呈现最后【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_optionsgpt_model_optionsgpt_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;
}
}
};
File diff suppressed because it is too large Load Diff
+100
View File
@@ -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}`
}
}
}
}
+119
View File
@@ -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 主分类,gpttag这些
* @param {*} property 返回书信的名称 gpt_optionsgpt_model_optionsgpt_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;
}
}
}
+245
View File
@@ -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 要获取的什么属性信息 propertyproperty 为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 要获取的什么属性信息 propertyproperty 为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()
}
}
}
}
+268
View File
@@ -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" }
]
}
}
}
+47
View File
@@ -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);
}
};
+153
View File
@@ -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()
}
}
}
}