ammariii08's picture
Update app.py
a2c7195 verified
import gradio as gr
import os
import requests
import re
import time
from datetime import datetime, timezone
# Constants
RUNPOD_API_KEY = os.environ["RUNPOD_API_KEY"]
RUNPOD_ENDPOINT = "https://api.runpod.ai/v2/vz476hgvqvzojy"
USER_LOGIN = "Ammariii08"
HEADERS = {
"Content-Type": "application/json",
"Authorization": f"Bearer {RUNPOD_API_KEY}"
}
def extract_file_id(url):
m = re.search(r'/d/([a-zA-Z0-9_-]+)', url) or re.search(r'id=([a-zA-Z0-9_-]+)', url)
return m.group(1) if m else None
def to_direct_download(link):
fid = extract_file_id(link)
return f"https://drive.google.com/uc?export=download&id={fid}" if fid else None
def make_api_request(fid):
payload = {"input": {"video_url": f"https://drive.google.com/uc?export=download&id={fid}"}}
resp = requests.post(f"{RUNPOD_ENDPOINT}/run", headers=HEADERS, json=payload, timeout=1800)
resp.raise_for_status()
return resp.json()
def process_video(drive_link, progress=gr.Progress()):
fid = extract_file_id(drive_link)
if not fid:
progress(1.0, desc="Invalid URL")
return "❌ Invalid Drive URL", "", "–", ""
progress(0.05, desc="Initializing…")
t0 = time.time()
try:
job = make_api_request(fid)
except Exception as e:
progress(1.0, desc="Submission Failed")
return f"❌ Submission error: {e}", "", "–", ""
progress(0.2, desc="Job Submitted")
t1 = time.time()
job_id = job["id"]
prog = 0.2
while True:
st = requests.get(f"{RUNPOD_ENDPOINT}/status/{job_id}", headers=HEADERS).json()
status = st.get("status", "UNKNOWN")
if status == "COMPLETED":
t2 = time.time()
exec_time = t2 - t1
out = st["output"]
drive_links = out.get("drive_links", [])
break
if status == "FAILED":
progress(1.0, desc="Job Failed")
return "❌ Job failed", "", "–", ""
prog = min(prog + 0.1, 0.9)
progress(prog, desc=f"Waiting ({status})…")
time.sleep(5)
progress(1.0, desc="Completed")
delay = t1 - t0
details_md = f"**Job ID:** `{job_id}` \n**Status:** `{status}`\n\n**Submission Delay:** `{delay:.1f}s` \n**Execution Time:** `{exec_time:.1f}s`\n\n"
# Compose all download links, one per drive
links_md = ""
button_md = ""
for item in drive_links:
drive = item.get("drive", "Unknown")
web_link = item.get("webViewLink", "")
dl_link = to_direct_download(web_link) or web_link
links_md += f"**{drive} Drive Link:** \n`{web_link}`\n\n"
# Add download button per drive
button_md += (
f'<a href="{web_link}" target="_blank" style="display:inline-block;padding:8px 16px;background:#4CAF50;color:white;border-radius:4px;text-decoration:none;margin-right:8px;">'
f'Open {drive} Download</a> '
)
details_md = links_md + details_md
# Optionally, show first link as the main download link
primary_dl_link = drive_links[0]["webViewLink"] if drive_links else ""
return "✅ Completed!", primary_dl_link, details_md, button_md
def create_ui():
with gr.Blocks(theme=gr.themes.Soft()) as app:
gr.Markdown(f"""
# AXION 🎾
## RUNPOD Deployment Testing
""")
link_in = gr.Textbox(label="Google Drive Link", placeholder="https://drive.google.com/file/d/…")
btn = gr.Button("Process Video")
status = gr.Textbox(label="Status", interactive=False)
dl_out = gr.Textbox(label="Download Link", interactive=False)
details = gr.Markdown(label="Details")
open_btn = gr.Markdown() # <-- always present
btn.click(
fn=process_video,
inputs=[link_in],
outputs=[status, dl_out, details, open_btn]
)
return app
if __name__ == "__main__":
create_ui().launch(share=True, server_name="0.0.0.0", server_port=7860)