-
Notifications
You must be signed in to change notification settings - Fork 1
/
Anilist.js
140 lines (122 loc) · 4.53 KB
/
Anilist.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
const Hyak_Anime = require("../model/Hyak_Anime");
// const Hyak_Anime = require('./data/Hyak_Anime.json')
// Hyakanime status formater
let status_formater = {
"CURRENT": 1,
"PLANNING": 2,
"COMPLETED": 3,
"FINISHED": 3, // rewatch -> Completed
"PAUSED": 4,
"DROPPED": 5,
}
// Transform format date Anilist to Hyakanime
function formatedDate(date) {
let final_date = ""
if (date.year) {
final_date = `${date.year}-01-01T00:00:00.000Z`
if (date.month && date.day)
final_date = `${date.year}-${date.month.toString().padStart(2, '0')}-${date.day.toString().padStart(2, '0')}T00:00:00.000Z`
}
return final_date
}
module.exports = async function importAnilist(username, uid) {
const query = `
query ($userName: String) {
MediaListCollection(userName: $userName, type: ANIME) {
lists {
name
entries {
media {
id
title {
romaji
english
native
}
status
episodes
}
status
score
progress
repeat
startedAt {
year
month
day
}
completedAt {
year
month
day
}
}
}
}
}
`;
const options = {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
},
body: JSON.stringify({
query: query,
variables: { userName: username }
})
};
const response = await fetch('https://graphql.anilist.co', options);
const data = await response.json();
if (!data || !data.data.MediaListCollection)
throw new Error("Aucun media trouvé pour ce nom d'utilisateur.");
// Get all information from Anilist progression
let formated_anilist_progression = []
data.data.MediaListCollection.lists.forEach((e) => {
e.entries.forEach((item) => {
// Check double entries in different list
if (!formated_anilist_progression.some((el) => el.id === item.media.id)) {
// Change date format
let iso8601StartDate = item.startedAt ? formatedDate(item.startedAt) : "";
let iso8601EndDate = item.completedAt ? formatedDate(item.completedAt) : "";
formated_anilist_progression.push({
id: item.media.id,
title: item.media.title.english ? item.media.title.english : item.media.title.romaji ? item.media.title.romaji : item.media.title.natif,
status: item.status,
progression: item.progress,
score: item.score,
startDate: iso8601StartDate,
endDate: iso8601EndDate,
rewatch: item.repeat
})
}
})
})
// Find Hyakanime Anime from Anilist ID (if you use Mongoose)
let anime_find = await Hyak_Anime.find({ idAnilist: formated_anilist_progression.map(i => { return i.id }) });
// If you use json file :
// const anime_find = Hyak_Anime.filter(anime => formated_anilist_progression.map(i => i.id).includes(anime.idAnilist));
// Create Hyakanime progression and keep title not found
let finalProgression = [];
let added_anime = [];
let missing_anime = [];
formated_anilist_progression.forEach((e) => {
if (anime_find.some((element) => element.idAnilist === e.id)) {
let { id } = anime_find.find((a) => a.idAnilist === e.id);
finalProgression.push({
animeID: id,
progression: e.progression,
status: status_formater[e.status],
score: e.score,
uid: uid,
startDate: e.startDate,
endDate: e.endDate,
rewatch: e.rewatch
})
added_anime.push(e.title)
}
else
missing_anime.push(e.title)
})
return { missing_anime, added_anime, finalProgression };
}