Add handlers for AniList rate limit (#92)

This commit is contained in:
Simon Lecoq
2021-02-02 22:45:10 +01:00
committed by GitHub
parent 651bc9bc17
commit 8d5b855167
2 changed files with 39 additions and 12 deletions

View File

@@ -131,3 +131,8 @@
await page.close() await page.close()
return {resized, mime} return {resized, mime}
} }
/** Wait */
export async function wait(seconds) {
await new Promise(solve => setTimeout(solve), seconds*1000)
}

View File

@@ -51,11 +51,22 @@
let page = 1 let page = 1
let next = false let next = false
do { do {
console.debug(`metrics/compute/${login}/plugins > anilist > querying api (favorites ${type}s - page ${page})`) try {
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})}) console.debug(`metrics/compute/${login}/plugins > anilist > querying api (favorites ${type}s - page ${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})})
next = cursor.hasNextPage page++
list.push(...await Promise.all(nodes.map(media => format({media:{progess:null, score:null, media}, imports})))) 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) } while (next)
//Format and save results //Format and save results
result.lists[type].favorites = shuffle ? imports.shuffle(list) : list result.lists[type].favorites = shuffle ? imports.shuffle(list) : list
@@ -75,13 +86,24 @@
let page = 1 let page = 1
let next = false let next = false
do { do {
console.debug(`metrics/compute/${login}/plugins > anilist > querying api (favorites characters - page ${page})`) try {
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()}) console.debug(`metrics/compute/${login}/plugins > anilist > querying api (favorites characters - page ${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()})
next = cursor.hasNextPage page++
for (const {name:{full:name}, image:{medium:artwork}} of nodes) { next = cursor.hasNextPage
console.debug(`metrics/compute/${login}/plugins > anilist > processing ${name}`) for (const {name:{full:name}, image:{medium:artwork}} of nodes) {
characters.push({name, artwork:artwork ? await imports.imgb64(artwork) : "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg=="}) 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) } while (next)
//Format and save results //Format and save results