97 lines
3.0 KiB
JavaScript
97 lines
3.0 KiB
JavaScript
/**
|
||
* 流水线配置校验:Rust 合并服务端 desktop_configs + 本地 SQLite(同名本地优先)。
|
||
* 实际密钥由 Node 子进程通过环境变量 AICLIENT_CFG_* 读取,无需在前端 params 传递。
|
||
*/
|
||
|
||
import { invoke } from "@tauri-apps/api/core";
|
||
|
||
/** @returns {Promise<{ ok: true, map: Record<string, string> } | { 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,
|
||
};
|