Catify is a powerful command-line tool to extract, analyze, and report metadata from images, RAW files, and videos. It detects duplicate files via SHA256, extracts GPS coordinates with direct map links, saves embedded thumbnails, and generates beautiful terminal output or export reports in CSV, JSON, or HTML.
| Feature | Description |
|---|---|
| πΈ Full metadata extraction | Camera make, model, exposure, ISO, datetime, dimensions, and more |
| π GPS extraction | Converts DMS to decimal, provides Google Maps & OpenStreetMap links |
| π Duplicate detection | SHA256 hash comparison across files |
| πΌοΈ Thumbnail extraction | Saves embedded thumbnails to a separate directory |
| π‘οΈ EXIF Sanitization | Automatically escapes non-printable chars and truncates long values (XSS protection) |
| π Rich terminal output | Colorful tables with live progress bar (via rich) |
| π Multiple export formats | CSV, JSON, HTML (viewable in any browser) |
| π Recursive scanning | Process entire folder trees |
| π§Ή Clean & fast | Handles large files efficiently with graceful error handling |
| Category | Extensions | Reader Used |
|---|---|---|
| Images | .jpg .jpeg .tiff .tif |
exifread (full EXIF + thumbnails + GPS) |
| Common image formats | .png .webp .bmp .gif .heic .heif |
Pillow (EXIF + GPS + thumbnails) |
| RAW formats | .raw .cr2 .cr3 .nef .arw .dng |
rawpy (camera, ISO, exposure, dimensions) |
| Video formats | .mp4 .mov .avi .mkv .webm .mts .m2ts |
pymediainfo (track metadata + GPS) |
Formats outside the
exifread/core set require the matching optional dependency below. If it's missing, those files will be reported withERRORstatus instead of being processed.
https://github.com/tc4dy/Catify/releases/tag/Catify
git clone https://github.com/tc4dy/Catify.git
cd Catify| Dependency | Required? | Enables |
|---|---|---|
exifread |
β Required | JPEG/TIFF EXIF parsing |
rich |
β Required | Terminal tables, colors, progress bar |
Pillow |
βοΈ Optional | PNG, WEBP, BMP, GIF, HEIC, HEIF support |
rawpy |
βοΈ Optional | RAW format support (CR2, NEF, ARW, DNG...) |
pymediainfo |
βοΈ Optional | Video metadata & GPS support |
Minimal (JPEG/TIFF only):
pip install exifread richFull (all formats):
pip install exifread rich pillow rawpy pymediainfoπ‘
pymediainfoalso requires the MediaInfo library to be installed on your system (e.g.apt install mediainfoon Debian/Ubuntu, orbrew install media-infoon macOS).
python catify.py --helppython catify.py -i <INPUT> [OPTIONS]| Argument | Description |
|---|---|
-i, --input PATH |
Path to a single file or a directory |
| Option | Description |
|---|---|
-r, --recursive |
Scan subdirectories recursively |
--csv FILE |
Export report to CSV format |
--json FILE |
Export report to JSON format |
--html FILE |
Export report to HTML format |
--thumbs DIR |
Directory to save thumbnails (default: catify_thumbs) |
-v, --verbose |
Print each file name while processing |
--version |
Show version information |
Analyze a single image
python catify.py -i vacation.jpgScan a folder (including subfolders) and generate an HTML report
python catify.py -i ./photos -r --html report.htmlFull export: CSV, JSON, HTML, with custom thumbnail directory and verbose output
python catify.py -i ./images -r --csv metadata.csv --json exif.json --html report.html --thumbs my_thumbs -vOnly show terminal output (no exports)
python catify.py -i DSC_001.jpg /\_____/\
/ o o \
( == ^ == )
) C A T (
( I F Y )
\ ExFin /
'-------'
Catify v2.0.0 β EXIF Metadata Tool | @tc4dy
5 files found, processingβ¦
ββββββββββββββββββββββββββββββ Summary βββββββββββββββββββββββββββββββ
β Total files 5 β
β EXIF OK 4 β
β No EXIF 0 β
β Error 1 β
β Duplicate 2 β
β With GPS 1 β
β Thumbnail 3 β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β photo.jpg OK DUPLICATE β
β /home/user/photos/photo.jpg β
β Size: 2.3 MB Date: 2024-01-15 14:32:10 β
β SHA256: a1b2c3d4e5f6β¦ β
β Same file: /backup/photo.jpg β
β GPS: 41.0082, 28.9784 Google Maps OSM β
β Thumbnail: catify_thumbs/photo_thumb.jpg β
β β
β βββββββββββββββββββββββββββββ EXIF βββββββββββββββββββββββββββββββ β
β β Tag Value β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β Image Make Canon β β
β β Image Model EOS 5D β β
β β EXIF ExposureTime 1/125 β β
β β EXIF FNumber 2.8 β β
β β EXIF ISO 100 β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
| Badge | Meaning |
|---|---|
π’ OK |
Metadata read successfully |
π‘ NO EXIF |
File readable, but no metadata found |
π΄ ERROR |
File couldn't be read (missing dependency or corrupt file) |
π£ DUPLICATE |
File content matches another file (same SHA256) |
Open the generated .html file in any browser. It includes:
- π Summary statistics cards (total files, OK, duplicates, GPS)
- ποΈ Each file with metadata table, GPS links, and thumbnail path
- π Dark theme, responsive layout
All metadata tags become columns β perfect for Excel or data analysis.
Structured data for programmatic use, including GPS coordinates, hashes, and full tag dictionaries.
If a file contains an embedded thumbnail (common in JPEGs) or supports thumbnail generation (via Pillow), Catify saves it as {original_name}_thumb.jpg inside the directory specified by --thumbs (default: catify_thumbs).
| Format group | Thumbnail behavior |
|---|---|
| JPEG/TIFF | Extracted from embedded EXIF thumbnail |
| PNG/WEBP/BMP/GIF/HEIC/HEIF | Generated via Pillow (resized to 160Γ160) |
| RAW | Not supported |
| Video | Not supported |
| Requirement | Notes |
|---|---|
| Python 3.7+ | β |
exifread |
Required |
rich |
Required |
Pillow |
Optional, for common image formats |
rawpy |
Optional, for RAW formats |
pymediainfo + MediaInfo |
Optional, for video formats |
The previous version (V1) has been further developed to offer improved formatting, broader format support, and more comprehensive metadata extraction.