From 8d5b855167faf4048f715fe86135eacc6b58cb90 Mon Sep 17 00:00:00 2001 From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com> Date: Tue, 2 Feb 2021 22:45:10 +0100 Subject: [PATCH] Add handlers for AniList rate limit (#92) --- source/app/metrics/utils.mjs | 5 ++++ source/plugins/anilist/index.mjs | 46 +++++++++++++++++++++++--------- 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/source/app/metrics/utils.mjs b/source/app/metrics/utils.mjs index 5cfc435d..9a26ad13 100644 --- a/source/app/metrics/utils.mjs +++ b/source/app/metrics/utils.mjs @@ -131,3 +131,8 @@ await page.close() return {resized, mime} } + +/** Wait */ + export async function wait(seconds) { + await new Promise(solve => setTimeout(solve), seconds*1000) + } \ No newline at end of file diff --git a/source/plugins/anilist/index.mjs b/source/plugins/anilist/index.mjs index 1b4ab6d3..869d2098 100644 --- a/source/plugins/anilist/index.mjs +++ b/source/plugins/anilist/index.mjs @@ -51,11 +51,22 @@ let page = 1 let next = false do { - console.debug(`metrics/compute/${login}/plugins > anilist > querying api (favorites ${type}s - page ${page})`) - const {data:{data:{User:{favourites:{[type]:{nodes, pageInfo:cursor}}}}}} = await imports.axios.post("https://graphql.anilist.co", {variables:{name:user, page}, query:queries.anilist.favorites({type})}) - page++ - next = cursor.hasNextPage - list.push(...await Promise.all(nodes.map(media => format({media:{progess:null, score:null, media}, imports})))) + try { + console.debug(`metrics/compute/${login}/plugins > anilist > querying api (favorites ${type}s - page ${page})`) + const {data:{data:{User:{favourites:{[type]:{nodes, pageInfo:cursor}}}}}} = await imports.axios.post("https://graphql.anilist.co", {variables:{name:user, page}, query:queries.anilist.favorites({type})}) + page++ + next = cursor.hasNextPage + list.push(...await Promise.all(nodes.map(media => format({media:{progess:null, score:null, media}, imports})))) + } + catch (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) + continue + } + throw error + } } while (next) //Format and save results result.lists[type].favorites = shuffle ? imports.shuffle(list) : list @@ -75,13 +86,24 @@ let page = 1 let next = false do { - console.debug(`metrics/compute/${login}/plugins > anilist > querying api (favorites characters - page ${page})`) - const {data:{data:{User:{favourites:{characters:{nodes, pageInfo:cursor}}}}}} = await imports.axios.post("https://graphql.anilist.co", {variables:{name:user, page}, query:queries.anilist.characters()}) - page++ - next = cursor.hasNextPage - for (const {name:{full:name}, image:{medium:artwork}} of nodes) { - console.debug(`metrics/compute/${login}/plugins > anilist > processing ${name}`) - characters.push({name, artwork:artwork ? await imports.imgb64(artwork) : "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg=="}) + try { + console.debug(`metrics/compute/${login}/plugins > anilist > querying api (favorites characters - page ${page})`) + const {data:{data:{User:{favourites:{characters:{nodes, pageInfo:cursor}}}}}} = await imports.axios.post("https://graphql.anilist.co", {variables:{name:user, page}, query:queries.anilist.characters()}) + page++ + next = cursor.hasNextPage + for (const {name:{full:name}, image:{medium:artwork}} of nodes) { + console.debug(`metrics/compute/${login}/plugins > anilist > processing ${name}`) + characters.push({name, artwork:artwork ? await imports.imgb64(artwork) : "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg=="}) + } + } + catch (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) + continue + } + throw error } } while (next) //Format and save results