AdhyanshVerma's picture
Update main.py
7d44fe7 verified
Raw
History Blame
3.62 kB
import gradio as gr
import sqlite3
import requests
import os
def fetch_data(db_path, limit_links=None):
if not os.path.exists(db_path):
return [], []
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS links (
id INTEGER PRIMARY KEY,
url TEXT,
status TEXT DEFAULT 'pending'
)''')
try:
cursor.execute("SELECT api_key FROM accounts")
api_keys = [row[0] for row in cursor.fetchall() if row[0]]
except Exception as e:
api_keys = []
try:
query = "SELECT id, url FROM links WHERE status='pending'"
if limit_links:
query += f" LIMIT {limit_links}"
cursor.execute(query)
link_records = cursor.fetchall()
links = [row[1] for row in link_records if row[1]]
if link_records:
ids = [str(row[0]) for row in link_records]
cursor.execute(f"UPDATE links SET status='processing' WHERE id IN ({','.join(ids)})")
conn.commit()
except Exception as e:
links = []
conn.close()
return api_keys, links
def trigger_workers(db_path, worker_urls_str, links_per_worker):
worker_urls = [u.strip() for u in worker_urls_str.split(',') if u.strip()]
if not worker_urls:
return "Error: No worker URLs provided."
api_keys, links = fetch_data(db_path, limit_links=int(links_per_worker) * len(worker_urls))
if not api_keys:
return "Error: No API keys found in DB."
if not links:
return "Error: No pending links found in DB."
link_chunks = [links[i:i + int(links_per_worker)] for i in range(0, len(links), int(links_per_worker))]
logs = []
logs.append(f"Loaded {len(api_keys)} API keys and {len(links)} links.")
logs.append(f"Divided into {len(link_chunks)} worker chunks.")
for idx, chunk in enumerate(link_chunks):
if idx >= len(worker_urls):
logs.append("More chunks than workers. Remaining chunks won't be sent.")
break
worker_url = worker_urls[idx]
api_key = api_keys[idx % len(api_keys)]
payload = {
"links": chunk,
"api_key": api_key
}
endpoint = f"{worker_url.rstrip('/')}/process"
try:
resp = requests.post(endpoint, json=payload, timeout=10)
logs.append(f"Sent {len(chunk)} links to {worker_url}: {resp.status_code} - {resp.text}")
except Exception as e:
logs.append(f"Failed to send to {worker_url}: {str(e)}")
return "\n".join(logs)
with gr.Blocks() as app:
gr.Markdown("# YouTube Video Orchestrator Host")
gr.Markdown("Deploy this to Hugging Face Spaces or run locally. It fetches pending links from your database and delegates them to FastAPI workers.")
with gr.Row():
db_input = gr.Textbox(label="DB Path", value="data/db/accounts.db")
workers_input = gr.Textbox(label="Worker URLs (comma separated)", placeholder="http://localhost:7860, https://your-worker.hf.space")
links_per_worker = gr.Number(label="Links per worker", value=2)
run_btn = gr.Button("Run Orchestration", variant="primary")
output_log = gr.Textbox(label="Logs", lines=10)
run_btn.click(fn=trigger_workers, inputs=[db_input, workers_input, links_per_worker], outputs=output_log)
if __name__ == "__main__":
app.launch(server_name="0.0.0.0", server_port=7860)