aboutsummaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/artstation.py
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2022-10-03 04:08:41 -0400
committerLibravatarUnit 193 <unit193@unit193.net>2022-10-03 04:08:41 -0400
commitb2d8a54ecf4157570d00a8b974a779766822bf4b (patch)
treed7b6db11c9b6add2c1a714fcfc95ab62b11e126c /gallery_dl/extractor/artstation.py
parente6b82556343116256be047ab7099bedd9063f66a (diff)
New upstream version 1.23.2upstream/1.23.2
Diffstat (limited to 'gallery_dl/extractor/artstation.py')
-rw-r--r--gallery_dl/extractor/artstation.py58
1 files changed, 44 insertions, 14 deletions
diff --git a/gallery_dl/extractor/artstation.py b/gallery_dl/extractor/artstation.py
index c0e8e67..62626a1 100644
--- a/gallery_dl/extractor/artstation.py
+++ b/gallery_dl/extractor/artstation.py
@@ -103,16 +103,23 @@ class ArtstationExtractor(Extractor):
return response.json()
def _pagination(self, url, params=None, json=None):
+ headers = {
+ "Accept" : "application/json, text/plain, */*",
+ "Origin" : self.root,
+ "Referer": self.root + "/",
+ }
+
if json:
params = json
- kwargs = {"json": json}
+ headers["PUBLIC-CSRF-TOKEN"] = self._init_csrf_token()
+ kwargs = {"method": "POST", "headers": headers, "json": json}
else:
if not params:
params = {}
- kwargs = {"params": params}
+ kwargs = {"params": params, "headers": headers}
- params["page"] = 1
total = 0
+ params["page"] = 1
while True:
data = self.request(url, **kwargs).json()
@@ -124,6 +131,17 @@ class ArtstationExtractor(Extractor):
params["page"] += 1
+ def _init_csrf_token(self):
+ url = self.root + "/api/v2/csrf_protection/token.json"
+ headers = {
+ "Accept" : "*/*",
+ "Origin" : self.root,
+ "Referer": self.root + "/",
+ }
+ return self.request(
+ url, method="POST", headers=headers, json={},
+ ).json()["public_csrf_token"]
+
@staticmethod
def _no_cache(url, alphabet=(string.digits + string.ascii_letters)):
"""Cause a cache miss to prevent Cloudflare 'optimizations'
@@ -298,34 +316,46 @@ class ArtstationSearchExtractor(ArtstationExtractor):
archive_fmt = "s_{search[query]}_{asset[id]}"
pattern = (r"(?:https?://)?(?:\w+\.)?artstation\.com"
r"/search/?\?([^#]+)")
- test = ("https://www.artstation.com/search?q=ancient&sort_by=rank", {
+ test = ("https://www.artstation.com/search?query=ancient&sort_by=rank", {
"range": "1-20",
"count": 20,
})
def __init__(self, match):
ArtstationExtractor.__init__(self, match)
- query = text.parse_query(match.group(1))
- self.query = query.get("q", "")
- self.sorting = query.get("sort_by", "rank").lower()
+ self.params = query = text.parse_query(match.group(1))
+ self.query = text.unquote(query.get("query") or query.get("q", ""))
+ self.sorting = query.get("sort_by", "relevance").lower()
+ self.tags = query.get("tags", "").split(",")
def metadata(self):
return {"search": {
"query" : self.query,
"sorting": self.sorting,
+ "tags" : self.tags,
}}
def projects(self):
+ filters = []
+ for key, value in self.params.items():
+ if key.endswith("_ids") or key == "tags":
+ filters.append({
+ "field" : key,
+ "method": "include",
+ "value" : value.split(","),
+ })
+
url = "{}/api/v2/search/projects.json".format(self.root)
- return self._pagination(url, json={
- "additional_fields": "[]",
- "filters" : "[]",
- "page" : None,
- "per_page" : "50",
- "pro_first" : "1",
+ data = {
"query" : self.query,
+ "page" : None,
+ "per_page" : 50,
"sorting" : self.sorting,
- })
+ "pro_first" : "1",
+ "filters" : filters,
+ "additional_fields": (),
+ }
+ return self._pagination(url, json=data)
class ArtstationArtworkExtractor(ArtstationExtractor):