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 @@
import keywordGroupMain from './main';
export default keywordGroupMain;
+282
View File
@@ -0,0 +1,282 @@
import { ipcMain } from "electron";
import DBMain from "../db/main";
import type { KeywordGroup } from "../../../src/types/smartSubtitle";
// 获取所有关键词分组
const getAllKeywordGroups = async (): Promise<KeywordGroup[]> => {
try {
console.log('[keywordGroup:getAllKeywordGroups] IPC 处理器被调用');
// 检查数据库是否初始化
if (!DBMain) {
console.error('[keywordGroup:getAllKeywordGroups] ❌ DBMain 未定义');
return [];
}
console.log('[keywordGroup:getAllKeywordGroups] 准备执行数据库查询...');
const groups = await DBMain.select(
`SELECT * FROM keyword_groups
WHERE id NOT LIKE 'test_group_%' AND name != '测试分组-全部字统一特效'
ORDER BY createdAt DESC`
);
console.log('[keywordGroup:getAllKeywordGroups] 数据库查询完成,返回结果:', {
count: groups?.length || 0,
groups: groups?.map((g: any) => ({ id: g.id, name: g.name })) || []
});
// 🔍 调试:显示所有分组的贴纸数据
console.log('[keywordGroup:getAllKeywordGroups] 所有分组的贴纸数据:');
groups.forEach((g: any, idx: number) => {
console.log(` 分组 #${idx} "${g.name}": stickerId=${g.stickerId}, stickerConfig=${g.stickerConfig}`);
});
const result = groups.map((group: any) => ({
...group,
keywords: JSON.parse(group.keywords || "[]"),
styleOverride: group.styleOverride ? JSON.parse(group.styleOverride) : undefined,
// 🔧 修复:为 effectConfig 和 styleConfig 提供默认值以通过前端验证
effectConfig: group.effectConfig
? JSON.parse(group.effectConfig)
: { type: 'pulse-scale', duration: 600, delay: 0, intensity: 0.8 },
styleConfig: group.styleConfig
? JSON.parse(group.styleConfig)
: { fontSize: 64, fontColor: '#FFFFFF', outlineColor: '#000000', outlineWidth: 2 },
// 🔧 修复:贴纸字段直接从对应列读取(stickerId, stickerConfig
stickerId: group.stickerId, // 直接读取贴纸ID列
stickerConfig: group.stickerConfig ? JSON.parse(group.stickerConfig) : undefined // 直接读取贴纸配置列
}));
// 🔍 调试:显示映射后的结果
console.log('[keywordGroup:getAllKeywordGroups] 映射后的第一个分组:');
if (result.length > 0) {
console.log(` ID: ${result[2]?.id}`);
console.log(` Name: ${result[2]?.name}`);
console.log(` stickerId: ${result[2]?.stickerId}`);
console.log(` stickerConfig: ${JSON.stringify(result[2]?.stickerConfig)}`);
}
console.log('[keywordGroup:getAllKeywordGroups] ✅ 返回最终结果,数量:', result.length);
return result;
} catch (error) {
console.error('[keywordGroup:getAllKeywordGroups] ❌ 异常:', {
message: error?.message,
stack: error?.stack
});
return [];
}
};
// 保存关键词分组
const saveKeywordGroup = async (group: KeywordGroup): Promise<{ success: boolean; id?: string; message?: string }> => {
try {
const now = Date.now();
const existingGroup = await DBMain.first(
`SELECT id FROM keyword_groups WHERE id = ?`,
[group.id]
);
const keywords = JSON.stringify(group.keywords || []);
const styleOverride = group.styleOverride ? JSON.stringify(group.styleOverride) : null;
const effectConfig = group.effectConfig ? JSON.stringify(group.effectConfig) : null;
const styleConfig = group.styleConfig ? JSON.stringify(group.styleConfig) : null;
const stickerConfig = group.stickerConfig ? JSON.stringify(group.stickerConfig) : null; // 🆕
const soundEffectConfig = group.soundEffectConfig ? JSON.stringify(group.soundEffectConfig) : null; // 🆕
// 🔍 调试:显示即将保存的贴纸数据
console.log('[keywordGroup:saveGroup] 准备保存的贴纸数据:', {
groupId: group.id,
groupName: group.name,
stickerId: group.stickerId,
stickerConfig: group.stickerConfig,
stickerConfigStringified: stickerConfig
});
if (existingGroup) {
// 更新现有分组
await DBMain.update(
`UPDATE keyword_groups
SET name = ?, description = ?, keywords = ?, color = ?, effectId = ?,
styleOverride = ?, effectConfig = ?, styleConfig = ?,
stickerId = ?, stickerConfig = ?, effectDuration = ?,
sound_effect_id = ?, sound_effect_config = ?, updatedAt = ?
WHERE id = ?`,
[
group.name,
group.description || null,
keywords,
group.color || null,
group.effectId || null,
styleOverride,
effectConfig,
styleConfig,
group.stickerId || null,
stickerConfig,
group.effectDuration || null,
group.soundEffectId || null,
soundEffectConfig,
now,
group.id
]
);
console.log('[keywordGroup:saveGroup] ✅ UPDATE 成功,groupId:', group.id, 'stickerId:', group.stickerId);
} else {
// 插入新分组
await DBMain.insert(
`INSERT INTO keyword_groups
(id, name, description, keywords, color, effectId, styleOverride, effectConfig, styleConfig,
stickerId, stickerConfig, effectDuration, sound_effect_id, sound_effect_config, createdAt, updatedAt)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
[
group.id,
group.name,
group.description || null,
keywords,
group.color || null,
group.effectId || null,
styleOverride,
effectConfig,
styleConfig,
group.stickerId || null,
stickerConfig,
group.effectDuration || null,
group.soundEffectId || null,
soundEffectConfig,
now,
now
]
);
console.log('[keywordGroup:saveGroup] ✅ INSERT 成功,groupId:', group.id, 'stickerId:', group.stickerId);
}
return { success: true, id: group.id };
} catch (error) {
console.error("保存关键词分组失败:", error);
return { success: false, message: "保存关键词分组失败" };
}
};
// 删除关键词分组
const deleteKeywordGroup = async (groupId: string): Promise<{ success: boolean; message?: string }> => {
try {
await DBMain.delete(
`DELETE FROM keyword_groups WHERE id = ?`,
[groupId]
);
return { success: true };
} catch (error) {
console.error("删除关键词分组失败:", error);
return { success: false, message: "删除关键词分组失败" };
}
};
// 查询关键词所属的分组
const queryKeyword = async (keyword: string): Promise<KeywordGroup | null> => {
try {
const groups = await getAllKeywordGroups();
for (const group of groups) {
const groupKeywords = group.keywords || [];
const found = groupKeywords.some((kw: any) => {
const kwStr = typeof kw === 'string' ? kw : kw.keyword;
return kwStr === keyword;
});
if (found) {
return group;
}
}
return null;
} catch (error) {
console.error("查询关键词所属分组失败:", error);
return null;
}
};
// 批量查询关键词
const queryKeywordBatch = async (keywords: string[]): Promise<Map<string, KeywordGroup>> => {
try {
const result = new Map<string, KeywordGroup>();
const groups = await getAllKeywordGroups();
for (const keyword of keywords) {
for (const group of groups) {
const groupKeywords = group.keywords || [];
const found = groupKeywords.some((kw: any) => {
const kwStr = typeof kw === 'string' ? kw : kw.keyword;
return kwStr === keyword;
});
if (found) {
result.set(keyword, group);
break;
}
}
}
return result;
} catch (error) {
console.error("批量查询关键词所属分组失败:", error);
return new Map();
}
};
// 注册IPC处理程序
const registerIpcHandlers = () => {
console.log('[keywordGroup:registerIpcHandlers] 开始注册关键词分组 IPC 处理器...');
// 获取所有关键词分组
ipcMain.handle("keywordGroup:getAllGroups", async () => {
console.log('[keywordGroup:IPC:getAllGroups] 处理器被触发');
return await getAllKeywordGroups();
});
console.log('[keywordGroup:registerIpcHandlers] ✓ 已注册 keywordGroup:getAllGroups');
// 保存关键词分组
ipcMain.handle("keywordGroup:saveGroup", async (event, group: KeywordGroup) => {
console.log('[keywordGroup:IPC:saveGroup] 处理器被触发,groupId:', group.id);
return await saveKeywordGroup(group);
});
console.log('[keywordGroup:registerIpcHandlers] ✓ 已注册 keywordGroup:saveGroup');
// 删除关键词分组
ipcMain.handle("keywordGroup:deleteGroup", async (event, groupId: string) => {
console.log('[keywordGroup:IPC:deleteGroup] 处理器被触发,groupId:', groupId);
return await deleteKeywordGroup(groupId);
});
console.log('[keywordGroup:registerIpcHandlers] ✓ 已注册 keywordGroup:deleteGroup');
// 查询关键词所属分组
ipcMain.handle("keywordGroup:queryKeyword", async (event, keyword: string) => {
console.log('[keywordGroup:IPC:queryKeyword] 处理器被触发,keyword:', keyword);
return await queryKeyword(keyword);
});
console.log('[keywordGroup:registerIpcHandlers] ✓ 已注册 keywordGroup:queryKeyword');
// 批量查询关键词
ipcMain.handle("keywordGroup:queryKeywordBatch", async (event, keywords: string[]) => {
console.log('[keywordGroup:IPC:queryKeywordBatch] 处理器被触发,keywords数量:', keywords.length);
const result = await queryKeywordBatch(keywords);
return Array.from(result.entries()).map(([keyword, group]) => ({
keyword,
group
}));
});
console.log('[keywordGroup:registerIpcHandlers] ✓ 已注册 keywordGroup:queryKeywordBatch');
console.log('[keywordGroup:registerIpcHandlers] ===================== 所有 IPC 处理器注册完成 =====================');
};
export default {
getAllKeywordGroups,
saveKeywordGroup,
deleteKeywordGroup,
queryKeyword,
queryKeywordBatch,
registerIpcHandlers
};
+33
View File
@@ -0,0 +1,33 @@
import type { KeywordGroup } from "../../../src/types/smartSubtitle";
import { ipcRenderer } from 'electron';
const init = () => { };
const getAllGroups = async (): Promise<KeywordGroup[]> => {
return ipcRenderer.invoke("keywordGroup:getAllGroups");
};
const saveGroup = async (group: KeywordGroup): Promise<{ success: boolean; id?: string; message?: string }> => {
return ipcRenderer.invoke("keywordGroup:saveGroup", group);
};
const deleteGroup = async (groupId: string): Promise<{ success: boolean; message?: string }> => {
return ipcRenderer.invoke("keywordGroup:deleteGroup", groupId);
};
const queryKeyword = async (keyword: string): Promise<KeywordGroup | null> => {
return ipcRenderer.invoke("keywordGroup:queryKeyword", keyword);
};
const queryKeywordBatch = async (keywords: string[]): Promise<{ keyword: string; group: KeywordGroup }[]> => {
return ipcRenderer.invoke("keywordGroup:queryKeywordBatch", keywords);
};
export default {
init,
getAllGroups,
saveGroup,
deleteGroup,
queryKeyword,
queryKeywordBatch
};