@@ -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