summaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/kemono.py
diff options
context:
space:
mode:
Diffstat (limited to 'gallery_dl/extractor/kemono.py')
-rw-r--r--gallery_dl/extractor/kemono.py72
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