1
1
import { readdirSync , readFileSync , writeFileSync , existsSync } from 'fs' ;
2
2
import path from 'path' ;
3
3
import * as drpy from '../libs/drpyS.js' ;
4
- import { naturalSort , urljoin } from '../utils/utils.js'
4
+ import { naturalSort , urljoin , updateQueryString } from '../utils/utils.js'
5
5
import { ENV } from "../utils/env.js" ;
6
6
import { validatePwd } from "../utils/api_validate.js" ;
7
7
import { getSitesMap } from "../utils/sites-map.js" ;
@@ -11,7 +11,7 @@ import batchExecute from '../libs_drpy/batchExecute.js';
11
11
const { jsEncoder} = drpy ;
12
12
13
13
// 工具函数:生成 JSON 数据
14
- async function generateSiteJSON ( jsDir , configDir , requestHost , sub , subFilePath , pwd ) {
14
+ async function generateSiteJSON ( jsDir , dr2Dir , configDir , requestHost , sub , subFilePath , pwd ) {
15
15
const files = readdirSync ( jsDir ) ;
16
16
let valid_files = files . filter ( ( file ) => file . endsWith ( '.js' ) && ! file . startsWith ( '_' ) ) ; // 筛选出不是 "_" 开头的 .js 文件
17
17
let sort_list = [ ] ;
@@ -118,6 +118,77 @@ async function generateSiteJSON(jsDir, configDir, requestHost, sub, subFilePath,
118
118
} ;
119
119
120
120
await batchExecute ( tasks , listener ) ;
121
+
122
+ // 根据用户是否启用dr2源去生成对应配置
123
+ if ( ENV . get ( 'enable_dr2' , '1' ) === '1' ) {
124
+ const dr2_files = readdirSync ( dr2Dir ) ;
125
+ let dr2_valid_files = dr2_files . filter ( ( file ) => file . endsWith ( '.js' ) && ! file . startsWith ( '_' ) ) ; // 筛选出不是 "_" 开头的 .js 文件
126
+ // log(dr2_valid_files);
127
+ log ( `开始生成dr2的t3配置,dr2Dir:${ dr2Dir } ,源数量: ${ dr2_valid_files . length } ` ) ;
128
+
129
+ const dr2_tasks = dr2_valid_files . map ( ( file ) => {
130
+ return {
131
+ func : async ( { file, dr2Dir, requestHost, pwd, drpy, SitesMap} ) => {
132
+ const baseName = path . basename ( file , '.js' ) ; // 去掉文件扩展名
133
+ let api = `./drpy2.min.js` ; // 使用内置drpy2
134
+ let ext = `${ requestHost } /js/${ file } ` ;
135
+ if ( pwd ) {
136
+ ext += `?pwd=${ pwd } ` ;
137
+ }
138
+ let ruleObject = {
139
+ searchable : 0 , // 固定值
140
+ filterable : 0 , // 固定值
141
+ quickSearch : 0 , // 固定值
142
+ } ;
143
+ try {
144
+ // console.log('file:', path.join(dr2Dir, file));
145
+ ruleObject = await drpy . getRuleObject ( path . join ( dr2Dir , file ) ) ;
146
+ } catch ( e ) {
147
+ throw new Error ( `Error parsing rule object for file: ${ file } , ${ e . message } ` ) ;
148
+ }
149
+
150
+ let fileSites = [ ] ;
151
+ if ( baseName === 'push_agent' ) {
152
+ let key = 'push_agent' ;
153
+ let name = `${ ruleObject . title } (DR2)` ;
154
+ fileSites . push ( { key, name, ext} ) ;
155
+ } else if ( SitesMap . hasOwnProperty ( baseName ) && Array . isArray ( SitesMap [ baseName ] ) ) {
156
+ SitesMap [ baseName ] . forEach ( ( it ) => {
157
+ let key = `drpy2_${ it . alias } ` ;
158
+ let name = `${ it . alias } (DR2)` ;
159
+ let _ext = updateQueryString ( ext , it . queryStr ) ;
160
+ fileSites . push ( { key, name, ext : _ext } ) ;
161
+ } ) ;
162
+ } else {
163
+ let key = `drpy2_${ baseName } ` ;
164
+ let name = `${ baseName } (DR2)` ;
165
+ fileSites . push ( { key, name, ext} ) ;
166
+ }
167
+
168
+ fileSites . forEach ( ( fileSite ) => {
169
+ const site = {
170
+ key : fileSite . key ,
171
+ name : fileSite . name ,
172
+ type : 3 , // 固定值
173
+ api,
174
+ searchable : ruleObject . searchable ,
175
+ filterable : ruleObject . filterable ,
176
+ quickSearch : ruleObject . quickSearch ,
177
+ more : ruleObject . more ,
178
+ ext : fileSite . ext || "" , // 固定为空字符串
179
+ } ;
180
+ sites . push ( site ) ;
181
+ } ) ;
182
+ } ,
183
+ param : { file, dr2Dir, requestHost, pwd, drpy, SitesMap} ,
184
+ id : file ,
185
+ } ;
186
+ } ) ;
187
+
188
+ await batchExecute ( dr2_tasks , listener ) ;
189
+
190
+ }
191
+
121
192
// 订阅再次处理别名的情况
122
193
if ( sub ) {
123
194
if ( sub . mode === 0 ) {
@@ -298,7 +369,7 @@ export default (fastify, options, done) => {
298
369
}
299
370
}
300
371
301
- const siteJSON = await generateSiteJSON ( options . jsDir , options . configDir , requestHost , sub , options . subFilePath , pwd ) ;
372
+ const siteJSON = await generateSiteJSON ( options . jsDir , options . dr2Dir , options . configDir , requestHost , sub , options . subFilePath , pwd ) ;
302
373
const parseJSON = await generateParseJSON ( options . jxDir , requestHost ) ;
303
374
const livesJSON = generateLivesJSON ( requestHost ) ;
304
375
const playerJSON = generatePlayerJSON ( options . configDir , requestHost ) ;
0 commit comments