Skip to main content

Organize photos and videos by capture date while preserving metadata and resumable workflows.

Project description

DateFrame

PyPI version Tests

DateFrame organizes photo and video libraries around their capture date. It can rename media, repair date metadata, import from iCloud Photos on Windows, keep supported sidecars and Apple Live Photo pairs together, and resume long operations from detailed logs.

Install

Install the published package with Python 3.10 or newer:

pip install dateframe

This installs a single command:

dateframe --help

You do not need to clone this repository to use DateFrame. Cloning is only needed for development or contributing.

Quick Start

Import files directly from iCloud Photos on Windows:

dateframe import-icloud "C:\Users\You\Pictures\iCloud Photos\Photos" "C:\Users\You\Pictures\iCloud-Renamed"

Copy and rename media from a camera folder or export:

dateframe rename --copy "/path/to/originals" "/path/to/renamed"

Write filename dates back into media metadata:

dateframe write-dates "/path/to/renamed"

Commands

Command Purpose
dateframe import-icloud Import and rename media from iCloud Photos for Windows using available iCloud/Windows date metadata.
dateframe rename Copy or move media into timestamp-based filenames using embedded metadata and associated sidecars.
dateframe write-dates Write capture dates from timestamped filenames or sidecars into metadata.
dateframe inspect Inspect a file's available metadata and associated sidecars.
dateframe extensions Count file extensions in a folder or input list.

Use command-specific help for all options:

dateframe rename --help
dateframe import-icloud --help

Media Handling

dateframe rename uses dates found in embedded metadata and supported sidecars. It keeps associated .xmp and .xml sidecars with renamed media, including Sony-style video XML sidecars:

C0001.MP4    -> 2026-03-02T03-20-52.MP4
C0001M01.XML -> 2026-03-02T03-20-52.MP4.M01.XML

Apple Live Photo image/video pairs are confirmed with embedded identifiers through ExifTool, then renamed to a common timestamp:

IMG_1234.JPG -> 2026-03-02T03-20-52.JPG
IMG_1234.MOV -> 2026-03-02T03-20-52.MOV

Logging And Resume

The processing commands (import-icloud, rename, and write-dates) write logs to ./logs by default:

  • A CSV log records per-file results and is the source used to resume.
  • A TXT log records run times, the effective command, interruption state, and summary counts.
  • A periodic checkpoint CSV preserves recent progress if a run is interrupted suddenly.

Resume an interrupted run from its most recent CSV or checkpoint:

dateframe rename --resume-csv "./logs/rename_media_2026-05-22T13-37-05.csv"
dateframe import-icloud --resume-csv "./logs/copy_icloud_2026-05-21T22-54-12_checkpoint.csv"

The latest resumed CSV includes previously recorded history, so it becomes the next file to use when continuing.

iCloud Notes

There are important differences between iCloud export paths:

  • dateframe import-icloud operates on the iCloud Photos folder exposed by the Windows application. It can preserve useful iCloud/Windows date information, but Live Photo video components are not available there when iCloud exposes only the image file.
  • Downloads from iCloud Web may provide Live Photos as image and video pairs, which dateframe rename can identify and keep together. Some exported files may not contain reliable capture-date metadata.

Extended workflow guidance and findings about iCloud exports, Live Photos, metadata sources, and recovery strategies are good candidates for the project wiki.

Requirements

DateFrame itself is installed through pip, but some operations require external tools:

Dependency Used for
ExifTool Writing metadata and confirming Live Photo pairs.
ffmpeg Reading video metadata.
ImageMagick Image metadata access through Wand.

dateframe import-icloud is Windows-only because it uses Windows Shell/iCloud metadata through pywin32. The other commands are designed for Windows, Linux, and macOS when their required external tools are available.

If you only use dateframe import-icloud, you need ExifTool but do not need ffmpeg or ImageMagick.

Safety

Before running a large import or rename operation, test on a small copied sample and inspect the produced CSV/TXT logs. Logs may contain local file paths, filenames, metadata values, and command arguments; redact private information before sharing them publicly.

Keep an independent backup of important media until you have verified the results.

Contributing

Bug reports and pull requests are welcome. See CONTRIBUTING.md for development setup and validation guidance.

For security-sensitive reports, see SECURITY.md.

License

DateFrame is licensed under the GNU General Public License v3.0. See LICENSE.md.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dateframe-0.1.1.tar.gz (60.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dateframe-0.1.1-py3-none-any.whl (55.8 kB view details)

Uploaded Python 3

File details

Details for the file dateframe-0.1.1.tar.gz.

File metadata

  • Download URL: dateframe-0.1.1.tar.gz
  • Upload date:
  • Size: 60.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for dateframe-0.1.1.tar.gz
Algorithm Hash digest
SHA256 86950e5e3b65939fecdd44568c2597e143ebe7768aac52439210c1f566a94d67
MD5 5c619dc462c7c9b070eaff6c34dbb154
BLAKE2b-256 f707e075172b2b07f29b90759f798c5b75e939f6c9d9af3d3dc7eeb6e0e9bb65

See more details on using hashes here.

File details

Details for the file dateframe-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: dateframe-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 55.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for dateframe-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 daa6bf92d26bcf749d9955f83bb7ec2692a94b96eced7119fa9d28f9453ae09b
MD5 78d98b1675cdce5132f06b346eace4f9
BLAKE2b-256 5ae7d1d00b6668b2423e4bc1a4c0e9e062cdbd77f7bad27528e5d0c9d4ec31b0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page