import gradio as gr import requests from io import BytesIO from zipfile import ZipFile import tempfile import os def urls_to_zip(urls_text): urls = urls_text.strip().split("\n") # 一時ファイルを作成 with tempfile.NamedTemporaryFile(delete=False, suffix=".zip") as tmp: with ZipFile(tmp, "w") as zip_file: for i, url in enumerate(urls): url = url.strip() if not url: continue try: response = requests.get(url) response.raise_for_status() filename = url.split("/")[-1] or f"file_{i}" zip_file.writestr(filename, response.content) except Exception as e: zip_file.writestr(f"error_{i}.txt", f"Failed to download {url}\nError: {str(e)}") tmp_path = tmp.name return tmp_path # ファイルパスを返す with gr.Blocks() as demo: gr.Markdown("### 改行で区切ったURLリストからZIPを作成します") url_input = gr.Textbox(lines=10, placeholder="ここにURLを改行区切りで入力してください") zip_output = gr.File(label="ZIPファイル") btn = gr.Button("ZIP作成") btn.click(urls_to_zip, inputs=url_input, outputs=zip_output) demo.launch()