[civitai] implement extracting 'tags' metadata (#8626)

This commit is contained in:
Mike Fährmann
2025-11-29 17:51:02 +01:00
parent 5c7a27e003
commit 9bf52ab8c5
3 changed files with 41 additions and 7 deletions

View File

@@ -2090,12 +2090,18 @@ Type
Default Default
``false`` ``false``
Example Example
* ``"generation,post,version"`` * ``"generation,tags,post,version"``
* ``["version", "generation"]`` * ``["version", "generation"]``
Description Description
Extract additional ``generation``, ``version``, and ``post`` metadata. Extract additional metadata.
Supported Values
* ``generation``
* ``post``
* ``tags``
* ``version``
Note Note
This requires 1 or more additional API requests per image or video. This requires 1 additional API request
for each selected value per image or video.
extractor.civitai.nsfw extractor.civitai.nsfw

View File

@@ -61,13 +61,14 @@ class CivitaiExtractor(Extractor):
if isinstance(metadata, str): if isinstance(metadata, str):
metadata = metadata.split(",") metadata = metadata.split(",")
elif not isinstance(metadata, (list, tuple)): elif not isinstance(metadata, (list, tuple)):
metadata = ("generation", "version", "post") metadata = {"generation", "version", "post", "tags"}
self._meta_generation = ("generation" in metadata) self._meta_generation = ("generation" in metadata)
self._meta_version = ("version" in metadata) self._meta_version = ("version" in metadata)
self._meta_post = ("post" in metadata) self._meta_post = ("post" in metadata)
self._meta_tags = ("tags" in metadata)
else: else:
self._meta_generation = self._meta_version = self._meta_post = \ self._meta_generation = self._meta_version = self._meta_post = \
False self._meta_tags = False
def items(self): def items(self):
if models := self.models(): if models := self.models():
@@ -110,8 +111,9 @@ class CivitaiExtractor(Extractor):
} }
if self._meta_generation: if self._meta_generation:
data["generation"] = \ data["generation"] = self._extract_meta_generation(file)
self._extract_meta_generation(file) if self._meta_tags:
data["tags"] = self._extract_meta_tags(file)
if self._meta_version: if self._meta_version:
data["model"], data["version"] = \ data["model"], data["version"] = \
self._extract_meta_version(file, False) self._extract_meta_version(file, False)
@@ -181,6 +183,8 @@ class CivitaiExtractor(Extractor):
file["date"] = self.parse_datetime_iso(file["createdAt"]) file["date"] = self.parse_datetime_iso(file["createdAt"])
if self._meta_generation: if self._meta_generation:
file["generation"] = self._extract_meta_generation(file) file["generation"] = self._extract_meta_generation(file)
if self._meta_tags:
file["tags"] = self._extract_meta_tags(file)
yield data yield data
def _image_reactions(self): def _image_reactions(self):
@@ -218,6 +222,12 @@ class CivitaiExtractor(Extractor):
except Exception as exc: except Exception as exc:
return self.log.traceback(exc) return self.log.traceback(exc)
def _extract_meta_tags(self, image):
try:
return self.api.tag_getvotabletags(image["id"])
except Exception as exc:
return self.log.traceback(exc)
def _extract_meta_version(self, item, is_post=True): def _extract_meta_version(self, item, is_post=True):
try: try:
if version_id := self._extract_version_id(item, is_post): if version_id := self._extract_version_id(item, is_post):
@@ -821,6 +831,11 @@ class CivitaiTrpcAPI():
params = self._type_params(params) params = self._type_params(params)
return self._pagination(endpoint, params) return self._pagination(endpoint, params)
def tag_getvotabletags(self, image_id):
endpoint = "tag.getVotableTags"
params = {"id": int(image_id), "type": "image"}
return self._call(endpoint, params)
def user(self, username): def user(self, username):
endpoint = "user.getCreator" endpoint = "user.getCreator"
params = {"username": username} params = {"username": username}

View File

@@ -149,6 +149,19 @@ __tests__ = (
"tags": [], "tags": [],
"collectionId": None, "collectionId": None,
}, },
"tags[*]": {
"automated" : bool,
"concrete" : bool,
"downVotes" : int,
"id" : int,
"lastUpvote" : None,
"name" : str,
"needsReview": bool,
"nsfwLevel" : 1,
"score" : int,
"type" : {"Label", "UserGenerated"},
"upVotes" : int,
},
"model": { "model": {
"id": 703211, "id": 703211,
"name": "メイド クラシック/maid classic", "name": "メイド クラシック/maid classic",