diff options
Diffstat (limited to 'gallery_dl/extractor/deviantart.py')
| -rw-r--r-- | gallery_dl/extractor/deviantart.py | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/gallery_dl/extractor/deviantart.py b/gallery_dl/extractor/deviantart.py index 02a14e3..90b27d1 100644 --- a/gallery_dl/extractor/deviantart.py +++ b/gallery_dl/extractor/deviantart.py @@ -93,9 +93,11 @@ class DeviantartExtractor(Extractor): if content["src"].startswith("https://images-wixmp-"): if deviation["index"] <= 790677560: # https://github.com/r888888888/danbooru/issues/4069 - content["src"] = re.sub( + intermediary, count = re.subn( r"(/f/[^/]+/[^/]+)/v\d+/.*", r"/intermediary\1", content["src"]) + if count and self._check_url(intermediary): + content["src"] = intermediary if self.quality: content["src"] = re.sub( r"q_\d+", self.quality, content["src"]) @@ -261,6 +263,9 @@ class DeviantartExtractor(Extractor): if mtype and mtype.startswith("image/"): content.update(data) + def _check_url(self, url): + return self.request(url, method="HEAD", fatal=False).status_code < 400 + class DeviantartUserExtractor(DeviantartExtractor): """Extractor for an artist's user profile""" @@ -717,7 +722,7 @@ class DeviantartExtractorV2(DeviantartExtractor): # select largest video target = max(media["types"], key=lambda x: text.parse_int(x.get("q", "")[:-1])) - src = target["s"] + src = target["b"] elif target["t"] == "flash": src = target["s"] @@ -737,8 +742,10 @@ class DeviantartExtractorV2(DeviantartExtractor): if src.startswith("https://images-wixmp-"): if deviation["index"] <= 790677560: # https://github.com/r888888888/danbooru/issues/4069 - src = re.sub( + intermediary, count = re.subn( r"(/f/[^/]+/[^/]+)/v\d+/.*", r"/intermediary\1", src) + if count and self._check_url(intermediary): + src = intermediary if self.quality: src = re.sub(r"q_\d+", self.quality, src) @@ -811,15 +818,17 @@ class DeviantartDeviationExtractor(DeviantartExtractorV2): }), # video ("https://www.deviantart.com/chi-u/art/-VIDEO-Brushes-330774593", { - "url": "3b6e6e761d2d393fa61a4dc3ed6e7db51b14d07b", + "pattern": r"https://wixmp-.+wixmp.com/v/mp4/.+\.720p\.\w+.mp4", "keyword": { "filename": r"re:_video____brushes_\w+_by_chi_u-d5gxnb5", "extension": "mp4", "target": { "d": 306, - "f": 9963639, - "q": "1080p", + "f": 19367585, + "h": 720, + "q": "720p", "t": "video", + "w": 1364, "src": str, }, } @@ -952,11 +961,15 @@ class DeviantartAPI(): self.folders = extractor.config("folders", False) self.metadata = extractor.extra or extractor.config("metadata", False) - self.refresh_token = extractor.config("refresh-token") - self.client_id = extractor.config("client-id", self.CLIENT_ID) + self.client_id = extractor.config( + "client-id", self.CLIENT_ID) self.client_secret = extractor.config( "client-secret", self.CLIENT_SECRET) + self.refresh_token = extractor.config("refresh-token") + if self.refresh_token == "cache": + self.refresh_token = "#" + str(self.client_id) + self.log.debug( "Using %s API credentials (client-id %s)", "default" if self.client_id == self.CLIENT_ID else "custom", @@ -1026,8 +1039,12 @@ class DeviantartAPI(): "type" : kind, "include_session": "false", } - return self.extractor.request( - url, headers=headers, params=params, fatal=None).json() + response = self.extractor.request( + url, headers=headers, params=params, fatal=None) + if response.status_code == 404: + raise exception.StopExtraction( + "Your account must use the Eclipse interface.") + return response.json() def deviation_metadata(self, deviations): """ Fetch deviation metadata for a set of deviations""" |
