A desktop application for restoring metadata to photos exported from Google Photos. When you download your library via Google Takeout, the original EXIF data (GPS coordinates, timestamps) is stripped from the images and stored separately in sidecar JSON files. This tool reads those JSON files and writes the metadata back into the image files.
- Restores GPS coordinates (latitude, longitude, altitude) to image EXIF data
- Restores capture timestamps (
DateTime,DateTimeOriginal,DateTimeDigitized) - Supports JPEG and PNG formats
- Preserves existing EXIF fields, only GPS and datetime tags are updated
- Processes entire directory trees recursively
- Non-destructive, outputs to a separate directory, leaving originals untouched
- Real-time progress tracking with a per-file status log
Google Takeout exports each photo alongside a .json file with the same base name. The JSON contains the original capture time and GPS location. This tool:
- Scans the input directory recursively for
.jsonsidecar files - Reads the
title,geoData, andphotoTakenTimefields from each JSON - Locates the corresponding image file
- Writes the metadata into the image's EXIF data
- Saves the updated image to the output directory, preserving the original folder structure
- Rust (stable toolchain)
git clone https://github.com/FrancisPatron/media-metadata-fix.git
cd media-metadata-fix
cargo build --releaseThe compiled binary will be available at target/release/media-metadata-fix.
Run the application:
cargo run --release- Click Browse... next to Input Directory and select the folder containing your Google Takeout export (the folder with your images and their
.jsonsidecars). - Click Browse... next to Output Directory and select where you want the updated files saved.
- Click Process Media.
Progress is shown in real time. Each file is marked as succeeded or failed in the status log. When complete, a summary shows the total number of files processed and any errors encountered.
| Format | Extension |
|---|---|
| JPEG | .jpg, .jpeg |
| PNG | .png |
The tool expects the standard Google Takeout JSON format:
{
"title": "IMG_1234.jpg",
"photoTakenTime": {
"timestamp": "1609459200"
},
"geoData": {
"latitude": 40.7128,
"longitude": -74.0060,
"altitude": 10.5
}
}| Crate | Purpose |
|---|---|
eframe |
GUI framework |
rfd |
Native file/folder picker dialog |
kamadak-exif |
Reading and writing EXIF data |
png |
Decoding and encoding PNG files |
serde_json |
Parsing JSON sidecar files |
chrono |
Timestamp parsing and formatting |
Run the test suite:
cargo testCheck formatting:
cargo fmt -- --checkCI runs on every push to main and on all pull requests (build, test, and format check).
See LICENSE.