[civitai] add 'user-collections' extractor (#8005)

This commit is contained in:
Mike Fährmann
2025-08-10 18:42:03 +02:00
parent 2b03843092
commit e92538624e
5 changed files with 46 additions and 1 deletions

View File

@@ -1888,6 +1888,7 @@ Description
* ``"user-posts"``
* ``"user-images"``
* ``"user-videos"``
* ``"user-collections"``
It is possible to use ``"all"`` instead of listing all values separately.
Note

View File

@@ -190,7 +190,7 @@ Consider all listed sites to potentially be NSFW.
<tr>
<td>Civitai</td>
<td>https://www.civitai.com/</td>
<td>Collections, Generated Files, individual Images, Image Listings, Models, Model Listings, Posts, Post Listings, Image Searches, Model Searches, Tag Searches, User Profiles, User Images, Image Reactions, User Models, User Posts, User Videos, Video Reactions</td>
<td>Collections, Generated Files, individual Images, Image Listings, Models, Model Listings, Posts, Post Listings, Image Searches, Model Searches, Tag Searches, User Profiles, User Collections, User Images, Image Reactions, User Models, User Posts, User Videos, Video Reactions</td>
<td></td>
</tr>
<tr>

View File

@@ -483,6 +483,7 @@ class CivitaiUserExtractor(Dispatch, CivitaiExtractor):
(CivitaiUserPostsExtractor , base + "posts"),
(CivitaiUserImagesExtractor, base + "images"),
(CivitaiUserVideosExtractor, base + "videos"),
(CivitaiUserCollectionsExtractor, base + "collections"),
), ("user-images", "user-videos"))
@@ -551,6 +552,22 @@ class CivitaiUserVideosExtractor(CivitaiExtractor):
images = CivitaiUserImagesExtractor.images
class CivitaiUserCollectionsExtractor(CivitaiExtractor):
subcategory = "user-collections"
pattern = USER_PATTERN + r"/collections/?(?:\?([^#]+))?"
example = "https://civitai.com/user/USER/collections"
def items(self):
user, query = self.groups
params = self._parse_query(query)
params["userId"] = self.api.user(text.unquote(user))[0]["id"]
base = f"{self.root}/collections/"
for collection in self.api.collections(params):
collection["_extractor"] = CivitaiCollectionExtractor
yield Message.Queue, f"{base}{collection['id']}", collection
class CivitaiGeneratedExtractor(CivitaiExtractor):
"""Extractor for your generated files feed"""
subcategory = "generated"
@@ -785,6 +802,18 @@ class CivitaiTrpcAPI():
params = {"id": int(collection_id)}
return self._call(endpoint, params)["collection"]
def collections(self, params, defaults=True):
endpoint = "collection.getInfinite"
if defaults:
params = self._merge_params(params, {
"browsingLevel": self.nsfw,
"sort" : "Newest",
})
params = self._type_params(params)
return self._pagination(endpoint, params)
def user(self, username):
endpoint = "user.getCreator"
params = {"username": username}

View File

@@ -240,6 +240,7 @@ SUBCATEGORY_MAP = {
"user-images": ("User Images", "Image Reactions"),
"user-posts" : "User Posts",
"user-videos": ("User Videos", "Video Reactions"),
"user-collections" : "User Collections",
"generated": "Generated Files",
},
"coomer": {

View File

@@ -660,4 +660,18 @@ __tests__ = (
},
},
{
"#url" : "https://civitai.com/user/SakuraCherryBlossoms/collections",
"#class" : civitai.CivitaiUserCollectionsExtractor,
"#results" : (
"https://civitai.com/collections/11462456",
"https://civitai.com/collections/11453431",
"https://civitai.com/collections/11453135",
"https://civitai.com/collections/11407164",
"https://civitai.com/collections/11405046",
"https://civitai.com/collections/11395523",
"https://civitai.com/collections/11395467",
),
},
)