Files
tvbox_collect/cpu_iy2/merge.js
T
2026-07-28 12:25:15 +00:00

179 lines
4.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const fs = require("fs");
const axios = require("axios");
const ARRAY_FIELDS = ["sites", "lives", "flags", "parses", "rules", "ads"];
// ------------------------------
// 自动获取 Wex 最新 spider
// ------------------------------
async function getWexSpider() {
try {
const url = "https://9280.kstore.space/newwex.json";
const res = await axios.get(url, { timeout: 10000 });
if (res.data && res.data.spider) {
console.log("🕷️ 已获取最新 Wex spider:", res.data.spider);
return res.data.spider;
}
} catch (e) {
console.error("❌ 获取 Wex spider 失败:", e);
}
return null;
}
// ------------------------------
// 自动获取 Fish 最新 spider
// ------------------------------
async function getFishSpider() {
try {
const url = "https://6800.kstore.vip/fish.json";
const res = await axios.get(url, { timeout: 10000 });
// 兼容服务器返回 JSON 对象或 JSON 字符串
const data =
typeof res.data === "string"
? JSON.parse(res.data)
: res.data;
if (data && data.spider) {
console.log("🐟 已获取最新 Fish spider:", data.spider);
return data.spider;
}
console.error("❌ Fish 配置中未找到 spider 字段");
} catch (e) {
console.error("❌ 获取 Fish spider 失败:", e.message || e);
}
return null;
}
// ------------------------------
// 合并数组逻辑(保持原样)
// ------------------------------
function mergeArrays(apiArr, editedArr, keyName) {
if (!Array.isArray(editedArr)) return apiArr;
const editedMap = new Map();
for (const item of editedArr) {
if (!item || !item[keyName]) continue;
editedMap.set(item[keyName], item);
}
const result = [];
for (const apiItem of apiArr) {
const k = apiItem[keyName];
const editedItem = editedMap.get(k);
if (!editedItem) {
result.push(apiItem);
continue;
}
if (editedItem.delete === true) continue;
const { delete: _del, ...pure } = editedItem;
result.push(pure);
editedMap.delete(k);
}
for (const [_, item] of editedMap) {
if (item.delete === true) continue;
const { delete: _del, ...pure } = item;
result.push(pure);
}
return result;
}
// ------------------------------
// 深度合并
// ------------------------------
function deepMerge(api, edited) {
const result = JSON.parse(JSON.stringify(api));
for (const key in edited) {
const value = edited[key];
if (ARRAY_FIELDS.includes(key) && Array.isArray(value)) {
const keyName = key === "sites" ? "key" : "name";
result[key] = mergeArrays(api[key] || [], value, keyName);
continue;
}
if (typeof value === "object" && value !== null && !Array.isArray(value)) {
result[key] = deepMerge(api[key] || {}, value);
continue;
}
result[key] = value;
}
return result;
}
// ------------------------------
// 主流程
// ------------------------------
(async () => {
try {
const api = JSON.parse(fs.readFileSync("天神IY.txt", "utf8"));
const edited = JSON.parse(fs.readFileSync("edited.json", "utf8"));
// 先合并
const merged = deepMerge(api, edited);
// 同时获取最新 Wex 和 Fish spider
const [wexSpider, fishSpider] = await Promise.all([
getWexSpider(),
getFishSpider()
]);
// ------------------------------
// 为指定站点注入对应 jar/ext
// ------------------------------
if (merged.sites && Array.isArray(merged.sites)) {
merged.sites = merged.sites.map(site => {
// 为 csp_SportKaFeiGuard 注入 Wex spider
if (site.api === "csp_SportKaFeiGuard" && wexSpider) {
console.log(`✨ 为 ${site.key} 注入最新 Wex spider`);
return {
...site,
jar: wexSpider,
ext: "https://9280.kstore.space/newwex.json"
};
}
// 为 csp_ALLLive 和 csp_FishConfig 注入 Fish spider
if (
(site.api === "csp_ALLLive" || site.api === "csp_FishConfig") &&
fishSpider
) {
console.log(`🐟 为 ${site.key}${site.api})注入最新 Fish spider`);
return {
...site,
jar: fishSpider,
ext: "https://6800.kstore.vip/fish.json"
};
}
return site;
});
}
// 写入最终接口
fs.writeFileSync("iy_merged.json", JSON.stringify(merged, null, 2), "utf8");
console.log("🎉 合并完成:已为指定站点注入spider");
} catch (e) {
console.error("❌ 合并失败");
console.error(e);
process.exit(1);
}
})();