-
Notifications
You must be signed in to change notification settings - Fork 0
/
svg_fixed_upload.js
125 lines (109 loc) · 3.51 KB
/
svg_fixed_upload.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
/**
* Upload multiple, fixed SVG files.
*/
const { MwApi } = require('./lib/mw-api');
const fs = require('fs');
const path = require('path');
const apiUrl = 'https://commons.wikimedia.org/w/api.php';
const { USERNAME, PASSWORD } = require('./bot.config');
let api = new MwApi(apiUrl);
// /---- Settings ----
const basePath = './img/temp/final';
// let summary = "fix rendering (remove clipping), uniform colors";
// let summary = "uniform colors with good contrast";
let summary = "fix rendering (clipping with groups)";
// Extra seconds needed for limits...
let waitSec = 8;
// Quick (for small-ish batches around 200 files)
// let waitSec = 0;
// \---- Settings ----
(async () => {
await auth();
const files = fs.readdirSync(basePath);
const svgFiles = files.filter(file => file.endsWith('.svg'));
await run(svgFiles, waitSec);
})();
function sleep(s) {
if (s > 0.01) {
let minutes = Math.floor(s / 60);
let seconds = s % 60;
let info = minutes > 0 ? `${minutes}:${seconds} [min:s]` : `${s} [s]`;
console.log(`Waiting... ${info}`);
}
return new Promise(resolve => setTimeout(resolve, s * 1000));
}
// auth
async function auth() {
try {
// estabilish session
await api.login(USERNAME, PASSWORD);
} catch (ex) {
console.error('Auth error.', ex);
}
}
/**
* Main.
* @param {Object} svgFiles List of files.
* @param {Number} waitSec Extra seconds needed for limits...
* @returns {done:int, missing:[], error:[], other:int}
*/
async function run(svgFiles, waitSec = 8) {
let done = [];
let missing = [];
let error = [];
const startTime = Date.now();
for (const svgFile of svgFiles) {
let destFileName = decodeURIComponent(svgFile);
let id = '-';
try {
// If exists upload a new version
if (await api.fileExists(destFileName)) {
await api.upload(path.join(basePath, svgFile), destFileName, summary);
console.log(`File uploaded as: ${destFileName}.`);
done.push({id, destFileName});
} else {
// When missing add to missing list.
console.warn(`File:${destFileName} does not exist on Commons.`);
missing.push({id, destFileName});
}
} catch (ex) {
if (ex.code && ex.code === 'fileexists-no-change') {
console.log(`File was already uploaded as: ${destFileName}.`);
done.push({id, destFileName});
} else {
console.error(`Unable to upload File:${destFileName}.`, ex);
error.push({id, destFileName});
await sleep(30); // extra
// Upon error stop (at least for now).
// break;
}
}
await sleep(waitSec);
}
const endTime = Date.now();
const elapsed = (endTime - startTime)/1000;
console.log(`Elapsed time: ${elapsed.toFixed(1)} [seconds]`);
console.log(`Records per minute: ${(svgFiles.length / elapsed * 60.0).toFixed(2)}`);
let other = svgFiles.length - done.length - missing.length;
let results = {done:done.length, missing, error, other};
info(results);
return results;
}
function formatArray(arr) {
return JSON.stringify(arr)
.replace(/(\},|\[)/g, '$1\n\t')
.replace('}]', '}\n];\n')
;
}
function info(results, verbose=true) {
let {done, missing, error, other} = results;
// Finally dump list of missing files.
if (verbose && missing.length) {
console.warn("var missing = " + formatArray(missing));
}
if (verbose && error.length) {
console.error("var error = " + formatArray(error));
}
// Show stats: missing count, uploaded count.
console.info(`Uploaded: ${done}; missing: ${missing.length}; other: ${other}`);
}