11import { readdirSync , readFileSync , writeFileSync , existsSync } from 'fs' ;
22import path from 'path' ;
33import * as drpy from '../libs/drpyS.js' ;
4- import { naturalSort , urljoin } from '../utils/utils.js'
4+ import { naturalSort , urljoin , updateQueryString } from '../utils/utils.js'
55import { ENV } from "../utils/env.js" ;
66import { validatePwd } from "../utils/api_validate.js" ;
77import { getSitesMap } from "../utils/sites-map.js" ;
@@ -11,7 +11,7 @@ import batchExecute from '../libs_drpy/batchExecute.js';
1111const { jsEncoder} = drpy ;
1212
1313// 工具函数:生成 JSON 数据
14- async function generateSiteJSON ( jsDir , configDir , requestHost , sub , subFilePath , pwd ) {
14+ async function generateSiteJSON ( jsDir , dr2Dir , configDir , requestHost , sub , subFilePath , pwd ) {
1515 const files = readdirSync ( jsDir ) ;
1616 let valid_files = files . filter ( ( file ) => file . endsWith ( '.js' ) && ! file . startsWith ( '_' ) ) ; // 筛选出不是 "_" 开头的 .js 文件
1717 let sort_list = [ ] ;
@@ -118,6 +118,77 @@ async function generateSiteJSON(jsDir, configDir, requestHost, sub, subFilePath,
118118 } ;
119119
120120 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+
121192 // 订阅再次处理别名的情况
122193 if ( sub ) {
123194 if ( sub . mode === 0 ) {
@@ -298,7 +369,7 @@ export default (fastify, options, done) => {
298369 }
299370 }
300371
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 ) ;
302373 const parseJSON = await generateParseJSON ( options . jxDir , requestHost ) ;
303374 const livesJSON = generateLivesJSON ( requestHost ) ;
304375 const playerJSON = generatePlayerJSON ( options . configDir , requestHost ) ;
0 commit comments