[artstation] support search filters (#2970)

This commit is contained in:
Mike Fährmann
2022-09-28 16:51:17 +02:00
parent 194803f3a7
commit 6992d01e19

View File

@@ -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'
@@ -305,27 +323,39 @@ class ArtstationSearchExtractor(ArtstationExtractor):
def __init__(self, match):
ArtstationExtractor.__init__(self, match)
query = text.parse_query(match.group(1))
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):