Compare commits

...

1 Commits

Author SHA1 Message Date
bymyself
bf16b965ce [feat] Update audio widgets to support NodeLocatorIds in subgraphs
- Import useWorkflowStore to access executionIdToCurrentId conversion
- Update onNodeOutputsUpdated to convert execution IDs to local node IDs
- Only update audio widgets for nodes in the current graph context
- Add null checks to prevent errors when nodes are not found

This ensures audio outputs from subgraph nodes are properly displayed
in their audio widgets when the subgraph is active.
2025-07-22 21:01:32 -07:00

View File

@@ -9,6 +9,7 @@ import type { ResultItemType } from '@/schemas/apiSchema'
import type { ComfyNodeDef } from '@/schemas/nodeDefSchema' import type { ComfyNodeDef } from '@/schemas/nodeDefSchema'
import type { DOMWidget } from '@/scripts/domWidget' import type { DOMWidget } from '@/scripts/domWidget'
import { useToastStore } from '@/stores/toastStore' import { useToastStore } from '@/stores/toastStore'
import { useWorkflowStore } from '@/stores/workflowStore'
import { api } from '../../scripts/api' import { api } from '../../scripts/api'
import { app } from '../../scripts/app' import { app } from '../../scripts/app'
@@ -142,13 +143,26 @@ app.registerExtension({
} }
}, },
onNodeOutputsUpdated(nodeOutputs: Record<number, any>) { onNodeOutputsUpdated(nodeOutputs: Record<number, any>) {
for (const [nodeId, output] of Object.entries(nodeOutputs)) { const workflowStore = useWorkflowStore()
const node = app.graph.getNodeById(nodeId)
for (const [executionId, output] of Object.entries(nodeOutputs)) {
// Convert execution ID to local node ID for current graph context
const localNodeId = workflowStore.executionIdToCurrentId(executionId)
// Skip if node is not in current graph context
if (!localNodeId) continue
const node = app.graph.getNodeById(localNodeId)
if (!node) continue
if ('audio' in output) { if ('audio' in output) {
// @ts-expect-error fixme ts strict error // @ts-expect-error fixme ts strict error
const audioUIWidget = node.widgets.find( const audioUIWidget = node.widgets.find(
(w) => w.name === 'audioUI' (w) => w.name === 'audioUI'
) as unknown as DOMWidget<HTMLAudioElement, string> ) as unknown as DOMWidget<HTMLAudioElement, string>
if (!audioUIWidget) continue
const audio = output.audio[0] const audio = output.audio[0]
audioUIWidget.element.src = api.apiURL( audioUIWidget.element.src = api.apiURL(
getResourceURL(audio.subfolder, audio.filename, audio.type) getResourceURL(audio.subfolder, audio.filename, audio.type)