504 lines
14 KiB
TypeScript
504 lines
14 KiB
TypeScript
import { ipcRenderer } from "electron";
|
|
|
|
// 打开浏览器窗口
|
|
const openBrowserWindow = async (params: { url: string }) => {
|
|
return ipcRenderer.invoke("ipAgent:openBrowserWindow", params);
|
|
};
|
|
|
|
// 从浏览器抓取数据
|
|
const scrapeFromBrowser = async (params: { url: string }) => {
|
|
return ipcRenderer.invoke("ipAgent:scrapeFromBrowser", params);
|
|
};
|
|
|
|
// 分析抖音账号
|
|
const analyzeDouyinAccount = async (params: { url: string }) => {
|
|
return ipcRenderer.invoke("ipAgent:analyzeDouyinAccount", params);
|
|
};
|
|
|
|
// 仿写标题
|
|
const rewriteTitles = async (params: {
|
|
titles: string[],
|
|
accountName: string,
|
|
modelConfig: { providerId: string, modelId: string, apiUrl: string, apiHost: string, apiKey: string, type: string },
|
|
rewritePrompt: string
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:rewriteTitles", params);
|
|
};
|
|
|
|
// 生成视频文案
|
|
const generateScript = async (params: {
|
|
title: string,
|
|
count: number,
|
|
modelConfig: { providerId: string, modelId: string, apiUrl: string, apiHost: string, apiKey: string, type: string },
|
|
scriptPrompt: string
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:generateScript", params);
|
|
};
|
|
|
|
// 生成标题、标签和关键词
|
|
const generateTitleTags = async (params: {
|
|
content: string,
|
|
modelConfig: { providerId: string, modelId: string, apiUrl: string, apiHost: string, apiKey: string, type: string },
|
|
titleTagPrompt: string
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:generateTitleTags", params);
|
|
};
|
|
|
|
// 保存设置
|
|
const saveSettings = async (params: { settings: any }) => {
|
|
return ipcRenderer.invoke("ipAgent:saveSettings", params);
|
|
};
|
|
|
|
// 获取设置
|
|
const getSettings = async () => {
|
|
return ipcRenderer.invoke("ipAgent:getSettings");
|
|
};
|
|
|
|
// 导出设置
|
|
const exportSettings = async (data?: any) => {
|
|
return ipcRenderer.invoke("ipAgent:exportSettings", data);
|
|
};
|
|
|
|
// 导入设置
|
|
const importSettings = async () => {
|
|
return ipcRenderer.invoke("ipAgent:importSettings");
|
|
};
|
|
|
|
// 处理视频静音检测和剪辑
|
|
const processSilenceDetection = async (params: {
|
|
inputVideo: string,
|
|
silenceThreshold: number,
|
|
silenceDuration: number
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:processSilenceDetection", params);
|
|
};
|
|
|
|
// 处理绿幕替换
|
|
const processGreenScreen = async (params: {
|
|
inputVideo: string,
|
|
backgroundImage: string,
|
|
similarity?: number,
|
|
blend?: number
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:processGreenScreen", params);
|
|
};
|
|
|
|
// 生成字幕文件
|
|
const generateSubtitle = async (params: {
|
|
videoPath: string,
|
|
scriptContent: string,
|
|
asrModelKey?: string,
|
|
timeOffset?: number
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:generateSubtitle", params);
|
|
};
|
|
|
|
// 添加字幕到视频
|
|
const addSubtitleToVideo = async (params: {
|
|
inputVideo: string,
|
|
srtPath: string,
|
|
subtitleStyle: any,
|
|
highlightWords?: string[],
|
|
keywordStyle?: any,
|
|
keywords?: Array<{ keyword: string, enabled?: boolean }>,
|
|
keywordMarkers?: any[],
|
|
keywordGroups?: any[],
|
|
enableTopTitle?: boolean,
|
|
topTitleStyle?: any,
|
|
topTitleText?: string
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:addSubtitleToVideo", params);
|
|
};
|
|
|
|
// 添加背景音乐到视频
|
|
const addBGMToVideo = async (params: {
|
|
inputVideo: string,
|
|
bgmPath: string,
|
|
bgmVolume: number
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:addBGMToVideo", params);
|
|
};
|
|
|
|
// 选择本地音乐文件
|
|
const selectMusicFile = async () => {
|
|
return ipcRenderer.invoke("ipAgent:selectMusicFile");
|
|
};
|
|
|
|
// 选择本地视频文件(用于上传自己的视频生成字幕)
|
|
const selectVideoFile = async () => {
|
|
return ipcRenderer.invoke("ipAgent:selectVideoFile");
|
|
};
|
|
|
|
// 使用FUNASR生成字幕
|
|
const generateFunasrSubtitle = async (params: {
|
|
videoPath: string,
|
|
language?: string,
|
|
maxCharsPerLine?: number
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:generateFunasrSubtitle", params);
|
|
};
|
|
|
|
// 从视频提取音频(原有版本,用于FUNASR)
|
|
const extractAudioFromVideo = async (params: {
|
|
videoPath: string
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:extractAudioFromVideo", params);
|
|
};
|
|
|
|
// 从视频提取音频(增强版,支持多种格式)
|
|
const extractAudioFromVideoEnhanced = async (params: {
|
|
videoPath: string,
|
|
format?: string,
|
|
quality?: string,
|
|
sampleRate?: string,
|
|
outputPath?: string
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:extractAudioFromVideoEnhanced", params);
|
|
};
|
|
|
|
// 从文案生成SRT字幕文件
|
|
const generateSrtFromScript = async (params: {
|
|
videoPath: string,
|
|
scriptContent: string,
|
|
audioDuration?: number,
|
|
maxCharsPerLine?: number
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:generateSrtFromScript", params);
|
|
};
|
|
|
|
// 从ASR结果生成SRT字幕文件
|
|
const generateSrtFromAsrResult = async (params: {
|
|
videoPath: string,
|
|
asrRecords: any[],
|
|
maxCharsPerLine?: number,
|
|
audioPath?: string, // 可选:音频文件路径,用于提取时间戳
|
|
timestamp?: number // 可选:直接指定时间戳,用于匹配音频文件
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:generateSrtFromAsrResult", params);
|
|
};
|
|
|
|
// 识别字幕中的关键词
|
|
const extractKeywords = async (params: {
|
|
subtitleText: string,
|
|
modelConfig: { providerId: string, modelId: string, apiUrl: string, apiKey: string },
|
|
customPrompt?: string
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:extractKeywords", params);
|
|
};
|
|
|
|
// 提取视频中的出彩帧
|
|
const extractBestFrames = async (params: {
|
|
videoPath: string,
|
|
frameCount?: number
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:extractBestFrames", params);
|
|
};
|
|
|
|
// 生成视频封面
|
|
const generateVideoCover = async (params: {
|
|
videoPath: string,
|
|
titleText: string,
|
|
effectStyle?: any
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:generateVideoCover", params);
|
|
};
|
|
|
|
// 读取SRT文件
|
|
const readSrtFile = async (params: {
|
|
srtPath: string
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:readSrtFile", params);
|
|
};
|
|
|
|
// 保存ASS字幕文件
|
|
const saveAssFile = async (params: {
|
|
assContent: string,
|
|
videoPath?: string,
|
|
timestamp?: number
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:saveAssFile", params);
|
|
};
|
|
|
|
// 获取所有封面模板
|
|
const getCoverTemplates = async () => {
|
|
return ipcRenderer.invoke("ipAgent:getCoverTemplates");
|
|
};
|
|
|
|
// 获取单个封面模板
|
|
const getCoverTemplate = async (params: { id: string }) => {
|
|
return ipcRenderer.invoke("ipAgent:getCoverTemplate", params);
|
|
};
|
|
|
|
// 保存封面模板
|
|
const saveCoverTemplate = async (params: {
|
|
name: string,
|
|
config: any,
|
|
thumbnailPath?: string,
|
|
id?: string
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:saveCoverTemplate", params);
|
|
};
|
|
|
|
// 删除封面模板
|
|
const deleteCoverTemplate = async (params: { id: string }) => {
|
|
return ipcRenderer.invoke("ipAgent:deleteCoverTemplate", params);
|
|
};
|
|
|
|
// 更新封面模板
|
|
const updateCoverTemplate = async (params: {
|
|
id: string,
|
|
name?: string,
|
|
config?: any,
|
|
thumbnailPath?: string
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:updateCoverTemplate", params);
|
|
};
|
|
|
|
// 预览封面模板效果
|
|
const previewCoverTemplate = async (params: {
|
|
videoPath: string,
|
|
titleText: string,
|
|
config: any
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:previewCoverTemplate", params);
|
|
};
|
|
|
|
// 清理损坏的封面模板数据
|
|
const cleanupCoverTemplates = async () => {
|
|
return ipcRenderer.invoke("ipAgent:cleanupCoverTemplates");
|
|
};
|
|
|
|
// 导出所有封面模板
|
|
const exportCoverTemplatesToConfig = async () => {
|
|
return ipcRenderer.invoke("ipAgent:exportCoverTemplatesToConfig");
|
|
};
|
|
|
|
// 导出所有封面模板(别名)
|
|
const exportAllCoverTemplates = async () => {
|
|
return ipcRenderer.invoke("ipAgent:exportCoverTemplatesToConfig");
|
|
};
|
|
|
|
// 导出单个封面模板
|
|
const exportCoverTemplateById = async (params: { id: string }) => {
|
|
return ipcRenderer.invoke("ipAgent:exportCoverTemplateById", params);
|
|
};
|
|
|
|
// 视频仿写功能
|
|
const rewriteVideoContent = async (params: {
|
|
videoUrl: string,
|
|
modelConfig: { providerId: string, modelId: string, apiUrl: string, apiHost: string, apiKey: string, type: string },
|
|
rewritePrompt: string
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:rewriteVideoContent", params);
|
|
};
|
|
|
|
// 新版字幕生成接口(使用ZimuShengcheng服务)
|
|
const generateSubtitleV2 = async (params: {
|
|
videoPath: string,
|
|
videoWidth: number,
|
|
videoHeight: number,
|
|
userText: string,
|
|
funasrSegments: any[],
|
|
subtitleStyle: any,
|
|
keywordGroups: any[],
|
|
keywordRenderMode?: 'floating' | 'inline-emphasis',
|
|
fontDir: string,
|
|
outputPath: string
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:generateSubtitleV2", params);
|
|
};
|
|
|
|
// 获取视频时长
|
|
const getVideoDuration = async (params: { videoPath: string }) => {
|
|
return ipcRenderer.invoke("ipAgent:getVideoDuration", params);
|
|
};
|
|
|
|
// 处理视频混剪
|
|
const processVideoMixCut = async (params: {
|
|
inputVideo: string,
|
|
replacements: Array<{
|
|
startTime: number,
|
|
duration: number,
|
|
materialPath: string,
|
|
materialDuration: number,
|
|
materialStartOffset: number,
|
|
reason: string
|
|
}>,
|
|
outputPath: string,
|
|
videoResolution: { width: number, height: number },
|
|
videoDuration: number,
|
|
displayMode?: 'pip' | 'fullscreen'
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:processVideoMixCut", params);
|
|
};
|
|
|
|
// 下载视频 (URL)
|
|
const downloadVideoFromUrl = async (params: { videoUrl: string, fileName?: string }) => {
|
|
return ipcRenderer.invoke("ipAgent:downloadVideoFromUrl", params);
|
|
};
|
|
|
|
// 下载视频 (专门用于视频仿写,返回详细信息)
|
|
const downloadVideo = async (params: { url: string }) => {
|
|
return ipcRenderer.invoke("ipAgent:downloadVideo", params);
|
|
};
|
|
|
|
// ========== 视频仿写优化 - 新增方法 ==========
|
|
|
|
// 处理抖音分享文本(新功能:不打开浏览器)
|
|
const processDouyinShare = async (params: {
|
|
shareText: string,
|
|
modelConfig: { providerId: string, modelId: string, apiUrl: string, apiHost: string, apiKey: string, type: string },
|
|
rewriteConfig?: {
|
|
style?: 'casual' | 'professional' | 'emotional' | 'humorous',
|
|
length?: 'short' | 'medium' | 'long',
|
|
keepHashtags?: boolean,
|
|
keepEmoji?: boolean
|
|
},
|
|
customPrompt?: string
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:processDouyinShare", params);
|
|
};
|
|
|
|
// 批量处理抖音分享文本
|
|
const processBatchDouyinShares = async (params: {
|
|
shareTexts: string[],
|
|
modelConfig: { providerId: string, modelId: string, apiUrl: string, apiHost: string, apiKey: string, type: string },
|
|
rewriteConfig?: {
|
|
style?: 'casual' | 'professional' | 'emotional' | 'humorous',
|
|
length?: 'short' | 'medium' | 'long',
|
|
keepHashtags?: boolean,
|
|
keepEmoji?: boolean
|
|
},
|
|
customPrompt?: string
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:processBatchDouyinShares", params);
|
|
};
|
|
|
|
// ========== 字幕模板管理 ==========
|
|
|
|
// 保存字幕模板
|
|
const saveSubtitleTemplate = async (params: {
|
|
name: string,
|
|
description?: string,
|
|
config: any,
|
|
id?: string,
|
|
isDev?: boolean
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:saveSubtitleTemplate", params);
|
|
};
|
|
|
|
// 获取所有字幕模板
|
|
const getSubtitleTemplates = async (params?: { metadataOnly?: boolean }) => {
|
|
return ipcRenderer.invoke("ipAgent:getSubtitleTemplates", params);
|
|
};
|
|
|
|
// 获取单个字幕模板
|
|
const getSubtitleTemplate = async (params: { id: string }) => {
|
|
return ipcRenderer.invoke("ipAgent:getSubtitleTemplate", params);
|
|
};
|
|
|
|
// 删除字幕模板
|
|
const deleteSubtitleTemplate = async (params: { id: string, isDev?: boolean }) => {
|
|
return ipcRenderer.invoke("ipAgent:deleteSubtitleTemplate", params);
|
|
};
|
|
|
|
// 更新字幕模板
|
|
const updateSubtitleTemplate = async (params: {
|
|
id: string,
|
|
name?: string,
|
|
description?: string,
|
|
config?: any,
|
|
is_system?: number,
|
|
isDev?: boolean
|
|
}) => {
|
|
return ipcRenderer.invoke("ipAgent:updateSubtitleTemplate", params);
|
|
};
|
|
|
|
// 导出所有字幕模板
|
|
const exportSubtitleTemplates = async (params?: { includeSystemOnly?: boolean }) => {
|
|
return ipcRenderer.invoke("ipAgent:exportSubtitleTemplates", params);
|
|
};
|
|
|
|
// 导出单个字幕模板
|
|
const exportSubtitleTemplateById = async (params: { id: string }) => {
|
|
return ipcRenderer.invoke("ipAgent:exportSubtitleTemplateById", params);
|
|
};
|
|
|
|
// 导入字幕模板
|
|
const importSubtitleTemplate = async () => {
|
|
return ipcRenderer.invoke("ipAgent:importSubtitleTemplate");
|
|
};
|
|
|
|
// 复制字幕模板
|
|
const duplicateSubtitleTemplate = async (params: { id: string; newName?: string }) => {
|
|
return ipcRenderer.invoke("ipAgent:duplicateSubtitleTemplate", params);
|
|
};
|
|
|
|
// 获取最近生成的结果文件
|
|
const getResultFilesRecently = async (type: 'audio' | 'video', limit?: number) => {
|
|
return ipcRenderer.invoke("ipAgent:getResultFilesRecently", { type, limit: limit || 5 });
|
|
};
|
|
|
|
export default {
|
|
openBrowserWindow,
|
|
scrapeFromBrowser,
|
|
generateSrtFromScript,
|
|
analyzeDouyinAccount,
|
|
rewriteTitles,
|
|
generateScript,
|
|
generateTitleTags,
|
|
saveSettings,
|
|
getSettings,
|
|
exportSettings,
|
|
importSettings,
|
|
processSilenceDetection,
|
|
processGreenScreen,
|
|
generateSubtitle,
|
|
addSubtitleToVideo,
|
|
addBGMToVideo,
|
|
selectMusicFile,
|
|
selectVideoFile,
|
|
generateFunasrSubtitle,
|
|
extractAudioFromVideo,
|
|
extractAudioFromVideoEnhanced,
|
|
generateSrtFromAsrResult,
|
|
extractKeywords,
|
|
extractBestFrames,
|
|
generateVideoCover,
|
|
readSrtFile,
|
|
saveAssFile,
|
|
// 封面模板管理
|
|
getCoverTemplates,
|
|
getCoverTemplate,
|
|
saveCoverTemplate,
|
|
deleteCoverTemplate,
|
|
updateCoverTemplate,
|
|
previewCoverTemplate,
|
|
cleanupCoverTemplates,
|
|
exportCoverTemplatesToConfig,
|
|
exportAllCoverTemplates,
|
|
exportCoverTemplateById,
|
|
rewriteVideoContent,
|
|
generateSubtitleV2,
|
|
// 混剪功能
|
|
getVideoDuration,
|
|
processVideoMixCut,
|
|
downloadVideoFromUrl,
|
|
downloadVideo,
|
|
// 视频仿写优化
|
|
processDouyinShare,
|
|
processBatchDouyinShares,
|
|
// 字幕模板管理
|
|
saveSubtitleTemplate,
|
|
getSubtitleTemplates,
|
|
getSubtitleTemplate,
|
|
deleteSubtitleTemplate,
|
|
updateSubtitleTemplate,
|
|
exportSubtitleTemplates,
|
|
exportSubtitleTemplateById,
|
|
importSubtitleTemplate,
|
|
duplicateSubtitleTemplate,
|
|
// 文件查询
|
|
getResultFilesRecently
|
|
};
|