[kemonoparty] add 'artists' extractor (#7582)

This commit is contained in:
Mike Fährmann
2025-05-26 11:17:50 +02:00
parent e469dc0da8
commit f1ab8c39fb
3 changed files with 90 additions and 2 deletions

View File

@@ -190,7 +190,7 @@ Consider all listed sites to potentially be NSFW.
<tr>
<td>Coomer</td>
<td>https://coomer.su/</td>
<td>Favorites, Posts, User Profiles</td>
<td>Artists, Favorites, Posts, User Profiles</td>
<td>Supported</td>
</tr>
<tr>
@@ -496,7 +496,7 @@ Consider all listed sites to potentially be NSFW.
<tr>
<td>Kemono</td>
<td>https://kemono.su/</td>
<td>Discord Servers, Favorites, Posts, User Profiles</td>
<td>Artists, Discord Servers, Favorites, Posts, User Profiles</td>
<td>Supported</td>
</tr>
<tr>

View File

@@ -528,6 +528,44 @@ class KemonopartyFavoriteExtractor(KemonopartyExtractor):
yield Message.Queue, url, post
class KemonopartyArtistsExtractor(KemonopartyExtractor):
"""Extractor for kemono artists"""
subcategory = "artists"
pattern = BASE_PATTERN + r"/artists(?:\?([^#]+))?"
example = "https://kemono.su/artists"
def items(self):
params = text.parse_query(self.groups[2])
users = self.api.creators()
if params.get("service"):
service = params["service"].lower()
users = [user for user in users
if user["service"] == service]
if params.get("q"):
q = params["q"].lower()
users = [user for user in users
if q in user["name"].lower()]
sort = params.get("sort_by") or "favorited"
order = params.get("order") or "desc"
users.sort(key=lambda user: user[sort] or util.NONE,
reverse=(order != "asc"))
for user in users:
service = user["service"]
if service == "discord":
user["_extractor"] = KemonopartyDiscordServerExtractor
url = "{}/discord/server/{}".format(
self.root, user["id"])
else:
user["_extractor"] = KemonopartyUserExtractor
url = "{}/{}/user/{}".format(
self.root, service, user["id"])
yield Message.Queue, url, user
class KemonoAPI():
"""Interface for the Kemono API v1.1.0
@@ -547,6 +585,10 @@ class KemonoAPI():
endpoint = "/file/" + file_hash
return self._call(endpoint)
def creators(self):
endpoint = "/creators.txt"
return self._call(endpoint)
def creator_posts(self, service, creator_id,
offset=0, query=None, tags=None):
endpoint = "/{}/user/{}".format(service, creator_id)

View File

@@ -680,4 +680,50 @@ __tests__ = (
"#class" : kemonoparty.KemonopartyFavoriteExtractor,
},
{
"#url" : "https://kemono.su/artists?q=aMSa",
"#category": ("", "kemonoparty", "artists"),
"#class" : kemonoparty.KemonopartyArtistsExtractor,
"#pattern" : kemonoparty.KemonopartyUserExtractor.pattern,
"#urls" : (
"https://kemono.su/patreon/user/91205314",
"https://kemono.su/patreon/user/51528107",
"https://kemono.su/fanbox/user/12812028",
"https://kemono.su/patreon/user/35237747",
"https://kemono.su/patreon/user/8296916",
"https://kemono.su/patreon/user/155095324",
"https://kemono.su/patreon/user/75988930",
"https://kemono.su/patreon/user/93703989",
"https://kemono.su/patreon/user/100292687",
"https://kemono.su/patreon/user/138609443",
"https://kemono.su/patreon/user/61646879",
"https://kemono.su/patreon/user/110669843",
"https://kemono.su/patreon/user/44343773",
"https://kemono.su/patreon/user/77920059",
"https://kemono.su/patreon/user/102386631",
),
"favorited": int,
"id" : str,
"indexed" : int,
"name" : str,
"service" : {"patreon", "fanbox"},
"updated" : int,
},
{
"#url" : "https://kemono.su/artists?q=Axe&service=discord&sort_by=name&order=asc",
"#category": ("", "kemonoparty", "artists"),
"#class" : kemonoparty.KemonopartyArtistsExtractor,
"#pattern" : kemonoparty.KemonopartyDiscordServerExtractor.pattern,
"#urls" : "https://kemono.su/discord/server/1168450323023663164",
"favorited": range(40, 80),
"id" : "1168450323023663164",
"indexed" : 1710201675,
"name" : "Axel Colored Workshop",
"service" : "discord",
"updated" : range(1740000000, 2000000000),
},
)