[deviantart] use proper exponential backoff on API errors

... and use separate API credentials for unit tests.
This commit is contained in:
Mike Fährmann
2018-03-15 15:53:16 +01:00
parent 723cc66bb1
commit 557cb94f81
3 changed files with 21 additions and 15 deletions

View File

@@ -464,29 +464,32 @@ class DeviantartAPI():
def _call(self, endpoint, params=None, expect_error=False): def _call(self, endpoint, params=None, expect_error=False):
"""Call an API endpoint""" """Call an API endpoint"""
url = "https://www.deviantart.com/api/v1/oauth2/" + endpoint url = "https://www.deviantart.com/api/v1/oauth2/" + endpoint
tries = 1
while True: while True:
if self.delay: if self.delay > 0:
time.sleep(self.delay) time.sleep(2 ** (self.delay-1))
self.authenticate() self.authenticate()
response = self.session.get( response = self.session.get(
url, headers=self.headers, params=params) url, headers=self.headers, params=params)
if response.status_code == 200: if response.status_code == 200:
if self.delay > 2:
self.delay -= 1
break break
elif response.status_code == 429:
self.delay += 1
self.log.debug("rate limit (delay: %d)", self.delay)
else: else:
if expect_error: self.delay += 1
return None
self.delay = 1 if response.status_code == 429:
self.log.debug("http status code %d (%d/3)", msg = "Rate limit reached"
response.status_code, tries) else:
tries += 1 if expect_error:
if tries > 3: return None
raise Exception(response.text) msg = "API responded with {} {}".format(
response.status_code, response.reason)
self.log.warning(
"%s. Using %ds delay.", msg, 2 ** (self.delay-1))
self.log.debug(response.text)
try: try:
return response.json() return response.json()
except ValueError: except ValueError:

View File

@@ -25,7 +25,7 @@ class LusciousAlbumExtractor(AsynchronousExtractor):
(("https://luscious.net/c/hentai_manga/albums/" (("https://luscious.net/c/hentai_manga/albums/"
"okinami-no-koigokoro_277031/view/"), { "okinami-no-koigokoro_277031/view/"), {
"url": "7e4984a271a1072ac6483e4228a045895aff86f3", "url": "7e4984a271a1072ac6483e4228a045895aff86f3",
"keyword": "76e099479b180420fd5cf820f00c52fe07fda884", "keyword": "e746a3771f4e14bfff81215232a12417d6351ce6",
"content": "b3a747a6464509440bd0ff6d1267e6959f8d6ff3", "content": "b3a747a6464509440bd0ff6d1267e6959f8d6ff3",
}), }),
("https://luscious.net/albums/virgin-killer-sweater_282582/", { ("https://luscious.net/albums/virgin-killer-sweater_282582/", {

View File

@@ -36,6 +36,9 @@ class TestExtractors(unittest.TestCase):
config.set(("extractor", "password"), name) config.set(("extractor", "password"), name)
config.set(("extractor", "nijie", "username"), email) config.set(("extractor", "nijie", "username"), email)
config.set(("extractor", "seiga", "username"), email) config.set(("extractor", "seiga", "username"), email)
config.set(("extractor", "deviantart", "client-id"), "7777")
config.set(("extractor", "deviantart", "client-secret"),
"ff14994c744d9208e5caeec7aab4a026")
config.set(("extractor", "tumblr", "api-key"), config.set(("extractor", "tumblr", "api-key"),
"0cXoHfIqVzMQcc3HESZSNsVlulGxEXGDTTZCDrRrjaa0jmuTc6") "0cXoHfIqVzMQcc3HESZSNsVlulGxEXGDTTZCDrRrjaa0jmuTc6")