@@ -25,13 +25,15 @@ def __init__(self, config_file="config.json"):
2525 # 添加并发限制和超时设置
2626 self .semaphore = asyncio .Semaphore (5 ) # 限制并发请求数
2727 self .timeout = ClientTimeout (total = 10 ) # 10秒超时
28+ # 添加自定义NSFW模型ID列表
29+ self .custom_nsfw_models = self .config .get ("custom_nsfw_models" , [])
2830
2931 def load_config (self ) -> dict :
3032 """加载配置文件"""
3133 if os .path .exists (self .config_file ):
3234 with open (self .config_file , "r" , encoding = "utf-8" ) as f :
3335 return json .load (f )
34- return {"models_path" : "" , "output_file" : "models_info.json" }
36+ return {"models_path" : "" , "output_file" : "models_info.json" , "custom_nsfw_models" : [] }
3537
3638 def save_config (self ):
3739 """保存配置文件"""
@@ -212,7 +214,9 @@ def get_model_display_info(self, model_path: str) -> dict:
212214 "preview_url" : None ,
213215 "description" : "未找到模型信息" ,
214216 "baseModel" : "未知" ,
215- "nsfw" : False ,
217+ "nsfw" : str (model_path ) in self .custom_nsfw_models , # 检查是否在自定义NSFW列表中
218+ "custom_nsfw" : str (model_path ) in self .custom_nsfw_models , # 新增自定义NSFW标记
219+ "original_nsfw" : False , # 新增原始NSFW标记
216220 "nsfwLevel" : 0 ,
217221 }
218222
@@ -224,13 +228,19 @@ def get_model_display_info(self, model_path: str) -> dict:
224228 # 添加本地图片路径
225229 local_preview = info .get ("local_preview" )
226230
231+ # 如果在自定义NSFW列表中,覆盖API返回的nsfw值
232+ is_custom_nsfw = str (model_path ) in self .custom_nsfw_models
233+ is_original_nsfw = model_data .get ("nsfw" , False )
234+
227235 return {
228236 "name" : model_data .get ("name" , Path (model_path ).name ),
229237 "type" : model_data .get ("type" , "未知" ),
230238 "preview_url" : local_preview or preview_url ,
231239 "baseModel" : info .get ("baseModel" , "未知" ),
232- "url" : f"https://civitai.com/models/{ info ['modelId' ]} ?modelVersionId={ info ['id' ]} " ,
233- "nsfw" : model_data .get ("nsfw" , False ),
240+ "url" : f"https://civitai.com/models/{ info ['modelId' ]} ?modelVersionId={ info ['id' ]} " if 'modelId' in info and 'id' in info else None ,
241+ "nsfw" : is_custom_nsfw or is_original_nsfw , # 自定义NSFW或API返回的NSFW
242+ "custom_nsfw" : is_custom_nsfw , # 新增自定义NSFW标记
243+ "original_nsfw" : is_original_nsfw , # 新增原始NSFW标记
234244 "nsfwLevel" : preview_image .get ("nsfwLevel" , 0 ),
235245 }
236246
@@ -244,4 +254,41 @@ def get_all_models_info(self) -> list:
244254 }
245255 for model_path in self .models_info .keys ()
246256 if str (model_path ).startswith (current_path )
247- ]
257+ ]
258+
259+ def toggle_custom_nsfw (self , model_path : str ) -> bool :
260+ """切换模型的自定义NSFW状态
261+
262+ Args:
263+ model_path: 模型路径
264+
265+ Returns:
266+ bool: 更新后的NSFW状态
267+ """
268+ model_path = str (model_path ) # 确保为字符串
269+
270+ # 检查是否为原始NSFW模型
271+ model_info = self .models_info .get (model_path , {})
272+ if model_info :
273+ info = model_info .get ("info" , {})
274+ model_data = info .get ("model" , {})
275+ is_original_nsfw = model_data .get ("nsfw" , False )
276+
277+ # 如果是原始NSFW模型,不允许更改
278+ if is_original_nsfw :
279+ return True # 保持NSFW状态
280+
281+ if model_path in self .custom_nsfw_models :
282+ # 如果模型已在自定义NSFW列表中,则移除
283+ self .custom_nsfw_models .remove (model_path )
284+ current_state = False
285+ else :
286+ # 否则添加到列表中
287+ self .custom_nsfw_models .append (model_path )
288+ current_state = True
289+
290+ # 更新配置并保存
291+ self .config ["custom_nsfw_models" ] = self .custom_nsfw_models
292+ self .save_config ()
293+
294+ return current_state
0 commit comments