38 lines
1.2 KiB
Python
38 lines
1.2 KiB
Python
import logging
|
|
from pathlib import Path
|
|
from typing import Any, Dict
|
|
from PIL import Image
|
|
from tools.utils import ToolError
|
|
|
|
logger = logging.getLogger("MooseCP")
|
|
|
|
async def handle(args: Dict[str, Any]):
|
|
"""
|
|
Extracts text-based metadata chunks (tEXt, zTXt, iTXt) from a PNG file.
|
|
These often contain AI generation prompts and parameters.
|
|
"""
|
|
path_str = args.get("path")
|
|
if not path_str:
|
|
raise ToolError("Missing path argument")
|
|
|
|
path = Path(path_str)
|
|
|
|
try:
|
|
with Image.open(path) as img:
|
|
# Metadata extraction is specific to PNG format in this implementation
|
|
if img.format != 'PNG':
|
|
raise ToolError("File is not a PNG image.")
|
|
|
|
# Pillow parses PNG text chunks into the .info dictionary
|
|
metadata = img.info
|
|
if not metadata:
|
|
return {"text": "No metadata found in this PNG."}
|
|
|
|
# Format as a simple key: value list
|
|
output = "\n".join([f"{k}: {v}" for k, v in metadata.items()])
|
|
return {"text": f"PNG Metadata:\n{output}"}
|
|
except ToolError:
|
|
raise
|
|
except Exception as e:
|
|
raise ToolError(f"Error reading PNG metadata: {str(e)}")
|