summaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/deviantart.py
diff options
context:
space:
mode:
Diffstat (limited to 'gallery_dl/extractor/deviantart.py')
-rw-r--r--gallery_dl/extractor/deviantart.py37
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"""