Handler AniList rate-limit

This commit is contained in:
lowlighter
2021-02-19 21:48:26 +01:00
parent 1a464ddaae
commit 534a770062

View File

@@ -13,32 +13,44 @@
const result = {user:{stats:null, genres:[]}, lists:Object.fromEntries(medias.map(type => [type, {}])), characters:[], sections} const result = {user:{stats:null, genres:[]}, lists:Object.fromEntries(medias.map(type => [type, {}])), characters:[], sections}
//User statistics //User statistics
{ for (let retried = false; !retried; retried = true) {
//Query API try {
console.debug(`metrics/compute/${login}/plugins > anilist > querying api (user statistics)`) //Query API
const {data:{data:{User:{statistics:stats}}}} = await imports.axios.post("https://graphql.anilist.co", {variables:{name:user}, query:queries.anilist.statistics()}) console.debug(`metrics/compute/${login}/plugins > anilist > querying api (user statistics)`)
//Format and save results const {data:{data:{User:{statistics:stats}}}} = await imports.axios.post("https://graphql.anilist.co", {variables:{name:user}, query:queries.anilist.statistics()})
result.user.stats = stats //Format and save results
result.user.genres = [...new Set([...stats.anime.genres.map(({genre}) => genre), ...stats.manga.genres.map(({genre}) => genre)])] result.user.stats = stats
result.user.genres = [...new Set([...stats.anime.genres.map(({genre}) => genre), ...stats.manga.genres.map(({genre}) => genre)])]
}
catch (error) {
await retry({login, imports, error})
}
} }
//Medias lists //Medias lists
if ((sections.includes("watching"))||(sections.includes("reading"))) { if ((sections.includes("watching"))||(sections.includes("reading"))) {
for (const type of medias) { for (const type of medias) {
//Query API for (let retried = false; !retried; retried = true) {
console.debug(`metrics/compute/${login}/plugins > anilist > querying api (medias lists - ${type})`) try {
const {data:{data:{MediaListCollection:{lists}}}} = await imports.axios.post("https://graphql.anilist.co", {variables:{name:user, type:type.toLocaleUpperCase()}, query:queries.anilist.medias()}) //Query API
//Format and save results console.debug(`metrics/compute/${login}/plugins > anilist > querying api (medias lists - ${type})`)
for (const {name, entries} of lists) { const {data:{data:{MediaListCollection:{lists}}}} = await imports.axios.post("https://graphql.anilist.co", {variables:{name:user, type:type.toLocaleUpperCase()}, query:queries.anilist.medias()})
//Format results //Format and save results
const list = await Promise.all(entries.map(media => format({media, imports}))) for (const {name, entries} of lists) {
result.lists[type][name.toLocaleLowerCase()] = shuffle ? imports.shuffle(list) : list //Format results
//Limit results const list = await Promise.all(entries.map(media => format({media, imports})))
if (limit > 0) { result.lists[type][name.toLocaleLowerCase()] = shuffle ? imports.shuffle(list) : list
console.debug(`metrics/compute/${login}/plugins > anilist > keeping only ${limit} medias`) //Limit results
result.lists[type][name.toLocaleLowerCase()].splice(limit) if (limit > 0) {
console.debug(`metrics/compute/${login}/plugins > anilist > keeping only ${limit} medias`)
result.lists[type][name.toLocaleLowerCase()].splice(limit)
}
} }
} }
catch (error) {
await retry({login, imports, error})
}
}
} }
} }
@@ -59,13 +71,8 @@
list.push(...await Promise.all(nodes.map(media => format({media:{progess:null, score:null, media}, imports})))) list.push(...await Promise.all(nodes.map(media => format({media:{progess:null, score:null, media}, imports}))))
} }
catch (error) { catch (error) {
if ((error.isAxiosError)&&(error.response.status === 429)) { if (await retry({login, imports, error}))
const delay = Number(error.response.headers["retry-after"])+5
console.debug(`metrics/compute/${login}/plugins > anilist > reached requests limit, retrying in ${delay}s`)
await imports.wait(delay)
continue continue
}
throw error
} }
} while (next) } while (next)
//Format and save results //Format and save results
@@ -97,13 +104,8 @@
} }
} }
catch (error) { catch (error) {
if ((error.isAxiosError)&&(error.response.status === 429)) { if (await retry({login, imports, error}))
const delay = Number(error.response.headers["retry-after"])+5
console.debug(`metrics/compute/${login}/plugins > anilist > reached requests limit, retrying in ${delay}s`)
await imports.wait(delay)
continue continue
}
throw error
} }
} while (next) } while (next)
//Format and save results //Format and save results
@@ -143,3 +145,14 @@
artwork:artwork ? await imports.imgb64(artwork) : "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg==", artwork:artwork ? await imports.imgb64(artwork) : "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg==",
} }
} }
/**Rate-limiter handler */
async function retry({login, imports, error}) {
if ((error.isAxiosError)&&(error.response.status === 429)) {
const delay = Number(error.response.headers["retry-after"])+5
console.debug(`metrics/compute/${login}/plugins > anilist > reached requests limit, retrying in ${delay}s`)
await imports.wait(delay)
return true
}
throw error
}