ComfyUI Node

TOS Upload Video URL

The Glue Node That Makes Seedance Reference Video Work

By dzy1128·Created 12 months ago·Updated 2 months ago· 7
TOS Upload Video URL
  • video
  • url
  • object_key
  • is_reused
  • text
bucket
endpointtos-cn-beijing.volces.com
regioncn-beijing
expires_seconds3600
reuse_existingfalse
object_prefixseedance/
file_path

Here's the awkward thing about ByteDance's Seedance video API: it wants reference videos as public URLs, and it will not accept your local file. TOSUploadVideoURL exists to paper over exactly that gap. It takes a local video from your ComfyUI graph, uploads it to Volcengine's TOS object storage (think AWS S3, ByteDance edition), and hands you back a pre-signed URL - which you then feed straight into the video_url input of the pack's SeedanceVideoGenerate node. Upload node → video node, done.

TOS (that's the service's actual name) is the sanctioned way to do this, and the node is built around the official limits: reference videos max out at 50 MB and should be .mp4 or .mov. Exceed the size cap and it refuses up front with a clear error instead of letting the API reject you halfway. Hand it a file that's already under the limit and it just works.

What you configure

The node needs a TOS bucket to exist, and you fill in the details:

  • bucket - your bucket name. You create it in the Volcengine console.
  • endpoint - default tos-cn-beijing.volces.com; change it if your bucket lives elsewhere.
  • region - default cn-beijing, keep in sync with the bucket.
  • expires_seconds - how long the signed URL stays valid, 60 seconds up to 30 days. If your Seedance generation runs longer than the TTL, the URL dies mid-poll. Keep it generous.
  • reuse_existing - hashes the file and skips re-uploading if the object already exists. Handy for re-running a workflow without re-uploading the same clip every time; off by default.

The input that matters

You have two ways in. Either wire a VIDEO tensor from LoadVideo / CreateVideo into the video port, or type a local path into file_path. If you give both, file_path wins - the source is explicit about that. It also validates the path exists before it does anything, so a typo fails fast. Outputs are url (the pre-signed URL - this is the one you wire into Seedance's video_url), object_key, is_reused, and a text log with the SHA-256, size, and upload status.

The thing people trip on: it's a second key

Every other node in this pack runs on ARK_API_KEY. This one does not. TOS needs its own credentials via TOS_ACCESS_KEY and TOS_SECRET_KEY environment variables - a different pair from your ARK key, created in the TOS section of the Volcengine console. You'll also need the SDK that the base README glosses over:

pip install tos

The pack's requirements.txt includes it, but if you installed the node before that dependency was added, the node fails on import with a helpful "run pip install tos" message. Other than that, it's the same install story as the rest of the pack: ComfyUI Manager → search "Seedream Image Generate", or clone the repo into custom_nodes. No model files here - this node's whole job is moving bytes to a bucket and minting a URL. If your reference clip is already on a public URL and under 50 MB, you can honestly skip this node entirely; it only earns its keep when the video starts its life on your disk.

Categoryvideo/upload

Inputs (8)

NameTypeDefaultDescription
bucketSTRINGTOS 桶名称
endpointSTRINGtos-cn-beijing.volces.comTOS Endpoint,例如 tos-cn-beijing.volces.com
regionSTRINGcn-beijing桶所在地域,例如 cn-beijing
expires_secondsINT360060–2592000预签名 URL 时效,单位秒,范围 60-2592000(30天)
reuse_existingBOOLEANfalse是否按文件内容哈希复用已上传对象。关闭时每次都会重新上传
object_prefixSTRINGseedance/上传到桶内的对象前缀
videooptVIDEO可连接 LoadVideo / CreateVideo 等节点输出
file_pathoptSTRING本地视频路径。若同时提供 video 与 file_path,则优先使用 file_path

Outputs (4)

NameTypeDescription
urlSTRING
object_keySTRING
is_reusedBOOLEAN
textSTRING