@@ -5,6 +5,8 @@ const getEtag = require('../lib/qetag');
55const config = require ( '../config' ) ;
66const out = require ( '../lib/out' ) ;
77const ImageBed = require ( './imageBeds' ) ;
8+ const Queue = require ( 'queue' ) ;
9+ const lodash = require ( 'lodash' ) ;
810
911const imageBed = config . imgCdn . enabled ? ImageBed . getInstance ( config . imgCdn ) : null ;
1012
@@ -83,49 +85,67 @@ async function img2Cdn(article) {
8385 // 1。从文章中获取语雀的图片URL列表
8486 const matchYuqueImgUrlList = article . body . match ( imageUrlRegExp ) ;
8587 if ( ! matchYuqueImgUrlList ) return article ;
86- const promiseList = matchYuqueImgUrlList . map ( async matchYuqueImgUrl => {
87- // 获取真正的图片url
88- const yuqueImgUrl = getImgUrl ( matchYuqueImgUrl ) ;
89- // 2。将图片转成buffer
90- const imgBuffer = await img2Buffer ( yuqueImgUrl ) ;
91- if ( ! imgBuffer ) {
92- return {
93- originalUrl : matchYuqueImgUrl ,
94- yuqueRealImgUrl : yuqueImgUrl ,
95- url : yuqueImgUrl ,
96- } ;
97- }
98- // 3。根据buffer文件生成唯一的hash文件名
99- const fileName = await getFileName ( imgBuffer , yuqueImgUrl ) ;
100- try {
101- // 4。检查图床是否存在该文件
102- let url = await imageBed . hasImage ( fileName ) ;
103- let exists = true ;
104- // 5。如果图床已经存在,直接替换;如果图床不存在,则先上传到图床,再将原本的语雀url进行替换
105- if ( ! url ) {
106- url = await imageBed . uploadImg ( imgBuffer , fileName ) ;
107- exists = false ;
88+ const promiseList = matchYuqueImgUrlList . map ( matchYuqueImgUrl => {
89+ return async ( ) => {
90+ // 获取真正的图片url
91+ const yuqueImgUrl = getImgUrl ( matchYuqueImgUrl ) ;
92+ // 2。将图片转成buffer
93+ const imgBuffer = await img2Buffer ( yuqueImgUrl ) ;
94+ if ( ! imgBuffer ) {
95+ return {
96+ originalUrl : matchYuqueImgUrl ,
97+ yuqueRealImgUrl : yuqueImgUrl ,
98+ url : yuqueImgUrl ,
99+ } ;
108100 }
109- return {
110- originalUrl : matchYuqueImgUrl ,
111- yuqueRealImgUrl : yuqueImgUrl ,
112- url,
113- exists,
114- } ;
115- } catch ( e ) {
116- out . error ( `访问图床出错,请检查配置: ${ e } ` ) ;
117- process . exit ( - 1 ) ;
118- }
101+ // 3。根据buffer文件生成唯一的hash文件名
102+ const fileName = await getFileName ( imgBuffer , yuqueImgUrl ) ;
103+ try {
104+ // 4。检查图床是否存在该文件
105+ let url = await imageBed . hasImage ( fileName ) ;
106+ let exists = true ;
107+ // 5。如果图床已经存在,直接替换;如果图床不存在,则先上传到图床,再将原本的语雀url进行替换
108+ if ( ! url ) {
109+ url = await imageBed . uploadImg ( imgBuffer , fileName ) ;
110+ exists = false ;
111+ }
112+ return {
113+ originalUrl : matchYuqueImgUrl ,
114+ yuqueRealImgUrl : yuqueImgUrl ,
115+ url,
116+ exists,
117+ } ;
118+ } catch ( e ) {
119+ out . error ( `访问图床出错,请检查配置: ${ e } ` ) ;
120+ return {
121+ yuqueRealImgUrl : yuqueImgUrl ,
122+ url : '' ,
123+ } ;
124+ }
125+ } ;
126+ } ) ;
127+ // 并发数
128+ const concurrency = config . imgCdn . concurrency || promiseList . length ;
129+ const queue = new Queue ( { concurrency, results : [ ] } ) ;
130+ queue . push ( ...promiseList ) ;
131+ await new Promise ( resolve => {
132+ queue . start ( ( ) => {
133+ resolve ( ) ;
134+ } ) ;
119135 } ) ;
120- const urlList = await Promise . all ( promiseList ) ;
136+ const _urlList = queue . results ;
137+ const urlList = lodash . flatten ( _urlList ) ;
138+
121139 urlList . forEach ( function ( url ) {
122- if ( url ) {
140+ if ( url . url ) {
123141 article . body = article . body . replace ( url . originalUrl , `` ) ;
124142 if ( url . exists ) {
125143 out . info ( `图片已存在 skip: ${ url . url } ` ) ;
126144 } else {
127145 out . info ( `replace ${ url . yuqueRealImgUrl } to ${ url . url } ` ) ;
128146 }
147+ } else {
148+ out . warn ( `图片替换失败,将使用原url: ${ url . yuqueRealImgUrl } ` ) ;
129149 }
130150 } ) ;
131151 return article ;
0 commit comments