Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

9 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

PhotoTidy

PhotoTidy Banner

A modern photo organization tool for sorting, grouping, and managing your photo library.

Python PySide6 License

Features

πŸ“ Smart Photo Organization

  • Date Sorting - Group photos by year, month, or day
  • Location Sorting - Automatic GPS-based grouping with reverse geocoding
  • Camera Sorting - Organize by camera make/model
  • Manual Location Tagging - Tag photos without GPS data
  • Configurable Location Format - Choose suburb, city, or full address display

🎨 Multiple View Modes

  • Thumbnails - Large preview icons
  • Tiles - Medium icons with metadata
  • List - Compact rows
  • Details - Table view with columns

πŸ” Find & Filter (v2.0.0)

  • Duplicate Finder - Perceptual-hash scan with side-by-side review, auto-mark (keep largest/oldest/newest), and Recycle Bin cleanup
  • Search Bar - Live filter by filename, camera, or location
  • Type & Date Filters - Narrow by file format or date range presets
  • Map View - GPS-tagged photos on an OpenStreetMap map with thumbnail popups

🎬 Video Support (v2.0.0)

  • Load videos alongside photos (MP4, MOV, AVI, MKV, WebM, M4V, WMV, and more)
  • First-frame thumbnails with play badge, duration in the details panel
  • Double-click opens your system video player
  • Sort, group, search, rename, and move/copy videos like photos

🎨 Themes (v2.0.0)

  • Dark (default) and Light themes - switch live in Settings β†’ Display

πŸ› οΈ Photo Management

  • Batch Rename - Custom patterns (date, location, sequence)
  • Move/Copy - Organize into folders with undo support
  • Rotate - Lossless EXIF-based rotation
  • Delete - Move to Recycle Bin (can be restored)
  • Preview - Full-size preview with metadata panel
  • Fullscreen Viewer - Double-click for fullscreen with zoom, pan, and keyboard navigation
  • Explorer-style Selection - Ctrl+click to toggle, Shift+click for ranges
  • Session Restore - Recent folders menu; reopens your last folder on startup

πŸ–ΌοΈ Image Processing (v1.2.0)

  • ⚑ Batch Processing - Chain multiple operations: Resize β†’ Rotate β†’ Rename β†’ Watermark β†’ WebP
  • Mass Resize - Resize by percentage, max dimension, or exact size
  • Text Watermark - Custom text with system fonts, color, and opacity
  • Image Watermark - Use any image as a watermark (logos, signatures)
  • WebP Conversion - Convert to WebP for optimized web uploads
  • Output saved to subfolders (Batch Processed/, Resized/, Watermarked/, WebP/)

πŸ“· Format Support

  • Standard: JPG, PNG, GIF, BMP, TIFF, WebP
  • RAW: CR2, CR3, NEF, ARW, DNG, RAF, ORF, RW2
  • HEIC/HEIF: iPhone photos
  • Video: MP4, MOV, AVI, MKV, WebM, M4V, WMV, MPG, 3GP, MTS

Installation

Requirements

  • Python 3.10 or higher
  • Windows 10/11 (primary), Linux/macOS (experimental)

Quick Start

# Clone the repository
git clone https://github.com/xersbtt/PhotoTidy.git
cd PhotoTidy

# Install dependencies
pip install -r requirements.txt

# Run the application
python main.py

Running Tests

pip install pytest
python -m pytest tests/

Usage

Opening Photos

  • Click πŸ“ File menu to open folder, files, or add folders
  • Drag & drop files or folders onto the window

Keyboard Shortcuts

Shortcut Action
Ctrl+O Open folder
Ctrl+F Focus search bar
Ctrl+A Select all
Ctrl+D Deselect all
Ctrl+Click Toggle photo selection
Shift+Click Select range
Double-click Open fullscreen viewer
Ctrl+Z Undo
Ctrl+1/2/3/4 Switch view mode
F2 Rename selected
F5 Refresh
F1 About
Ctrl+, Settings

In the fullscreen viewer: scroll to zoom, drag to pan, ←/β†’ to navigate, F to fit, 1 for 100%, Esc to close.

Right-Click Menu

Right-click any photo for quick actions:

  • Open File / Show in Explorer
  • Select/Deselect
  • Rename / Set Location
  • Remove from View
  • Delete (Recycle Bin)

Project Structure

PhotoTidy/
β”œβ”€β”€ main.py                  # Application entry point
β”œβ”€β”€ config.py                # Configuration and constants
β”œβ”€β”€ requirements.txt         # Python dependencies
β”œβ”€β”€ LICENSE                  # MIT License
β”œβ”€β”€ README.md
β”œβ”€β”€ CHANGELOG.md
β”œβ”€β”€ assets/
β”‚   β”œβ”€β”€ banner.png           # GitHub banner image
β”‚   └── icon.png             # Application icon
β”œβ”€β”€ core/                    # Core functionality
β”‚   β”œβ”€β”€ photo.py             # Photo/video data model
β”‚   β”œβ”€β”€ metadata.py          # EXIF and video metadata extraction
β”‚   β”œβ”€β”€ thumbnail.py         # Thumbnail generation (with cache cap)
β”‚   β”œβ”€β”€ geocoding.py         # Reverse geocoding
β”‚   β”œβ”€β”€ location_store.py    # Persistent manual location tags
β”‚   β”œβ”€β”€ operations.py        # File operations (move/copy)
β”‚   β”œβ”€β”€ image_processing.py  # Resize, watermark, WebP conversion
β”‚   └── batch_pipeline.py    # Batch processing pipeline engine
β”œβ”€β”€ sorting/                 # Sorting strategies
β”‚   β”œβ”€β”€ base.py              # Base strategy interface
β”‚   β”œβ”€β”€ date_sorter.py       # Date-based sorting
β”‚   β”œβ”€β”€ location_sorter.py   # Location-based sorting
β”‚   β”œβ”€β”€ camera_sorter.py     # Camera-based sorting
β”‚   β”œβ”€β”€ compound_sorter.py   # Multi-criteria sorting
β”‚   β”œβ”€β”€ dynamic_sorter.py    # Dynamic sorting
β”‚   └── grouped.py           # Photo grouping
β”œβ”€β”€ tests/                   # Pytest test suite
β”œβ”€β”€ ui/                      # User interface
β”‚   β”œβ”€β”€ main_window.py       # Main application window
β”‚   β”œβ”€β”€ theme.py             # Dark/light theme system
β”‚   β”œβ”€β”€ toolbar.py           # Toolbar with actions
β”‚   β”œβ”€β”€ search_bar.py        # Search and filter bar
β”‚   β”œβ”€β”€ filter_panel.py      # Filter/sort controls
β”‚   β”œβ”€β”€ group_widget.py      # Photo group display
β”‚   β”œβ”€β”€ photo_thumbnail.py   # Thumbnail widget
β”‚   β”œβ”€β”€ view_items.py        # List/detail view items
β”‚   β”œβ”€β”€ preview_panel.py     # Photo preview
β”‚   β”œβ”€β”€ fullscreen_viewer.py # Fullscreen viewer with zoom/pan
β”‚   β”œβ”€β”€ image_loader.py      # Shared full-res image loading
β”‚   β”œβ”€β”€ metadata_panel.py    # EXIF metadata display
β”‚   β”œβ”€β”€ flow_layout.py       # Flow layout for thumbnails
β”‚   β”œβ”€β”€ rename_dialog.py     # Batch rename dialog
β”‚   β”œβ”€β”€ location_dialog.py   # Location tagging dialog
β”‚   β”œβ”€β”€ duplicates_dialog.py # Duplicate finder dialog
β”‚   β”œβ”€β”€ map_dialog.py        # Map view of GPS photos
β”‚   β”œβ”€β”€ resize_dialog.py     # Batch resize dialog
β”‚   β”œβ”€β”€ watermark_dialog.py  # Watermark dialog
β”‚   β”œβ”€β”€ convert_dialog.py    # WebP conversion dialog
β”‚   β”œβ”€β”€ batch_dialog.py      # Batch processing dialog
β”‚   β”œβ”€β”€ settings_dialog.py   # Settings dialog
β”‚   └── about_dialog.py      # About dialog
└── utils/                   # Utilities
    β”œβ”€β”€ renamer.py           # Batch renaming logic
    β”œβ”€β”€ rotate.py            # Image rotation
    └── hash.py              # File hashing

Dependencies

  • PySide6 - Qt-based GUI framework
  • Pillow - Image processing
  • pillow-heif - HEIC/HEIF support
  • exifread - EXIF metadata extraction
  • rawpy - RAW file processing
  • geopy - Reverse geocoding
  • send2trash - Safe file deletion (Recycle Bin)
  • imagehash - Perceptual hashing for duplicate detection
  • opencv-python-headless - Video thumbnails and metadata

License

This project is licensed under the MIT License - see the LICENSE file for details.

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Acknowledgments

About

Photo organization tool with smart sorting, batch rename, and multiple view modes

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages