From e92538624ea9ea00bfb9d853e7e5fdaffb0e327f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Sun, 10 Aug 2025 18:42:03 +0200 Subject: [PATCH] [civitai] add 'user-collections' extractor (#8005) --- docs/configuration.rst | 1 + docs/supportedsites.md | 2 +- gallery_dl/extractor/civitai.py | 29 +++++++++++++++++++++++++++++ scripts/supportedsites.py | 1 + test/results/civitai.py | 14 ++++++++++++++ 5 files changed, 46 insertions(+), 1 deletion(-) diff --git a/docs/configuration.rst b/docs/configuration.rst index 543a8a31..985696e9 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -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 diff --git a/docs/supportedsites.md b/docs/supportedsites.md index 8b2ee746..e4cde17d 100644 --- a/docs/supportedsites.md +++ b/docs/supportedsites.md @@ -190,7 +190,7 @@ Consider all listed sites to potentially be NSFW. Civitai https://www.civitai.com/ - 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 + 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 diff --git a/gallery_dl/extractor/civitai.py b/gallery_dl/extractor/civitai.py index 557993e9..fe3b7ed4 100644 --- a/gallery_dl/extractor/civitai.py +++ b/gallery_dl/extractor/civitai.py @@ -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} diff --git a/scripts/supportedsites.py b/scripts/supportedsites.py index b2c86856..a6010304 100755 --- a/scripts/supportedsites.py +++ b/scripts/supportedsites.py @@ -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": { diff --git a/test/results/civitai.py b/test/results/civitai.py index b4c31cdf..7397c92d 100644 --- a/test/results/civitai.py +++ b/test/results/civitai.py @@ -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", + ), +}, + )