@@ -5,6 +5,8 @@ const getEtag = require('../lib/qetag');
5
5
const config = require ( '../config' ) ;
6
6
const out = require ( '../lib/out' ) ;
7
7
const ImageBed = require ( './imageBeds' ) ;
8
+ const Queue = require ( 'queue' ) ;
9
+ const lodash = require ( 'lodash' ) ;
8
10
9
11
const imageBed = config . imgCdn . enabled ? ImageBed . getInstance ( config . imgCdn ) : null ;
10
12
@@ -83,49 +85,67 @@ async function img2Cdn(article) {
83
85
// 1。从文章中获取语雀的图片URL列表
84
86
const matchYuqueImgUrlList = article . body . match ( imageUrlRegExp ) ;
85
87
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
+ } ;
108
100
}
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
+ } ) ;
119
135
} ) ;
120
- const urlList = await Promise . all ( promiseList ) ;
136
+ const _urlList = queue . results ;
137
+ const urlList = lodash . flatten ( _urlList ) ;
138
+
121
139
urlList . forEach ( function ( url ) {
122
- if ( url ) {
140
+ if ( url . url ) {
123
141
article . body = article . body . replace ( url . originalUrl , `` ) ;
124
142
if ( url . exists ) {
125
143
out . info ( `图片已存在 skip: ${ url . url } ` ) ;
126
144
} else {
127
145
out . info ( `replace ${ url . yuqueRealImgUrl } to ${ url . url } ` ) ;
128
146
}
147
+ } else {
148
+ out . warn ( `图片替换失败,将使用原url: ${ url . yuqueRealImgUrl } ` ) ;
129
149
}
130
150
} ) ;
131
151
return article ;
0 commit comments