Skip to main content

MotionMiner

MotionMiner Logo

Extract videos from Google Motion Photos with ease!

MotionMiner is a powerful Python tool that extracts embedded MP4 videos from Google Motion Photos (JPG files) and converts them to various formats including MP4 and GIF animations.

codecov

🚀 Features

  • Extract MP4 videos from Google Motion Photos
  • Convert to GIF animations with customizable quality settings
  • Batch processing for multiple files
  • Multiple output formats: MP4, GIF, or both
  • Quality presets for GIF output (tiny, low, medium, high)
  • File structure analysis to examine Motion Photo internals
  • Cross-platform support (Windows, macOS, Linux)

📋 Requirements

  • Python 3.6+
  • FFmpeg (for video conversion)

🛠️ Installation

Method 1: Install from PyPI (Recommended)

pip install motionminer

Method 2: Install from Source

git clone https://github.com/yourusername/motionminer.git
cd motionminer
pip install -e .

Step 2: Install FFmpeg

FFmpeg is required for video processing. Choose your platform:

Windows

  1. Download FFmpeg from https://ffmpeg.org/download.html
  2. Extract to a folder (e.g., C:\ffmpeg)
  3. Add the bin folder to your system PATH
  4. Test installation: ffmpeg -version

macOS

# Using Homebrew
brew install ffmpeg

# Using MacPorts
port install ffmpeg

Linux (Ubuntu/Debian)

sudo apt update
sudo apt install ffmpeg

Linux (CentOS/RHEL/Fedora)

# CentOS/RHEL
sudo yum install ffmpeg

# Fedora
sudo dnf install ffmpeg

Step 3: Verify Installation

Test that everything is working:

motionminer --help

Or use the alternative command:

motion-extract --help

🎯 Usage

Basic Usage

Extract MP4 from a single Motion Photo:

motionminer photo.jpg

Extract as GIF animation:

motionminer photo.jpg --gif

Extract both MP4 and GIF:

motionminer photo.jpg --both

Output Options

Specify custom output filename:

motionminer photo.jpg -o my_video.mp4
motionminer photo.jpg -o my_animation.gif --gif

GIF Quality Settings

MotionMiner offers 4 quality presets for GIF output:

Quality Colors File Size Description
--gif-tiny 64 ~1-2MB Maximum compression
--gif-low 128 ~2-3MB Heavy compression, decent quality
--gif-medium 192 ~3-4MB Balanced quality and size (default)
--gif-high 256 ~5-7MB Best quality

Examples:

motionminer photo.jpg --gif-tiny      # Small file size
motionminer photo.jpg --gif-high      # Best quality

Custom GIF Width

Adjust GIF width (height is automatically calculated):

motionminer photo.jpg --gif --gif-width 640

GIF Looping Control

By default, GIFs loop infinitely. Use --gif-no-loop to create a GIF that plays once:

motionminer photo.jpg --gif --gif-no-loop      # GIF plays once
motionminer photo.jpg --gif-high --gif-no-loop # High quality GIF that plays once

Batch Processing

Process all JPG files in a directory:

motionminer photos/ --batch

Batch process with custom output directory:

motionminer photos/ --batch --batch-output extracted_videos/

Batch convert to GIFs:

motionminer photos/ --batch --gif-low

File Analysis

Analyze Motion Photo structure without extracting:

motionminer photo.jpg --analyze

📖 Command Reference

Required Arguments

  • input - Input JPG file or directory containing JPG files

Optional Arguments

  • -o, --output [OUTPUT] - Output file path (auto-generated if not provided)
  • -p, --photo [PATH] - Extract a standalone photo and save it to the specified PATH (PATH is optional, auto-generated if not provided)
  • --mp4 - Extract as MP4 video (default)
  • --gif - Extract as GIF animation
  • --both - Extract both MP4 and GIF
  • --gif-tiny - Extract as tiny GIF (64 colors, ~1-2MB)
  • --gif-low - Extract as low quality GIF (128 colors, ~2-3MB)
  • --gif-medium - Extract as medium quality GIF (192 colors, ~3-4MB)
  • --gif-high - Extract as high quality GIF (256 colors, ~5-7MB)
  • --gif-width - GIF width in pixels (default: 480)
  • --gif-no-loop - Create GIF that plays once instead of looping infinitely
  • --batch - Process all JPG files in input directory
  • --batch-output - Output directory for batch processing
  • --analyze - Analyze file structure without extracting

💡 Examples

Single File Examples

# Extract MP4 from Motion Photo
motionminer IMG_20231201_123456.jpg

# Extract MP4 and standalone JPEG
motionminer IMG_20231201_123456.jpg --photo

# Extract high-quality GIF
motionminer IMG_20231201_123456.jpg --gif-high

# Extract GIF that plays once (no loop)
motionminer IMG_20231201_123456.jpg --gif --gif-no-loop

# Extract both video formats with custom output
motionminer motion_photo.jpg --both -o my_video.mp4

# Extract both video formats and standalone JPEG with custom output
motionminer motion_photo.jpg --both -o my_video.mp4 -p my_photo.jpg

# Analyze file structure
motionminer motion_photo.jpg --analyze

Batch Processing Examples

# Process all photos in current directory
motionminer . --batch

# Process photos and save to specific directory
motionminer photos/ --batch --batch-output extracted/

# Batch convert to tiny GIFs for web use
motionminer photos/ --batch --gif-tiny --batch-output web_gifs/

# Process with custom GIF settings
motionminer photos/ --batch --gif --gif-width 320 --batch-output small_gifs/

# Batch convert to non-looping GIFs
motionminer photos/ --batch --gif-medium --gif-no-loop --batch-output single_play_gifs/

🔧 Troubleshooting

Common Issues

"No embedded MP4 video found"

  • The file might not be a Google Motion Photo
  • Some Motion Photos have different internal structures
  • Use --analyze to examine the file structure

"FFmpeg not found"

  • Make sure FFmpeg is installed and in your system PATH
  • Test with ffmpeg -version in your terminal

"Permission denied"

  • Check file permissions for input files
  • Ensure you have write permissions in the output directory

Getting Help

View all available options:

motionminer --help

📁 Project Structure

MotionMiner/
├── motionminer/        # Main package directory
│   ├── __init__.py     # Package initialization
│   ├── main.py         # Main application entry point
│   ├── cli.py          # Command-line interface
│   ├── extractor.py    # Motion Photo extraction logic
│   ├── converter.py    # Video conversion utilities
│   ├── analyzer.py     # File structure analysis
│   └── config.py       # Configuration and settings
├── tests/              # Test suite
├── pyproject.toml      # Package configuration
├── requirements.txt    # Python dependencies
└── README.md           # This file

🤝 Contributing

Contributions are welcome! Feel free to:

  • Report bugs
  • Suggest new features
  • Submit pull requests
  • Improve documentation

📄 License

This project is licensed under the terms specified in the LICENSE file.

🙏 Acknowledgments

  • Thanks to Google for creating Motion Photos
  • FFmpeg community for excellent video processing tools
  • Python community for amazing libraries

Happy extracting! 🎬✨

Metadata

Release files for motionminer 1.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for motionminer 1.2.0
File Size Uploaded
motionminer-1.2.0.tar.gz 265.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for motionminer 1.2.0
File Interpreter ABI Platform
motionminer-1.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 294.9 kB

Release files / motionminer-1.2.0.tar.gz

Download URL motionminer-1.2.0.tar.gz
Size 265.1 kB
Tags Source
SHA-256 checksum
How to use checksums
362a1e37320b5216ffe976ede02eeb9a7540205106789a7fedc8b3d322c97a06
BLAKE2b-256 checksum
How to use checksums
dfb46b178064d085e8d27abc8ac7bdc37f9313c3ea55ff2ecb566efac9a1f623
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 4, 2026.

Transparency log

Release files / motionminer-1.2.0-py3-none-any.whl

Download URL motionminer-1.2.0-py3-none-any.whl
Size 29.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b78968a9ee12d32b08b27a4f5a52feb2bc94795a9596be35f9716662d259e61b
BLAKE2b-256 checksum
How to use checksums
9e1ecb07927298400c7ee6aa173b60e69718e3947c9286f4a2e406dbebb75512
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 4, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.2.0 This release

2 release files

1.1.0

2 release files

1.0.2

2 release files

1.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page