diff options
Diffstat (limited to 'gallery_dl/extractor/sankaku.py')
| -rw-r--r-- | gallery_dl/extractor/sankaku.py | 54 |
1 files changed, 43 insertions, 11 deletions
diff --git a/gallery_dl/extractor/sankaku.py b/gallery_dl/extractor/sankaku.py index b2f31dd..c7303f2 100644 --- a/gallery_dl/extractor/sankaku.py +++ b/gallery_dl/extractor/sankaku.py @@ -66,8 +66,7 @@ class SankakuExtractor(BooruExtractor): def _prepare(self, post): post["created_at"] = post["created_at"]["s"] post["date"] = text.parse_timestamp(post["created_at"]) - post["tags"] = [tag["name"].lower().replace(" ", "_") - for tag in post["tags"] if tag["name"]] + post["tags"] = post.pop("tag_names", ()) post["tag_string"] = " ".join(post["tags"]) post["_http_validate"] = self._check_expired @@ -76,7 +75,7 @@ class SankakuExtractor(BooruExtractor): def _tags(self, post, page): tags = collections.defaultdict(list) - for tag in post["tags"]: + for tag in self.api.tags(post["id"]): name = tag["name"] if name: tags[tag["type"]].append(name.lower().replace(" ", "_")) @@ -112,11 +111,11 @@ class SankakuTagExtractor(SankakuExtractor): if "date:" in self.tags: # rewrite 'date:' tags (#1790) self.tags = re.sub( - r"date:(\d\d)[.-](\d\d)[.-](\d\d\d\d)", - r"date:\3.\2.\1", self.tags) + r"date:(\d\d)[.-](\d\d)[.-](\d\d\d\d)(?!T)", + r"date:\3-\2-\1T00:00", self.tags) self.tags = re.sub( - r"date:(\d\d\d\d)[.-](\d\d)[.-](\d\d)", - r"date:\1.\2.\3", self.tags) + r"date:(\d\d\d\d)[.-](\d\d)[.-](\d\d)(?!T)", + r"date:\1-\2-\3T00:00", self.tags) def metadata(self): return {"search_tags": self.tags} @@ -209,6 +208,30 @@ class SankakuAPI(): params = {"lang": "en"} return self._call("/posts/{}/notes".format(post_id), params) + def tags(self, post_id): + endpoint = "/posts/{}/tags".format(post_id) + params = { + "lang" : "en", + "page" : 1, + "limit": 100, + } + + tags = None + while True: + data = self._call(endpoint, params) + + tags_new = data["data"] + if not tags_new: + return tags or [] + elif tags is None: + tags = tags_new + else: + tags.extend(tags_new) + + if len(tags_new) < 80 or len(tags) >= data["total"]: + return tags + params["page"] += 1 + def pools(self, pool_id): params = {"lang": "en"} return self._call("/pools/" + pool_id, params) @@ -216,6 +239,15 @@ class SankakuAPI(): def pools_keyset(self, params): return self._pagination("/pools/keyset", params) + def pools_series(self, params): + params_ = { + "lang" : "en", + "filledPools": "true", + "includes[]" : "pools", + } + params_.update(params) + return self._pagination("/poolseriesv2", params) + def posts(self, post_id): params = { "lang" : "en", @@ -223,17 +255,17 @@ class SankakuAPI(): "limit": "1", "tags" : ("md5:" if len(post_id) == 32 else "id_range:") + post_id, } - return self._call("/posts", params) + return self._call("/v2/posts", params) def posts_keyset(self, params): - return self._pagination("/posts/keyset", params) + return self._pagination("/v2/posts/keyset", params) def authenticate(self): self.headers["Authorization"] = \ _authenticate_impl(self.extractor, self.username, self.password) def _call(self, endpoint, params=None): - url = "https://capi-v2.sankakucomplex.com" + endpoint + url = "https://sankakuapi.com" + endpoint for _ in range(5): self.authenticate() response = self.extractor.request( @@ -311,7 +343,7 @@ class SankakuAPI(): def _authenticate_impl(extr, username, password): extr.log.info("Logging in as %s", username) - url = "https://capi-v2.sankakucomplex.com/auth/token" + url = "https://sankakuapi.com/auth/token" headers = {"Accept": "application/vnd.sankaku.api+json;v=2"} data = {"login": username, "password": password} |
