Skip to content

Commit f7272bf

Browse files
author
David Khristepher Santos
committed
Add support for ComfyUI workflows in JPEG
1 parent 8674455 commit f7272bf

2 files changed

Lines changed: 73 additions & 21 deletions

File tree

Diffusion.Scanner/ComfyUI.cs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public override int GetHashCode()
2424
{
2525
var hash = Id.GetHashCode();
2626

27-
if(Name != null)
27+
if (Name != null)
2828
{
2929
hash = (hash * 397) ^ Name.GetHashCode();
3030
}
@@ -65,11 +65,20 @@ public class ComfyUIParser
6565
{
6666
if (workflow == null) return null;
6767
var root = JsonDocument.Parse(workflow);
68-
var rootElements = root.RootElement.EnumerateObject().ToDictionary(n => n.Name, n => n.Value);
6968

69+
JsonElement rootElement = root.RootElement;
70+
71+
if (rootElement.TryGetProperty("prompt", out var tempElement))
72+
{
73+
rootElement = tempElement;
74+
}
75+
76+
var rootProperties = rootElement
77+
.EnumerateObject().ToDictionary(n => n.Name, n => n.Value);
78+
7079
var nodes = new List<Node>();
7180

72-
foreach (var element in rootElements)
81+
foreach (var element in rootProperties)
7382
{
7483
var node = new Node();
7584
node.Id = element.Key;

Diffusion.Scanner/Metadata.cs

Lines changed: 61 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
using System.Collections.Concurrent;
22
using System.Text.Json;
33
using System.Text.RegularExpressions;
4-
using MetadataExtractor;
5-
using MetadataExtractor.Formats.Jpeg;
6-
using MetadataExtractor.Formats.Png;
74
using Directory = MetadataExtractor.Directory;
85
using Dir = System.IO.Directory;
96
using System.Globalization;
10-
using System.Reflection.Metadata.Ecma335;
11-
using MetadataExtractor.Formats.WebP;
127
using Diffusion.Common;
138
using System.Text;
14-
using System.Security.Cryptography;
159
using SixLabors.ImageSharp;
10+
using MetadataExtractor;
11+
using MetadataExtractor.Formats.Jpeg;
12+
using MetadataExtractor.Formats.Png;
13+
using MetadataExtractor.Formats.WebP;
14+
using MetadataExtractor.Formats.QuickTime;
1615

1716
namespace Diffusion.IO;
1817

@@ -51,6 +50,7 @@ public enum FileType
5150
PNG,
5251
JPEG,
5352
WebP,
53+
MP4,
5454
Other,
5555
}
5656

@@ -154,11 +154,23 @@ private static FileType GetFileType(Stream stream)
154154
// Some PNGs are JPEGs in disguise, read the magic to make sure we have the correct file type
155155
var fileType = GetFileType(stream);
156156

157+
if (fileType == FileType.Other)
158+
{
159+
if (Path.GetExtension(file).ToLowerInvariant() == ".mp4")
160+
{
161+
fileType = FileType.MP4;
162+
}
163+
}
164+
157165
stream.Seek(0, SeekOrigin.Begin);
158166

159167
// Now, attempt to read the metadata
160168
switch (fileType)
161169
{
170+
case FileType.MP4:
171+
{
172+
break;
173+
}
162174
case FileType.PNG:
163175
{
164176
IEnumerable<Directory> directories = PngMetadataReader.ReadMetadata(stream);
@@ -255,7 +267,7 @@ private static FileType GetFileType(Stream stream)
255267
{
256268
var isJson = tag.Description.Substring("prompt: ".Length).Trim().StartsWith("{");
257269
format = isJson ? MetaFormat.ComfyUI : MetaFormat.EasyDiffusion;
258-
var tempParameters = isJson ? ReadComfyUIParameters(file, tag.Description) : ReadEasyDiffusionParameters(file, directories);
270+
var tempParameters = isJson ? ReadComfyUIParameters(tag.Description) : ReadEasyDiffusionParameters(file, directories);
259271

260272
if (fileParameters == null)
261273
{
@@ -400,6 +412,25 @@ private static FileType GetFileType(Stream stream)
400412
_ => fileParameters
401413
};
402414
}
415+
else
416+
{
417+
if (tag.Description.StartsWith("{\"prompt\":"))
418+
{
419+
format = MetaFormat.ComfyUI;
420+
var tempParameters = ReadComfyUIParameters(tag.Description, true);
421+
422+
if (fileParameters == null)
423+
{
424+
fileParameters = tempParameters;
425+
}
426+
else
427+
{
428+
fileParameters.WorkflowId = tempParameters.WorkflowId;
429+
fileParameters.Workflow = tempParameters.Workflow;
430+
fileParameters.Nodes = tempParameters.Nodes;
431+
}
432+
}
433+
}
403434
break;
404435
}
405436
}
@@ -495,7 +526,7 @@ private static FileType GetFileType(Stream stream)
495526

496527
fileParameters.Width = width;
497528
fileParameters.Height = height;
498-
529+
499530
return fileParameters;
500531
}
501532

@@ -699,27 +730,39 @@ private static int GetHashCode(JsonElement node)
699730

700731

701732

702-
private static FileParameters ReadComfyUIParameters(string file, string description)
733+
private static FileParameters ReadComfyUIParameters(string description, bool isProperJson = false)
703734
{
704735
var fp = new FileParameters();
705736

706737
try
707738
{
708-
var json = description.Substring("prompt: ".Length);
739+
if (!isProperJson)
740+
{
741+
var json = description.Substring("prompt: ".Length);
742+
743+
// fix for errant nodes
744+
json = json.Replace("NaN", "null");
745+
746+
fp.Workflow = json;
709747

710-
// fix for errant nodes
711-
json = json.Replace("NaN", "null");
748+
var root = JsonDocument.Parse(json);
749+
fp.WorkflowId = GetHashCode(root.RootElement).ToString("X");
712750

713-
fp.Workflow = json;
751+
var parser = new ComfyUIParser();
752+
var pnodes = parser.Parse(fp.WorkflowId, fp.Workflow);
714753

715-
var root = JsonDocument.Parse(json);
754+
fp.Nodes = pnodes;
755+
}
756+
else
757+
{
758+
fp.Workflow = description;
716759

717-
fp.WorkflowId = GetHashCode(root.RootElement).ToString("X");
760+
var parser = new ComfyUIParser();
761+
var pnodes = parser.Parse(fp.WorkflowId, fp.Workflow);
718762

719-
var parser = new ComfyUIParser();
720-
var pnodes = parser.Parse(fp.WorkflowId, fp.Workflow);
763+
fp.Nodes = pnodes;
764+
}
721765

722-
fp.Nodes = pnodes;
723766

724767
return fp;
725768
}

0 commit comments

Comments
 (0)