Commit Graph
236 Commits
Author SHA1 Message Date
Austin Mroz 87f73c7dbb Fix misplaced parens
Resolves #460
2025-04-09 13:03:24 -05:00
Austin Mroz df55f01d1d Float rounding fixes
Backend preview code will now accept floats and convert or truncate as
needed.

Fix updateParameter callbacks using out of date, unbounded values
2025-04-05 04:11:07 -05:00
Austin Mroz 972c87da57 Fix incorrect preview logic for gifs
Gifs were incorrectly being loaded by a video tag when advanced previews
was set to "Input Only" (the default). The logic for when advanced
previews are used as been clarified.

Resolves #435

Parameters that determine the output quality when advanced previews are
displayed have been moved to only be set when the request if for an
advanced preview. These were ignored when the request was made to the
default /view endpoint, but created undesirable clutter
2025-03-28 11:32:11 -05:00
Austin Mroz 0a3b1eb433 Improve cloneType disconnection logic
The prior disconnection logic would eagerly disconnect if the type has
changed at all. In addition to providing awful quality of life, this
was also causing issue with workflows that contain an unbatch node being
saved at all.

The code for type cloning has undergone a substantial rewrite to
properly check link validity and to propogate link events

Resolves #432
2025-03-26 12:09:00 -05:00
Austin Mroz d3e3c2e6b4 Merge removal of native metadata parsing 2025-03-23 22:33:10 -05:00
Austin Mroz 546359d436 Add additional null check to audio link migration 2025-03-23 22:32:20 -05:00
Austin Mroz 0d5870a4ce Fix padding of seconds term 2025-03-23 22:32:00 -05:00
Austin Mroz c338a1e572 Display frame rate annotation when force_rate is 0 2025-03-19 16:00:12 -05:00
Austin Mroz 2fbbd53e62 Fix incorrect seconds padding, remove callback 2025-03-18 17:42:51 -05:00
Austin Mroz 93ae745f22 Add timestamp widget
Several nodes, like Load Video FFmpeg and Load Audio have a widgets that
take a time in seconds.

These are now handled by an updated widget that will display times as
hour:minutes:seconds and allow entry by hour:minutes:seconds
2025-03-18 17:25:40 -05:00
Austin Mroz e661ee7f3f Set start_time step to be single frame.
This is simple and low cost to implement since video information is
already being queried.
2025-03-18 12:59:01 -05:00
Austin Mroz 718af34bc2 Use setWidgetConfig on options
SetWidgetConfig is usable on widget options despite the type mismatch.
This provides a cleaner solution than a blind
Object.getOwnPropertySymbols call.
2025-03-17 15:57:57 -05:00
Austin Mroz 53c406679d Use node size to calculate target preview width
The prior code of parsing width traces all the way back to f63a0f78

I no longer recall the purpose of the slice, but parsing element
information to determine sizing is inherently flawed. An element width
will not exist until a preview has loaded. Instead, the element size is
back calculated from the node size.
2025-03-14 02:28:53 -05:00
Austin Mroz e44b3565c7 Allow dragging node from VHS preview widgets
See #414
2025-03-14 02:28:49 -05:00
Austin Mroz 73418575ca Fix low quality rendering threshold
The prior fix to respect rendering threshold had a number of mistakes.
Foremost, a typo in naming prevented it from applying at all. Path
widgets perform rendering separately and need an independent fix. The
comparison has additionally been changed to greater than or equals. This
is most noticeable when low_quality_zoom_threshold is set to 1.0

See #412
2025-03-11 16:44:15 -05:00
Tommie ea525bfbd6 Fix input mime type for Matroska files
Fixes .mkv files not showing in the file upload window
2025-03-11 16:24:04 -05:00
Austin Mroz 28eb44c13c Pass mouse events for animated latent previews
Resolves #414
2025-03-11 14:45:59 -05:00
Austin Mroz 25c31ca79e Respect low quality rendering threshold
Resolves #412
2025-03-11 14:45:59 -05:00
Austin Mroz 626cb249d1 Remove parsing of native video metadata
Core has staged a more robust implementation for parsing video metadata.

Once this been rolled out, it should be used instead of the `good
enough` implementation used by VHS.
2025-02-28 17:23:01 -06:00
Austin Mroz 51aa43368d Add documentation for Select Latest, prune timeout
The code for querying video information is an async function. Rather
than adding a setTimeout call, the function is simply called, but never
awaited.

Remove experimental from unbatch description
2025-02-25 17:26:46 -06:00
Austin Mroz 532de499f6 Select Latest poc
Adds a new node to select the most recently modified file of a target
folder. This can be used to automate using the output of one execution
as the input for another. In order to allow frontend values to properly
update, this is implemented as a virtual node, skeleton node def is
included due to difficulty with setting up the node as fully virtual.
This will likely be revisited in the future.

Add an optional length argument to path trimming. The original 30
character length estimate seems to no longer be accurate which results
in text overlapping. A more thorough investigation and fix will come
later.

Update experimental designation on nodes.
2025-02-25 12:24:12 -06:00
Austin Mroz 23ebe28091 Fix persisting output previews across reloads
Preview updates on message. This nonsense of wrapping outputs is not
useful.
2025-02-25 12:24:12 -06:00
Austin Mroz 2c25b8b538 Minor cleanup
video_query data is deleted when a new preview is loaded. This ensures
old query information doesn't persist on failed load.

Call onRemove on removed output format widgets. This doesn't matter for
any existing formats, but swapping to app.widgets allows for arbitrary
widgets to be included in formats which may require it.

Remove the app argument from the VHSFLOAT and VHSINT widget
constructors. These constructors aren't actually used, but this change
brings there functionality closer in line with the upstream sentiment.
2025-02-24 12:06:27 -06:00
Austin Mroz 514de7fe2e Add video source information to context menu
Inspired by the change to core image preview nodes. Information for a
video source is now displayed in the context menu for nodes with a
preview.
2025-02-24 12:06:27 -06:00
Austin Mroz f2c905aaed Make numeric format widgets annotated, tab safety
Format widgets which are numbers are now converted to be annotated
widgets. This ensures they have full access to VHS QoL in the future
even though none can make use of this functionality at present.

Sequential widget prompting with now check that the subsequent widget
has a mouse function before blindly calling, but is also lmited to only
annotated numbers for now. The distinction makes no difference for
existing nodes, but adds an additional layer of safety.
2025-02-24 12:06:27 -06:00
Austin Mroz 127b3646fa Allow sequential widget updates with tab
When a widget is clicked on a dialogue pops up to allow a value to be
typed. For numeric inputs on VHS nodes, pushing tab will now finalize
the input and create a new prompt for the next widget on the node.

Fix incorrect indentation.
2025-02-24 12:06:27 -06:00
Austin Mroz 9e0590cfdb Minor missed changes to comments 2025-02-24 12:06:27 -06:00
Austin Mroz 124c913ccd Fix loading of mp4 metadata
mp4 files are parsed separately from webm files. The prior commit
changed the parsing to directly pass the workflow content, but failed to
make an equivalent change in the mp4 parsing code.

As a fix, the full dict containing metadata information is now returned
as before and native videos are simply wrapped.

Resolves #393
2025-02-21 12:33:02 -06:00
Austin Mroz 8262bb941d Support Core format for video metadata
Core has added experimental support for outputting video, but does not
support loading it yet. VHS currently swallows any video files it can
not find metadata in. Once ComfyUI adds support for loading it's own
video files, this will result in an awkward period where VHS breaks
loading of core ComfyUI video files.

Instead, I've just implemented support for loading workflows from videos
output by ComfyUI.
2025-02-21 07:49:54 -06:00
Austin Mroz 24566553a5 Remove injectHidden
injectHidden was previously used to hide the custom width and custom
height widgets when they had been disabled by force_size.

As this functionality has been removed, this is dead code and can be
removed as well.
2025-02-15 17:04:23 -06:00
Austin Mroz e8ad2a851d Cleanup Format Widget js
Now that passing of information has been simplified, it's handling can
also be cleaned up. The new code should have no functional difference
but is vastly shorter.

Because the functionality has not changed, this still does not require a
reload.
2025-02-13 16:36:43 -06:00
Austin Mroz 0963fa917f Part 2 of format migration
Format widgets are now stored in the options of format widget instead of
the name.

This code has been prepped to execute without requiring a webpage reload
unless a user has not updated in the week prior to this commit.

A minor js change is made to allow for a change in format to function
without recreated nodes, but this will be phased out immeidately now
that the code for format selection can be simplified

See ffbc27304
2025-02-13 16:02:09 -06:00
Austin Mroz f470aeb38e Fixes to format widget transition code.
A couple bugs were found when actually testing with both the new and old
methods. Both methods have now been verified as functional
2025-02-07 01:08:20 -06:00
Austin Mroz ffbc273042 Partial migration for format widgets
When format widgets were initially introduced, node defs were only
partially updated when a refresh node def operation was performed. As a
workaround, format widgets include this additional information in names
of the selections. This less than desirable and should be phased out.

As every single update has had users that fail to reload the page and
run old javascript, I plan to release this change in three phases.
- (this commit) Check for format widget definitions in format widget
  options as well.
- Modify the format widget defs to be included in the options instead of
  names
- Only check for format widget defs in options and remove the code for
  parsing names
2025-02-07 01:08:20 -06:00
Austin Mroz 86e9f6a4cb Add options to remove additional file outputs
Closes #305
2025-02-07 01:08:20 -06:00
Austin Mroz 0a4462bb1e Display frame count regardless of format
When a format like AnimateDiff or None is selected that do not put
restrictions on frames is used, it is still useful to see the number of
frames available

NOTE: the number of frames will go negative if skip_first_frames or
start time is too high. It's easy to restrict this to 0, but I'm leaving
it in for now as I consider it useful information.
2025-01-30 19:11:37 -06:00
Austin Mroz 38927c5f46 Add deadline option for advanced previews 2025-01-30 17:08:49 -06:00
Austin Mroz 903ecc3a97 start_time precision, vae inputs
While 1 second is a reasonable step for start time, this setting was
causing undesiable rounding and truncating of precision. The precision
has been manually increased to 3 decimal places while maining the 1
second step

The vae input was broken for the ffmpeg nodes and the Load Image (path)
nodes. basic operation is fixed, but the mask output is currently
disabled while in use and will require further attention.
2025-01-30 16:18:20 -06:00
Austin Mroz 76d9fe74f3 Initialize video location callback sooner.
Since the Path and Upload nodes have different processing needs for
source selection, this isn't handled in the common load video code.
Previously, this code was executed after which meant that the initial
state isn't recorded when the common load code triggers callbacks for
each widget.
2025-01-30 13:48:23 -06:00
Austin Mroz b212f7a3bd Calculate loaded information in queryvideo
Generating accurate frame counts becomes fairly involved when other
widgets are modified that affect frame number. In an effort to
centralize this frame count logic, the loaded number of frames is now
calculated on the backed queryvideo call and this number is then
displayed on in the annotation.

Add try/catch loop to the queryvideo call. This failing is expected if
the ComfyUI server is restarting or down and this ensures exception
doesn't propagate and cause issues elsewhere
2025-01-30 13:02:36 -06:00
Austin Mroz 5d98b154a8 Restore the initial callback for Load Video
Nodes that are added, rather than being restored do not have configure
called and thus do not have their callbacks triggered. The addLoadCommon
method used to initialize the Load Video nodes will now explicitly
trigger the callback on every non video widget at the end to ensure it's
done in a unified singular spot.
2025-01-29 16:09:59 -06:00
Austin Mroz 17fc1b9b67 Add annotation if frame_load_cap > loadable
The frame_load_cap widget will now display the actual number of frames
that will be loaded if it differs from the selection

The queryvideo endpoint now wraps its information under a source item.
If information is later added to process other query args, those may can
now be added under a loaded item instead.
2025-01-29 15:54:06 -06:00
Austin Mroz c2449e03dd Add default format resolutions, check force_size
Add default resolutions to each of the load video formats and added
shorhand code for assigning them

force_size is now checked for and a warning is displayed if it is used.
Users not reloading the webpage after installing an update is a
recurring issue.
2025-01-28 14:23:49 -06:00
Austin Mroz a5e362b87e Fix Load formats, allow 0 length cap, add disable
A previous attempt to update the load format code to prevent defaults
from being clobbered was mistakenly added to the wrong function. This
has been fixed.

The callback to restrict widget values to number + modulus now
explicitly always allows 0

frame_load_cap now has an added annotation to disable
2025-01-27 18:36:34 -06:00
Austin Mroz 1b35b85f95 Move initial value callabcks to KVState
Prior commit was flawed, a node is not configured until after all
onNodeCreated fire. Performing callbacks prior to this moment is wasted.

Instead, the KV state code performs this callback but with an added
guard to ensure that buttons aren't clicked.
2025-01-27 18:08:45 -06:00
Austin Mroz 616577a0bd Improve callback ordering
The ordering for adding callbacks for node functionality was ill thought
out. This both made initial loads unreliable and resulted in many places
in the code were unnecessary delays were added with
requestAnimationFrame or setTimeout.

Remove the callback from key/value setup. This was causing buttons to be
clicked and was merely masking issues elsewhere.

Refactor _addVideoPreview back in. The video preview code was briefly
used for the implementation of latent previews, but the released code
uses images and the separation no longer has purpose.
2025-01-27 17:29:05 -06:00
Austin Mroz 460c90afd1 Don't remap image load args in preview requests
Functioning server code was in place to pull image_load_cap and
skip_first_images when processing previews in the Load Images nodes, but
these args where being redirected to function on the images after they
have been converted into a video. This was causing issues, so this
remapping has been disabled.

Resolves #368

Added a check to ensure a format input exists on load nodes before
trying to initialize it.
2025-01-27 00:23:16 -06:00
Austin Mroz b85ead786c Fix annotated number conversion
The type of an annotated widget has been changed to BOOLEAN so that it
isn't a known Litegraph type, but is still a valid type for widget
conversion. This will require further testing to ensure it doesn't break
anything.

Annotated numbers converted from floats can now connect to both INT and
FLOAT types.
See #365

Fixed a bug where Load Formats prevented a node from being cloned

Known issue: Cloning a Load Video (Upload) node with alt+drag seemingly
triggers the file upload dialogue.
2025-01-25 15:31:37 -06:00
Austin Mroz 775b931f64 Load format isolation, aspect ratio tracking
Load formats provided by VHS are now stored separate from those other
extensions can potentially provide. This ensures the formats built in to
VHS can't get clobbered by other devs blindly copying VHS code.

Aspect ratio is again tracked to determine when previews need to be
updated.

Further input tweaks: The 8x step has been removed from dimensions so a
user can opt into other dimensions when no format is selected.
frame_load_cap is now marked as being disabled when set to 0.

A request animation call used to initialize state after widget values
are set has been changed to a timeout. There's some unreliability here
which warrants further investigation, but this is much more reliable for
the interim.
2025-01-25 04:49:21 -06:00
Austin Mroz 2498563e23 Rollback source element usage
HTML source elements claim to provide a way to have different priorities
for videos served. I had hoped that this would provide a way to minimize
the chances that a users configuration would result in previews failing
to display, but from testing, this appears to be quite unreliable.
updating the src on source elements doesn't cause the browser to
recheck which source items are valid and and I noticed requests
persisting after elements have been removed.

Since this update set is already becoming larger than expected, I plan
to revisit this functionality at a later date.

Functionality to skip encoding in the video preview endpoint has been
reduced. This functionality created security concerns by exposing read
access to any file on the users system. Instead, it only displays files
that already can be handled by the native view endpoint and only
executes in the fringe case that a user install is incomplete and ffmpeg
is unavailable.

Further old code related to force_size has been removed. The viewvideo
endpoint will likely be changed in the future as well, but I'm more
cautious of other custom nodes that leverage this endpoint.
2025-01-24 13:22:55 -06:00