Skip to content

Commit db2c10b

Browse files
committed
Preview context menu improvements
The Save and Open options are no longer displayed when the original file can not be served. A new option to download the first frame png has been added.
1 parent b5d3a32 commit db2c10b

File tree

2 files changed

+28
-11
lines changed

2 files changed

+28
-11
lines changed

videohelpersuite/nodes.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -344,8 +344,8 @@ def batched_encode(images, vae, frames_per_batch):
344344
output_process = None
345345

346346
# save first frame as png to keep metadata
347-
file = f"{filename}_{counter:05}.png"
348-
file_path = os.path.join(full_output_folder, file)
347+
first_image_file = f"{filename}_{counter:05}.png"
348+
file_path = os.path.join(full_output_folder, first_image_file)
349349
Image.fromarray(tensor_to_bytes(first_image)).save(
350350
file_path,
351351
pnginfo=metadata,
@@ -561,19 +561,18 @@ def pad(image):
561561
#It will be muted unless opened or saved with right click
562562
file = output_file_with_audio
563563

564-
previews = [
565-
{
564+
preview = {
566565
"filename": file,
567566
"subfolder": subfolder,
568567
"type": "output" if save_output else "temp",
569568
"format": format,
570569
"frame_rate": frame_rate,
570+
"workflow": first_image_file
571571
}
572-
]
573572
if num_frames == 1 and 'png' in format and '%03d' in file:
574573
previews[0]['format'] = 'image/png'
575574
previews[0]['filename'] = file.replace('%03d', '001')
576-
return {"ui": {"gifs": previews}, "result": ((save_output, output_files),)}
575+
return {"ui": {"gifs": [preview]}, "result": ((save_output, output_files),)}
577576
@classmethod
578577
def VALIDATE_INPUTS(self, format, **kwargs):
579578
return True

web/js/VHS.core.js

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -896,10 +896,12 @@ function addPreviewOptions(nodeType) {
896896

897897
let url = null
898898
if (previewWidget.videoEl?.hidden == false && previewWidget.videoEl.src) {
899-
//Use full quality video
900-
url = api.apiURL('/view?' + new URLSearchParams(previewWidget.value.params));
901-
//Workaround for 16bit png: Just do first frame
902-
url = url.replace('%2503d', '001')
899+
if (['input', 'output', 'temp'].includes(previewWidget.value.params.type)) {
900+
//Use full quality video
901+
url = api.apiURL('/view?' + new URLSearchParams(previewWidget.value.params));
902+
//Workaround for 16bit png: Just do first frame
903+
url = url.replace('%2503d', '001')
904+
}
903905
} else if (previewWidget.imgEl?.hidden == false && previewWidget.imgEl.src) {
904906
url = previewWidget.imgEl.src;
905907
url = new URL(url);
@@ -917,13 +919,29 @@ function addPreviewOptions(nodeType) {
917919
callback: () => {
918920
const a = document.createElement("a");
919921
a.href = url;
920-
a.setAttribute("download", new URLSearchParams(previewWidget.value.params).get("filename"));
922+
a.setAttribute("download", previewWidget.value.params.filename);
921923
document.body.append(a);
922924
a.click();
923925
requestAnimationFrame(() => a.remove());
924926
},
925927
}
926928
);
929+
if (previewWidget.value.params.workflow) {
930+
let wParams = {...previewWidget.value.params,
931+
filename: previewWidget.value.params.workflow}
932+
let wUrl = api.apiURL('/view?' + new URLSearchParams(wParams));
933+
optNew.push({
934+
content: "Save workflow image",
935+
callback: () => {
936+
const a = document.createElement("a");
937+
a.href = wUrl;
938+
a.setAttribute("download", previewWidget.value.params.workflow);
939+
document.body.append(a);
940+
a.click();
941+
requestAnimationFrame(() => a.remove());
942+
}
943+
});
944+
}
927945
}
928946
const PauseDesc = (previewWidget.value.paused ? "Resume" : "Pause") + " preview";
929947
if(previewWidget.videoEl.hidden == false) {

0 commit comments

Comments
 (0)