/
index.js
109 lines (91 loc) · 3.31 KB
/
index.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
var APIs = 'https://api.apis.guru/v2/list.json';
var COLORS = 3;
var DIR = __dirname;
var DATA = DIR + '/api-models-rainbows.json';
const fs = require('fs');
const async = require('async');
const got = require('got');
const url = require('url');
const PNG = require('pngjs').PNG;
const colorgram = require('colorgram');
const gm = require('gm');
const d3Color = require('d3-color');
module.exports.download = download;
module.exports.load = load;
if (!module.parent) {
download();
}
function load (done) {
try {
done(require(DATA));
} catch (ign) {
download(done);
}
}
function download (done) {
got(APIs).then(response => {
var apis = JSON.parse(response.body);
var colors = {};
async.forEachOfLimit(apis, 32, (item, key, callback) => {
var info = item.versions[item.preferred].info;
var logo = info['x-logo'];
if (logo) {
var bgColor = logo.backgroundColor;
var ext = url.parse(logo.url).path.replace(/^.*(\.[a-z]+)$/gi, '$1');
var name = key + ext;
var down = got.stream(logo.url);
if (ext.toLowerCase() !== '.png') {
down = gm(down, 'image.svg').stream('png');
}
down.pipe(new PNG())
.on('error', ()=> {
console.error('ERROR', name);
callback();
})
.on('parsed', function () {
console.log(name);
colors[key] = colorgram.extract({
data: this.data,
width: this.width,
height: this.height,
channels: 4
}, bgColor ? (COLORS - 1) : COLORS);
if (bgColor) {
var r = d3Color.rgb(bgColor);
colors[key].push([r.r, r.g, r.b, 1]);
}
colors[key].forEach(function (c) {
c.pop();
var n = d3Color.rgb(c[0], c[1], c[2], 1);
var h = d3Color.cubehelix(n);
h.s = Math.max(h.s, 1);
h.l = Math.max(h.l, 0.8);
h.l = Math.min(h.l, 1.2);
c[0] = h.h;
c[1] = h.s;
c[2] = h.l;
});
colors[key].sort((b, a) => {
return a[0] - b[0];
});
colors[key].forEach((c) => {
var r = d3Color.rgb(d3Color.cubehelix(c[0], c[1], c[2], 1).rgb().toString());
c[0] = r.r;
c[1] = r.g;
c[2] = r.b;
});
callback();
});
} else {
callback();
}
}, () => {
fs.writeFile(DATA, JSON.stringify(colors), () => {
console.log('DONE');
if(done) {
done(colors);
}
});
});
});
}