summaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/deviantart.py
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2021-11-01 05:03:49 -0400
committerLibravatarUnit 193 <unit193@unit193.net>2021-11-01 05:03:49 -0400
commit4a965d875415907cc1a016b428ae305a964f9228 (patch)
tree7cece9948a7ba390348e00c669f9cb1f7a9ba39a /gallery_dl/extractor/deviantart.py
parent34ba2951b8c523713425c98addb9256ea05c946f (diff)
New upstream version 1.19.1.upstream/1.19.1
Diffstat (limited to 'gallery_dl/extractor/deviantart.py')
-rw-r--r--gallery_dl/extractor/deviantart.py84
1 files changed, 45 insertions, 39 deletions
diff --git a/gallery_dl/extractor/deviantart.py b/gallery_dl/extractor/deviantart.py
index 7dac770..4604d39 100644
--- a/gallery_dl/extractor/deviantart.py
+++ b/gallery_dl/extractor/deviantart.py
@@ -14,6 +14,7 @@ from ..cache import cache, memcache
import collections
import itertools
import mimetypes
+import binascii
import time
import re
@@ -39,7 +40,6 @@ class DeviantartExtractor(Extractor):
self.offset = 0
self.flat = self.config("flat", True)
self.extra = self.config("extra", False)
- self.quality = self.config("quality", "100")
self.original = self.config("original", True)
self.comments = self.config("comments", False)
self.user = match.group(1) or match.group(2)
@@ -53,9 +53,6 @@ class DeviantartExtractor(Extractor):
else:
self.unwatch = None
- if self.quality:
- self.quality = ",q_{}".format(self.quality)
-
if self.original != "image":
self._update_content = self._update_content_default
else:
@@ -104,19 +101,8 @@ class DeviantartExtractor(Extractor):
if self.original and deviation["is_downloadable"]:
self._update_content(deviation, content)
-
- if content["src"].startswith("https://images-wixmp-"):
- if deviation["index"] <= 790677560:
- # https://github.com/r888888888/danbooru/issues/4069
- intermediary, count = re.subn(
- r"(/f/[^/]+/[^/]+)/v\d+/.*",
- r"/intermediary\1", content["src"], 1)
- if count:
- deviation["_fallback"] = (content["src"],)
- content["src"] = intermediary
- if self.quality:
- content["src"] = re.sub(
- r",q_\d+", self.quality, content["src"], 1)
+ else:
+ self._update_token(deviation, content)
yield self.commit(deviation, content)
@@ -302,6 +288,32 @@ class DeviantartExtractor(Extractor):
if mtype and mtype.startswith("image/"):
content.update(data)
+ def _update_token(self, deviation, content):
+ """Replace JWT to be able to remove width/height limits
+
+ All credit goes to @Ironchest337
+ for discovering and implementing this method
+ """
+ url, sep, _ = content["src"].partition("/v1/")
+ if not sep:
+ return
+
+ # header = b'{"typ":"JWT","alg":"none"}'
+ payload = (
+ b'{"sub":"urn:app:","iss":"urn:app:","obj":[[{"path":"/f/' +
+ url.partition("/f/")[2].encode() +
+ b'"}]],"aud":["urn:service:file.download"]}'
+ )
+
+ deviation["_fallback"] = (content["src"],)
+ content["src"] = (
+ "{}?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.{}.".format(
+ url,
+ # base64 of 'header' is precomputed as 'eyJ0eX...'
+ # binascii.a2b_base64(header).rstrip(b"=\n").decode(),
+ binascii.b2a_base64(payload).rstrip(b"=\n").decode())
+ )
+
def _limited_request(self, url, **kwargs):
"""Limits HTTP requests to one every 2 seconds"""
kwargs["fatal"] = None
@@ -746,29 +758,27 @@ class DeviantartPopularExtractor(DeviantartExtractor):
def __init__(self, match):
DeviantartExtractor.__init__(self, match)
- self.search_term = self.time_range = self.category_path = None
self.user = ""
trange1, path, trange2, query = match.groups()
- trange = trange1 or trange2
query = text.parse_query(query)
-
- if not trange:
- trange = query.get("order")
-
- if path:
- self.category_path = path.strip("/")
- if trange:
- if trange.startswith("popular-"):
- trange = trange[8:]
- self.time_range = trange.replace("-", "").replace("hours", "hr")
- if query:
- self.search_term = query.get("q")
+ self.search_term = query.get("q")
+
+ trange = trange1 or trange2 or query.get("order", "")
+ if trange.startswith("popular-"):
+ trange = trange[8:]
+ self.time_range = {
+ "most-recent" : "now",
+ "this-week" : "1week",
+ "this-month" : "1month",
+ "this-century": "alltime",
+ "all-time" : "alltime",
+ }.get(trange, "alltime")
self.popular = {
"search": self.search_term or "",
- "range" : trange or "",
- "path" : self.category_path,
+ "range" : trange or "all-time",
+ "path" : path.strip("/") if path else "",
}
def deviations(self):
@@ -851,12 +861,8 @@ class DeviantartDeviationExtractor(DeviantartExtractor):
}),
# wixmp URL rewrite
(("https://www.deviantart.com/citizenfresh/art/Hverarond-789295466"), {
- "pattern": (r"https://images-wixmp-\w+\.wixmp\.com"
- r"/intermediary/f/[^/]+/[^.]+\.jpg")
- }),
- # wixmp URL rewrite v2 (#369)
- (("https://www.deviantart.com/josephbiwald/art/Destiny-2-804940104"), {
- "pattern": r"https://images-wixmp-\w+\.wixmp\.com/.*,q_100,"
+ "pattern": (r"https://images-wixmp-\w+\.wixmp\.com/f"
+ r"/[^/]+/[^.]+\.jpg\?token="),
}),
# GIF (#242)
(("https://www.deviantart.com/skatergators/art/COM-Moni-781571783"), {