From 982880615dc8334ab43cdf0770214144e8089302 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Sat, 2 Mar 2024 21:55:04 +0100 Subject: [PATCH] [deviantart] prevent unnecessary API requests (#4995) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit … when using 'comments-avatars' This also has the added benefit of making it possible to download comment avatars from users without a valid user profile entry, like deleted users. --- gallery_dl/extractor/deviantart.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/gallery_dl/extractor/deviantart.py b/gallery_dl/extractor/deviantart.py index 7235c479..08961614 100644 --- a/gallery_dl/extractor/deviantart.py +++ b/gallery_dl/extractor/deviantart.py @@ -101,9 +101,9 @@ class DeviantartExtractor(Extractor): if self.user: group = self.config("group", True) if group: - profile = self.api.user_profile(self.user) - if profile: - self.user = profile["user"]["username"] + user = _user_details(self, self.user) + if user: + self.user = user["username"] self.group = False elif group == "skip": self.log.info("Skipping group '%s'", self.user) @@ -175,8 +175,11 @@ class DeviantartExtractor(Extractor): if self.comments_avatars: for comment in deviation["comments"]: - url = "{}/{}/avatar/".format( - self.root, comment["user"]["username"]) + user = comment["user"] + name = user["username"].lower() + _user_details.update(name, user) + + url = "{}/{}/avatar/".format(self.root, name) comment["_extractor"] = DeviantartAvatarExtractor yield Message.Queue, url, comment @@ -577,11 +580,10 @@ class DeviantartAvatarExtractor(DeviantartExtractor): def deviations(self): name = self.user.lower() - profile = self.api.user_profile(name) - if not profile: + user = _user_details(self, name) + if not user: return () - user = profile["user"] icon = user["usericon"] index = icon.rpartition("?")[2] @@ -1725,6 +1727,14 @@ class DeviantartEclipseAPI(): return token +@memcache(keyarg=1) +def _user_details(extr, name): + try: + return extr.api.user_profile(name)["user"] + except Exception: + return None + + @cache(maxage=36500*86400, keyarg=0) def _refresh_token_cache(token): if token and token[0] == "#":