import path from "path"; import {readFile} from "fs/promises"; import {getSitesMap} from "../utils/sites-map.js"; import {computeHash, getNowTime, deepCopy} from "../utils/utils.js"; import {fileURLToPath, pathToFileURL} from 'url'; import {md5} from "../libs_drpy/crypto-util.js"; // 缓存已初始化的模块和文件 hash 值 const moduleCache = new Map(); const ruleObjectCache = new Map(); const __dirname = path.dirname(fileURLToPath(import.meta.url)); const _data_path = path.join(__dirname, '../data'); const _config_path = path.join(__dirname, '../config'); const _lib_path = path.join(__dirname, '../spider/catvod'); const getRule = async function (filePath, env) { const moduleObject = await init(filePath, env); return JSON.stringify(moduleObject); } const json2Object = function (json) { if (!json) { return {} } else if (json && typeof json === 'object') { return json } return JSON.parse(json); } const init = async function (filePath, env = {}, refresh) { try { const fileContent = await readFile(filePath, 'utf-8'); const fileHash = computeHash(fileContent); const moduleName = path.basename(filePath, '.js'); let moduleExt = env.ext || ''; let SitesMap = getSitesMap(_config_path); if (moduleExt && SitesMap[moduleName]) { try { moduleExt = ungzip(moduleExt); } catch (e) { log(`[${moduleName}] ungzip解密moduleExt失败: ${e.message}`); } if (!SitesMap[moduleName].find(i => i.queryStr === moduleExt) && !SitesMap[moduleName].find(i => i.queryObject.params === moduleExt)) { throw new Error("moduleExt is wrong!") } } let hashMd5 = md5(filePath + '#pAq#' + moduleExt); if (moduleCache.has(hashMd5) && !refresh) { const cached = moduleCache.get(hashMd5); if (cached.hash === fileHash) { return cached.moduleObject; } } log(`Loading module: ${filePath}`); let t1 = getNowTime(); // const scriptUrl = pathToFileURL(filePath).href; const scriptUrl = `${pathToFileURL(filePath).href}?v=${fileHash}`; // console.log(scriptUrl); const module = await import(scriptUrl); let rule; if (module && module.__jsEvalReturn && typeof module.__jsEvalReturn === 'function') { rule = module.__jsEvalReturn(); } else { rule = module.default || module; } // console.log(rule); // 加载 init await rule.init(moduleExt || {}); let t2 = getNowTime(); const moduleObject = deepCopy(rule); moduleObject.cost = t2 - t1; moduleCache.set(hashMd5, {moduleObject, hash: fileHash}); return moduleObject; } catch (error) { console.log(`Error in catvod.init :${filePath}`, error); throw new Error(`Failed to initialize module:${error.message}`); } } const home = async function (filePath, env, filter = 1) { const moduleObject = await init(filePath, env); return json2Object(await moduleObject.home(filter)); } const homeVod = async function (filePath, env) { const moduleObject = await init(filePath, env); return json2Object(await moduleObject.homeVod()); } const cate = async function (filePath, env, tid, pg = 1, filter = 1, extend = {}) { const moduleObject = await init(filePath, env); return json2Object(await moduleObject.category(tid, pg, filter, extend)); } const detail = async function (filePath, env, ids) { const moduleObject = await init(filePath, env); return json2Object(await moduleObject.detail(ids)); } const search = async function (filePath, env, wd, quick = 0, pg = 1) { const moduleObject = await init(filePath, env); return json2Object(await moduleObject.search(wd, quick, pg)); } const play = async function (filePath, env, flag, id, flags) { const moduleObject = await init(filePath, env); return json2Object(await moduleObject.play(flag, id, flags)); } const proxy = async function (filePath, env, params) { const moduleObject = await init(filePath, env); return json2Object(await moduleObject.proxy(params)); } const action = async function (filePath, env, action, value) { const moduleObject = await init(filePath, env); return json2Object(await moduleObject.action(action, value)); } export default { getRule, init, home, homeVod, cate, detail, search, play, proxy, action, }