configure-word-audio.mjs 2.4 KB

123456789101112131415161718192021
  1. #!/usr/bin/env node
  2. import {readFileSync,statSync} from 'node:fs';
  3. import {homedir} from 'node:os';
  4. import {resolve} from 'node:path';
  5. const file=resolve(process.argv.find(value=>value.startsWith('--file='))?.slice(7)||homedir()+'/.config/xiaoshu/xfyun-word-audio.json');
  6. if((statSync(file).mode&0o077)!==0)throw Error('配置文件须仅限当前用户读取,请执行 chmod 600 后重试');
  7. const input=JSON.parse(readFileSync(file,'utf8'));
  8. const gatewayOnly=process.argv.includes('--gateway-only');
  9. const required=gatewayOnly?['XIAOSHU_TTS_WORKER_URL','XIAOSHU_TTS_WORKER_TOKEN','XFYUN_TTS_VCN']:['XFYUN_APP_ID','XFYUN_API_KEY','XFYUN_API_SECRET','XFYUN_TTS_VCN'];
  10. const optional=['XIAOSHU_TTS_WORKER_URL','XIAOSHU_TTS_WORKER_TOKEN','XIAOSHU_TTS_ENABLED','XIAOSHU_TTS_DAILY_LIMIT','XIAOSHU_TTS_USER_MINUTE_LIMIT','XIAOSHU_TTS_CONCURRENCY','XIAOSHU_S3_ENDPOINT','XIAOSHU_S3_BUCKET','XIAOSHU_S3_REGION','XIAOSHU_S3_ACCESS_KEY_ID','XIAOSHU_S3_SECRET_ACCESS_KEY','XIAOSHU_S3_PUBLIC_BASE_URL'];
  11. const missing=required.filter(key=>!String(input[key]||'').trim());
  12. if(missing.length)throw Error('请填写配置项:'+missing.join('、'));
  13. const params=Object.fromEntries([...new Set([...required,...optional])].filter(key=>input[key]!=null).map(key=>[key,String(input[key]).trim()]));
  14. params.XIAOSHU_TTS_ENABLED=process.argv.includes('--enable')?'true':'false';
  15. if(!process.argv.includes('--apply')){console.log(JSON.stringify({valid:true,applied:false,enabled:false,message:'配置格式检查通过;--apply 写入服务端私密配置,--enable 另行开启生成。不会调用讯飞。'}));process.exit(0);}
  16. const master=process.env.XIAOSHU_MASTER_KEY;if(!master)throw Error('缺少 XIAOSHU_MASTER_KEY');
  17. const url=(process.env.XIAOSHU_PARSE_URL||'https://server.xiaoshu.pro/parse').replace(/\/$/,'');
  18. const response=await fetch(url+'/config',{method:'PUT',headers:{'Content-Type':'application/json','X-Parse-Application-Id':process.env.XIAOSHU_PARSE_APP_ID||'7pIbDBJmKx_main','X-Parse-Master-Key':master},body:JSON.stringify({params,masterKeyOnly:Object.fromEntries(Object.keys(params).map(key=>[key,true]))})});
  19. if(!response.ok)throw Error('私密配置保存失败(HTTP '+response.status+')');
  20. const payload=await response.json();if(payload.error)throw Error('私密配置保存失败');
  21. console.log(JSON.stringify({configured:true,enabled:params.XIAOSHU_TTS_ENABLED==='true',secretsPrinted:false}));