Initial clean project import

This commit is contained in:
cat-shark
2026-06-19 18:41:41 +08:00
commit a13b804c7a
1306 changed files with 220568 additions and 0 deletions
+3
View File
@@ -0,0 +1,3 @@
export const CommonConfig = {
darkModeEnable: false,
};
+17
View File
@@ -0,0 +1,17 @@
import contextMenu from "electron-context-menu";
const init = () => {
contextMenu({
showSaveImageAs: false,
showCopyLink: false,
showCopyImage: false,
showSelectAll: false,
showInspectElement: false,
showSearchWithGoogle: false,
showLookUpSelection: false,
});
};
export const ConfigContextMenu = {
init,
};
+199
View File
@@ -0,0 +1,199 @@
{
"version": "4.0.0",
"exportDate": "2026-01-04T03:52:18.928Z",
"config": {
"lang": "zh-CN",
"updaterCheckAtLaunch": "yes",
"hubRoot": "D:\\生成的文件",
"videoMixCutSettings": {
"enabled": true,
"mode": "fixed",
"fixedModeConfig": {
"enabled": true,
"opening": {
"enabled": true,
"timeRange": {
"durationMin": 1,
"durationMax": 6
},
"materialFolderPath": "D:\\可以用的素材\\鞋子电商视频",
"displayMode": "fullscreen",
"pipPosition": "bottom-center",
"pipSizePercent": 35,
"pipScaleMode": "fit",
"originalVideoMinimized": {
"enabled": true,
"shape": "circle",
"position": "bottom-right",
"sizePercent": 25
},
"selectionMode": "random"
},
"middle": {
"enabled": true,
"timeRange": {
"durationMin": 1,
"durationMax": 7
},
"materialFolderPath": "D:\\可以用的素材\\鞋子电商视频",
"displayMode": "pip",
"pipPosition": "center",
"pipSizePercent": 50,
"pipScaleMode": "fit",
"originalVideoMinimized": {
"enabled": true,
"shape": "circle",
"position": "center",
"sizePercent": 25
},
"selectionMode": "random"
},
"ending": {
"enabled": true,
"timeRange": {
"durationMin": 1,
"durationMax": 7
},
"materialFolderPath": "D:\\可以用的素材\\鞋子电商视频",
"displayMode": "pip",
"pipScaleMode": "fill",
"pipSizePercent": 30,
"pipPosition": "top-right",
"originalVideoMinimized": {
"enabled": true,
"shape": "square",
"position": "top-right",
"sizePercent": 15
},
"selectionMode": "random"
}
},
"keywordModeConfig": {
"enabled": false,
"groups": [
{
"groupId": "group_1765719932044_0.6648505028922633",
"groupName": "12",
"materialFolderPath": "",
"durationMin": 2,
"durationMax": 5,
"selectionMode": "random",
"displayMode": "fullscreen",
"pipPosition": "bottom-right",
"pipSizePercent": 30,
"pipScaleMode": "fit",
"enabled": false,
"originalVideoMinimized": {
"enabled": false,
"shape": "square",
"position": "bottom-right",
"sizePercent": 25
}
},
{
"groupId": "group_keyemphasis",
"groupName": "重点词/成语词",
"materialFolderPath": "D:\\可以用的素材\\鞋子电商视频",
"durationMin": 1,
"durationMax": 6,
"selectionMode": "random",
"displayMode": "fullscreen",
"pipPosition": "center",
"pipSizePercent": 80,
"pipScaleMode": "fit",
"enabled": true,
"originalVideoMinimized": {
"enabled": true,
"shape": "square",
"position": "bottom-right",
"sizePercent": 25
}
},
{
"groupId": "group_description",
"groupName": "描述词",
"materialFolderPath": "D:\\可以用的素材\\鞋子电商视频",
"durationMin": 1,
"durationMax": 5,
"selectionMode": "random",
"displayMode": "pip",
"pipPosition": "center",
"pipSizePercent": 80,
"pipScaleMode": "fit",
"enabled": true,
"originalVideoMinimized": {
"enabled": false,
"shape": "square",
"position": "bottom-right",
"sizePercent": 25
}
},
{
"groupId": "group_emotion",
"groupName": "情感词",
"materialFolderPath": "D:\\可以用的素材\\鞋子电商视频",
"durationMin": 2,
"durationMax": 5,
"selectionMode": "random",
"displayMode": "fullscreen",
"pipPosition": "bottom-right",
"pipSizePercent": 30,
"pipScaleMode": "fit",
"enabled": true,
"originalVideoMinimized": {
"enabled": true,
"shape": "circle",
"position": "top-left",
"sizePercent": 25
}
},
{
"groupId": "group_action",
"groupName": "行动词",
"materialFolderPath": "D:\\可以用的素材\\鞋子电商视频",
"durationMin": 1,
"durationMax": 10,
"selectionMode": "random",
"displayMode": "pip",
"pipPosition": "center",
"pipSizePercent": 80,
"pipScaleMode": "fit",
"enabled": true,
"originalVideoMinimized": {
"enabled": false,
"shape": "square",
"position": "bottom-right",
"sizePercent": 25
}
},
{
"groupId": "group_12",
"groupName": "12",
"materialFolderPath": "",
"durationMin": 2,
"durationMax": 5,
"selectionMode": "random",
"displayMode": "fullscreen",
"pipPosition": "bottom-right",
"pipSizePercent": 30,
"pipScaleMode": "fit",
"enabled": false,
"originalVideoMinimized": {
"enabled": false,
"shape": "square",
"position": "bottom-right",
"sizePercent": 25
}
}
]
}
},
"ipAgentSettings": null,
"prompts": {
"scriptPrompt": "你是一个视频口播专家,擅长根据用户给的主题和关键词生成高质量的口播稿件。\n请根据以下要求生成口播稿件:\n\n1. 主题:{title}\n2. 字数:大约{count}字\n\n请确保稿件内容连贯、有吸引力,并且符合口播的风格。\n请直接输出生成的口播稿件,无需任何额外说明文字。\n不要带任何表情和符号。\n禁止输出的词:\"原文\"\"作者\"\"文章\"等词,攻击性强、侮辱性强的词(滚吧、找爸爸去、废物)、骂人的词(傻子、垃圾、蠢蛋),ai常用词(如\"这波操作\"、\"666\"),极限词、违反法律的词汇\n\n可用变量:{title}、{count}",
"titleTagPrompt": "是短视频标题与标签助手。请基于提供的口播文案,生成一个标题和3-4个标签,输出的语言要完全是我们文案的语言格式\n- 标题不超过15个字,简洁有吸引力,不加引号,不含表情或图标字符。\n- 标签为2-6个字的中文短词,不含#、空格和表情;以主题词为主,避免冗长句。\n- 然后从文案里筛选出优秀的的词汇,必须是文案里包含的一字不差的,按照以下分类\n * 重点词/成语词:文案中的核心词汇、成语、重要概念。\n * 描述词:文案中用于描述事物特征、状态的优秀词汇。\n * 行动词:文案中表示动作、行为的优秀词汇。\n * 情感词:文案中表达情感、情绪的优秀词汇。\n\n-- 直接输出纯JSON格式,如果没有合适的词,[]格式里面可以留空,不要生凑,不要一个字的词,不要使用markdown代码块(不要用),不要附加任何说明文字。\n\n- 输出格式为:\n{\n \"title\": \"...\",\n \"tags\": [\"...\", \"...\", \"...\", \"...\"],\n \"keywords\": {\n \"重点词/成语词\": [\"...\", \"...\"],\n \"描述词\": [\"...\"],\n \"行动词\": [\"...\"],\n \"情感词\": [\"...\",]\n }\n}\n\n\n文案:<content>{{content}}</content>",
"topicRewritePrompt": "参考以下标题,帮我生成5个新的标题。\n\n参考标题:\n{{content}}\n\n要求:\n1. 保持相似的主题和风格\n2. 标题简洁有力,吸引眼球\n3. 不要添加表情符号和#标签\n4. 每个标题独立成行\n\n请直接输出5个新标题,不要编号和额外说明。\n可用变量:{{content}}",
"rewritePrompt": "你是一位文案改写助手,不增加表情或特殊符号,输出{{count}}字。\n原文:\n{{content}}\n\n\n ## 写作限制和特征\n -禁止输出的词:\"原文\"\"作者\"\"文章\"等词,攻击性强、侮辱性强的词(滚吧、找爸爸去、废物)、骂人的词(傻子、垃圾、蠢蛋),ai常用词(如\"这波操作\"、\"666\"),极限词、违反法律的词汇\n\n -用词口语化,句式有短句、情绪浓烈,\n -不要输出前言和介绍,也不能直白的指责。\n -写作的内容不要引用提示词的要求。\n\n ## 写作要求\n 1、第一段直接照抄原文的第一句话作为文章开头,一个字也不能改,必须控制30个字以内,绝对禁止照抄的第一句话超过30个字,超过30个字在不影响句子连贯的情况下截停。\n\n 2、后面的内容要具体叙述具体行为,每一个具体动作都不能跳过,可以直接使用原文句子,但是不能完全一致,从原文案的内容里面,用不同的角度切入叙述,确保内容完整,可以使用同义字进行替换,重组结构。\n\n 3、最后一段可以直接使用原文的最后一段,如果有身份信息的内容,就不要写出来,**例如:我是某某,后续内容主页观看。**\n可用变量:{{content}}、{{count}}"
}
}
}
+721
View File
@@ -0,0 +1,721 @@
{
"version": "1.2",
"timestamp": "2026-01-10T04:12:13.221Z",
"ipAgentSettings": {
"textModelKey": "builtInDoubao|doubao-seed-2-0-mini-260215",
"voiceModelKey": "",
"voicePromptId": 7,
"asrMode": "online",
"asrModelKey": "",
"voiceMode": "online",
"videoDigitalHumanModelKey": "__CLOUD__",
"scriptPrompt": "你是一个视频口播专家,擅长根据用户给的主题和关键词生成高质量的口播稿件。\n请根据以下要求生成口播稿件:\n\n1. 主题:{title}\n2. 字数:大约{count}字\n\n请确保稿件内容连贯、有吸引力,并且符合口播的风格。\n请直接输出生成的口播稿件,无需任何额外说明文字。\n\n可用变量:{title}、{count}",
"titleTagPrompt": "是短视频标题与标签助手。请基于提供的口播文案,生成一个标题和3-4个标签,输出的语言要完全是我们文案的语言格式\n- 标题不超过15个字,简洁有吸引力,不加引号,不含表情或图标字符。\n- 标签为2-6个字的中文短词,不含#、空格和表情;以主题词为主,避免冗长句。\n- 然后从文案里筛选出优秀的的词汇,必须是文案里包含的一字不差的,按照以下分类\n * 重点词/成语词:文案中的核心词汇、成语、重要概念。\n * 描述词:文案中用于描述事物特征、状态的优秀词汇。\n * 行动词:文案中表示动作、行为的优秀词汇。\n * 情感词:文案中表达情感、情绪的优秀词汇。\n\n-- 直接输出纯JSON格式,如果没有合适的词,[]格式里面可以留空,不要生凑,不要一个字的词,不要使用markdown代码块(不要用),不要附加任何说明文字。\n\n- 输出格式为:\n{\n \"title\": \"...\",\n \"tags\": [\"...\", \"...\", \"...\", \"...\"],\n \"keywords\": {\n \"重点词/成语词\": [\"...\", \"...\"],\n \"描述词\": [\"...\"],\n \"行动词\": [\"...\"],\n \"情感词\": [\"...\",]\n }\n}\n\n\n文案:<content>{{content}}</content>",
"topicRewritePrompt": "参考以下标题,帮我生成5个新的标题。\n\n参考标题:\n{{content}}\n\n要求:\n1. 保持相似的主题和风格\n2. 标题简洁有力,吸引眼球\n3. 不要添加表情符号和#标签\n4. 每个标题独立成行\n\n请直接输出5个新标题,不要编号和额外说明。\n可用变量:{{content}}",
"rewritePrompt": "# 你是一位文案改写助手,不增加表情或特殊符号,输出{{count}}字。\n原文:\n{{content}}\n\n\n ## 写作限制和特征\n -禁止输出的词:“原文”“作者”“文章”等词,攻击性强、侮辱性强的词(滚吧、找爸爸去、废物)、骂人的词(傻子、垃圾、蠢蛋),ai常用词(如“这波操作”、“666”)\n -用词口语化,句式有短句、情绪浓烈,\n -不要输出前言和介绍,也不能直白的指责。\n -写作的内容不要引用提示词的要求。\n\n ## 写作要求\n 1、第一段直接照抄原文的第一句话作为文章开头,一个字也不能改,必须控制30个字以内,绝对禁止照抄的第一句话超过30个字,超过30个字在不影响句子连贯的情况下截停。\n\n 2、后面的内容要具体叙述具体行为,每一个具体动作都不能跳过,可以直接使用原文句子,但是不能完全一致,从原文案的内容里面,用不同的角度切入叙述,确保内容完整,可以使用同义字进行替换,重组结构。\n\n 3、最后一段可以直接使用原文的最后一段,如果有身份信息的内容,就不要写出来,**例如:我是某某,后续内容主页观看。**",
"subtitleHighlightWords": "",
"bgmDirectory": "",
"enableSentimentAnalysis": false,
"sentimentModelKey": "zhipu|glm-4-flash",
"sentimentTemplate": "auto",
"sentimentEffectIntensity": 70,
"enableSentimentAnimation": true,
"sentimentColors": {
"positive": "#00FF00",
"negative": "#FF0000",
"neutral": "#FFFFFF",
"emphasis": "#FFFF00"
},
"minSubtitleDuration": 2,
"normalSubtitleX": 50,
"normalSubtitleY": 15,
"effectSubtitleX": 50,
"effectSubtitleY": 50,
"disableSmartLayout": false,
"keywordGroupPositions": [
{
"groupName": "行动词",
"effectX": 15
},
{
"groupName": "情感词",
"effectX": 50,
"effectY": 53
},
{
"groupName": "描述词",
"effectX": 46,
"effectY": 63
},
{
"groupName": "重点词/成语词",
"effectX": 50,
"effectY": 89
},
{
"groupName": "12"
}
],
"avoidanceConfig": {
"safeDistance": 20,
"preferDirection": "right"
},
"silenceThreshold": -40,
"silenceDuration": 1,
"minPauseDuration": 0.15,
"videoDigitalHumanMode": "local"
},
"prompts": {
"scriptPrompt": "你是一个视频口播专家,擅长根据用户给的主题和关键词生成高质量的口播稿件。\n请根据以下要求生成口播稿件:\n\n1. 主题:{title}\n2. 字数:大约{count}字\n\n请确保稿件内容连贯、有吸引力,并且符合口播的风格。\n请直接输出生成的口播稿件,无需任何额外说明文字。\n\n可用变量:{title}、{count}",
"titleTagPrompt": "是短视频标题与标签助手。请基于提供的口播文案,生成一个标题和3-4个标签,输出的语言要完全是我们文案的语言格式\n- 标题不超过15个字,简洁有吸引力,不加引号,不含表情或图标字符。\n- 标签为2-6个字的中文短词,不含#、空格和表情;以主题词为主,避免冗长句。\n- 然后从文案里筛选出优秀的的词汇,必须是文案里包含的一字不差的,按照以下分类\n * 重点词/成语词:文案中的核心词汇、成语、重要概念。\n * 描述词:文案中用于描述事物特征、状态的优秀词汇。\n * 行动词:文案中表示动作、行为的优秀词汇。\n * 情感词:文案中表达情感、情绪的优秀词汇。\n\n-- 直接输出纯JSON格式,如果没有合适的词,[]格式里面可以留空,不要生凑,不要一个字的词,不要使用markdown代码块(不要用),不要附加任何说明文字。\n\n- 输出格式为:\n{\n \"title\": \"...\",\n \"tags\": [\"...\", \"...\", \"...\", \"...\"],\n \"keywords\": {\n \"重点词/成语词\": [\"...\", \"...\"],\n \"描述词\": [\"...\"],\n \"行动词\": [\"...\"],\n \"情感词\": [\"...\",]\n }\n}\n\n\n文案:<content>{{content}}</content>",
"topicRewritePrompt": "参考以下标题,帮我生成5个新的标题。\n\n参考标题:\n{{content}}\n\n要求:\n1. 保持相似的主题和风格\n2. 标题简洁有力,吸引眼球\n3. 不要添加表情符号和#标签\n4. 每个标题独立成行\n\n请直接输出5个新标题,不要编号和额外说明。\n可用变量:{{content}}",
"rewritePrompt": "# 你是一位文案改写助手,不增加表情或特殊符号,输出{{count}}字。\n原文:\n{{content}}\n\n\n ## 写作限制和特征\n -禁止输出的词:“原文”“作者”“文章”等词,攻击性强、侮辱性强的词(滚吧、找爸爸去、废物)、骂人的词(傻子、垃圾、蠢蛋),ai常用词(如“这波操作”、“666”)\n -用词口语化,句式有短句、情绪浓烈,\n -不要输出前言和介绍,也不能直白的指责。\n -写作的内容不要引用提示词的要求。\n\n ## 写作要求\n 1、第一段直接照抄原文的第一句话作为文章开头,一个字也不能改,必须控制30个字以内,绝对禁止照抄的第一句话超过30个字,超过30个字在不影响句子连贯的情况下截停。\n\n 2、后面的内容要具体叙述具体行为,每一个具体动作都不能跳过,可以直接使用原文句子,但是不能完全一致,从原文案的内容里面,用不同的角度切入叙述,确保内容完整,可以使用同义字进行替换,重组结构。\n\n 3、最后一段可以直接使用原文的最后一段,如果有身份信息的内容,就不要写出来,**例如:我是某某,后续内容主页观看。**",
"voicePromptId": 7,
"audioVoicePromptId": 7,
"audioLanguage": "中文"
},
"videoMixCutSettings": {
"enabled": true,
"mode": "fixed",
"fixedModeConfig": {
"enabled": true,
"opening": {
"enabled": false,
"timeRange": {
"durationMin": 2,
"durationMax": 5
},
"materialFolderPath": "",
"selectionMode": "random",
"displayMode": "fullscreen",
"pipPosition": "top-right",
"pipSizePercent": 30,
"pipScaleMode": "fit",
"originalVideoMinimized": {
"enabled": false,
"shape": "square",
"position": "bottom-right",
"sizePercent": 25
}
},
"middle": {
"enabled": false,
"timeRange": {
"durationMin": 2,
"durationMax": 5
},
"materialFolderPath": "",
"selectionMode": "random",
"displayMode": "fullscreen",
"pipPosition": "bottom-left",
"pipSizePercent": 40,
"pipScaleMode": "fit",
"originalVideoMinimized": {
"enabled": false,
"shape": "square",
"position": "bottom-right",
"sizePercent": 25
}
},
"ending": {
"enabled": false,
"timeRange": {
"durationMin": 2,
"durationMax": 5
},
"materialFolderPath": "",
"selectionMode": "random",
"displayMode": "fullscreen",
"pipPosition": "bottom-right",
"pipSizePercent": 30,
"pipScaleMode": "fit",
"originalVideoMinimized": {
"enabled": false,
"shape": "square",
"position": "bottom-right",
"sizePercent": 25
}
}
},
"keywordModeConfig": {
"enabled": false,
"groups": [
{
"groupId": "group_action",
"groupName": "行动词",
"materialFolderPath": "",
"durationMin": 2,
"durationMax": 5,
"selectionMode": "random",
"displayMode": "fullscreen",
"pipPosition": "bottom-right",
"pipSizePercent": 30,
"pipScaleMode": "fit",
"enabled": false,
"originalVideoMinimized": {
"enabled": false,
"shape": "square",
"position": "bottom-right",
"sizePercent": 25
}
},
{
"groupId": "group_emotion",
"groupName": "情感词",
"materialFolderPath": "",
"durationMin": 2,
"durationMax": 5,
"selectionMode": "random",
"displayMode": "fullscreen",
"pipPosition": "bottom-right",
"pipSizePercent": 30,
"pipScaleMode": "fit",
"enabled": false,
"originalVideoMinimized": {
"enabled": false,
"shape": "square",
"position": "bottom-right",
"sizePercent": 25
}
},
{
"groupId": "group_description",
"groupName": "描述词",
"materialFolderPath": "",
"durationMin": 2,
"durationMax": 5,
"selectionMode": "random",
"displayMode": "fullscreen",
"pipPosition": "bottom-right",
"pipSizePercent": 30,
"pipScaleMode": "fit",
"enabled": false,
"originalVideoMinimized": {
"enabled": false,
"shape": "square",
"position": "bottom-right",
"sizePercent": 25
}
},
{
"groupId": "group_keyemphasis",
"groupName": "重点词/成语词",
"materialFolderPath": "",
"durationMin": 2,
"durationMax": 5,
"selectionMode": "random",
"displayMode": "fullscreen",
"pipPosition": "bottom-right",
"pipSizePercent": 30,
"pipScaleMode": "fit",
"enabled": false,
"originalVideoMinimized": {
"enabled": false,
"shape": "square",
"position": "bottom-right",
"sizePercent": 25
}
},
{
"groupId": "group_12",
"groupName": "12",
"materialFolderPath": "",
"durationMin": 2,
"durationMax": 5,
"selectionMode": "random",
"displayMode": "fullscreen",
"pipPosition": "bottom-right",
"pipSizePercent": 30,
"pipScaleMode": "fit",
"enabled": false,
"originalVideoMinimized": {
"enabled": false,
"shape": "square",
"position": "bottom-right",
"sizePercent": 25
}
}
]
}
},
"subtitleTemplates": [
{
"id": "template_system_11",
"name": "11",
"description": "自定义字幕模板 - 黑底白字,支持关键词特效",
"createdAt": 1767950393391,
"config": {
"subtitleStyleId": "system-subtitle-11",
"subtitleStyle": {
"id": "custom",
"name": "自定义样式",
"description": "完全自定义的字幕样式",
"preview": "示例文字",
"fontName": "Noto Serif CJK",
"fontSize": 48,
"fontColor": "#FFFFFF",
"outlineColor": "#000000",
"outlineWidth": 3,
"shadowOffset": 2,
"shadowColor": "#000000",
"shadowBlur": 4,
"backgroundColor": "transparent",
"backgroundOpacity": 0,
"position": "bottom",
"alignment": "center",
"fontSource": "bundled"
},
"subtitleFontSizeScale": 100,
"subtitlePosition": "bottom",
"enableKeywordEffects": true,
"keywordGroups": [
{
"name": "12",
"description": "模板分组12",
"color": "#FF6B6B",
"effectId": "none",
"keywords": [],
"styleOverride": {},
"effectConfig": {}
},
{
"name": "重点词/成语词",
"description": "视频中的重点词汇和成语",
"color": "#EF0707EC",
"effectId": "fly-in",
"soundEffectId": "chain-pull",
"keywords": [],
"styleOverride": {
"fontName": "字玩哥特黑白无常 免费 超黑",
"fontSize": 80,
"fontColor": "#EF0707EC",
"outlineColor": "#000000",
"outlineWidth": 10
},
"effectConfig": {
"duration": 1.5
}
},
{
"name": "描述词",
"description": "描述性的形容词和副词",
"color": "#FFFFFF",
"effectId": "intense-flash",
"soundEffectId": "pop-1",
"keywords": [],
"styleOverride": {
"fontName": "USMCCyuanjiantecu",
"fontSize": 64,
"fontColor": "#FFFFFF",
"outlineColor": "#000000",
"outlineWidth": 1
},
"effectConfig": {
"duration": 2
}
},
{
"name": "情感词",
"description": "表达情感的词汇",
"color": "#FEFEFE",
"effectId": "danmaku",
"soundEffectId": "cash-register",
"keywords": [],
"styleOverride": {
"fontName": "心朵儿体",
"fontSize": 68,
"fontColor": "#FEFEFE",
"outlineColor": "#000000",
"outlineWidth": 0
},
"effectConfig": {
"duration": 3
}
},
{
"name": "行动词",
"description": "需要强调的行动动词",
"color": "#6CC4F6",
"effectId": "ARC_TEXT",
"soundEffectId": "knife-scrape",
"keywords": [],
"styleOverride": {
"fontName": "USMCCyuanjiantecu",
"fontSize": 200,
"fontColor": "#6CC4F6",
"outlineColor": "#000000",
"outlineWidth": 3
},
"effectConfig": {
"duration": 2
}
}
],
"screenWidth": 1920,
"screenHeight": 1080,
"fontSize": 48,
"fontFamily": "Arial, sans-serif",
"keywordGroupsStyles": [
{
"groupName": "行动词",
"styleOverride": {
"fontColor": "#FFFFFF",
"outlineColor": "#000000",
"outlineWidth": 3,
"fontSize": 68,
"fontName": "Noto Serif CJK"
},
"effectId": "intense-flash",
"effectDuration": 2,
"color": "#FFFFFF",
"soundEffectId": "magic-sfx",
"soundEffectConfig": {
"volume": 0.7,
"pitch": 1,
"fadeIn": 0,
"fadeOut": 50,
"triggerTime": "start"
}
},
{
"groupName": "情感词",
"styleOverride": {
"fontColor": "#1D69DE",
"outlineColor": "#000000",
"outlineWidth": 0,
"fontSize": 192,
"fontName": "Noto Serif CJK"
},
"effectId": "ARC_TEXT",
"effectDuration": 2,
"color": "#1D69DE",
"soundEffectId": "swoosh",
"soundEffectConfig": {
"volume": 0.7,
"pitch": 1,
"fadeIn": 0,
"fadeOut": 50,
"triggerTime": "start"
}
},
{
"groupName": "描述词",
"styleOverride": {
"fontColor": "#9ACAF9",
"outlineColor": "#000000",
"outlineWidth": 1,
"fontSize": 48,
"fontName": "Noto Serif CJK"
},
"effectId": "danmaku",
"effectDuration": 2,
"color": "#9ACAF9",
"soundEffectId": "cash-register",
"soundEffectConfig": {
"volume": 0.7,
"pitch": 1,
"fadeIn": 0,
"fadeOut": 50,
"triggerTime": "start"
}
},
{
"groupName": "重点词/成语词",
"styleOverride": {
"fontColor": "#EF0707EC",
"outlineColor": "#000000",
"outlineWidth": 10,
"fontSize": 104,
"fontName": "Noto Serif CJK"
},
"effectId": "fly-in",
"effectDuration": 2,
"color": "#EF0707EC",
"soundEffectId": "blow-impact",
"soundEffectConfig": {
"volume": 0.7,
"pitch": 1,
"fadeIn": 0,
"fadeOut": 50,
"triggerTime": "start"
}
},
{
"groupName": "12",
"styleOverride": null,
"effectId": null,
"effectDuration": null,
"color": null,
"soundEffectId": null,
"soundEffectConfig": null
}
]
},
"isSystem": true
}
],
"frontendState": {
"selectedSubtitleTemplate": "template_system_11",
"keywordGroups": [
{
"id": "group_action",
"name": "行动词",
"description": "用于表达行动和进度",
"keywords": [
{
"keyword": "重仓",
"enabled": true
},
{
"keyword": "预判",
"enabled": true
},
{
"keyword": "认准",
"enabled": true
},
{
"keyword": "聚焦",
"enabled": true
},
{
"keyword": "兑现",
"enabled": true
},
{
"keyword": "离场",
"enabled": true
}
],
"color": "#FFFFFF",
"effectId": "intense-flash",
"styleOverride": {
"fontColor": "#FFFFFF",
"outlineColor": "#000000",
"outlineWidth": 3,
"fontSize": 68,
"fontName": "Noto Serif CJK"
},
"effectConfig": {
"duration": 2
},
"styleConfig": {
"fontSize": 64,
"fontColor": "#FFFFFF",
"outlineColor": "#000000",
"outlineWidth": 2
},
"createdAt": 1767519506523,
"updatedAt": 1768017351366,
"sound_effect_id": "magic-sfx",
"sound_effect_config": "{\"volume\":0.7,\"pitch\":1,\"fadeIn\":0,\"fadeOut\":50,\"triggerTime\":\"start\"}",
"stickerId": null,
"effectDuration": 2,
"soundEffectId": "magic-sfx",
"soundEffectConfig": {
"volume": 0.7,
"pitch": 1,
"fadeIn": 0,
"fadeOut": 50,
"triggerTime": "start"
}
},
{
"id": "group_emotion",
"name": "情感词",
"description": "用于表达情感",
"keywords": [
{
"keyword": "慌了",
"enabled": true
},
{
"keyword": "狂揽",
"enabled": true
},
{
"keyword": "不舒服",
"enabled": true
}
],
"color": "#1D69DE",
"effectId": "ARC_TEXT",
"styleOverride": {
"fontColor": "#1D69DE",
"outlineColor": "#000000",
"outlineWidth": 0,
"fontSize": 192,
"fontName": "Noto Serif CJK"
},
"effectConfig": {
"duration": 3
},
"styleConfig": {
"fontSize": 64,
"fontColor": "#FFFFFF",
"outlineColor": "#000000",
"outlineWidth": 2
},
"createdAt": 1767519506517,
"updatedAt": 1768017351438,
"sound_effect_id": "swoosh",
"sound_effect_config": "{\"volume\":0.7,\"pitch\":1,\"fadeIn\":0,\"fadeOut\":50,\"triggerTime\":\"start\"}",
"stickerId": null,
"effectDuration": 2,
"soundEffectId": "swoosh",
"soundEffectConfig": {
"volume": 0.7,
"pitch": 1,
"fadeIn": 0,
"fadeOut": 50,
"triggerTime": "start"
}
},
{
"id": "group_description",
"name": "描述词",
"description": "用于描述场景和事物",
"keywords": [
{
"keyword": "果断",
"enabled": true
},
{
"keyword": "极致",
"enabled": true
},
{
"keyword": "无敌",
"enabled": true
}
],
"color": "#9ACAF9",
"effectId": "danmaku",
"styleOverride": {
"fontColor": "#9ACAF9",
"outlineColor": "#000000",
"outlineWidth": 1,
"fontSize": 48,
"fontName": "Noto Serif CJK"
},
"effectConfig": {
"duration": 2
},
"styleConfig": {
"fontSize": 64,
"fontColor": "#FFFFFF",
"outlineColor": "#000000",
"outlineWidth": 2
},
"createdAt": 1767519506509,
"updatedAt": 1768017351477,
"sound_effect_id": "cash-register",
"sound_effect_config": "{\"volume\":0.7,\"pitch\":1,\"fadeIn\":0,\"fadeOut\":50,\"triggerTime\":\"start\"}",
"stickerId": null,
"effectDuration": 2,
"soundEffectId": "cash-register",
"soundEffectConfig": {
"volume": 0.7,
"pitch": 1,
"fadeIn": 0,
"fadeOut": 50,
"triggerTime": "start"
}
},
{
"id": "group_keyemphasis",
"name": "重点词/成语词",
"description": "用于强调关键词汇和成语",
"keywords": [
{
"keyword": "核心优势",
"enabled": true
},
{
"keyword": "护城河",
"enabled": true
},
{
"keyword": "投资逻辑",
"enabled": true
},
{
"keyword": "价值标的",
"enabled": true
}
],
"color": "#EF0707EC",
"effectId": "fly-in",
"styleOverride": {
"fontColor": "#EF0707EC",
"outlineColor": "#000000",
"outlineWidth": 10,
"fontSize": 104,
"fontName": "Noto Serif CJK"
},
"effectConfig": {
"duration": 1.5
},
"styleConfig": {
"fontSize": 64,
"fontColor": "#FFFFFF",
"outlineColor": "#000000",
"outlineWidth": 2
},
"createdAt": 1767519506503,
"updatedAt": 1768017351515,
"sound_effect_id": "blow-impact",
"sound_effect_config": "{\"volume\":0.7,\"pitch\":1,\"fadeIn\":0,\"fadeOut\":50,\"triggerTime\":\"start\"}",
"stickerId": null,
"effectDuration": 2,
"soundEffectId": "blow-impact",
"soundEffectConfig": {
"volume": 0.7,
"pitch": 1,
"fadeIn": 0,
"fadeOut": 50,
"triggerTime": "start"
}
},
{
"id": "group_12",
"name": "12",
"description": "模板分组12",
"keywords": [],
"color": null,
"effectId": null,
"effectConfig": {},
"styleConfig": {
"fontSize": 64,
"fontColor": "#FFFFFF",
"outlineColor": "#000000",
"outlineWidth": 2
},
"createdAt": 1767519506497,
"updatedAt": 1768017351556,
"sound_effect_id": null,
"sound_effect_config": null,
"stickerId": null,
"effectDuration": null
}
],
"enableKeywordEffects": true,
"enableSmartSubtitle": true,
"enableSilenceRemoval": false,
"subtitleFontSizeScale": 100,
"subtitlePosition": "bottom",
"enableBGM": true,
"bgmVolume": 30,
"videoTemplateId": 7,
"enableTopTitle": false,
"topTitleStyle": {
"fontSize": 48,
"fontColor": "#FFD700",
"backgroundColor": "#000000",
"backgroundOpacity": 0.7,
"paddingHorizontal": 20,
"paddingVertical": 10,
"borderRadius": 10
}
}
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+8
View File
@@ -0,0 +1,8 @@
import {buildResolve, extraResolve} from "../lib/env";
export const logoPath = buildResolve("logo.png");
export const icoLogoPath = buildResolve("logo.ico");
export const icnsLogoPath = buildResolve("logo.icns");
export const trayPath =
process.platform === "darwin" ? extraResolve("osx/tray/iconTemplate.png") : buildResolve("tray.png");
+78
View File
@@ -0,0 +1,78 @@
import source from "./../../src/lang/source.json";
import enUS from "./../../src/lang/en-US.json";
import zhCN from "./../../src/lang/zh-CN.json";
import {isDev} from "../lib/env";
import lang from "../mapi/lang/main";
import {ConfigMain} from "../mapi/config/main";
export const defaultLocale = "zh-CN";
let locale = defaultLocale;
export const langMessageList = [
{
name: "en-US",
label: "English",
messages: enUS,
},
{
name: "zh-CN",
label: "简体中文",
messages: zhCN,
},
];
const buildMessages = (): any => {
let messages = {};
for (let m of langMessageList) {
let msgList = {};
for (let k in source) {
const v = source[k];
if (m.messages[v]) {
msgList[k] = m.messages[v];
}
}
messages[m.name] = msgList;
}
return messages;
};
let messages = buildMessages();
export const t = (text: string, param: object | null = null) => {
if (isDev) {
lang.writeSourceKeyUse(text).then();
}
if (messages[locale]) {
if (messages[locale][text]) {
if (param) {
return messages[locale][text].replace(/\{(\w+)\}/g, function (match, key) {
return key in param ? param[key] : match;
});
}
return messages[locale][text];
}
}
if (isDev) {
lang.writeSourceKey(text).then();
}
if (param) {
return text.replace(/\{(\w+)\}/g, function (match, key) {
return key in param ? param[key] : match;
});
}
return text;
};
const readyAsync = async () => {
locale = await ConfigMain.get("lang", defaultLocale);
};
const getLocale = () => {
return locale;
};
export const ConfigLang = {
readyAsync,
getLocale,
};
+87
View File
@@ -0,0 +1,87 @@
import {app, Menu} from "electron";
import {isDev, isMac} from "../lib/env";
import {t} from "./lang";
import {PageAbout} from "../page/about";
let contextMenu: Electron.Menu;
const ready = () => {
const menuTemplate: Electron.MenuItemConstructorOptions[] = [];
if (isMac) {
menuTemplate.push({
label: app.name,
submenu: [
{label: `${t("关于")}${app.name}`, role: "about"},
{type: "separator"},
// {
// label: t("设置"),
// click: () => {
// createSettingWindow();
// },
// accelerator: "CmdOrCtrl+,",
// },
// {type: "separator"},
{label: t("服务"), role: "services"},
{type: "separator"},
{label: `${t("隐藏")} ${app.name}`, role: "hide"},
{label: t("隐藏其他"), role: "hideOthers"},
{label: t("全部显示"), role: "unhide"},
{type: "separator"},
{label: t("退出"), role: "quit"},
],
});
}
menuTemplate.push({
label: t("编辑"),
submenu: [
{label: t("撤销"), accelerator: "CmdOrCtrl+Z", role: "undo"},
{label: t("重做"), accelerator: "Shift+CmdOrCtrl+Z", role: "redo"},
{type: "separator"},
{label: t("剪切"), accelerator: "CmdOrCtrl+X", role: "cut"},
{label: t("复制"), accelerator: "CmdOrCtrl+C", role: "copy"},
{label: t("粘贴"), accelerator: "CmdOrCtrl+V", role: "paste"},
{label: t("全选"), accelerator: "CmdOrCtrl+A", role: "selectAll"},
],
});
if (isDev) {
menuTemplate.push({
label: t("视图"),
submenu: [
{label: t("重新加载"), role: "reload"},
{label: t("强制重载"), role: "forceReload"},
{label: t("开发者工具"), role: "toggleDevTools"},
{type: "separator"},
{label: t("实际大小"), role: "resetZoom", accelerator: ""},
{label: t("放大"), role: "zoomIn"},
{label: t("缩小"), role: "zoomOut"},
{type: "separator"},
{label: t("全屏"), role: "togglefullscreen"},
],
});
}
// menuTemplate.push({
// label: t("帮助"),
// role: "help",
// submenu: [
// // {
// // label: t("教程帮助"),
// // click: () => {
// // createHelpWindow();
// // },
// // },
// // {type: "separator"},
// // {
// // label: t("关于"),
// // click: () => {
// // PageAbout.open().then()
// // },
// // },
// ],
// })
const menu = Menu.buildFromTemplate(menuTemplate);
Menu.setApplicationMenu(menu);
};
export const ConfigMenu = {
ready,
};
File diff suppressed because it is too large Load Diff
+78
View File
@@ -0,0 +1,78 @@
import {app, Menu, Tray} from "electron";
import {trayPath} from "./icon";
import {AppRuntime} from "../mapi/env";
import {AppConfig} from "../../src/config";
import {t} from "./lang";
import {isMac, isWin} from "../lib/env";
let tray = null;
const showApp = () => {
if (isMac) {
app.dock.show();
}
AppRuntime.mainWindow.show();
};
const hideApp = () => {
if (isMac) {
app.dock.hide();
}
AppRuntime.mainWindow.hide();
};
const quitApp = () => {
app.quit();
};
const ready = () => {
try {
tray = new Tray(trayPath);
} catch (err) {
console.error('[Tray] Failed to create tray:', err);
return;
}
tray.setToolTip(AppConfig.title);
if (isWin) {
tray.on("click", () => {
showApp();
});
}
const contextMenu = Menu.buildFromTemplate([
{
label: t("显示主界面"),
click: () => {
showApp();
},
},
{
label: t("重启"),
click: () => {
app.relaunch();
quitApp();
},
},
{
label: t("退出"),
click: () => {
quitApp();
},
},
]);
tray.setContextMenu(contextMenu);
};
const show = () => {
if (tray) {
tray.destroy();
tray = null;
}
};
export const ConfigTray = {
ready,
};
+19
View File
@@ -0,0 +1,19 @@
export const WindowConfig = {
alwaysOpenDevTools: true,
minWidth: 1024,
minHeight: 680,
initWidth: 1600,
initHeight: 920,
aboutWidth: 500,
aboutHeight: 400,
logWidth:800,
logHeight: 600,
feedbackWidth: 700,
feedbackHeight: 600,
guideWidth: 800,
guideHeight: 540,
paymentWidth: 500,
paymentHeight: 400,
setupWidth: 800,
setupHeight: 540,
};