Sno Station
Sno Station은 AI 에이전트를 하나의 팀으로 묶는 오픈소스 워크스테이션으로, 로컬 머신에서 에이전트 협업을 가능하게 함
ComfyUI 전용 노드 패키지로 미디어 로드와 비디오 파이프라인을 직관적인 노드로 간편하게 구성
A ComfyUI custom node package for streamlined media loading and video pipeline assembly. Provides intuitive nodes that simplify media resource loading with user-friendly parameters, making it easier t
플러그인Python · TypeScriptGitHub @yolain직접 설치운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
A ComfyUI custom node package for streamlined media loading and video pipeline assembly. Provides intuitive nodes that simplify media resource loading with user-friendly parameters, making it easier to build and configure video processing workflows.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A ComfyUI custom node package for streamlined media loading and video pipeline assembly. Provides intuitive nodes that simplify media resource editing and loading with user-friendly parameters, making it easier to build and configure video processing workflows.
It is strongly recommended that before installing this node package, you first ensure that FFmpeg has already been installed in your system environment
After installing, open ComfyUI and find the bundled example workflows in the Templates panel on the left sidebar — look for entries under ComfyUI-Easy-Media.README 전문 보기 ↗A ComfyUI custom node package for streamlined media loading and video pipeline assembly. Provides intuitive nodes that simplify media resource editing and loading with user-friendly parameters, making it easier to build and configure video processing workflows.
[!IMPORTANT] It is strongly recommended that before installing this node package, you first ensure that
FFmpeghas already been installed in your system environment
cd Your_ComfyUI_Path/custom_nodes
git clone https://github.com/yolain/ComfyUI-Easy-Media.git
After installing, open ComfyUI and find the bundled example workflows in the Templates panel on the left sidebar — look for entries under ComfyUI-Easy-Media.
The package includes the easy-media-multitrack-workflow Skill. Give Codex your assets and requirements in natural language to create a workflow from the bundled template or modify an existing one, automatically configuring the timeline, prompts, continuity modes, and sampling settings.
Use $easy-media-multitrack-workflow to create three 5-second tasks from these reference images and prompts.
Use Shot for the first segment and Context for the next two, then generate a new workflow JSON.
By default, the Skill only generates JSON. When explicitly asked to run the workflow, it can upload assets and submit it to ComfyUI. See the Skill documentation for installation and detailed usage.
Introduced in v1.3.0, the MultiTrack Project Pipeline connects timeline arrangement, segment generation, context continuity, and final video assembly. MultiTrack Project currently supports MiniMax H3; MultiTrack Editor remains independent of any model and can still feed other model workflows.
Use the workflow generation Skill to configure this pipeline through natural language, either from a blank template or by modifying an existing workflow.
MultiTrack Editor ── TRACKS_INFO ──→ MultiTrack Project ── PROJECT_NAME ──→ MultiTrack Project Video Combine ── VIDEO ──→ SaveVideo
↑
model_loader
(optional model_loader_2nd)
[!IMPORTANT] v1.3.0 loads media on demand. When a timeline has no Slot references, the editor no longer loads all images, audio, and video in advance. Its
IMAGES,AUDIO, andVIDEOoutputs areNoneby design. The project pipeline only needsTRACKS_INFO; older workflows that consume media directly should use MultiTrack Task Output.
Select the MiniMax format, set the target dimensions and frame rate, enter prompts for each task segment, and add reference images, video, or audio as needed. See the MultiTrack Editor overview below for tracks, task modes, and media editing.
The new continuity mode determines how a task follows the previous segment. It is configured separately from task modes such as text-to-video, image-to-video, and reference-to-video:
| Continuity Mode | Generation Behavior | Use Cases |
|---|---|---|
Shot (shot) | Generates independently, without inheriting motion or audio context from the previous segment | New shots, scene changes, and deliberate cuts |
Context (context) | Uses the tail of the previous result's audio/video latent to continue motion and sound | Continuous action, long takes, and ongoing audio |
Drift Control Context (context_drift) | In the first pass, applies Drift-Control to the copied video prefix: a denoise mask recalculated for each sampling step allows more change away from the seam and tapers to a fixed boundary. This limits visual drift while carrying motion forward; audio transitions softly. The second pass uses the standard high-resolution anchor without Drift-Control. | Change a subject or appearance while retaining the previous motion |
The first segment starts in Shot mode. Set subsequent segments individually or select multiple tasks to change them together. For example, “Shot → Context → Context → Shot” creates three connected segments followed by a new shot. This setting affects generation, rather than adding a crossfade during assembly. Context does not guarantee seamless continuity across arbitrary scene or prompt changes.
Connect the editor's TRACKS_INFO to tracks_info, then connect a model_loader containing the H3 model, CLIP, video VAE, and audio VAE. The node automatically expands the tasks in sequence, so no manual segment-index loop is needed:
Read task and load media on demand → Encode prompts and reference conditioning → First pass
→ [Optional: upscale video latent → Second pass] → Decode audio/video → Trim context overlap
→ Save segment and context → Process next task → Output project name
Each segment uses its own prompts, references, and continuity mode. With Context enabled, the first pass uses the previous segment's context at the corresponding resolution; the second pass uses its final high-resolution result to preserve the join. Each segment is saved before the next one runs. You can choose a starting segment and count, or save a first-pass preview and resume the second pass later. See MultiTrack Project details for settings, upscaler dependencies, and the context implementation's source and adaptations.
Connect PROJECT_NAME to the combine node to preview saved segments, choose a version for each, and assemble the final video. Auto combine produces a complete video in one workflow run. Turn it off to review results first, then click Combine to run only assembly and downstream saving without re-running the model. If a segment has multiple generated versions, select two for synchronized comparison before choosing the final version. See MultiTrack Project Video Combine for details.
Tips: The advantage of the multi-track editor is its decoupling design — it is used solely for media editing and loading, and is not bound to any model. Users can freely choose any model node to process the media data output by the multi-track editor.
easy multiImagesLoader provides the same resolution choices for an ordered list of up to 25 images. Add images through the media selector or drop image files onto the grid; the node resizes each image and outputs an IMAGE list in grid order.
| Track Type | Description |
|---|---|
| Task Track | Supports multiple task type definitions such as t2v, i2v, r2v, v2v |
| Video Track | Import and manage video clips, supporting multi-segment video stitching and intelligent segmentation |
| Audio Track | Import and manage audio clips, supporting multi-segment audio stitching |
| Subtitle Track | Add subtitles recognized from audio/video |
The editor passes time ranges, prompts, media locations, and track settings through TRACKS_INFO. Downstream output nodes load the required media when processing each task, reducing the cost of decoding and assembling an entire long timeline in advance. Metadata probing, frontend thumbnails, and waveform previews are separate from loading complete media for workflow execution.
| Timeline Sources | Editor Outputs | How to Access Media |
|---|---|---|
| Files or URLs, without Slot references | TRACKS_INFO is available; media outputs are None | Connect TRACKS_INFO to MultiTrack Project or MultiTrack Task Output for loading on demand |
| Slot references to upstream image, audio, or video inputs | Retains immediate loading and media outputs; requests only the input types actually referenced | Continue using the editor's media outputs and companion output nodes |
If an older workflow connects directly to the editor's media outputs, insert MultiTrack Task Output (easy multiTrackTaskOutput):
TRACKS_INFO and set task_index = 0, 1, 2… to retrieve media for the corresponding task range.task_index = -1 to output the entire timeline's media, replacing the editor's former full-media output behavior. This restores the resource cost of loading the full timeline.MultiTrack Info Output; complete media loading is unnecessary for this metadata.| Scenario | Description | Requirements |
|---|---|---|
| Video Generation | MiniMax H3/wan/bernini/ltx t2v, i2v, r2v | Task track segments only |
| Video Editing | bernini v2v, bernini vi2v, wan animate, ltx video replace, ltx iclora edit/inpaint/outpaint | Video track segments + task track segments |
| Video Reference | wan scail2, wan animate, ltx iclora guide | Video track segments + task track segments |
| Video Dubbing | wan infinititalk, longcat avatar, ltx ai2v | Task track segments + audio track segments |
| Video Subtitles | - | Task track segments + subtitle track segments |
| Scenario | Description | Download | Local Path | Prerequisites |
|---|---|---|---|---|
| Video Subtitles (Whisper) | Audio/video recognition to generate subtitles | Whisper Large V3 | models/audio_encoders/ | pip install openai-whisper |
| Video Subtitles (Qwen3) | Audio/video recognition to generate subtitles | Qwen3-ASR Qwen3-ForcedAligner | models/Qwen3-ASR/ | pip install qwen-asr torchaudio |
| Subtitle Narration | Convert subtitles to speech voiceover | VoxCPM2 | models/voxcpm/ | pip install voxcpm |
| Shot Detection | Intelligently segment video shots | OmniShotCut | models/checkpoints | - |
Note: Some models support automatic download via the built-in Easy-Media model download interface. Model files will be placed in the
ComfyUI/models/directory.
easy multiTrackPromptEnhancer and easy multitrackPromptEnhanceToProject support openai_compatible (local) through /v1/chat/completions, including Strata. The seven options are base_url, model_name, apikey, max_tokens, temperature, reasoning_effort, and force_unload.
base_url is empty by default: a nonempty node value takes priority, followed by OPENAI_LOCAL_BASE_URL in config.yaml and finally http://127.0.0.1:8080/v1. Server roots, /v1 bases, full Chat Completions URLs, and proxy prefixes are accepted. model_name is also empty by default: the node value overrides OPENAI_LOCAL_MODEL_NAME; otherwise /v1/models must identify one model (aliases for that same model are accepted). If discovery is unavailable or multiple distinct models are listed, fill model_name explicitly. API keys are optional and read from OPENAI_LOCAL_API_KEY in config.yaml or the environment.
max_tokens defaults to empty and is omitted from the request, leaving the output limit to the service. Positive integers and STRING/INT connections are supported. Output includes thinking and must fit beside the input in the server's context. An explicit output limit rejected with Strata's positive remaining-output allowance is reduced to that allowance and retried once without truncating input. Other errors and inputs with no output space still fail. Existing workflows keep saved field values; select the new provider and clear saved limits or addresses to use the defaults.
reasoning_effort defaults to high; none, low, medium, and high are sent directly, without enable_thinking or chat_template_kwargs. The service must support the selected effort; Strata's none disables thinking. Only final answer text is returned: separate reasoning fields, thinking content blocks, and inline <think> blocks are excluded. Reasoning-only responses fail. Temperature defaults to 0.7, timeout is 600 seconds, and other settings follow the service defaults. Vision-capable models receive images; each video is sampled into up to 24 image frames. Audio is omitted.
Both nodes offload ComfyUI's loaded models and clear allocator caches before local inference; cleanup failures stop the request. force_unload defaults to false. When enabled, it separately calls /v1/unload?wait=1 after inference, including failures. Enable it for Strata or services that implement that endpoint; keep it disabled otherwise. Unload errors are reported. The generated Chat Completions payload does not contain force_unload. Strata runs on the machine selected by base_url; 127.0.0.1 means the ComfyUI server's machine. See Strata's API documentation.
easy multitrackProject manages segment-by-segment generation for MiniMax H3 projects. The editor's dimensions are the first-pass dimensions; dual sampling scales up from this size for the second pass. Project files are stored in ComfyUI/output/easy_media/projects/<project_name>/, including segment media, project records, and context latents for continuation.
sampling_mode = single and dual generate at the editor's configured dimensions. The first-pass size is not reduced based on upscale_by.dual only): Multiply each configured dimension by upscale_by, then align to the nearest multiple of 32 using round(dimension * upscale_by / 32) * 32. Upscale the first-pass video latent to this size, recombine it with the audio latent, and sample again. Rebuild reference conditioning when dimensions change. Setting upscale_by = 1.000 skips resizing but still allows a second pass.PROJECT_NAME for the combine node.| Setting | Description |
|---|---|
model_loader | First-pass H3 model and shared CLIP, video VAE, and audio VAE; video projects also require the audio VAE |
model_loader_2nd | Optional second-pass H3 model; defaults to the first-pass model. Even when connected, encoding and VAEs still come from the first-pass loader |
sampling_plan | Built-in presets such as ultra_light, light, medium, and high select samplers and sigmas for Turbo / non-Turbo models; use custom for manual settings |
sampling_mode | single, dual, or selflift; SelfLift expands transition_ratio, lowres_scale, and the optional highres_tiling switch. Pixel/VAE correction is disabled for ordinary segments and uses an internal conservative preset for context continuation. SelfLift also saves separate low- and high-resolution context lineages |
sampler / sigmas | Connect both to override first-pass sampling. Second-pass overrides use sampler_2nd / sigmas_2nd, also as a pair. custom requires both inputs for every sampling pass that runs |
upscale_by | Second-pass scale relative to the editor dimensions; default 1.250, three decimal places, step 0.001 |
disable_2nd_noise | Disables added second-pass noise; it does not skip the second pass |
1st_pass_only | In dual mode, runs and checkpoints only the first pass of the first selected segment. Disable it on the next run to resume that segment at the second pass |
Alignment uses Python round, matching the H3 latent upscaler; it is not always upward, and exact ties round to the even integer. For example, 1344 × 768 at 1.250 becomes 1680 × 960 before alignment and 1664 × 960 for the second pass. Both upscaling paths use this size, and project records and combined exports retain the resulting dimensions. Single-pass generation and first-pass-only previews keep the editor dimensions; audio-only projects (32 × 32) do not upscale. Existing workflows retain their saved multiplier rather than automatically adopting the new default.
To customize presets, copy h3_sample.json.example to presets/h3_sample.json and edit it. The current built-in dual-sampling presets use separate first- and second-pass sigma schedules. Do not assume that light always splits sigmas and leaves the first pass incomplete. A custom preset with split_step explicitly splits one sigma schedule across both passes. Existing custom files take precedence, so review your configuration after upgrading.
upscale_model | Upscaling Path | Dependencies |
|---|---|---|
| An H3 latent upscaler model | Calls the bundled easy minimaxH3LatentUpscaler node to upscale the video latent directly to the scaled, aligned second-pass dimensions | Place the H3 upscaler weights in ComfyUI/models/latent_upscale_models/; the external custom-node package is not required |
None | Decode the first-pass video with the VAE → Resize images → Re-encode with the VAE → Second pass | Requires ImageResizeKJv2 from ComfyUI-KJNodes |
upscale_model selects H3 latent upscaler weights, which serve a different purpose from the H3 generation model in model_loader_2nd. Direct latent upscaling avoids the intermediate video VAE decode/encode round trip, but the second pass still runs at the target resolution; its VRAM requirements do not decrease proportionally. Easy Media includes the inference node and runtime; only the checkpoint is downloaded separately.
The standalone easy minimaxH3LatentUpscaler node exposes enable_temporal_chunking and force_unload. Both default to enabled; MultiTrack's internal latent-upscale path also enables both explicitly. Temporal chunking lowers peak memory for long latents, while forced unload releases the upscaler from VRAM after inference.
For example, download minimax_h3_latent_upscaler_3d_fp16.safetensors from the model repository above, place it in the specified directory, restart ComfyUI, and select it under upscale_model. Its documentation specifies a 1–4× scaling range. Follow the selected model's supported range even if the project parameter accepts larger values.
Context conditioning is based on NikoDemon80 / ComfyUI-H3-Motion-Context, adapted inside Easy Media for project loops and dual sampling. The current hard-continuity implementation requires native H3 audio/video keyframe support in ComfyUI (0.34.0+). Check ComfyUI compatibility when upgrading.
In addition to attaching the previous segment's context conditioning, the project pipeline applies these adaptations:
sigmas_2nd_context = 0.50, 0.30, 0.14, 0.06, 0.0 for second passes with previous-segment context. Explicit custom second-pass sampler or sigma inputs prevent this substitution.1st pass only run can resume its second pass later; runtime context handoffs use a separate trimmed copy.Note: Context continuation requires the previous segment's saved latents; an MP4 alone is insufficient. After changing editor dimensions, scaling factor, or the previous segment's version, check the downstream context chain. Regenerate first-pass checkpoints and context latents created with the old reduced-first-pass sizing before resuming with the new sizing behavior. Existing later segments are not automatically regenerated when an earlier segment changes.
A context segment starts from the previous segment's delivered tail (22 frames, 0.92 s at 24 fps), not from the ending its prompt asked for. Model priors on framing and camera motion mean the two can differ. Those frames are pinned, and text that disagrees with them tends to be rendered in addition to them rather than replacing them: a pinned close-up plus a newly described two-shot can come out as both. Write the handoff around what is certain, never around what you intended the previous segment to do.
| Rule | In practice |
|---|---|
| Open with a hold | [Shot 1] holds the incoming state: the camera keeps its incoming direction and framing, and the subject keeps the incoming pose, action, and lighting. No new composition, arrangement of people, or location. |
| Keep the hold alive | A held frame with nothing happening renders as a freeze. Give the performer a breath, a weight shift, or an eyeline change; only the camera holds still. |
| Change after the hold | No cut, dialogue, or new key action before 00:02.000. A requested change of framing or location becomes an explicit cut after that point; a change of distance alone is a camera movement. |
| Start in motion | Anything already moving at the join (gait, gesture, camera move, sound) starts mid-motion. Nothing is already finished at the first frame. |
| Stay self-contained | The model sees no earlier prompt text. Define every <Subject N> fully and name the location and lighting; avoid "the same" for identity. Only pose, action, and camera may refer to what is incoming. |
| Pictures define identity, not frames | Use <Picture N> to define a subject, setting, or style, never as the first frame or composition anchor of [Shot 1]. Do not use <Video N> or [video continuation] for the handoff, because continuation comes from the saved latents. The summary tag stays [reference generation]. |
End in motion before another context segment | No "finishes", "arrives", "settles", "centered", or "slows"; no cut or new line of dialogue in the final second; describe the last camera state as a movement or a hold. |
If the next segment needs a specific new framing rather than whatever the previous one happened to end on, use a shot segment with a keyframe instead of context.
Automatic application: when MultiTrack Task Output builds a prompt with the default MiniMax reference-mode system prompt, it appends these rules, the incoming ones when the segment is not first and uses context, and the outgoing ones when the next segment uses context. They reach a rewriting LLM only through the api and llm prompt formats, because default and promptRelay do not output a system prompt. Custom system prompts, the base T2VA / I2VA / FL2VA / L2VA prompt, edit mode, and context_drift (including the legacy context_swap) are left unchanged.
Timestamps: Easy Media does not shift prompt timestamps. They are read against the generated clip, which starts 0.92 s before the saved segment, so [Shot 2] At 00:03.000 is expected to appear about 2.1 s into the saved file. Frames generated beyond the required length are discarded.
Note: These are conservative defaults based on how the pinned tail works and on third-party field reports, notably the chaining notes in ComfyUI-H3-Motion-Context (the hold-then-change pattern). They have not been benchmarked in this project; adjust the
00:02.000threshold and the wording against your own renders.
| Setting | Behavior |
|---|---|
project_name | Identifies the project directory and records; use the same name when resuming |
segment_start_number | Starting segment, counting from 1, unlike the zero-based task_index in MultiTrack Task Output |
segment_count | Maximum segments to generate in this run; -1 processes all remaining segments from the start |
project_save = new | Preserves existing results in the same project and adds versions for regenerated segments, allowing comparison |
project_save = override | Replaces the corresponding segment version. With segment_count = -1, clears saved segments from the start onward before regeneration; a first-pass checkpoint being resumed is preserved |
For example, to regenerate only segment 3, set segment_start_number = 3 and segment_count = 1. Choose project_save = new to retain the old result for comparison. If segment 3 uses Context, the project must contain compatible context from segment 2. After accepting the new segment 3, regenerate any later Context segments that depend on it.
easy multitrackProjectVideoCombine reads saved video segments from a project. Preview them sequentially on the timeline without first creating a merged file. Use the project selector to switch projects or refresh saved results.
VIDEO and FILENAME_PREFIX. Connect an output node such as SaveVideo to save the final video.FILENAME_PREFIX as a naming prefix if desired.After regenerating with project_save = new, click a timeline segment to open its video file list:
Segments display their Shot / Context mode to help review joins. Selecting an older version changes the assembled clip but does not repair already-generated downstream context. If versions end with different motion or audio, regenerate the affected later segments. Deleting a segment version or an entire project also deletes associated files and context; make sure they are no longer needed for resuming.
Scope: This node is for video projects. Audio-only projects with editor dimensions set to
32 × 32cannot use it to combine video.
Integrated and enhanced the video saving node from the SaveVideoRGBA node package. Supports video export with customizable output path, filename prefix, frame rate, and other parameters.
Load video files from a list of file paths (or URLs) and concatenate them into a single video output.
The trim_frame_count parameter defaults to -1, which keeps all frames of the merged video. When set to a value greater than 0, the node calculates the duration based on the merged video's frame rate and uses FFmpeg to trim the final video.
config.yaml file in the ComfyUI-Easy-Media directory and add the following content to enable frontend development mode:WEB_VERSION: dev
cd frontend && bun install && bun run dev
bun run build:release