@@ -20,6 +20,7 @@ async function generateSiteJSON(options, requestHost, sub, pwd) {
2020 const jsDir = options . jsDir ;
2121 const dr2Dir = options . dr2Dir ;
2222 const pyDir = options . pyDir ;
23+ const catDir = options . catDir ;
2324 const configDir = options . configDir ;
2425 const jsonDir = options . jsonDir ;
2526 const subFilePath = options . subFilePath ;
@@ -395,6 +396,92 @@ async function generateSiteJSON(options, requestHost, sub, pwd) {
395396
396397 }
397398
399+ // 根据用户是否启用cat源去生成对应配置
400+ if ( ENV . get ( 'enable_cat' , '1' ) === '1' ) {
401+ const cat_files = readdirSync ( catDir ) ;
402+ let cat_valid_files = cat_files . filter ( ( file ) => file . endsWith ( '.js' ) && ! file . startsWith ( '_' ) ) ; // 筛选出不是 "_" 开头的 .py 文件
403+ // log(py_valid_files);
404+ log ( `开始生成catvod的t3配置,catDir:${ catDir } ,源数量: ${ cat_valid_files . length } ` ) ;
405+
406+ const cat_tasks = cat_valid_files . map ( ( file ) => {
407+ return {
408+ func : async ( { file, catDir, requestHost, pwd, SitesMap} ) => {
409+ const baseName = path . basename ( file , '.js' ) ; // 去掉文件扩展名
410+ const extJson = path . join ( catDir , baseName + '.json' ) ;
411+ let api = `${ requestHost } /cat/${ file } ` ;
412+ let ext = existsSync ( extJson ) ? `${ requestHost } /cat/${ file } ` : '' ;
413+ if ( pwd ) {
414+ api += `?pwd=${ pwd } ` ;
415+ if ( ext ) {
416+ ext += `?pwd=${ pwd } ` ;
417+ }
418+ }
419+ let ruleObject = {
420+ searchable : 1 , // 固定值
421+ filterable : 1 , // 固定值
422+ quickSearch : 1 , // 固定值
423+ } ;
424+ let ruleMeta = { ...ruleObject } ;
425+ const filePath = path . join ( catDir , file ) ;
426+ const header = await FileHeaderManager . readHeader ( filePath ) ;
427+ // console.log('py header:', header);
428+ if ( ! header || forceHeader ) {
429+ const fileContent = await readFile ( filePath , 'utf-8' ) ;
430+ const title = extractNameFromCode ( fileContent ) || baseName ;
431+ Object . assign ( ruleMeta , {
432+ title : title ,
433+ lang : 'cat' ,
434+ } ) ;
435+ // console.log('py ruleMeta:', ruleMeta);
436+ await FileHeaderManager . writeHeader ( filePath , ruleMeta ) ;
437+ } else {
438+ Object . assign ( ruleMeta , header ) ;
439+ }
440+ if ( ! isLoaded ) {
441+ const sizeInBytes = await FileHeaderManager . getFileSize ( filePath , { humanReadable : true } ) ;
442+ console . log ( `Loading RuleObject: ${ filePath } fileSize:${ sizeInBytes } ` ) ;
443+ }
444+ ruleMeta . title = enableRuleName ? ruleMeta . title || baseName : baseName ;
445+
446+ let fileSites = [ ] ;
447+ if ( baseName === 'push_agent' ) {
448+ let key = 'push_agent' ;
449+ let name = `${ ruleMeta . title } (cat)` ;
450+ fileSites . push ( { key, name, ext} ) ;
451+ } else if ( SitesMap . hasOwnProperty ( baseName ) && Array . isArray ( SitesMap [ baseName ] ) ) {
452+ SitesMap [ baseName ] . forEach ( ( it ) => {
453+ let key = `catvod_${ it . alias } ` ;
454+ let name = `${ it . alias } (cat)` ;
455+ let _ext = updateQueryString ( ext , it . queryStr ) ;
456+ fileSites . push ( { key, name, ext : _ext } ) ;
457+ } ) ;
458+ } else {
459+ let key = `catvod_${ ruleMeta . title } ` ;
460+ let name = `${ ruleMeta . title } (cat)` ;
461+ fileSites . push ( { key, name, ext} ) ;
462+ }
463+
464+ fileSites . forEach ( ( fileSite ) => {
465+ const site = {
466+ key : fileSite . key ,
467+ name : fileSite . name ,
468+ type : 3 , // 固定值
469+ api,
470+ ...ruleMeta ,
471+ ext : fileSite . ext || "" , // 固定为空字符串
472+ } ;
473+ sites . push ( site ) ;
474+ } ) ;
475+ } ,
476+ param : { file, catDir, requestHost, pwd, SitesMap} ,
477+ id : file ,
478+ } ;
479+ } ) ;
480+
481+ await batchExecute ( cat_tasks , listener ) ;
482+
483+ }
484+
398485 // 根据用户是否启用挂载数据源去生成对应配置
399486 if ( ENV . get ( 'enable_link_data' , '0' ) === '1' ) {
400487 log ( `开始挂载外部T4数据` ) ;
0 commit comments