Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -42,6 +42,21 @@ MODEL_MAPPING_VIDEO = {
|
|
| 42 |
|
| 43 |
SUPPORTED_CIVITAI_BASE_MODELS = list(MODEL_MAPPING_IMAGE.keys()) + list(MODEL_MAPPING_VIDEO.keys())
|
| 44 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 45 |
|
| 46 |
def get_json_data(url):
|
| 47 |
url_split = url.split('/')
|
|
@@ -112,9 +127,10 @@ def get_prompts_from_image(image_id_str: str):
|
|
| 112 |
prompt = ""
|
| 113 |
negative_prompt = ""
|
| 114 |
try:
|
| 115 |
-
response = requests.get(url, timeout=10) # Added timeout
|
| 116 |
response.raise_for_status() # Will raise an HTTPError if the HTTP request returned an unsuccessful status code
|
| 117 |
data = response.json()
|
|
|
|
| 118 |
# Expected structure: {'result': {'data': {'json': {'meta': {'prompt': '...', 'negativePrompt': '...'}}}}}
|
| 119 |
meta = data.get('result', {}).get('data', {}).get('json', {}).get('meta')
|
| 120 |
if meta: # meta can be None
|
|
@@ -150,7 +166,6 @@ def extract_info(json_data: Dict[str, Any], hunyuan_type: Optional[str] = None)
|
|
| 150 |
elif civitai_base_model_name in MODEL_MAPPING_IMAGE:
|
| 151 |
base_model_hf = MODEL_MAPPING_IMAGE[civitai_base_model_name]
|
| 152 |
else:
|
| 153 |
-
# Should not happen if SUPPORTED_CIVITAI_BASE_MODELS is derived correctly
|
| 154 |
print(f"Logic error: {civitai_base_model_name} in supported list but not mapped.")
|
| 155 |
continue
|
| 156 |
|
|
@@ -161,7 +176,6 @@ def extract_info(json_data: Dict[str, Any], hunyuan_type: Optional[str] = None)
|
|
| 161 |
break
|
| 162 |
|
| 163 |
if not primary_file_info:
|
| 164 |
-
# Sometimes primary might not be explicitly set, take first 'Model' type safetensors
|
| 165 |
for file_entry in model_version.get("files", []):
|
| 166 |
if file_entry.get("type") == "Model" and file_entry.get("name","").endswith(".safetensors"):
|
| 167 |
primary_file_info = file_entry
|
|
@@ -171,54 +185,43 @@ def extract_info(json_data: Dict[str, Any], hunyuan_type: Optional[str] = None)
|
|
| 171 |
print(f"No primary or suitable safetensors model file found for version {model_version.get('name')}")
|
| 172 |
continue
|
| 173 |
|
| 174 |
-
|
| 175 |
urls_to_download = [{"url": primary_file_info["downloadUrl"], "filename": primary_file_info["name"], "type": "weightName"}]
|
| 176 |
|
| 177 |
for image_obj in model_version.get("images", []):
|
| 178 |
-
# Skip if image/video itself is too NSFW for non-trusted, extract_info is called by check_civit_link too early for nsfw check
|
| 179 |
-
# The main nsfw check will handle this before download. Here we just gather info.
|
| 180 |
-
# if image_obj.get("nsfwLevel", 0) > 5: # This check belongs in check_nsfw for non-trusted.
|
| 181 |
-
# continue
|
| 182 |
-
|
| 183 |
image_url = image_obj.get("url")
|
| 184 |
if not image_url:
|
| 185 |
continue
|
| 186 |
|
| 187 |
-
|
| 188 |
-
# Example URLs:
|
| 189 |
-
# https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/.../12345.jpeg (where 12345 is the id)
|
| 190 |
-
# https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/.../width=1024/12345.jpeg
|
| 191 |
-
# https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/.../12345.mp4
|
| 192 |
-
filename_part = os.path.basename(image_url) # e.g., 12345.jpeg or 12345.mp4
|
| 193 |
image_id_str = filename_part.split('.')[0]
|
| 194 |
|
| 195 |
prompt, negative_prompt = "", ""
|
| 196 |
-
if image_obj.get("hasMeta", False)
|
| 197 |
prompt, negative_prompt = get_prompts_from_image(image_id_str)
|
| 198 |
|
| 199 |
urls_to_download.append({
|
| 200 |
"url": image_url,
|
| 201 |
-
"filename": filename_part,
|
| 202 |
-
"type": "imageName",
|
| 203 |
"prompt": prompt,
|
| 204 |
"negative_prompt": negative_prompt,
|
| 205 |
-
"media_type": image_obj.get("type", "image")
|
| 206 |
})
|
| 207 |
|
| 208 |
info = {
|
| 209 |
"urls_to_download": urls_to_download,
|
| 210 |
"id": model_version["id"],
|
| 211 |
-
"baseModel": base_model_hf,
|
| 212 |
-
"civitai_base_model_name": civitai_base_model_name,
|
| 213 |
"is_video_model": is_video,
|
| 214 |
-
"modelId": json_data.get("id", ""),
|
| 215 |
"name": json_data["name"],
|
| 216 |
-
"description": json_data.get("description", ""),
|
| 217 |
"trainedWords": model_version.get("trainedWords", []),
|
| 218 |
"creator": json_data.get("creator", {}).get("username", "Unknown"),
|
| 219 |
"tags": json_data.get("tags", []),
|
| 220 |
"allowNoCredit": json_data.get("allowNoCredit", True),
|
| 221 |
-
"allowCommercialUse": json_data.get("allowCommercialUse", "Sell"),
|
| 222 |
"allowDerivatives": json_data.get("allowDerivatives", True),
|
| 223 |
"allowDifferentLicense": json_data.get("allowDifferentLicense", True)
|
| 224 |
}
|
|
@@ -507,21 +510,6 @@ def get_creator(username):
|
|
| 507 |
return None # Cannot proceed without cookie for this specific call
|
| 508 |
|
| 509 |
url = f"https://civitai.com/api/trpc/user.getCreator?input=%7B%22json%22%3A%7B%22username%22%3A%22{username}%22%2C%22authed%22%3Atrue%7D%7D"
|
| 510 |
-
headers = {
|
| 511 |
-
"authority": "civitai.com",
|
| 512 |
-
"accept": "*/*",
|
| 513 |
-
"accept-language": "en-US,en;q=0.9", # Simplified
|
| 514 |
-
"content-type": "application/json",
|
| 515 |
-
"cookie": cookie_info, # Use the env var
|
| 516 |
-
"referer": f"https://civitai.com/user/{username}/models",
|
| 517 |
-
"sec-ch-ua": "\"Chromium\";v=\"118\", \"Not_A Brand\";v=\"99\"", # Example, update if needed
|
| 518 |
-
"sec-ch-ua-mobile": "?0",
|
| 519 |
-
"sec-ch-ua-platform": "\"Windows\"", # Example
|
| 520 |
-
"sec-fetch-dest": "empty",
|
| 521 |
-
"sec-fetch-mode": "cors",
|
| 522 |
-
"sec-fetch-site": "same-origin",
|
| 523 |
-
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" # Example
|
| 524 |
-
}
|
| 525 |
try:
|
| 526 |
response = requests.get(url, headers=headers, timeout=10)
|
| 527 |
response.raise_for_status()
|
|
|
|
| 42 |
|
| 43 |
SUPPORTED_CIVITAI_BASE_MODELS = list(MODEL_MAPPING_IMAGE.keys()) + list(MODEL_MAPPING_VIDEO.keys())
|
| 44 |
|
| 45 |
+
headers = {
|
| 46 |
+
"authority": "civitai.com",
|
| 47 |
+
"accept": "*/*",
|
| 48 |
+
"accept-language": "en-US,en;q=0.9", # Simplified
|
| 49 |
+
"content-type": "application/json",
|
| 50 |
+
"cookie": cookie_info, # Use the env var
|
| 51 |
+
"referer": f"https://civitai.com/user/{username}/models",
|
| 52 |
+
"sec-ch-ua": "\"Chromium\";v=\"118\", \"Not_A Brand\";v=\"99\"", # Example, update if needed
|
| 53 |
+
"sec-ch-ua-mobile": "?0",
|
| 54 |
+
"sec-ch-ua-platform": "\"Windows\"", # Example
|
| 55 |
+
"sec-fetch-dest": "empty",
|
| 56 |
+
"sec-fetch-mode": "cors",
|
| 57 |
+
"sec-fetch-site": "same-origin",
|
| 58 |
+
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" # Example
|
| 59 |
+
}
|
| 60 |
|
| 61 |
def get_json_data(url):
|
| 62 |
url_split = url.split('/')
|
|
|
|
| 127 |
prompt = ""
|
| 128 |
negative_prompt = ""
|
| 129 |
try:
|
| 130 |
+
response = requests.get(url, headers=headers, timeout=10) # Added timeout
|
| 131 |
response.raise_for_status() # Will raise an HTTPError if the HTTP request returned an unsuccessful status code
|
| 132 |
data = response.json()
|
| 133 |
+
print("Response from image: ", data)
|
| 134 |
# Expected structure: {'result': {'data': {'json': {'meta': {'prompt': '...', 'negativePrompt': '...'}}}}}
|
| 135 |
meta = data.get('result', {}).get('data', {}).get('json', {}).get('meta')
|
| 136 |
if meta: # meta can be None
|
|
|
|
| 166 |
elif civitai_base_model_name in MODEL_MAPPING_IMAGE:
|
| 167 |
base_model_hf = MODEL_MAPPING_IMAGE[civitai_base_model_name]
|
| 168 |
else:
|
|
|
|
| 169 |
print(f"Logic error: {civitai_base_model_name} in supported list but not mapped.")
|
| 170 |
continue
|
| 171 |
|
|
|
|
| 176 |
break
|
| 177 |
|
| 178 |
if not primary_file_info:
|
|
|
|
| 179 |
for file_entry in model_version.get("files", []):
|
| 180 |
if file_entry.get("type") == "Model" and file_entry.get("name","").endswith(".safetensors"):
|
| 181 |
primary_file_info = file_entry
|
|
|
|
| 185 |
print(f"No primary or suitable safetensors model file found for version {model_version.get('name')}")
|
| 186 |
continue
|
| 187 |
|
|
|
|
| 188 |
urls_to_download = [{"url": primary_file_info["downloadUrl"], "filename": primary_file_info["name"], "type": "weightName"}]
|
| 189 |
|
| 190 |
for image_obj in model_version.get("images", []):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 191 |
image_url = image_obj.get("url")
|
| 192 |
if not image_url:
|
| 193 |
continue
|
| 194 |
|
| 195 |
+
filename_part = os.path.basename(image_url)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 196 |
image_id_str = filename_part.split('.')[0]
|
| 197 |
|
| 198 |
prompt, negative_prompt = "", ""
|
| 199 |
+
if image_obj.get("hasMeta", False):
|
| 200 |
prompt, negative_prompt = get_prompts_from_image(image_id_str)
|
| 201 |
|
| 202 |
urls_to_download.append({
|
| 203 |
"url": image_url,
|
| 204 |
+
"filename": filename_part,
|
| 205 |
+
"type": "imageName",
|
| 206 |
"prompt": prompt,
|
| 207 |
"negative_prompt": negative_prompt,
|
| 208 |
+
"media_type": image_obj.get("type", "image")
|
| 209 |
})
|
| 210 |
|
| 211 |
info = {
|
| 212 |
"urls_to_download": urls_to_download,
|
| 213 |
"id": model_version["id"],
|
| 214 |
+
"baseModel": base_model_hf,
|
| 215 |
+
"civitai_base_model_name": civitai_base_model_name,
|
| 216 |
"is_video_model": is_video,
|
| 217 |
+
"modelId": json_data.get("id", ""),
|
| 218 |
"name": json_data["name"],
|
| 219 |
+
"description": json_data.get("description", ""),
|
| 220 |
"trainedWords": model_version.get("trainedWords", []),
|
| 221 |
"creator": json_data.get("creator", {}).get("username", "Unknown"),
|
| 222 |
"tags": json_data.get("tags", []),
|
| 223 |
"allowNoCredit": json_data.get("allowNoCredit", True),
|
| 224 |
+
"allowCommercialUse": json_data.get("allowCommercialUse", "Sell"),
|
| 225 |
"allowDerivatives": json_data.get("allowDerivatives", True),
|
| 226 |
"allowDifferentLicense": json_data.get("allowDifferentLicense", True)
|
| 227 |
}
|
|
|
|
| 510 |
return None # Cannot proceed without cookie for this specific call
|
| 511 |
|
| 512 |
url = f"https://civitai.com/api/trpc/user.getCreator?input=%7B%22json%22%3A%7B%22username%22%3A%22{username}%22%2C%22authed%22%3Atrue%7D%7D"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 513 |
try:
|
| 514 |
response = requests.get(url, headers=headers, timeout=10)
|
| 515 |
response.raise_for_status()
|