diff options
| author | 2022-10-03 04:08:41 -0400 | |
|---|---|---|
| committer | 2022-10-03 04:08:41 -0400 | |
| commit | b2d8a54ecf4157570d00a8b974a779766822bf4b (patch) | |
| tree | d7b6db11c9b6add2c1a714fcfc95ab62b11e126c /gallery_dl/extractor/artstation.py | |
| parent | e6b82556343116256be047ab7099bedd9063f66a (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.py | 58 |
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): |
