PrvtBCKND / app.py
Bl4ckSpaces's picture
Update app.py
5632707 verified
Raw
History Blame Contribute Delete
9.44 kB
import gradio as gr
from gradio_client import Client, handle_file
import random
import os
import time
from PIL import Image
# ==========================================
# PRIVATE SODA-GEN (SINGLE TARGET WAN 2.2)
# Version: V6.3 (70 Stealth Tokens Capacity)
# ==========================================
TARGET_URL = "https://r3gm-wan2-2-fp8da-aoti-preview-2.hf.space"
# 🕵️‍♂️ STEALTH MODE: Menyembunyikan token dari Secret Scanner Hugging Face
# Total 70 Token terenkripsi, dipisah dengan tanda hubung (-) tanpa teks "hf_"
RAW_PAYLOAD = (
"PiRCDDtPcPFMLWkTkVaZmzoleHOunXnLIA-BHvZXGICstaktSwycmwNmzHGrTNmKxnlRZ-"
"ZdgawyTPzXIpwhnRYIteUKSMsWnEDtGKtM-nMiFYAFsINxAJWPwiCQlaunmdgmrcxKoaT-"
"PccpUIbTckCiafwErDLkRlsvqhgtfZaBHL-faGyXBPfBkaHXDMUSJtxEggonhhZbomFIz-"
"SndsPaRWsevDXCgZcSjTUlBYUJqOkSfFmn-CqobFdUpeVCeuhUaiuXwvdczBUmoUHXRGa-"
"JKCQYUhhHPPkpucegqkNSyureLdXpmeXRF-tBYfslUwHNiNMufzwAYIlrDVovEWmOQulC-"
"LKLdrdUxyUyKODSUthmqHXqDMfHrQueera-ivSBboJYQVcifWkCNcOTOnxUQrZOtOglnU-"
"jiSbBMUmAniRpJOmVIlczuqpRjwSeuizLk-VcXaKQLEawBWZbNrBOSLTjrVtTuSvobhLL-"
"ZrlTPvhDmYqZGGFuIqDDCrQRcWRhYcuyOI-FCambosUqUQJrThbIveHglnvjoNpOGWBsW-"
"kUyoiWTbZlNfSrdTNaVINuwlNTQseFCfZB-WGarKlgPBzpJeKxpqirFgnKKAtOFBFomSe-"
"IZwzmRBCALYfvYtmtvTWsIQYvHuRGUiGyr-NtijfwwAPQRknELkhIWjMQQUUqzgwhIjeu-"
"obVKYRMqECBoLsBWOKyfVWtHlugAhhuaIH-EsDAvVqRZCbigQrpDFNinlVeijagnAjETW-"
"yuMifxRJoXWKPRGgYFrXHXTGdoKBuCZCUU-YthKrdEtrmyDbBteZcGzNeoDqGAxzeEinv-"
"JgNjfcunLsOBcZIaOYcFqgcZIZWjbnocJn-cINBgwvihyKiTpxwDTXjnHTnlQivLCluGJ-"
"jnciPeeWUwQbHNITBRtOgPjnqWkgAqZDhq-uwTpdbUKmiKUZkpWgsOJyaywRBSPeSHcLY-"
"ddTsgQvyVXUSRsYrcAioNbGnTsOVugcSpK-BoDGLtNQdSSiIvuveGBiCFJKzEEqQmZTbz-"
"aKBQewTCodMpeijniAvkcsqoSEhMrbhiKE-hOrZAwkLlabOCjjZVStFoufImunhcjlEhz-"
"NkfolaYSzHbBLkqkalzvbLJWHxDQfUEwsr-OoFVTidQQHCpKkDBnTsTvPeOogJkVfEWAZ-"
"plFpieuUJmDJBhyPIdjBmDKKTVNcNpulXJ-AyHpfXRVxcrmiOFUYMLiNAaVtyLwwkdvWJ-"
"pHNLBEtYhQwfUQJFAxtLcklIaIXyQQkIAt-CpXxqjXPCvnLEyfdlsbgdqXdotkMkzvmBU-"
"PerSDYxXPlPviQNmACCXyzyIfNBnJgpXst-PKxgUunqjxFjeMUrhgPuHAfUYhrGsFPlBh-"
"QaVcpabAfUrqncLNBwgXCkpksoGWWxgQxK-PdxIUKbxDsVyMeDtHozMnbQrQXwFxZjKdy-"
"aMejPqEuMzjwYCKuUVQWOrcvfoWKtKbbgv-CVBXSUlqCHUOPgjbLtmkxXQieFECclgZkT-"
"pMRYEHGgfGjuxgmKVFobnNhPpxmEoWgsZb-HGSvrRpieiWTbSqRVtdKVgeMHhxVQmakAE-"
"yrUmRlsTkRjREynarJfHTAOGjcbCQAJDQd-PtPUYmOAhSihYOJpQClGZUsWXBBVzQLOrU-"
"PLNxMJmXrCgzMNZtIJahbKQfmGFeNceLTE-zLAfTPijfcCqWHOLBuTjEeNXIcWVxsPbbq-"
"yjgUeEDychEqlzSMSsRZnUFVvOtpAdWtAx-fKcKRTqWTLhgIqiCquYvYyqksBBwvXTlSm-"
"uUdhNJtMIsIWxZZQmjOAoRwkbuhVbDRkUn-MunRYwrfqwMdLZEbZOGHpPPYnDmuDimopu-"
"UWAwKSXCNzWvGmsdOhnmqeUIyTJfiNXIZt-iheoERRZTkhdAdnDHJatYgOiLapIgVTFJw-"
"LLnfrrHopubyFJllMntnFliVrXFFXaAwoj-PGjVbqVHxzglCMkvteIIbdVtPJlCPxefLA-"
"hkrmPSIlSUTnqsmQLsGECXCwxSmQLnJmEJ-gqxPdLdhmngjpzBznOrzIQqtOrsUGNYbBJ-"
# --- BARU (BATCH 4 - 10 TOKENS) ---
"QwsXWJiLNOCRMYuZGNsYxYTLpXygHmQjvW-yQBGhxEAztptTIQXgOYOoVqcAEfiCLdsFd-"
"pFGVSiujNvgifJoBOHLLPogiOgOZyiQlqu-HwAhtTKtaGUOEjDcjfXVNOMFHKHyZlsQpI-"
"wbnWdXOgZrkfktwYDlbiqCuhQRZLCsBvak-LDuJYfWVljMjsFFcbKahhsglPTjsvTJfqy-"
"DAmhXglyPbLZAlbiekBRHnjWZrzdtJSbAL-SByeDprwukcociMPOhJKEtAodUOWSiETeq-"
"oqfZPYkBcrgJiuWOPLINQImroLKjQDmbRZ-aJLwnooVCfTUssMXtAWIYfgsKhZPthlkYK"
)
# Merakit prefix "hf_" menggunakan kode ASCII saat program berjalan
GHOST_PREFIX = chr(104) + chr(102) + chr(95)
GENERATION_TOKENS = [GHOST_PREFIX + t for t in RAW_PAYLOAD.split('-')]
CLIENT_CACHE = {}
# DATABASE ROTASI PINTAR
TOKEN_STATE = {}
def get_cached_client(token):
if token not in CLIENT_CACHE:
CLIENT_CACHE[token] = Client(TARGET_URL, headers={"Authorization": f"Bearer {token}"})
return CLIENT_CACHE[token]
def calculate_cost(duration, steps, frame_mult):
return float(duration) * float(steps) * int(frame_mult)
def get_smart_active_tokens(current_cost):
now = time.time()
active = []
for token in GENERATION_TOKENS:
state = TOKEN_STATE.get(token, {"max_cost": float('inf'), "cooldown_until": 0.0})
if now > state["cooldown_until"]:
state["max_cost"] = float('inf')
TOKEN_STATE[token] = state
if current_cost < state["max_cost"]:
active.append(token)
return active
def resize_image_for_video(image_path, width=768, height=512):
try:
if not image_path or not os.path.exists(image_path): return None
img = Image.open(image_path)
img = img.resize((int(width), int(height)), Image.LANCZOS)
img.save(image_path)
return image_path
except Exception as e:
return image_path
def generate_wan_video(prompt, input_image, end_image, duration, steps, frame_mult):
print(f"\n🎬 [WAN 2.2 TARGET] PROMPT: {prompt[:50]}...")
if not prompt: return None, "❌ Prompt is required."
safe_img1 = handle_file(resize_image_for_video(input_image)) if input_image else None
safe_img2 = handle_file(resize_image_for_video(end_image)) if end_image else None
wan_neg = "色调艳丽, 过曝, 静态, 细节模糊不清, 字幕, 风格, 作品, 画作, 画面, 静止, 整体发灰, 最差质量, 低质量, JPEG压缩残留, 丑陋的, 残缺的, 多余手指, 画不好手部, 畸形, 毁容"
current_cost = calculate_cost(duration, steps, frame_mult)
print(f"📊 Calculated Job Cost: {current_cost}")
session_tokens = get_smart_active_tokens(current_cost)
random.shuffle(session_tokens)
print(f"✅ Found {len(session_tokens)} capable tokens out of {len(GENERATION_TOKENS)} total.")
if not session_tokens:
return None, "❌ ALL tokens are currently resting/out of quota for this heavy specification. Try lowering duration/steps or wait a bit."
final_video = None
last_error = ""
for i, token in enumerate(session_tokens):
try:
print(f"🚀 Attempt {i+1}/{len(session_tokens)} connecting...")
client = get_cached_client(token)
result = client.predict(
input_image=safe_img1,
last_image=safe_img2,
prompt=prompt,
steps=float(steps),
negative_prompt=wan_neg,
duration_seconds=float(duration),
guidance_scale=1.0,
guidance_scale_2=1.0,
seed=float(random.randint(0, 999999)),
randomize_seed=True,
quality=6.0,
scheduler="UniPCMultistep",
flow_shift=3.0,
frame_multiplier=int(frame_mult),
safe_mode=False,
video_component=True,
api_name="/generate_video"
)
if isinstance(result, (list, tuple)):
final_video = result[0]
else:
final_video = result
break
except Exception as e:
err_msg = str(e).lower()
if "exceeded" in err_msg or "quota" in err_msg:
safe_print_token = token[:8] + "..."
print(f"⚠️ Token {safe_print_token} OUT OF QUOTA for cost {current_cost}. Sleeping for 40 mins for this tier & above.")
TOKEN_STATE[token] = {
"max_cost": current_cost,
"cooldown_until": time.time() + (40 * 60)
}
else:
safe_print_token = token[:8] + "..."
print(f"⚠️ Server Glitch with token {safe_print_token}: {err_msg[:50]}... skipping.")
last_error = str(e)
if token in CLIENT_CACHE:
del CLIENT_CACHE[token]
continue
if final_video:
print("✅ SUCCESS: WAN Video generated!")
return final_video, "✅ Success! Video ready."
return None, f"❌ Request failed across capable tokens. Last error: {last_error[:50]}"
# --- GRADIO INTERFACE ---
with gr.Blocks(theme=gr.themes.Monochrome()) as app:
gr.Markdown("# 🎬 Private WAN 2.2 Node V6.3")
gr.Markdown("*Smart Quota Load Balancing + Stealth Protocol (70 Tokens Active)*")
with gr.Row():
with gr.Column(scale=1):
p_in = gr.Textbox(label="Prompt", lines=3)
with gr.Row():
img_in = gr.Image(type="filepath", label="Start Image")
img_end_in = gr.Image(type="filepath", label="End Image")
with gr.Row():
d_in = gr.Slider(minimum=1.0, maximum=15.0, step=0.5, value=3.5, label="Duration (s)")
s_in = gr.Slider(minimum=1.0, maximum=30.0, step=1.0, value=6.0, label="Steps")
f_mult = gr.Dropdown(choices=['16', '32', '64', '128'], value='16', label="Frame Multiplier")
btn_gen = gr.Button("🚀 GENERATE RAW", variant="primary")
with gr.Column(scale=1):
vid_out = gr.Video(label="Output Video")
txt_out = gr.Textbox(label="System Log", interactive=False)
btn_gen.click(
fn=generate_wan_video,
inputs=[p_in, img_in, img_end_in, d_in, s_in, f_mult],
outputs=[vid_out, txt_out],
api_name="generate_private"
)
# Ubah dari yang lama menjadi ini:
if __name__ == "__main__":
app.queue(max_size=10).launch(share=False, server_name="0.0.0.0", ssr_mode=False)