248 lines
7.5 KiB
Markdown
248 lines
7.5 KiB
Markdown
# Metadata System Architecture
|
|
|
|
This document describes the architecture of the Metadata System for ComfyUI, explaining key components, data flow, and design choices.
|
|
|
|
## System Overview
|
|
|
|
The metadata system follows a layered architecture with a service facade that coordinates between specialized handlers. This design allows for maximum flexibility, easy extensibility, and clean separation of concerns.
|
|
|
|
```
|
|
┌─────────────────┐
|
|
│ ComfyUI Nodes │
|
|
└────────┬────────┘
|
|
│
|
|
▼
|
|
┌─────────────────┐
|
|
│ MetadataService │
|
|
└────────┬────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────┐
|
|
│ Handlers Layer │
|
|
├─────────────┬───────────┬────────────┬─────────────┤
|
|
│ Embedded │ XMP │ Text File │ Database │
|
|
│ Handler │ Handler │ Handler │ Handler │
|
|
└─────────────┴───────────┴────────────┴─────────────┘
|
|
```
|
|
|
|
## Key Components
|
|
|
|
### 1. MetadataService
|
|
|
|
`MetadataService` is the main entry point that coordinates between different handlers:
|
|
|
|
- **Lazy Initialization**: Handlers are only created when needed
|
|
- **Smart Routing**: Automatically selects appropriate handlers based on file format
|
|
- **Fallback Logic**: Falls back to alternative formats if primary source fails
|
|
- **Unified Interface**: Provides a simple interface for all metadata operations
|
|
|
|
### 2. Handlers
|
|
|
|
Each handler specializes in a specific metadata format:
|
|
|
|
#### BaseHandler
|
|
|
|
`BaseHandler` is an abstract base class that provides:
|
|
- Common logging functionality
|
|
- Error tracking
|
|
- Thread safety with locks
|
|
- Resource management
|
|
- Cleanup through context manager pattern
|
|
|
|
#### EmbeddedMetadataHandler
|
|
|
|
Handles metadata embedded directly within image files:
|
|
- Uses PyExiv2 for supported formats
|
|
- Falls back to ExifTool for additional format support
|
|
- Special handling for formats like PNG and WebP
|
|
- Preserves workflow data in PNG files
|
|
|
|
#### XMPSidecarHandler
|
|
|
|
Manages XMP sidecar files:
|
|
- Follows Metadata Working Group (MWG) standards
|
|
- Handles complex metadata structures with proper RDF encoding
|
|
- Supports intelligent merging of metadata
|
|
- Preserves XMP packet structure
|
|
|
|
#### TxtFileHandler
|
|
|
|
Creates human-readable text files:
|
|
- Supports both machine and human-readable formats
|
|
- Context-aware descriptions for better readability
|
|
- Smart value formatting based on data type
|
|
|
|
#### DatabaseHandler
|
|
|
|
Stores metadata in SQLite database:
|
|
- Structured schema with multiple tables
|
|
- Support for complex queries
|
|
- Efficient storage for bulk operations
|
|
- Optional component that gracefully degrades if unavailable
|
|
|
|
### 3. Utilities
|
|
|
|
Supporting components that enhance the system:
|
|
|
|
#### FormatHandler
|
|
|
|
Detects file formats and their capabilities:
|
|
- Identifies which handler to use
|
|
- Caches format information for performance
|
|
- Handles special cases like PNG metadata structure
|
|
|
|
#### NamespaceManager
|
|
|
|
Manages XMP namespaces:
|
|
- Registers namespaces with PyExiv2
|
|
- Creates ExifTool configuration
|
|
- Ensures consistent namespace usage
|
|
|
|
#### ErrorRecovery
|
|
|
|
Provides recovery strategies for errors:
|
|
- Attempts alternative approaches when operations fail
|
|
- Logs detailed error information
|
|
- Prevents data loss during failures
|
|
|
|
#### WorkflowMetadataProcessor
|
|
|
|
Processes ComfyUI workflow data:
|
|
- Extracts relevant information from workflow JSON
|
|
- Maps node parameters to metadata structure
|
|
- Handles different workflow formats and versions
|
|
|
|
## Metadata Structure
|
|
|
|
The metadata is organized into a structured hierarchy:
|
|
|
|
```
|
|
metadata
|
|
├── basic
|
|
│ ├── title
|
|
│ ├── description
|
|
│ ├── keywords
|
|
│ └── rating
|
|
├── analysis
|
|
│ ├── technical
|
|
│ │ ├── blur
|
|
│ │ ├── noise
|
|
│ │ └── ...
|
|
│ ├── aesthetic
|
|
│ │ ├── composition
|
|
│ │ ├── color_harmony
|
|
│ │ └── ...
|
|
│ └── pyiqa
|
|
│ ├── niqe
|
|
│ ├── musiq
|
|
│ └── ...
|
|
├── ai_info
|
|
│ ├── generation
|
|
│ │ ├── model
|
|
│ │ ├── prompt
|
|
│ │ ├── negative_prompt
|
|
│ │ ├── sampler
|
|
│ │ ├── steps
|
|
│ │ ├── cfg_scale
|
|
│ │ ├── seed
|
|
│ │ └── ...
|
|
│ └── workflow
|
|
│ ├── ...
|
|
└── regions
|
|
├── faces
|
|
│ ├── type
|
|
│ ├── name
|
|
│ ├── area
|
|
│ └── extensions
|
|
└── areas
|
|
├── type
|
|
├── name
|
|
├── area
|
|
└── extensions
|
|
```
|
|
|
|
## Data Flow
|
|
|
|
### Writing Metadata
|
|
|
|
1. User calls `write_metadata()` on MetadataService
|
|
2. Service gets existing metadata (for merging)
|
|
3. Service merges new and existing metadata
|
|
4. For each target format:
|
|
- Service gets the appropriate handler
|
|
- Handler writes format-specific metadata
|
|
5. Service returns success/failure for each target
|
|
|
|
### Reading Metadata
|
|
|
|
1. User calls `read_metadata()` on MetadataService
|
|
2. Service gets format information for the file
|
|
3. Service tries to read from the specified source
|
|
4. If fallback is enabled and primary source fails:
|
|
- Service tries alternative sources in priority order
|
|
5. Service returns the metadata from the successful source
|
|
|
|
## Design Decisions
|
|
|
|
### Lazy Initialization
|
|
|
|
Handlers are only initialized when needed, reducing memory usage and startup time, especially since some handlers have heavy dependencies.
|
|
|
|
### Merging Strategy
|
|
|
|
The system uses a "smart merge" approach:
|
|
- Basic fields: Newer values overwrite older ones
|
|
- Keywords: Combined without duplicates
|
|
- Analysis data: Timestamp-aware merging with score preservation
|
|
- Region data: Overlap detection to avoid duplicates
|
|
|
|
### Human-readable Format
|
|
|
|
The text format is designed to be readable by both humans and machines:
|
|
- Descriptive section headers
|
|
- Context-aware value formatting
|
|
- Unit indicators where appropriate
|
|
- Truncation of very long values with indicators
|
|
|
|
### Error Handling
|
|
|
|
Multi-layered approach to error handling:
|
|
1. Try-except blocks in individual operations
|
|
2. Recovery strategies for common errors
|
|
3. Fallback to alternative formats
|
|
4. Detailed logging for troubleshooting
|
|
|
|
## Extensibility
|
|
|
|
The system is designed for easy extension:
|
|
|
|
### Adding New Handlers
|
|
|
|
1. Create a new class inheriting from BaseHandler
|
|
2. Implement required methods (read_metadata, write_metadata)
|
|
3. Add handler initialization to MetadataService
|
|
|
|
### Adding New Metadata Sections
|
|
|
|
The metadata structure can be extended with new sections without changing the core architecture.
|
|
|
|
### Supporting New File Formats
|
|
|
|
Update FormatHandler to recognize new formats and route them to the appropriate handler.
|
|
|
|
## Performance Considerations
|
|
|
|
- Format information is cached to avoid repeated detection
|
|
- Handlers use lazy loading to initialize only when needed
|
|
- Thread locks ensure thread safety in multi-threaded environments
|
|
- Database uses prepared statements and transactions for efficiency
|
|
|
|
## Future Developments
|
|
|
|
Planned enhancements:
|
|
|
|
- Cloud storage integration
|
|
- WebDAV support for remote file access
|
|
- Enhanced query capabilities
|
|
- Metadata standardization tools
|
|
- AI-based metadata generation |