Skip to content

Commit dbf89cf

Browse files
author
Taois
committed
feat: 版本升级
1 parent 42548b0 commit dbf89cf

File tree

11 files changed

+2557
-36
lines changed

11 files changed

+2557
-36
lines changed

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# drpyS(drpy-node)
22

33
nodejs作为服务端的drpy实现。全面升级异步写法
4-
~~积极开发中,每日一更~~,当前进度 `63%`
4+
~~积极开发中,每日一更~~,当前进度 `65%`
55
~~找工作中,随缘更新~~
66
上班当牛马,下班要带娃,阶段性佛系趁娃睡觉熬夜更新
77

@@ -21,6 +21,10 @@ nodejs作为服务端的drpy实现。全面升级异步写法
2121

2222
## 更新记录
2323

24+
### 20250804
25+
26+
更新至V1.2.5
27+
2428
### 20250801
2529

2630
更新至V1.2.4

controllers/api.js

Lines changed: 48 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
import path from 'path';
1+
import path, { parse } from 'path';
22
import {existsSync, watch} from 'fs';
33
import {base64Decode} from '../libs_drpy/crypto-util.js';
44
import * as drpy from '../libs/drpyS.js';
5+
import * as drpy2 from '../libs/dr2Adapter.js';
6+
import * as pyadapter from '../libs/pyAdapter.js';
57
import {ENV} from "../utils/env.js";
68
import {validatePwd} from "../utils/api_validate.js";
79

@@ -50,22 +52,49 @@ export default (fastify, options, done) => {
5052
},
5153
handler: async (request, reply) => {
5254
const moduleName = request.params.module;
53-
const modulePath = path.join(options.jsDir, `${moduleName}.js`);
54-
if (!existsSync(modulePath)) {
55-
reply.status(404).send({error: `Module ${moduleName} not found`});
56-
return;
57-
}
5855
const method = request.method.toUpperCase();
5956
// 根据请求方法选择参数来源
6057
const query = method === 'GET' ? request.query : request.body;
58+
let parseEngine;
59+
let _ext;
60+
let moduleDir;
61+
// 根据查询参数选择解析引擎和脚本路径(adpt=ds || dr || py)
62+
const adpt = query.adpt;
63+
switch (adpt) {
64+
case 'ds':
65+
parseEngine = drpy;
66+
moduleDir = options.jsDir;
67+
_ext ='.js';
68+
break;
69+
case 'dr':
70+
parseEngine = drpy2;
71+
moduleDir = options.dr2Dir;
72+
_ext ='.js';
73+
break;
74+
case 'py':
75+
parseEngine = pyadapter;
76+
moduleDir = options.pyDir;
77+
_ext ='.py';
78+
break;
79+
default:
80+
parseEngine = drpy;
81+
moduleDir = options.jsDir;
82+
_ext ='.js';
83+
break;
84+
}
85+
const modulePath = path.join(moduleDir, `${moduleName}${_ext}`);
86+
if (!existsSync(modulePath)) {
87+
reply.status(404).send({error: `Module ${moduleName} not found`});
88+
return;
89+
}
90+
6191
const moduleExt = query.extend || '';
6292
// console.log('moduleExt:', typeof moduleExt, moduleExt);
6393
const protocol = request.protocol;
6494
const hostname = request.hostname;
6595
// const proxyUrl = `${protocol}://${hostname}${request.url}`.split('?')[0].replace('/api/', '/proxy/') + '/?do=js';
6696
// const proxyUrl = `${protocol}://${hostname}/proxy/${moduleName}/?do=js`;
6797
// console.log('proxyUrl:', proxyUrl);
68-
6998
const publicUrl = `${protocol}://${hostname}/public/`;
7099
const jsonUrl = `${protocol}://${hostname}/json/`;
71100
const httpUrl = `${protocol}://${hostname}/http`;
@@ -95,12 +124,12 @@ export default (fastify, options, done) => {
95124

96125
const env = getEnv(moduleName);
97126
env.getRule = async function (_moduleName) {
98-
const _modulePath = path.join(options.jsDir, `${_moduleName}.js`);
127+
const _modulePath = path.join(moduleDir, `${_moduleName}${_ext}`);
99128
if (!existsSync(_modulePath)) {
100129
return null;
101130
}
102131
const _env = getEnv(_moduleName);
103-
const RULE = await drpy.getRule(_modulePath, _env);
132+
const RULE = await parseEngine.getRule(_modulePath, _env);
104133
RULE.callRuleFn = async function (_method, _args) {
105134
let invokeMethod = null;
106135
switch (_method) {
@@ -136,7 +165,7 @@ export default (fastify, options, done) => {
136165
return await RULE[_method]
137166
}
138167
}
139-
return await drpy[invokeMethod](_modulePath, _env, ..._args)
168+
return await parseEngine[invokeMethod](_modulePath, _env, ..._args)
140169
};
141170
return RULE
142171
};
@@ -146,7 +175,7 @@ export default (fastify, options, done) => {
146175
if ('play' in query) {
147176
// 处理播放逻辑
148177
// console.log('play query:', query);
149-
const result = await drpy.play(modulePath, env, query.flag, query.play);
178+
const result = await parseEngine.play(modulePath, env, query.flag, query.play);
150179
return reply.send(result);
151180
}
152181

@@ -162,7 +191,7 @@ export default (fastify, options, done) => {
162191
}
163192
}
164193
// 分类逻辑
165-
const result = await drpy.cate(modulePath, env, query.t, pg, 1, extend);
194+
const result = await parseEngine.cate(modulePath, env, query.t, pg, 1, extend);
166195
return reply.send(result);
167196
}
168197

@@ -171,36 +200,36 @@ export default (fastify, options, done) => {
171200
fastify.log.info(`[${moduleName}] 二级已接收post数据: ${query.ids}`);
172201
}
173202
// 详情逻辑
174-
const result = await drpy.detail(modulePath, env, query.ids.split(','));
203+
const result = await parseEngine.detail(modulePath, env, query.ids.split(','));
175204
return reply.send(result);
176205
}
177206

178207
if ('ac' in query && 'action' in query) {
179208
// 处理动作逻辑
180-
const result = await drpy.action(modulePath, env, query.action, query.value);
209+
const result = await parseEngine.action(modulePath, env, query.action, query.value);
181210
return reply.send(result);
182211
}
183212

184213

185214
if ('wd' in query) {
186215
// 搜索逻辑
187216
const quick = 'quick' in query ? query.quick : 0;
188-
const result = await drpy.search(modulePath, env, query.wd, quick, pg);
217+
const result = await parseEngine.search(modulePath, env, query.wd, quick, pg);
189218
return reply.send(result);
190219
}
191220

192221
if ('refresh' in query) {
193222
// 强制刷新初始化逻辑
194-
const refreshedObject = await drpy.init(modulePath, env, true);
223+
const refreshedObject = await parseEngine.init(modulePath, env, true);
195224
return reply.send(refreshedObject);
196225
}
197226
if (!('filter' in query)) {
198227
query.filter = 1
199228
}
200229
// 默认逻辑,返回 home + homeVod 接口
201230
const filter = 'filter' in query ? query.filter : 1;
202-
const resultHome = await drpy.home(modulePath, env, filter);
203-
const resultHomeVod = await drpy.homeVod(modulePath, env);
231+
const resultHome = await parseEngine.home(modulePath, env, filter);
232+
const resultHomeVod = await parseEngine.homeVod(modulePath, env);
204233
let result = {
205234
...resultHome,
206235
// list: resultHomeVod,
@@ -266,7 +295,7 @@ export default (fastify, options, done) => {
266295

267296
const env = getEnv(moduleName);
268297
try {
269-
const backRespList = await drpy.proxy(modulePath, env, query);
298+
const backRespList = await parseEngine.proxy(modulePath, env, query);
270299
const statusCode = backRespList[0];
271300
const mediaType = backRespList[1] || 'application/octet-stream';
272301
let content = backRespList[2] || '';

controllers/config.js

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -188,22 +188,17 @@ async function generateSiteJSON(options, requestHost, sub, pwd) {
188188
await batchExecute(tasks, listener);
189189

190190
// 根据用户是否启用dr2源去生成对应配置
191-
if (ENV.get('enable_dr2', '1') === '1') {
191+
const enable_dr2 = ENV.get('enable_dr2', '1');
192+
if ((enable_dr2 === '1' || enable_dr2 === '2') ) {
192193
const dr2_files = readdirSync(dr2Dir);
193194
let dr2_valid_files = dr2_files.filter((file) => file.endsWith('.js') && !file.startsWith('_')); // 筛选出不是 "_" 开头的 .js 文件
194195
// log(dr2_valid_files);
195-
log(`开始生成dr2的t3配置,dr2Dir:${dr2Dir},源数量: ${dr2_valid_files.length}`);
196+
console.log(`开始生成dr2配置,dr2Dir:${dr2Dir},源数量: ${dr2_valid_files.length}, 启用模式: ${enable_dr2 === '1' ? 'T3配置' : 'T4风格API配置'}`);
196197

197198
const dr2_tasks = dr2_valid_files.map((file) => {
198199
return {
199200
func: async ({file, dr2Dir, requestHost, pwd, drpy, SitesMap}) => {
200201
const baseName = path.basename(file, '.js'); // 去掉文件扩展名
201-
// dr2ApiType=0 使用接口drpy2 dr2ApiType=1 使用壳子内置的drpy2
202-
let api = dr2ApiType ? `assets://js/lib/drpy2.js` : `${requestHost}/public/drpy/drpy2.min.js`;
203-
let ext = `${requestHost}/js/${file}`;
204-
if (pwd) {
205-
ext += `?pwd=${pwd}`;
206-
}
207202
let ruleObject = {
208203
searchable: 0, // 固定值
209204
filterable: 0, // 固定值
@@ -243,30 +238,66 @@ async function generateSiteJSON(options, requestHost, sub, pwd) {
243238
if (baseName === 'push_agent') {
244239
let key = 'push_agent';
245240
let name = `${ruleMeta.title}(DR2)`;
246-
fileSites.push({key, name, ext});
241+
fileSites.push({key, name});
247242
} else if (SitesMap.hasOwnProperty(baseName) && Array.isArray(SitesMap[baseName])) {
248243
SitesMap[baseName].forEach((it) => {
249244
let key = `drpy2_${it.alias}`;
250245
let name = `${it.alias}(DR2)`;
251-
let _ext = updateQueryString(ext, it.queryStr);
252-
fileSites.push({key, name, ext: _ext});
246+
fileSites.push({key, name, queryStr: it.queryStr});
253247
});
254248
} else {
255249
let key = `drpy2_${ruleMeta.title}`;
256250
let name = `${ruleMeta.title}(DR2)`;
257-
fileSites.push({key, name, ext});
251+
fileSites.push({key, name});
258252
}
259253

260254
fileSites.forEach((fileSite) => {
255+
if (enable_dr2 === '1') {
256+
// dr2ApiType=0 使用接口drpy2 dr2ApiType=1 使用壳子内置的drpy2
257+
let api = dr2ApiType ? `assets://js/lib/drpy2.js` : `${requestHost}/public/drpy/drpy2.min.js`;
258+
let ext = `${requestHost}/js/${file}`;
259+
if (pwd) {
260+
ext += `?pwd=${pwd}`;
261+
}
262+
// 处理传参源的ext
263+
if (fileSite.queryStr) {
264+
ext = updateQueryString(ext, fileSite.queryStr);
265+
}
266+
// 模式1:只启用dr2的T3配置
261267
const site = {
262268
key: fileSite.key,
263269
name: fileSite.name,
264270
type: 3, // 固定值
265271
api,
266272
...ruleMeta,
267-
ext: fileSite.ext || "", // 固定为空字符串
273+
ext: ext || "", // 固定为空字符串
268274
};
269275
sites.push(site);
276+
} else if (enable_dr2 === '2') {
277+
// 模式2:只启用T3脚本的T4风格API配置
278+
const t4site = {
279+
key: fileSite.key,
280+
name: fileSite.name,
281+
type: 4, // 固定值
282+
api:`${requestHost}/api/${baseName}`,
283+
...ruleMeta,
284+
ext: "", // 固定为空字符串
285+
};
286+
// 添加isdr2参数到API URL
287+
if (pwd) {
288+
t4site.api += `?pwd=${pwd}&adpt=dr`;
289+
} else {
290+
t4site.api += `?adpt=dr`;
291+
}
292+
293+
// 处理传参源的API参数
294+
if (fileSite.queryStr) {
295+
const separator = t4site.api.includes('?') ? '&' : '?';
296+
site.api += `${separator}extend=${encodeURIComponent(fileSite.queryStr)}`;
297+
}
298+
299+
sites.push(t4site);
300+
}
270301
});
271302
},
272303
param: {file, dr2Dir, requestHost, pwd, drpy, SitesMap},

docs/updateRecord.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
# drpyS更新记录
22

3+
### 20250804
4+
5+
更新至V1.2.5
6+
7+
1. 修复 `央视大全.ds`
8+
2. 新增 `爱看机器人``凤凰FM``天空影视` 等源
9+
3. dr2接口模式增加 T4风格 by `涵晓`,实验性特性,存在同步接口性能问题,按需开启(设置中心把允许dr2值设置为2)
10+
4. package.json 新增显式依赖项
11+
312
### 20250801
413

514
更新至V1.2.4

0 commit comments

Comments
 (0)