| | import { app } from '../../../scripts/app.js' |
| |
|
| |
|
| | function getVideoMetadata(file) { |
| | return new Promise((r) => { |
| | const reader = new FileReader(); |
| | reader.onload = (event) => { |
| | const videoData = new Uint8Array(event.target.result); |
| | const dataView = new DataView(videoData.buffer); |
| |
|
| | let decoder = new TextDecoder(); |
| | |
| | if (dataView.getUint32(0) == 0x1A45DFA3) { |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | let offset = 4 + 8; |
| | while(offset < videoData.length-16) { |
| | |
| | if (dataView.getUint16(offset) == 0x4487) { |
| | |
| | const name = String.fromCharCode(...videoData.slice(offset-7,offset)); |
| | if (name === "COMMENT") { |
| | let vint = dataView.getUint32(offset+2); |
| | let n_octets = Math.clz32(vint)+1; |
| | if (n_octets < 4) { |
| | let length = (vint >> (8*(4-n_octets))) & ~(1 << (7*n_octets)); |
| | const content = decoder.decode(videoData.slice(offset+2+n_octets, offset+2+n_octets+length)); |
| | const json = JSON.parse(content); |
| | r(json); |
| | return; |
| | } |
| | } |
| | } |
| | offset+=1; |
| | } |
| | } else if (dataView.getUint32(4) == 0x66747970 && dataView.getUint32(8) == 0x69736F6D) { |
| | |
| | |
| | |
| | let offset = videoData.length-4; |
| | while (offset > 16) { |
| | if (dataView.getUint32(offset) == 0x64617461) { |
| | if (dataView.getUint32(offset - 8) == 0xa9636d74) { |
| | let type = dataView.getUint32(offset+4); |
| | let locale = dataView.getUint32(offset+8); |
| | let size = dataView.getUint32(offset-4) - 4*4; |
| | const content = decoder.decode(videoData.slice(offset+12, offset+12+size)); |
| | const json = JSON.parse(content); |
| | r(json); |
| | return; |
| | } |
| | } |
| |
|
| | offset-=1; |
| | } |
| | } else { |
| | console.error("Unknown magic: " + dataView.getUint32(0)) |
| | r(); |
| | return; |
| | } |
| |
|
| | }; |
| |
|
| | reader.readAsArrayBuffer(file); |
| | }); |
| | } |
| | function isVideoFile(file) { |
| | if (file?.name?.endsWith(".webm")) { |
| | return true; |
| | } |
| | if (file?.name?.endsWith(".mp4")) { |
| | return true; |
| | } |
| |
|
| | return false; |
| | } |
| |
|
| | let originalHandleFile = app.handleFile; |
| | app.handleFile = handleFile; |
| | async function handleFile(file) { |
| | if (file?.type?.startsWith("video/") || isVideoFile(file)) { |
| | const videoInfo = await getVideoMetadata(file); |
| | if (videoInfo) { |
| | if (videoInfo.workflow) { |
| |
|
| | app.loadGraphData(videoInfo.workflow); |
| | } |
| | |
| | } |
| | } else { |
| | return await originalHandleFile.apply(this, arguments); |
| | } |
| | } |
| |
|
| | |
| | document.getElementById("comfy-file-input").accept += ",video/webm,video/mp4"; |
| |
|