From 42582af4f12315ff52a62687685a7c648e2b1ec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Thu, 14 Aug 2025 12:13:12 +0200 Subject: [PATCH] [kemono] support '"endpoint": "posts+"' for full metadata (#8028) alias for "legacy+" --- docs/configuration.rst | 21 +++++---------------- gallery_dl/extractor/kemono.py | 22 ++++++++++------------ 2 files changed, 15 insertions(+), 28 deletions(-) diff --git a/docs/configuration.rst b/docs/configuration.rst index d7234bd0..79452af0 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -3395,22 +3395,11 @@ Default Description API endpoint to use for retrieving creator posts. - ``"legacy"`` - | Use the results from - `/v1/{service}/user/{creator_id}/posts-legacy `__ - | Provides less metadata, but is more reliable at returning all posts. - | Supports filtering results by ``tag`` query parameter. - ``"legacy+"`` - | Use the results from - `/v1/{service}/user/{creator_id}/posts-legacy `__ - to retrieve post IDs - | and one request to - `/v1/{service}/user/{creator_id}/post/{post_id} `__ - to get a full set of metadata for each. - ``"posts"`` - | Use the results from - `/v1/{service}/user/{creator_id} `__ - | Provides more metadata, but might not return a creator's first/last posts. + ``"posts"`` | ``"legacy"`` + Provides only limited metadata. + ``"posts+"`` | ``"legacy+"`` + Provides full metadata, + but requires an additional API request for each post. extractor.kemono.favorites diff --git a/gallery_dl/extractor/kemono.py b/gallery_dl/extractor/kemono.py index e76c94ce..7aedbff5 100644 --- a/gallery_dl/extractor/kemono.py +++ b/gallery_dl/extractor/kemono.py @@ -320,23 +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 + 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( - 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): @@ -591,6 +582,13 @@ class KemonoAPI(): params = {"o": offset, "tag": tags, "q": query} return self._pagination(endpoint, params, 50) + def creator_posts_expand(self, service, creator_id, + offset=0, query=None, tags=None): + 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" return self._call(endpoint)