Skip to content

Commit 21b597a

Browse files
committed
Support reading ComfyUI Save Animated WEBP metadata
1 parent f7272bf commit 21b597a

1 file changed

Lines changed: 112 additions & 1 deletion

File tree

Diffusion.Scanner/Metadata.cs

Lines changed: 112 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -458,9 +458,120 @@ private static FileType GetFileType(Stream stream)
458458
{
459459
IEnumerable<Directory> directories = WebPMetadataReader.ReadMetadata(stream);
460460

461+
var format = MetaFormat.Unknown;
462+
461463
try
462464
{
463-
fileParameters = ReadAutomatic1111Parameters(file, directories);
465+
// Added ComfyUI metadata loading
466+
foreach (var directory in directories)
467+
{
468+
if (directory.Name == "Exif IFD0")
469+
{
470+
foreach (var tag in directory.Tags)
471+
{
472+
switch (tag.Name)
473+
{
474+
case "Make":
475+
// The workflow is stored in the Make tag.
476+
if (!string.IsNullOrEmpty(tag.Description))
477+
{
478+
try
479+
{
480+
// Check if it is JSON format
481+
var makeData = tag.Description.Trim().Substring("workflow:".Length);
482+
if (makeData.StartsWith("{"))
483+
{
484+
format = MetaFormat.ComfyUI;
485+
fileParameters ??= new FileParameters();
486+
fileParameters.Workflow = makeData;
487+
488+
var parser = new ComfyUIParser();
489+
var pnodes = parser.Parse(fileParameters.WorkflowId, fileParameters.Workflow);
490+
fileParameters.Nodes = pnodes;
491+
492+
// Generate WorkflowId
493+
var root = JsonDocument.Parse(makeData);
494+
fileParameters.WorkflowId = GetHashCode(root.RootElement).ToString("X");
495+
}
496+
}
497+
catch (Exception e)
498+
{
499+
Logger.Log($"Error parsing Make tag as ComfyUI workflow: {e.Message}");
500+
}
501+
}
502+
break;
503+
504+
case "Model":
505+
// The Model tag contains prompt data
506+
if (!string.IsNullOrEmpty(tag.Description))
507+
{
508+
try
509+
{
510+
// Check if it is JSON format
511+
var modelData = tag.Description.Trim().Substring("prompt:".Length);
512+
if (modelData.StartsWith("{"))
513+
{
514+
format = MetaFormat.ComfyUI;
515+
var tempParameters = ReadComfyUIParameters($"prompt: {modelData}", false);
516+
517+
if (fileParameters == null)
518+
{
519+
fileParameters = tempParameters;
520+
}
521+
else
522+
{
523+
// If both workflow and prompt exist, the prompt information is merged.
524+
if (tempParameters.Nodes != null)
525+
{
526+
fileParameters.WorkflowId = tempParameters.WorkflowId;
527+
fileParameters.Workflow = tempParameters.Workflow;
528+
fileParameters.Nodes = tempParameters.Nodes;
529+
}
530+
}
531+
}
532+
}
533+
catch (Exception e)
534+
{
535+
Logger.Log($"Error parsing Model tag as ComfyUI prompt: {e.Message}");
536+
}
537+
}
538+
break;
539+
}
540+
}
541+
}
542+
// Check User Comment in Exif SubIFD (supports the conventional A1111 format)
543+
else if (directory.Name == "Exif SubIFD")
544+
{
545+
foreach (var tag in directory.Tags)
546+
{
547+
if (tag.Name == "User Comment")
548+
{
549+
if (tag.Description.StartsWith("{\"prompt\":"))
550+
{
551+
format = MetaFormat.ComfyUI;
552+
var tempParameters = ReadComfyUIParameters(tag.Description, true);
553+
554+
if (fileParameters == null)
555+
{
556+
fileParameters = tempParameters;
557+
}
558+
else
559+
{
560+
fileParameters.WorkflowId = tempParameters.WorkflowId;
561+
fileParameters.Workflow = tempParameters.Workflow;
562+
fileParameters.Nodes = tempParameters.Nodes;
563+
}
564+
}
565+
}
566+
}
567+
}
568+
}
569+
570+
// If ComfyUI metadata is not found, load the legacy A1111 parameters
571+
if (fileParameters == null)
572+
{
573+
fileParameters = ReadAutomatic1111Parameters(file, directories);
574+
}
464575
}
465576
catch (Exception e)
466577
{

0 commit comments

Comments
 (0)