File size: 2,347 Bytes
cfdb90d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/usr/bin/env python3
"""Download files from a ComfyUI instance's output (or input/temp) folder.

Uses ComfyUI's built-in GET /view endpoint. File names may include a
subfolder ("qwen_edit/2026-07-07/img_00001_.webp") -- the same strings
run_workflow.py prints when a job finishes. Prints the local path of each
downloaded file to stdout.

Examples:
    python download_files.py --url https://POD-7865.proxy.runpod.net headswap_00001_.png
    python download_files.py --url http://127.0.0.1:7865 --out results a/x.png b/y.png
"""
import argparse
import pathlib
import sys

import requests


def download_file(base_url, name, folder_type="output", out_dir=".", timeout=300):
    """Download one file by its ComfyUI reference name; returns the local path."""
    ref = pathlib.PurePosixPath(name)
    r = requests.get(
        f"{base_url.rstrip('/')}/view",
        params={
            "filename": ref.name,
            "subfolder": str(ref.parent) if str(ref.parent) != "." else "",
            "type": folder_type,
        },
        timeout=timeout,
    )
    r.raise_for_status()
    dest = pathlib.Path(out_dir) / name
    dest.parent.mkdir(parents=True, exist_ok=True)
    dest.write_bytes(r.content)
    return dest


def main():
    ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
    ap.add_argument("--url", required=True, help="ComfyUI base URL, e.g. https://POD-7865.proxy.runpod.net")
    ap.add_argument("--type", default="output", choices=["output", "input", "temp"],
                    help="which ComfyUI folder to read from (default: output)")
    ap.add_argument("--out", default=".", help="local directory to save into (default: cwd)")
    ap.add_argument("names", nargs="+", help='file names, optionally with subfolder ("sub/file.png")')
    args = ap.parse_args()

    failed = False
    for name in args.names:
        try:
            dest = download_file(args.url, name, args.type, args.out)
        except (OSError, requests.RequestException) as e:
            print(f"ERROR downloading {name}: {e}", file=sys.stderr)
            failed = True
            continue
        print(f"downloaded {args.type}/{name} -> {dest} ({dest.stat().st_size} bytes)", file=sys.stderr)
        print(dest)
    sys.exit(1 if failed else 0)


if __name__ == "__main__":
    main()