diff options
Diffstat (limited to 'gallery_dl/extractor/kemono.py')
| -rw-r--r-- | gallery_dl/extractor/kemono.py | 72 |
1 files changed, 29 insertions, 43 deletions
diff --git a/gallery_dl/extractor/kemono.py b/gallery_dl/extractor/kemono.py index 1e88891..46139bc 100644 --- a/gallery_dl/extractor/kemono.py +++ b/gallery_dl/extractor/kemono.py @@ -102,19 +102,15 @@ class KemonoExtractor(Extractor): post["username"] = creator["name"] if comments: - try: - post["comments"] = self.api.creator_post_comments( - service, creator_id, post["id"]) - except exception.HttpError: + post["comments"] = cmts = self.api.creator_post_comments( + service, creator_id, post["id"]) + if not isinstance(cmts, list): + self.log.debug("%s/%s: %s", creator_id, post["id"], cmts) post["comments"] = () if dms is not None: if dms is True: dms = self.api.creator_dms( post["service"], post["user"]) - try: - dms = dms["props"]["dms"] - except Exception: - dms = () post["dms"] = dms if announcements is not None: if announcements is True: @@ -245,16 +241,15 @@ class KemonoExtractor(Extractor): def _revisions_post(self, post): post["revision_id"] = 0 - try: - revs = self.api.creator_post_revisions( - post["service"], post["user"], post["id"]) - except exception.HttpError: + revs = self.api.creator_post_revisions( + post["service"], post["user"], post["id"]) + if not revs: post["revision_hash"] = self._revision_hash(post) post["revision_index"] = 1 post["revision_count"] = 1 return (post,) - revs.insert(0, post) + revs.insert(0, post) for rev in revs: rev["revision_hash"] = self._revision_hash(rev) @@ -325,25 +320,14 @@ class KemonoUserExtractor(KemonoExtractor): def posts(self): _, _, service, creator_id, query = self.groups params = text.parse_query(query) - tag = params.get("tag") - endpoint = self.config("endpoint") - if endpoint == "legacy+": - endpoint = self._posts_legacy_plus - elif endpoint == "legacy" or tag: - endpoint = self.api.creator_posts_legacy + if self.config("endpoint") in ("posts+", "legacy+"): + endpoint = self.api.creator_posts_expand else: endpoint = self.api.creator_posts return endpoint(service, creator_id, - params.get("o"), params.get("q"), tag) - - def _posts_legacy_plus(self, service, creator_id, - offset=0, query=None, tags=None): - for post in self.api.creator_posts_legacy( - service, creator_id, offset, query, tags): - yield self.api.creator_post( - service, creator_id, post["id"])["post"] + params.get("o"), params.get("q"), params.get("tag")) class KemonoPostsExtractor(KemonoExtractor): @@ -589,20 +573,22 @@ class KemonoAPI(): return self._call(endpoint) def creators(self): - endpoint = "/creators.txt" - return self._call(endpoint) + endpoint = "/creators" + headers = {"Accept": "text/css"} + return self._call(endpoint, headers=headers) def creator_posts(self, service, creator_id, offset=0, query=None, tags=None): - endpoint = f"/{service}/user/{creator_id}" - params = {"q": query, "tag": tags, "o": offset} + endpoint = f"/{service}/user/{creator_id}/posts" + params = {"o": offset, "tag": tags, "q": query} return self._pagination(endpoint, params, 50) - def creator_posts_legacy(self, service, creator_id, + def creator_posts_expand(self, service, creator_id, offset=0, query=None, tags=None): - endpoint = f"/{service}/user/{creator_id}/posts-legacy" - params = {"o": offset, "tag": tags, "q": query} - return self._pagination(endpoint, params, 50, "results") + for post in self.creator_posts( + service, creator_id, offset, query, tags): + yield self.creator_post( + service, creator_id, post["id"])["post"] def creator_announcements(self, service, creator_id): endpoint = f"/{service}/user/{creator_id}/announcements" @@ -622,11 +608,11 @@ class KemonoAPI(): def creator_post_comments(self, service, creator_id, post_id): endpoint = f"/{service}/user/{creator_id}/post/{post_id}/comments" - return self._call(endpoint) + return self._call(endpoint, fatal=False) def creator_post_revisions(self, service, creator_id, post_id): endpoint = f"/{service}/user/{creator_id}/post/{post_id}/revisions" - return self._call(endpoint) + return self._call(endpoint, fatal=False) def creator_profile(self, service, creator_id): endpoint = f"/{service}/user/{creator_id}/profile" @@ -657,19 +643,19 @@ class KemonoAPI(): params = {"type": type} return self._call(endpoint, params) - def _call(self, endpoint, params=None): - url = self.root + endpoint - response = self.extractor.request(url, params=params) - return response.json() + def _call(self, endpoint, params=None, headers=None, fatal=True): + return self.extractor.request_json( + f"{self.root}{endpoint}", params=params, headers=headers, + encoding="utf-8", fatal=fatal) - def _pagination(self, endpoint, params, batch=50, key=False): + def _pagination(self, endpoint, params, batch=50, key=None): offset = text.parse_int(params.get("o")) params["o"] = offset - offset % batch while True: data = self._call(endpoint, params) - if key: + if key is not None: data = data.get(key) if not data: return |
