DOWNLOADER / app.py
deveos's picture
Update app.py
86a0a7a verified
Raw
History Blame Contribute Delete
2.38 kB
import os
import uuid
import subprocess
import gradio as gr
from urllib.parse import urlparse
SAVE_DIR = "/data/downloads"
os.makedirs(SAVE_DIR, exist_ok=True)
def make_filename(url):
ext = os.path.splitext(urlparse(url).path)[1]
if not ext or len(ext) > 10:
ext = ".bin"
return f"{uuid.uuid4().hex}{ext}"
def download_file(url):
if not url.startswith(("http://", "https://")):
return "Only direct HTTP/HTTPS links allowed.", None
filename = make_filename(url)
output_path = os.path.join(SAVE_DIR, filename)
cmd = [
"aria2c",
"-c",
"-x", "16",
"-s", "16",
"-k", "8M",
"--max-tries=0",
"--retry-wait=10",
"--timeout=60",
"--connect-timeout=30",
"--continue=true",
"--allow-overwrite=true",
"--auto-file-renaming=false",
"-d", SAVE_DIR,
"-o", filename,
url
]
try:
result = subprocess.run(
cmd,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
text=True
)
if result.returncode != 0:
return "aria2c error:\n" + result.stdout[-4000:], None
if not os.path.exists(output_path):
return "Download finished but file not found.", None
size_gb = os.path.getsize(output_path) / 1024**3
return f"Downloaded successfully: {filename} ({size_gb:.2f} GB)", output_path
except Exception as e:
return f"Error: {str(e)}", None
def list_files():
items = []
for name in os.listdir(SAVE_DIR):
path = os.path.join(SAVE_DIR, name)
if os.path.isfile(path):
size_gb = os.path.getsize(path) / 1024**3
items.append(f"{name} - {size_gb:.2f} GB")
return "\n".join(items) if items else "No files found."
with gr.Blocks() as demo:
gr.Markdown("# Large File Downloader")
gr.Markdown("Direct HTTP/HTTPS links only. No torrent/magnet links.")
url = gr.Textbox(label="Direct URL")
btn = gr.Button("Download")
status = gr.Textbox(label="Status", lines=8)
file_out = gr.File(label="Downloaded File")
btn.click(download_file, inputs=url, outputs=[status, file_out])
refresh = gr.Button("Refresh Files")
files = gr.Textbox(label="Saved Files", lines=10)
refresh.click(list_files, outputs=files)
demo.launch()