/** * 流水线配置校验:Rust 合并服务端 desktop_configs + 本地 SQLite(同名本地优先)。 * 实际密钥由 Node 子进程通过环境变量 AICLIENT_CFG_* 读取,无需在前端 params 传递。 */ import { invoke } from "@tauri-apps/api/core"; /** @returns {Promise<{ ok: true, map: Record } | { ok: false, message: string }>} */ export async function loadAppConfigMap() { try { const map = await invoke("get_app_config"); if (map && typeof map === "object" && Object.keys(map).length > 0) { return { ok: true, map }; } const serverMsg = await invoke("get_app_config_last_message"); if (serverMsg) { return { ok: false, message: String(serverMsg) }; } return { ok: false, message: "未获取到应用配置,请登录服务端或在「本地配置」中添加密钥", }; } catch { return { ok: false, message: "请在 Tauri 桌面端使用,并登录或在「本地配置」中设置密钥", }; } } /** 一键仿写 / 在线 ASR 等需百炼密钥 */ export async function ensureAppConfigReady() { const loaded = await loadAppConfigMap(); if (!loaded.ok) return loaded; const apiKey = loaded.map.BAILIAN_API_KEY || loaded.map.DASHSCOPE_API_KEY; if (!apiKey) { return { ok: false, message: "缺少 BAILIAN_API_KEY(或 DASHSCOPE_API_KEY),请在配置管理或「本地配置」中设置", }; } return { ok: true }; } /** 撰写文案 / LLM 改写需文本模型配置 */ export async function ensureLlmConfigReady() { const loaded = await loadAppConfigMap(); if (!loaded.ok) return loaded; const { map } = loaded; const apiKey = map.LLM_API_KEY || map.API_KEY; const apiUrl = map.LLM_BASE_URL || map.LLM_API_URL; if (!apiKey) { return { ok: false, message: "缺少 LLM_API_KEY,请在配置管理或「本地配置」中设置文本模型", }; } if (!apiUrl) { return { ok: false, message: "缺少 LLM_BASE_URL(或 LLM_API_URL),请配置文本模型接口地址", }; } return { ok: true }; } const DOUYIN_RE = /douyin\.com|iesdouyin\.com|v\.douyin\.com/i; const DIRECT_VIDEO_RE = /\.(mp4|mov|m4v|webm|mkv|flv|avi)(\?|$)/i; /** @returns {{ ok: true, value: string } | { ok: false, message: string }} */ export function validateShareText(text) { const raw = String(text || "").trim(); if (!raw) { return { ok: false, message: "请粘贴视频分享文本或视频链接" }; } const urls = raw.match(/https?:\/\/[^\s\u4e00-\u9fa5]+/gi) || []; if (urls.some((u) => DIRECT_VIDEO_RE.test(u))) { return { ok: true, value: raw }; } if (DOUYIN_RE.test(raw) || urls.some((u) => DOUYIN_RE.test(u))) { return { ok: true, value: raw }; } return { ok: false, message: "请输入抖音分享文本、抖音视频链接,或直接视频文件链接(mp4/mov/webm/mkv/avi)", }; } export const DEFAULT_REWRITE_CONFIG = { style: "casual", length: "medium", keepHashtags: true, keepEmoji: true, };