Spaces:
Running
Running
Commit
·
f7d53f5
1
Parent(s):
55c5937
init
Browse files
app.py
CHANGED
|
@@ -10,7 +10,7 @@ from nfsw import NSFWDetector
|
|
| 10 |
# Configuration parameters
|
| 11 |
|
| 12 |
TIP_TRY_N = 4 # Show like button tip after 12 tries
|
| 13 |
-
FREE_TRY_N =
|
| 14 |
SLOW_TRY_N = 15 # Slow phase start: 25 tries
|
| 15 |
SLOW2_TRY_N = 20 # Slow phase start: 32 tries
|
| 16 |
RATE_LIMIT_60 = 25 # Full restriction: blocked after 40 tries
|
|
@@ -450,7 +450,7 @@ def edit_image_interface(input_image, prompt, request: gr.Request, progress=gr.P
|
|
| 450 |
print(f"✅ Processing started - IP: {client_ip}, phase: {current_phase}, total count: {updated_count}, prompt: {prompt.strip()}", flush=True)
|
| 451 |
|
| 452 |
# Call image editing processing function
|
| 453 |
-
result_url, message, task_uuid = process_image_edit(input_image, prompt.strip(), None, progress_callback)
|
| 454 |
|
| 455 |
if result_url:
|
| 456 |
print(f"✅ Processing completed successfully - IP: {client_ip}, result_url: {result_url}, task_uuid: {task_uuid}", flush=True)
|
|
@@ -532,8 +532,11 @@ def edit_image_interface(input_image, prompt, request: gr.Request, progress=gr.P
|
|
| 532 |
action_buttons_html = ""
|
| 533 |
if task_uuid:
|
| 534 |
task_detail_url = f"https://omnicreator.net/my-creations/task/{task_uuid}"
|
| 535 |
-
# Create image-to-video URL with
|
| 536 |
-
|
|
|
|
|
|
|
|
|
|
| 537 |
action_buttons_html = f"""
|
| 538 |
<div style='display: flex; justify-content: center; gap: 15px; margin: 10px 0 5px 0; padding: 0px;'>
|
| 539 |
<a href='{task_detail_url}' target='_blank' style='
|
|
@@ -809,10 +812,10 @@ def local_edit_interface(image_dict, prompt, reference_image, request: gr.Reques
|
|
| 809 |
# Call local image editing processing function
|
| 810 |
if is_example_case:
|
| 811 |
# For example case, pass special flag to use local mask file
|
| 812 |
-
result_url, message, task_uuid = process_local_image_edit(base_image, layers, clean_prompt, reference_image, progress_callback, use_example_mask="datas/panda01m.jpeg")
|
| 813 |
else:
|
| 814 |
# Normal case
|
| 815 |
-
result_url, message, task_uuid = process_local_image_edit(base_image, layers, clean_prompt, reference_image, progress_callback)
|
| 816 |
|
| 817 |
if result_url:
|
| 818 |
print(f"✅ Local editing completed successfully - IP: {client_ip}, result_url: {result_url}, task_uuid: {task_uuid}", flush=True)
|
|
@@ -894,8 +897,11 @@ def local_edit_interface(image_dict, prompt, reference_image, request: gr.Reques
|
|
| 894 |
action_buttons_html = ""
|
| 895 |
if task_uuid:
|
| 896 |
task_detail_url = f"https://omnicreator.net/my-creations/task/{task_uuid}"
|
| 897 |
-
# Create image-to-video URL with
|
| 898 |
-
|
|
|
|
|
|
|
|
|
|
| 899 |
action_buttons_html = f"""
|
| 900 |
<div style='display: flex; justify-content: center; gap: 15px; margin: 10px 0 5px 0; padding: 0px;'>
|
| 901 |
<a href='{task_detail_url}' target='_blank' style='
|
|
|
|
| 10 |
# Configuration parameters
|
| 11 |
|
| 12 |
TIP_TRY_N = 4 # Show like button tip after 12 tries
|
| 13 |
+
FREE_TRY_N = 8 # Free phase: first 15 tries without restrictions
|
| 14 |
SLOW_TRY_N = 15 # Slow phase start: 25 tries
|
| 15 |
SLOW2_TRY_N = 20 # Slow phase start: 32 tries
|
| 16 |
RATE_LIMIT_60 = 25 # Full restriction: blocked after 40 tries
|
|
|
|
| 450 |
print(f"✅ Processing started - IP: {client_ip}, phase: {current_phase}, total count: {updated_count}, prompt: {prompt.strip()}", flush=True)
|
| 451 |
|
| 452 |
# Call image editing processing function
|
| 453 |
+
input_image_url, result_url, message, task_uuid = process_image_edit(input_image, prompt.strip(), None, progress_callback)
|
| 454 |
|
| 455 |
if result_url:
|
| 456 |
print(f"✅ Processing completed successfully - IP: {client_ip}, result_url: {result_url}, task_uuid: {task_uuid}", flush=True)
|
|
|
|
| 532 |
action_buttons_html = ""
|
| 533 |
if task_uuid:
|
| 534 |
task_detail_url = f"https://omnicreator.net/my-creations/task/{task_uuid}"
|
| 535 |
+
# Create image-to-video URL with input image, end image, and prompt
|
| 536 |
+
from urllib.parse import quote
|
| 537 |
+
# Use result URL as end_image, original upload URL as input_image
|
| 538 |
+
encoded_prompt = quote(prompt.strip())
|
| 539 |
+
image_to_video_url = f"https://omnicreator.net/image-to-video?input_image={input_image_url}&end_image={result_url}&prompt={encoded_prompt}"
|
| 540 |
action_buttons_html = f"""
|
| 541 |
<div style='display: flex; justify-content: center; gap: 15px; margin: 10px 0 5px 0; padding: 0px;'>
|
| 542 |
<a href='{task_detail_url}' target='_blank' style='
|
|
|
|
| 812 |
# Call local image editing processing function
|
| 813 |
if is_example_case:
|
| 814 |
# For example case, pass special flag to use local mask file
|
| 815 |
+
input_image_url, result_url, message, task_uuid = process_local_image_edit(base_image, layers, clean_prompt, reference_image, progress_callback, use_example_mask="datas/panda01m.jpeg")
|
| 816 |
else:
|
| 817 |
# Normal case
|
| 818 |
+
input_image_url, result_url, message, task_uuid = process_local_image_edit(base_image, layers, clean_prompt, reference_image, progress_callback)
|
| 819 |
|
| 820 |
if result_url:
|
| 821 |
print(f"✅ Local editing completed successfully - IP: {client_ip}, result_url: {result_url}, task_uuid: {task_uuid}", flush=True)
|
|
|
|
| 897 |
action_buttons_html = ""
|
| 898 |
if task_uuid:
|
| 899 |
task_detail_url = f"https://omnicreator.net/my-creations/task/{task_uuid}"
|
| 900 |
+
# Create image-to-video URL with input image, end image, and prompt
|
| 901 |
+
from urllib.parse import quote
|
| 902 |
+
# Use result URL as end_image, original upload URL as input_image
|
| 903 |
+
encoded_prompt = quote(clean_prompt)
|
| 904 |
+
image_to_video_url = f"https://omnicreator.net/image-to-video?input_image={input_image_url}&end_image={result_url}&prompt={encoded_prompt}"
|
| 905 |
action_buttons_html = f"""
|
| 906 |
<div style='display: flex; justify-content: center; gap: 15px; margin: 10px 0 5px 0; padding: 0px;'>
|
| 907 |
<a href='{task_detail_url}' target='_blank' style='
|
util.py
CHANGED
|
@@ -418,7 +418,7 @@ def process_image_edit(img_input, prompt, reference_image=None, progress_callbac
|
|
| 418 |
# Upload user image directly from memory
|
| 419 |
uploaded_url = upload_user_img_r2(client_ip, time_id, pil_image)
|
| 420 |
if not uploaded_url:
|
| 421 |
-
return None, "image upload failed", None
|
| 422 |
|
| 423 |
# Extract actual image URL from upload URL
|
| 424 |
if "?" in uploaded_url:
|
|
@@ -440,17 +440,17 @@ def process_image_edit(img_input, prompt, reference_image=None, progress_callbac
|
|
| 440 |
|
| 441 |
reference_url = upload_user_img_r2(client_ip, time_id, reference_pil)
|
| 442 |
if not reference_url:
|
| 443 |
-
return None, "reference image upload failed", None
|
| 444 |
|
| 445 |
if "?" in reference_url:
|
| 446 |
reference_url = reference_url.split("?")[0]
|
| 447 |
except Exception as e:
|
| 448 |
-
return None, f"reference image processing failed: {str(e)}", None
|
| 449 |
|
| 450 |
# Submit image editing task
|
| 451 |
task_id, error = submit_image_edit_task(uploaded_url, prompt, reference_image_url=reference_url)
|
| 452 |
if error:
|
| 453 |
-
return None, error, None
|
| 454 |
|
| 455 |
if progress_callback:
|
| 456 |
progress_callback(f"task submitted, ID: {task_id}, processing...")
|
|
@@ -467,11 +467,11 @@ def process_image_edit(img_input, prompt, reference_image=None, progress_callbac
|
|
| 467 |
|
| 468 |
if status == 'completed':
|
| 469 |
if output_url:
|
| 470 |
-
return output_url, "image edit completed", task_uuid
|
| 471 |
else:
|
| 472 |
-
return None, "Task completed but no result image returned", task_uuid
|
| 473 |
elif status == 'error' or status == 'failed':
|
| 474 |
-
return None, f"task processing failed: {task_data}", task_uuid
|
| 475 |
elif status in ['queued', 'processing', 'running', 'created', 'working']:
|
| 476 |
# Enhanced progress message with queue info and website promotion
|
| 477 |
if progress_callback and task_data and isinstance(task_data, dict):
|
|
@@ -498,10 +498,10 @@ def process_image_edit(img_input, prompt, reference_image=None, progress_callbac
|
|
| 498 |
progress_callback(f"unknown status: {status}")
|
| 499 |
time.sleep(1)
|
| 500 |
|
| 501 |
-
return None, "task processing timeout", task_uuid
|
| 502 |
|
| 503 |
except Exception as e:
|
| 504 |
-
return None, f"error occurred during processing: {str(e)}", None
|
| 505 |
|
| 506 |
|
| 507 |
def process_local_image_edit(base_image, layers, prompt, reference_image=None, progress_callback=None, use_example_mask=None):
|
|
@@ -531,7 +531,7 @@ def process_local_image_edit(base_image, layers, prompt, reference_image=None, p
|
|
| 531 |
|
| 532 |
# Check if base_image is valid
|
| 533 |
if base_image is None:
|
| 534 |
-
return None, "Base image is None, cannot process example mask", None
|
| 535 |
|
| 536 |
if os.path.exists(use_example_mask):
|
| 537 |
mask_image = Image.open(use_example_mask)
|
|
@@ -546,11 +546,11 @@ def process_local_image_edit(base_image, layers, prompt, reference_image=None, p
|
|
| 546 |
|
| 547 |
print(f"🎭 Using example mask from: {use_example_mask}, size: {mask_image.size}")
|
| 548 |
else:
|
| 549 |
-
return None, f"Example mask file not found: {use_example_mask}", None
|
| 550 |
except Exception as e:
|
| 551 |
import traceback
|
| 552 |
traceback.print_exc()
|
| 553 |
-
return None, f"Failed to load example mask: {str(e)}", None
|
| 554 |
else:
|
| 555 |
# Normal case: create mask from layers
|
| 556 |
mask_image = create_mask_from_layers(base_image, layers)
|
|
@@ -558,7 +558,7 @@ def process_local_image_edit(base_image, layers, prompt, reference_image=None, p
|
|
| 558 |
# 检查mask是否有内容
|
| 559 |
mask_array = np.array(mask_image)
|
| 560 |
if np.max(mask_array) == 0:
|
| 561 |
-
return None, "please draw mask", None
|
| 562 |
|
| 563 |
# Print mask statistics
|
| 564 |
if not use_example_mask:
|
|
@@ -573,7 +573,7 @@ def process_local_image_edit(base_image, layers, prompt, reference_image=None, p
|
|
| 573 |
# 直接从内存上传原始图片
|
| 574 |
uploaded_url = upload_user_img_r2(client_ip, time_id, base_image)
|
| 575 |
if not uploaded_url:
|
| 576 |
-
return None, "original image upload failed", None
|
| 577 |
|
| 578 |
# 从上传 URL 中提取实际的图片 URL
|
| 579 |
if "?" in uploaded_url:
|
|
@@ -585,7 +585,7 @@ def process_local_image_edit(base_image, layers, prompt, reference_image=None, p
|
|
| 585 |
# 直接从内存上传mask图片
|
| 586 |
mask_url = upload_mask_image_r2(client_ip, time_id, mask_image)
|
| 587 |
if not mask_url:
|
| 588 |
-
return None, "mask image upload failed", None
|
| 589 |
|
| 590 |
# 从上传 URL 中提取实际的图片 URL
|
| 591 |
if "?" in mask_url:
|
|
@@ -604,12 +604,12 @@ def process_local_image_edit(base_image, layers, prompt, reference_image=None, p
|
|
| 604 |
|
| 605 |
reference_url = upload_user_img_r2(client_ip, time_id, reference_pil)
|
| 606 |
if not reference_url:
|
| 607 |
-
return None, "reference image upload failed", None
|
| 608 |
|
| 609 |
if "?" in reference_url:
|
| 610 |
reference_url = reference_url.split("?")[0]
|
| 611 |
except Exception as e:
|
| 612 |
-
return None, f"reference image processing failed: {str(e)}", None
|
| 613 |
|
| 614 |
print(f"📤 图片上传成功:")
|
| 615 |
print(f" 原始图片: {uploaded_url}")
|
|
@@ -629,7 +629,7 @@ def process_local_image_edit(base_image, layers, prompt, reference_image=None, p
|
|
| 629 |
reference_image_url=reference_url
|
| 630 |
)
|
| 631 |
if error:
|
| 632 |
-
return None, error, None
|
| 633 |
|
| 634 |
if progress_callback:
|
| 635 |
progress_callback(f"task submitted, ID: {task_id}, processing...")
|
|
@@ -649,11 +649,11 @@ def process_local_image_edit(base_image, layers, prompt, reference_image=None, p
|
|
| 649 |
if status == 'completed':
|
| 650 |
if output_url:
|
| 651 |
print(f"✅ 局部编辑任务完成,结果: {output_url}")
|
| 652 |
-
return output_url, "local image edit completed", task_uuid
|
| 653 |
else:
|
| 654 |
-
return None, "task completed but no result image returned", task_uuid
|
| 655 |
elif status == 'error' or status == 'failed':
|
| 656 |
-
return None, f"task processing failed: {task_data}", task_uuid
|
| 657 |
elif status in ['queued', 'processing', 'running', 'created', 'working']:
|
| 658 |
# Enhanced progress message with queue info and website promotion
|
| 659 |
if progress_callback and task_data and isinstance(task_data, dict):
|
|
@@ -680,11 +680,11 @@ def process_local_image_edit(base_image, layers, prompt, reference_image=None, p
|
|
| 680 |
progress_callback(f"unknown status: {status}")
|
| 681 |
time.sleep(1)
|
| 682 |
|
| 683 |
-
return None, "task processing timeout", task_uuid
|
| 684 |
|
| 685 |
except Exception as e:
|
| 686 |
print(f"❌ 局部编辑处理异常: {str(e)}")
|
| 687 |
-
return None, f"error occurred during processing: {str(e)}", None
|
| 688 |
|
| 689 |
|
| 690 |
def download_and_check_result_nsfw(image_url, nsfw_detector=None):
|
|
|
|
| 418 |
# Upload user image directly from memory
|
| 419 |
uploaded_url = upload_user_img_r2(client_ip, time_id, pil_image)
|
| 420 |
if not uploaded_url:
|
| 421 |
+
return None, None, "image upload failed", None
|
| 422 |
|
| 423 |
# Extract actual image URL from upload URL
|
| 424 |
if "?" in uploaded_url:
|
|
|
|
| 440 |
|
| 441 |
reference_url = upload_user_img_r2(client_ip, time_id, reference_pil)
|
| 442 |
if not reference_url:
|
| 443 |
+
return None, None, "reference image upload failed", None
|
| 444 |
|
| 445 |
if "?" in reference_url:
|
| 446 |
reference_url = reference_url.split("?")[0]
|
| 447 |
except Exception as e:
|
| 448 |
+
return None, None, f"reference image processing failed: {str(e)}", None
|
| 449 |
|
| 450 |
# Submit image editing task
|
| 451 |
task_id, error = submit_image_edit_task(uploaded_url, prompt, reference_image_url=reference_url)
|
| 452 |
if error:
|
| 453 |
+
return None, None, error, None
|
| 454 |
|
| 455 |
if progress_callback:
|
| 456 |
progress_callback(f"task submitted, ID: {task_id}, processing...")
|
|
|
|
| 467 |
|
| 468 |
if status == 'completed':
|
| 469 |
if output_url:
|
| 470 |
+
return uploaded_url, output_url, "image edit completed", task_uuid
|
| 471 |
else:
|
| 472 |
+
return None, None, "Task completed but no result image returned", task_uuid
|
| 473 |
elif status == 'error' or status == 'failed':
|
| 474 |
+
return None, None, f"task processing failed: {task_data}", task_uuid
|
| 475 |
elif status in ['queued', 'processing', 'running', 'created', 'working']:
|
| 476 |
# Enhanced progress message with queue info and website promotion
|
| 477 |
if progress_callback and task_data and isinstance(task_data, dict):
|
|
|
|
| 498 |
progress_callback(f"unknown status: {status}")
|
| 499 |
time.sleep(1)
|
| 500 |
|
| 501 |
+
return None, None, "task processing timeout", task_uuid
|
| 502 |
|
| 503 |
except Exception as e:
|
| 504 |
+
return None, None, f"error occurred during processing: {str(e)}", None
|
| 505 |
|
| 506 |
|
| 507 |
def process_local_image_edit(base_image, layers, prompt, reference_image=None, progress_callback=None, use_example_mask=None):
|
|
|
|
| 531 |
|
| 532 |
# Check if base_image is valid
|
| 533 |
if base_image is None:
|
| 534 |
+
return None, None, "Base image is None, cannot process example mask", None
|
| 535 |
|
| 536 |
if os.path.exists(use_example_mask):
|
| 537 |
mask_image = Image.open(use_example_mask)
|
|
|
|
| 546 |
|
| 547 |
print(f"🎭 Using example mask from: {use_example_mask}, size: {mask_image.size}")
|
| 548 |
else:
|
| 549 |
+
return None, None, f"Example mask file not found: {use_example_mask}", None
|
| 550 |
except Exception as e:
|
| 551 |
import traceback
|
| 552 |
traceback.print_exc()
|
| 553 |
+
return None, None, f"Failed to load example mask: {str(e)}", None
|
| 554 |
else:
|
| 555 |
# Normal case: create mask from layers
|
| 556 |
mask_image = create_mask_from_layers(base_image, layers)
|
|
|
|
| 558 |
# 检查mask是否有内容
|
| 559 |
mask_array = np.array(mask_image)
|
| 560 |
if np.max(mask_array) == 0:
|
| 561 |
+
return None, None, "please draw mask", None
|
| 562 |
|
| 563 |
# Print mask statistics
|
| 564 |
if not use_example_mask:
|
|
|
|
| 573 |
# 直接从内存上传原始图片
|
| 574 |
uploaded_url = upload_user_img_r2(client_ip, time_id, base_image)
|
| 575 |
if not uploaded_url:
|
| 576 |
+
return None, None, "original image upload failed", None
|
| 577 |
|
| 578 |
# 从上传 URL 中提取实际的图片 URL
|
| 579 |
if "?" in uploaded_url:
|
|
|
|
| 585 |
# 直接从内存上传mask图片
|
| 586 |
mask_url = upload_mask_image_r2(client_ip, time_id, mask_image)
|
| 587 |
if not mask_url:
|
| 588 |
+
return None, None, "mask image upload failed", None
|
| 589 |
|
| 590 |
# 从上传 URL 中提取实际的图片 URL
|
| 591 |
if "?" in mask_url:
|
|
|
|
| 604 |
|
| 605 |
reference_url = upload_user_img_r2(client_ip, time_id, reference_pil)
|
| 606 |
if not reference_url:
|
| 607 |
+
return None, None, "reference image upload failed", None
|
| 608 |
|
| 609 |
if "?" in reference_url:
|
| 610 |
reference_url = reference_url.split("?")[0]
|
| 611 |
except Exception as e:
|
| 612 |
+
return None, None, f"reference image processing failed: {str(e)}", None
|
| 613 |
|
| 614 |
print(f"📤 图片上传成功:")
|
| 615 |
print(f" 原始图片: {uploaded_url}")
|
|
|
|
| 629 |
reference_image_url=reference_url
|
| 630 |
)
|
| 631 |
if error:
|
| 632 |
+
return None, None, error, None
|
| 633 |
|
| 634 |
if progress_callback:
|
| 635 |
progress_callback(f"task submitted, ID: {task_id}, processing...")
|
|
|
|
| 649 |
if status == 'completed':
|
| 650 |
if output_url:
|
| 651 |
print(f"✅ 局部编辑任务完成,结果: {output_url}")
|
| 652 |
+
return uploaded_url, output_url, "local image edit completed", task_uuid
|
| 653 |
else:
|
| 654 |
+
return None, None, "task completed but no result image returned", task_uuid
|
| 655 |
elif status == 'error' or status == 'failed':
|
| 656 |
+
return None, None, f"task processing failed: {task_data}", task_uuid
|
| 657 |
elif status in ['queued', 'processing', 'running', 'created', 'working']:
|
| 658 |
# Enhanced progress message with queue info and website promotion
|
| 659 |
if progress_callback and task_data and isinstance(task_data, dict):
|
|
|
|
| 680 |
progress_callback(f"unknown status: {status}")
|
| 681 |
time.sleep(1)
|
| 682 |
|
| 683 |
+
return None, None, "task processing timeout", task_uuid
|
| 684 |
|
| 685 |
except Exception as e:
|
| 686 |
print(f"❌ 局部编辑处理异常: {str(e)}")
|
| 687 |
+
return None, None, f"error occurred during processing: {str(e)}", None
|
| 688 |
|
| 689 |
|
| 690 |
def download_and_check_result_nsfw(image_url, nsfw_detector=None):
|