-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathget-emojipedia-data.js
110 lines (100 loc) · 3.82 KB
/
get-emojipedia-data.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
const fs = require('fs');
const openMojiJson = require('./public/data/openmoji.json');
const fetch = require('node-fetch');
const stripHtml = require('string-strip-html');
const limitForTesting = false;
const getUniqueEmojis = () => {
// Filter emojis, so every "unique" emoji is only shown once (not skintones)
let filteredEmojies = {};
for(let index in openMojiJson){
const item = openMojiJson[index];
// NOTE: skintone_base_emoji needs to occur before skintone variants in list
if (item.skintone !== "" && item.skintone_combination === "single") {
if (filteredEmojies[item.skintone_base_hexcode].skintones === undefined){
filteredEmojies[item.skintone_base_hexcode].skintones = [];
}
filteredEmojies[item.skintone_base_hexcode].skintones.push(item);
} else if(item.skintone !== "" && item.skintone_combination === "multiple") {
if (filteredEmojies[item.skintone_base_hexcode].skintone_combinations === undefined){
filteredEmojies[item.skintone_base_hexcode].skintone_combinations = [];
}
filteredEmojies[item.skintone_base_hexcode].skintone_combinations.push(item);
} else {
filteredEmojies[item.hexcode] = item;
}
}
return filteredEmojies;
}
const getEmojiGroupsAndSubgroups = () => {
// Extract all groups and subgroups from EmojiData
let groupsAndSubgroupsObject = {};
for(let index in openMojiJson){
const emojiData = openMojiJson[index];
const group = emojiData.group;
const subgroup = emojiData.subgroups;
if(!groupsAndSubgroupsObject[group]){
groupsAndSubgroupsObject[group] = [];
}
if(groupsAndSubgroupsObject[group].indexOf(subgroup) === -1){
groupsAndSubgroupsObject[group].push(subgroup);
groupsAndSubgroupsObject[group].sort();
}
}
// Put into array and sort them alphabetically
let groupsAndSubgroupsArray = [];
for(let groupName in groupsAndSubgroupsObject){
groupsAndSubgroupsArray.push({name: groupName, subgroups: groupsAndSubgroupsObject[groupName]});
}
groupsAndSubgroupsArray = groupsAndSubgroupsArray.sort((a, b) => a.name.localeCompare(b.name));
return groupsAndSubgroupsArray;
}
const getEmojiDataFor = async(index, emoji) => {
try{
const url = 'https://openmoji-emojipedia-api.glitch.me/emojis/' + emoji;
console.log(' - ' + (index + 1) + '. Get emoji data for', emoji, ' from ', url);
const response = await fetch(url);
const body = await response.json();
if(body?.detail == "Not found."){
console.log(' - Data received but empty');
return null;
}else{
console.log(' - Success');
}
return body;
}
catch{
console.log(' - Fetch failed');
return null;
}
}
const delay = (ms) => {
return new Promise(resolve => setTimeout(resolve, ms));
}
const getEmojiPediaDataAndWriteToFile = async () => {
let emojiPediaData = {}
const filteredEmojies = getUniqueEmojis();
console.log('- Emojies to query:', Object.keys(filteredEmojies).length);
let counter = 0;
for(let key in filteredEmojies){
const emojiData = filteredEmojies[key];
const emoji = emojiData.emoji;
const response = await getEmojiDataFor(counter, emoji);
const timeoutToPreventStressingTheAPI = Math.round(Math.random() * 1500);
console.log(' - Wait for', timeoutToPreventStressingTheAPI ,'ms')
await delay(timeoutToPreventStressingTheAPI);
console.log('');
emojiPediaData[key] = response;
if (response !== null) {
emojiPediaData[key].description = stripHtml(emojiPediaData[key].description);
}
counter ++
if(limitForTesting === true && counter > 3){
break;
}
}
console.log('- Querying done');
const filePath = './src/data/emojipediaData.json';
console.log('- Writing data to file', filePath)
fs.writeFileSync(filePath, JSON.stringify(emojiPediaData, null, 4), 'utf-8');
}
getEmojiPediaDataAndWriteToFile()