tonyassi's picture
Update app.py
5133a1d verified
import gradio as gr
import requests
import json
import traceback
APP_TITLE = "Face Swap Video API Demo"
API_URL = "https://www.face-swap.co/api"
# ----------------------------
# Helpers
# ----------------------------
def pretty_json(obj) -> str:
try:
return json.dumps(obj, indent=2, ensure_ascii=False)
except Exception:
return str(obj)
def do_post(url: str, payload: dict, timeout: int = 60) -> str:
try:
r = requests.post(url, json=payload, timeout=timeout)
r.raise_for_status()
try:
return pretty_json(r.json())
except Exception:
return r.text
except Exception:
return f"Traceback: {traceback.format_exc()}"
def do_get(url: str, timeout: int = 30) -> str:
try:
r = requests.get(url, timeout=timeout)
r.raise_for_status()
try:
return pretty_json(r.json())
except Exception:
return r.text
except Exception:
return f"Traceback: {traceback.format_exc()}"
# ----------------------------
# Code template builders (live preview)
# ----------------------------
def _escape_quotes(s: str) -> str:
return (s or "").replace('"', '\"')
def build_generate_code(api_key: str, img_url: str, vid_url: str, duration: int, gender: str) -> str:
api_key = _escape_quotes(api_key or 'YOUR_API_KEY')
img_url = _escape_quotes(img_url or 'https://tinyurl.com/elonmusk-faceswap')
vid_url = _escape_quotes(vid_url or 'https://tinyurl.com/ironman-faceswap')
gender = gender or 'all'
duration = int(duration) if duration else 4
return f"""import requests
api_key = "{api_key}"
input_image_url = "{img_url}"
input_video_url = "{vid_url}"
url = "https://www.face-swap.co/api/generate"
payload = {{
"key": api_key,
"input_image_url": input_image_url,
"input_video_url": input_video_url,
"duration": {duration}, # 4|60|120|180
"gender": "{gender}", # all|female|male
}}
r = requests.post(url, json=payload, timeout=60)
r.raise_for_status()
print(r.json())
"""
def build_status_code(job_id: str) -> str:
job_id = _escape_quotes(job_id or 'YOUR_JOB_ID')
return f"""import requests
job_id = "{job_id}"
r = requests.get(f"https://www.face-swap.co/api/status/{{job_id}}", timeout=30)
r.raise_for_status()
print(r.json())
"""
def build_credits_code(api_key: str) -> str:
api_key = _escape_quotes(api_key or 'YOUR_API_KEY')
return f"""import requests
api_key = "{api_key}"
r = requests.get(f"https://www.face-swap.co/api/credits/{{api_key}}", timeout=30)
r.raise_for_status()
print(r.json())
"""
def build_jobs_code(api_key: str) -> str:
api_key = _escape_quotes(api_key or 'YOUR_API_KEY')
return f"""import requests
api_key = "{api_key}"
r = requests.get(f"https://www.face-swap.co/api/jobs/{{api_key}}", timeout=30)
r.raise_for_status()
print(r.json())
"""
# ----------------------------
# Inference handlers (Execute buttons)
# ----------------------------
def run_generate(api_key: str, img_url: str, vid_url: str, duration: int, gender: str) -> str:
payload = {
"key": api_key,
"input_image_url": img_url,
"input_video_url": vid_url,
"duration": int(duration),
"gender": gender,
}
return do_post(f"{API_URL}/generate", payload, timeout=60)
def run_status(job_id: str) -> str:
return do_get(f"{API_URL}/status/{job_id}", timeout=30)
def run_credits(api_key: str) -> str:
return do_get(f"{API_URL}/credits/{api_key}", timeout=30)
def run_jobs(api_key: str) -> str:
return do_get(f"{API_URL}/jobs/{api_key}", timeout=30)
# ----------------------------
# UI
# ----------------------------
def build_ui():
default_image = "https://tinyurl.com/elonmusk-faceswap"
default_video = "https://tinyurl.com/ironman-faceswap"
with gr.Blocks(title=APP_TITLE, css=".gradio-container {max-width: 1100px !important}") as demo:
gr.Markdown(
f"""
# {APP_TITLE}
### **Free API key:** [face-swap.co/api](https://www.face-swap.co/api/?utm_source=hfspace_faceswapvideoapi&utm_medium=hero_cta)
"""
)
# with gr.Row():
# gr.Button("Open API Portal", variant="primary", link=API_URL)
gr.Markdown("---")
with gr.Tabs():
# 1) Generate Video
with gr.TabItem("1) Generate Video"):
with gr.Row():
api_key_in = gr.Textbox(label="API Key", placeholder="YOUR_API_KEY", type="password")
duration_in = gr.Dropdown([4, 60, 120, 180], value=4, label="Duration (seconds)")
gender_in = gr.Dropdown(["all", "female", "male"], value="all", label="Gender filter")
img_in = gr.Textbox(label="Input Image URL", value=default_image)
vid_in = gr.Textbox(label="Input Video URL", value=default_video)
code_init = build_generate_code("YOUR_API_KEY", default_image, default_video, 4, "all")
gen_code = gr.Code(label="Python (auto‑generated)", language="python", interactive=False, value=code_init)
gen_exec = gr.Button("▶️ Execute", variant="primary")
gen_out = gr.Textbox(label="Response", lines=14, show_copy_button=True)
def update_gen_code(k, im, vi, du, ge):
return build_generate_code(k, im, vi, du, ge)
for inp in [api_key_in, img_in, vid_in, duration_in, gender_in]:
inp.change(update_gen_code, inputs=[api_key_in, img_in, vid_in, duration_in, gender_in], outputs=gen_code)
gen_exec.click(run_generate, inputs=[api_key_in, img_in, vid_in, duration_in, gender_in], outputs=gen_out)
# 2) Check Status
with gr.TabItem("2) Check Status"):
job_in = gr.Textbox(label="Job ID", placeholder="YOUR_JOB_ID")
status_code = gr.Code(label="Python (auto‑generated)", language="python", interactive=False, value=build_status_code("YOUR_JOB_ID"))
status_exec = gr.Button("▶️ Execute", variant="primary")
status_out = gr.Textbox(label="Response", lines=12, show_copy_button=True)
def update_status_code(j):
return build_status_code(j)
job_in.change(update_status_code, inputs=job_in, outputs=status_code)
status_exec.click(run_status, inputs=job_in, outputs=status_out)
# 3) Get Credits
with gr.TabItem("3) Get Credits"):
credits_key_in = gr.Textbox(label="API Key", placeholder="YOUR_API_KEY", type="password")
credits_code = gr.Code(label="Python (auto‑generated)", language="python", interactive=False, value=build_credits_code("YOUR_API_KEY"))
credits_exec = gr.Button("▶️ Execute", variant="secondary")
credits_out = gr.Textbox(label="Response", lines=10, show_copy_button=True)
def update_credits_code(k):
return build_credits_code(k)
credits_key_in.change(update_credits_code, inputs=credits_key_in, outputs=credits_code)
credits_exec.click(run_credits, inputs=credits_key_in, outputs=credits_out)
# 4) Get Jobs
with gr.TabItem("4) Get Jobs"):
jobs_key_in = gr.Textbox(label="API Key", placeholder="YOUR_API_KEY", type="password")
jobs_code = gr.Code(label="Python (auto‑generated)", language="python", interactive=False, value=build_jobs_code("YOUR_API_KEY"))
jobs_exec = gr.Button("▶️ Execute", variant="secondary")
jobs_out = gr.Textbox(label="Response", lines=12, show_copy_button=True)
def update_jobs_code(k):
return build_jobs_code(k)
jobs_key_in.change(update_jobs_code, inputs=jobs_key_in, outputs=jobs_code)
jobs_exec.click(run_jobs, inputs=jobs_key_in, outputs=jobs_out)
gr.Markdown(
"""
---
**Notes**
- Trial runs: set `duration` to `4` seconds.
- Gender option: `all | female | male` (default `all`).
- Buttons execute real API calls from the Space; the code blocks are **read‑only previews** that update live and are easy to copy.
"""
)
return demo
demo = build_ui()
if __name__ == "__main__":
demo.launch()