[kemono] support '"endpoint": "posts+"' for full metadata (#8028)

alias for "legacy+"
This commit is contained in:
Mike Fährmann
2025-08-14 12:13:12 +02:00
parent ca3331d19f
commit 42582af4f1
2 changed files with 15 additions and 28 deletions

View File

@@ -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 <https://kemono.su/documentation/api#operations-default-get_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 <https://kemono.su/documentation/api#operations-default-get_v1__service__user__creator_id__posts_legacy>`__
to retrieve post IDs
| and one request to
`/v1/{service}/user/{creator_id}/post/{post_id} <https://kemono.su/documentation/api#operations-Posts-get_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} <https://kemono.su/documentation/api#operations-Posts-get_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

View File

@@ -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)