TS Files Downloader
Download every model a workflow needs, in one shot
You get a workflow from a friend - or from a reddit share - and it needs four models you don't have, from three different sources, in three different folders. Downloading them by hand is a chore, and a shared workflow that can't self-install is a workflow that dies on arrival. TS Files Downloader is the node that fixes that: give it a list of URL <space> target_path lines and it downloads them sequentially, with resume, mirror fallback, size/SHA verification, and optional auto-unzip. Handy for one-shot pulling all the assets a workflow needs.
The killer feature is the button: "Get models from workflow." It walks the open graph - including inside subgraphs - and collects every model every loader needs, reading the {name, url, directory} metadata ComfyUI stamps onto each loader. You get a report first; Append adds only what's missing, Replace list starts over.
How it works
The format is one download per line, URL <space> target_path. Target can be absolute, a models/... path, or a registered folder name (checkpoints, loras, vae - whatever ComfyUI already knows). Lines starting with # are ignored. It talks HTTP directly (via requests, a pack requirement), streams in chunks (chunk_size_kb, default 4096), and:
- Resumes interrupted downloads - a partial file is kept as
.part, so the next run continues instead of restarting. - Verifies -
verify_sizechecks each finished file against the server-reported size or HF SHA256, and re-downloads/resumes on mismatch. - Swaps HF mirrors -
hf_domainlists mirror domains (defaulthuggingface.co, hf-mirror.com); the first reachable one replaces the main host automatically. This is the "I'm in a region where HF is slow or blocked" button. - Unzips safely -
unzip_after_downloadextracts archives into the target folder with zip-slip validation.
The inputs that matter
file_list- the URL + target lines. The whole job.skip_existing- skip files already present (default on).verify_size- integrity checking (default on).hf_token/modelscope_token/proxy_url- for gated repos and networks. ⚠️ The tooltips warn these are stored in the workflow JSON as plain text - don't share a workflow that contains a token.
No outputs - it's an action node that holds the run until the files land.
Installing it
Part of comfyui-timesaver (ComfyUI Manager → "Timesaver", or manual clone + pip install -r requirements.txt + restart). No models to download - it is the downloader.
Where people get burned
Three things. First, the token warning is real: a workflow with hf_token filled in and shared publicly hands your token out. Only use it in workflows you never export. Second, "Get models from workflow" is smart but not psychic - it depends on loaders carrying the URL metadata, and a loader from a pack that doesn't stamp it falls back to filename-only. When that happens, the downloader just won't know where to fetch from, and you add the line by hand. Third, remember it's sequential and blocking: the rest of the graph waits, which is the design (the models have to exist before anything loads them), but it means a slow mirror makes the whole run wait. If a download stalls, that's when the mirror list earns its keep - add a mirror domain and rerun.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| file_list | STRING | https://www.dropbox.com/sh/example_folder?dl=0 /path/to/models https://huggingface.co/stabilityai/sdxl-turbo/resolve/main/sd_xl_turbo_1.0_fp16.safetensors /path/to/checkpoints | One download per line: '<url> → <folder>'. The arrow is there to be read — a long address wraps, and a folder pressed against its tail looks like part of the link; a plain space still works, so older lists keep running. Target may be absolute, a 'models/...' path, or a registered model folder name (checkpoints, loras, vae). Lines starting with # are ignored. |
| skip_existing | BOOLEAN | true | Skip a file that already exists in the target folder instead of downloading it again. |
| verify_size | BOOLEAN | true | Verify each finished file against the size (or HF SHA256) reported by the server; re-download or resume on mismatch. |
| chunk_size_kb | INT | 40961–65536 | Streaming chunk size in KB. Larger values can be faster on fast links; smaller values use less memory. |
| hf_tokenopt | STRING | HuggingFace token for gated repos. WARNING: stored in the workflow JSON as plain text — do not share a file that contains it. | |
| hf_domainopt | STRING | huggingface.co, hf-mirror.com | Comma-separated HuggingFace mirror domains. The first reachable one replaces huggingface.co in each URL. Useful in regions where the main host is slow or blocked. |
| proxy_urlopt | STRING | Proxy URL (may contain credentials). WARNING: stored in the workflow JSON as plain text — do not share a file that contains it. | |
| modelscope_tokenopt | STRING | ModelScope token. WARNING: stored in the workflow JSON as plain text — do not share a file that contains it. | |
| unzip_after_downloadopt | BOOLEAN | false | After a successful download, extract any .zip archive into its target folder and delete the archive. |
| enableopt | BOOLEAN | true | Master switch. When off, the node does nothing and returns immediately. |
| integrity_modeopt | COMBO | hf_sha256_auto | Integrity check strategy. 'hf_sha256_auto' verifies HuggingFace files by SHA256 when available; 'size_only' checks byte size alone. |
Outputs (0)
No outputs