forked from lyswhut/lx-music-desktop
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcos.js
153 lines (142 loc) · 4.65 KB
/
cos.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
const fs = require('fs')
const { jp, sizeFormate } = require('./index')
const chalk = require('chalk')
const COS = require('cos-nodejs-sdk-v5')
const config = require('./cosConfig')
const MultiProgress = require('multi-progress')
const multi = new MultiProgress(process.stderr)
const cos = new COS({
SecretId: config.secretId,
SecretKey: config.secretKey,
KeepAlive: false,
})
const getCosFileList = () => new Promise((resolve, reject) => {
cos.getBucket({
Bucket: config.bucket,
Region: config.region,
Prefix: config.prefix,
}, function(err, data) {
if (err) {
console.log(err)
reject(err)
console.log(chalk.red('COS文件列表获取失败'))
}
resolve(data.Contents.filter(o => o.Key !== config.prefix).map(o => o.Key.replace(config.prefix, '')))
})
})
const getLocalFileList = () => fs.readdirSync(jp('../assets'), 'utf8')
const diffFileList = (localFiles, cosFiles) => {
const removeFiles = []
cosFiles.forEach(file => {
let index = localFiles.indexOf(file)
if (index < 0) return removeFiles.push(file)
localFiles.splice(index, 1)
})
if (cosFiles.includes('latest.yml')) {
removeFiles.push('latest.yml')
localFiles.push('latest.yml')
}
if (cosFiles.includes('version.json')) {
removeFiles.push('version.json')
localFiles.push('version.json')
}
return removeFiles
}
const deleteCosFiles = files => new Promise((resolve, reject) => {
files = files.map(f => ({ Key: config.prefix + f }))
cos.deleteMultipleObject({
Bucket: config.bucket,
Region: config.region,
Objects: files,
}, function(err, data) {
if (err) {
console.log(err)
reject(err)
}
resolve()
})
})
const createProgressBar = (name, spacekLen, total) => multi.newBar(
`${` ${name}`.padEnd(spacekLen, ' ')} :status [:bar] :current/:total :percent :speed`, {
complete: '=',
incomplete: ' ',
width: 30,
total,
})
const uploadFile = (fileName, len) => new Promise((resolve, reject) => {
const filePath = jp('../assets', fileName)
// let size = fs.statSync(filePath).size
let bar = null
let prevLoaded = 0
cos.sliceUploadFile({
Bucket: config.bucket,
Region: config.region,
Key: config.prefix + fileName, /* 必须 */
FilePath: filePath, /* 必须 */
// TaskReady: function(taskId) { /* 非必须 */
// console.log(taskId)
// },
onHashProgress(progressData) { /* 非必须 */
if (!bar) {
bar = createProgressBar(fileName, len, progressData.total)
prevLoaded = 0
}
bar.tick(progressData.loaded - prevLoaded, {
status: '校验中',
speed: sizeFormate(progressData.speed) + '/s',
})
prevLoaded = progressData.loaded
// console.log('校验', fileName, JSON.stringify(progressData))
// console.log('校验', JSON.stringify(progressData))
},
onProgress(progressData) { /* 非必须 */
if (!bar) {
bar = createProgressBar(fileName, len, progressData.total)
prevLoaded = 0
}
bar.tick(progressData.loaded - prevLoaded, {
status: '上传中',
speed: sizeFormate(progressData.speed) + '/s',
})
prevLoaded = progressData.loaded
// console.log('上传', fileName, JSON.stringify(progressData))
// console.log('上传', JSON.stringify(progressData))
},
}, (err, data) => {
if (err) {
console.log(err)
return reject(err)
}
bar.tick({
status: '已完成',
speed: '',
})
resolve(data)
})
})
module.exports = async() => {
console.log(chalk.blue('正在获取COS文件列表...'))
const cosFiles = await getCosFileList()
console.log(chalk.green('COS文件列表获取成功'))
const uploadFiles = getLocalFileList()
const removeFiles = diffFileList(uploadFiles, cosFiles)
if (removeFiles.length) {
console.log(chalk.blue('共需删除') + chalk.yellow(removeFiles.length) + chalk.blue('个文件'))
console.log(chalk.blue('正在从COS删除多余的文件...'))
await deleteCosFiles(removeFiles)
console.log(chalk.green('多余文件删除成功'))
} else {
console.log(chalk.blue('没有在COS发现多余的文件'))
}
if (uploadFiles.length) {
console.log(chalk.blue('共需上传') + chalk.green(uploadFiles.length) + chalk.blue('个文件'))
console.log(chalk.blue('正在上传新文件到COS...'))
let max = Math.max(...uploadFiles.map(f => f.length)) + 2
let tasks = uploadFiles.map(f => uploadFile(f, max))
await Promise.all(tasks)
console.log(''.padEnd(Math.max(2, tasks.length - 2), '\n'))
console.log(chalk.green('所有文件上传完成'))
} else {
console.log(chalk.blue('没有需要上传的文件'))
}
}