@@ -560,9 +560,120 @@ private static FileType GetFileType(Stream stream)
560560 {
561561 IEnumerable < Directory > directories = WebPMetadataReader . ReadMetadata ( stream ) ;
562562
563+ var format = MetaFormat . Unknown ;
564+
563565 try
564566 {
565- fileParameters = ReadAutomatic1111Parameters ( file , directories ) ;
567+ // Added ComfyUI metadata loading
568+ foreach ( var directory in directories )
569+ {
570+ if ( directory . Name == "Exif IFD0" )
571+ {
572+ foreach ( var tag in directory . Tags )
573+ {
574+ switch ( tag . Name )
575+ {
576+ case "Make" :
577+ // The workflow is stored in the Make tag.
578+ if ( ! string . IsNullOrEmpty ( tag . Description ) )
579+ {
580+ try
581+ {
582+ // Check if it is JSON format
583+ var makeData = tag . Description . Trim ( ) . Substring ( "workflow:" . Length ) ;
584+ if ( makeData . StartsWith ( "{" ) )
585+ {
586+ format = MetaFormat . ComfyUI ;
587+ fileParameters ??= new FileParameters ( ) ;
588+ fileParameters . Workflow = makeData ;
589+
590+ var parser = new ComfyUIParser ( ) ;
591+ var pnodes = parser . Parse ( fileParameters . WorkflowId , fileParameters . Workflow ) ;
592+ fileParameters . Nodes = pnodes ;
593+
594+ // Generate WorkflowId
595+ var root = JsonDocument . Parse ( makeData ) ;
596+ fileParameters . WorkflowId = GetHashCode ( root . RootElement ) . ToString ( "X" ) ;
597+ }
598+ }
599+ catch ( Exception e )
600+ {
601+ Logger . Log ( $ "Error parsing Make tag as ComfyUI workflow: { e . Message } ") ;
602+ }
603+ }
604+ break ;
605+
606+ case "Model" :
607+ // The Model tag contains prompt data
608+ if ( ! string . IsNullOrEmpty ( tag . Description ) )
609+ {
610+ try
611+ {
612+ // Check if it is JSON format
613+ var modelData = tag . Description . Trim ( ) . Substring ( "prompt:" . Length ) ;
614+ if ( modelData . StartsWith ( "{" ) )
615+ {
616+ format = MetaFormat . ComfyUI ;
617+ var tempParameters = ReadComfyUIParameters ( $ "prompt: { modelData } ", false ) ;
618+
619+ if ( fileParameters == null )
620+ {
621+ fileParameters = tempParameters ;
622+ }
623+ else
624+ {
625+ // If both workflow and prompt exist, the prompt information is merged.
626+ if ( tempParameters . Nodes != null )
627+ {
628+ fileParameters . WorkflowId = tempParameters . WorkflowId ;
629+ fileParameters . Workflow = tempParameters . Workflow ;
630+ fileParameters . Nodes = tempParameters . Nodes ;
631+ }
632+ }
633+ }
634+ }
635+ catch ( Exception e )
636+ {
637+ Logger . Log ( $ "Error parsing Model tag as ComfyUI prompt: { e . Message } ") ;
638+ }
639+ }
640+ break ;
641+ }
642+ }
643+ }
644+ // Check User Comment in Exif SubIFD (supports the conventional A1111 format)
645+ else if ( directory . Name == "Exif SubIFD" )
646+ {
647+ foreach ( var tag in directory . Tags )
648+ {
649+ if ( tag . Name == "User Comment" )
650+ {
651+ if ( tag . Description . StartsWith ( "{\" prompt\" :" ) )
652+ {
653+ format = MetaFormat . ComfyUI ;
654+ var tempParameters = ReadComfyUIParameters ( tag . Description , true ) ;
655+
656+ if ( fileParameters == null )
657+ {
658+ fileParameters = tempParameters ;
659+ }
660+ else
661+ {
662+ fileParameters . WorkflowId = tempParameters . WorkflowId ;
663+ fileParameters . Workflow = tempParameters . Workflow ;
664+ fileParameters . Nodes = tempParameters . Nodes ;
665+ }
666+ }
667+ }
668+ }
669+ }
670+ }
671+
672+ // If ComfyUI metadata is not found, load the legacy A1111 parameters
673+ if ( fileParameters == null )
674+ {
675+ fileParameters = ReadAutomatic1111Parameters ( file , directories ) ;
676+ }
566677 }
567678 catch ( Exception e )
568679 {
0 commit comments