Sort tool
Go to file
Jaisen Mathai 531f7d2afa Merge pull request #115 from jmathai/add-tests-to-elodiepy-gh-108
gh-108 Add tests for the import_file function in elodie.py
2016-04-20 22:43:36 -07:00
app Update Readme files to include links and information about GUI app 2016-03-20 00:46:31 -07:00
configs Using plistlib to write to plist file for avmetareadwrite 2015-10-21 18:40:50 -07:00
creative gh-63 Add instructions to the Readme for building the GUI app 2016-01-05 00:30:32 -08:00
docs gh-76 Added mock module to docs/requirements.txt 2016-01-19 10:11:34 -08:00
elodie gh-108 Add tests for the import_file function in elodie.py 2016-04-20 22:37:12 -07:00
tools Rename root tests folder to tools to avoid confusion. 2015-12-01 01:03:00 -08:00
.dockerignore Added a Dockerfile 2016-03-01 18:53:20 -08:00
.gitignore gh-99 Add support for Sony ARW format 2016-04-12 23:47:41 -07:00
.pre-commit Fix syntax errors reported by flake8 2016-03-14 21:54:06 -07:00
.travis.yml gh-103 Add lines to .travis.yml to produce coveralls code coverage 2016-04-12 00:59:34 -07:00
Dockerfile Using Debian instead of Alpine 2016-03-02 10:35:07 -08:00
LICENSE Closes gh-42 Add Apache 2 License file 2015-12-23 22:59:47 -08:00
Readme.md gh-103 Add lines to .travis.yml to produce coveralls code coverage 2016-04-12 00:59:34 -07:00
config.ini-sample Add sample config 2015-10-14 23:26:07 -07:00
elodie.py gh-108 Add tests for the import_file function in elodie.py 2016-04-20 22:37:12 -07:00
elodie.spec Add initial screen to add config information 2015-11-19 02:31:32 -08:00
package.json Working electron app bundle 2015-11-02 02:11:53 -08:00
requirements.txt LatLon removed 2016-02-12 22:22:26 +03:00

Readme.md

Hello, I'm Elodie

~~ Your Personal EXIF-based Photo, Video and Audio Assistant ~~

Build Status Scrutinizer Code Quality Coverage Status

Read a 3 part blog post on why I was created and how I can be used with Google Photos.

I work tirelessly to make sure your photos are always sorted and organized so you can focus on more important things. By photos I mean JPEG, DNG, NEF and common video and audio files.

You don't love me yet but you will.

I only do 3 things.

  • Firstly I organize your existing collection of photos.
  • Second I help make it easy for all the photos you haven't taken yet to flow into the exact location they belong.
  • Third but not least I promise to do all this without a yucky propietary database that some friends of mine use.

NOTE: make sure you've installed everything I need before running the commands below. Instructions at the bottom of this page.

Two interfaces, same result

I can be used as a GUI taskbar app or through the command line. My GUI app is great for updating EXIF on existing photos while my command line tools are great for setting up automated jobs.

Read the instructions on building the GUI taskbar app for more information.

See me in action

Updating EXIF of photos using the GUI taskbar app.

IMAGE ALT TEXT

Importing and organizing photos from the command line.

IMAGE ALT TEXT

Updating EXIF of photos from the command line.

IMAGE ALT TEXT

The dream setup I am optimized for

I'm most helpful when I'm fully utilized to keep your photos organized. My parents had ambitious aspirations for me even when I was growing in my momma's belly . They're dreamers and so am I.

Here's dada's (very asynchronous) setup.

  • Specify a folder in his Dropbox to store the organized photo library.
  • Set up a Hazel rule to notify me when photos arrive in ~/Downloads so I can import them.
    • The rule waits 1 minute before processing the photo which gives him a chance to move it elsewhere if it's not something he wants in the library.
  • Use AirDrop to transfer files from his or momma's iPhone to his laptop. That goes to ~/Downloads for the Hazel rule to process.
    • AirDrop is fast, easy for momma to use and once the transfer is finished they don't have to stick around. I'll move it to Dropbox and Dropbox will sync it to their servers.
  • Periodically recategorize photos by fixing their location or date or by adding them to an album.
  • Have a Synology at home set to automatically sync down from Dropbox.

This setup means dada can quickly get photos off his or momma's phone and know that they'll be organized and backed up by the time they're ready to view them.

Let's organize your existing photos

My guess is you've got quite a few photos scattered around. The first thing I'll help you do is to get those photos organized. It doesn't matter if you have hundreds, thousands or tens of thousands of photos; the more the merrier.

Fire up your terminal and run this command which copies your photos into something a bit more structured.

./elodie.py import --destination="/where/i/want/my/photos/to/go" /where/my/photos/are

I'm pretty fast but depending on how many photos you have you might want to grab a snack. When you run this command I'll print out my work as I go along. If you're bored you can open /where/i/want/my/photos/to/go in Finder and watch as I effortlessly copy your photos there.

You'll notice that your photos are now organized by date and location. Some photos do not have proper dates or location information in them. I do my best and in the worst case scenario I'll use the earlier of the files access or modified time. Ideally your photos have dates and location in the EXIF so my work is more accurate.

Don't fret if your photos don't have much EXIF information. I'll show you how you can fix them up later on but let's walk before we run.

Back to your photos. When I'm done you should see something like this. Notice that I've renamed your files by adding the date and time they were taken. This helps keep them in chronological order when using most viewing applications. You'll thank me later.

├── 2015-06-Jun
│   ├── California
│   │   ├── 2015-06-29_16-34-14-img_3900.jpg
│   │   └── 2015-06-29_17-07-06-img_3901.jpg
│   └── Paris
│       └── 2015-06-30_02-40-43-img_3903.jpg
├── 2015-07-Jul
│   ├── Mountain View
│   │   ├── 2015-07-19_17-16-37-img_9426.jpg
│   │   └── 2015-07-24_19-06-33-img_9432.jpg
└── 2015-09-Sep
│   ├── Unknown Location
    │   ├── 2015-09-27_01-41-38-_dsc8705.dng
    │   └── 2015-09-27_01-41-38-_dsc8705.nef

Not too bad, eh? Wait a second, what's Unknown Location? If I'm not able to figure out where a photo was taken I'll place it into a folder named Unknown Location. This typically happens when photos do not have GPS information in their EXIF. You shouldn't see this for photos taken on a smartphone but it's often the case with digital cameras and SLRs. I can help you add GPS information to those photos and get them organized better. Let me show you how.

Reorganize by changing location and dates

If you notice some photos were incorrectly organized you should definitely let me know. In the example above I put two photos into an Unknown Location folder because I didn't find GPS information in their EXIF. To fix this I'll help you add GPS information into the photos' EXIF and then I'll reorganize them.

Tell me where your photos were taken

Run the command below if you want to tell me the photos were taken in Las Vegas. You don't have to type all that in though. It's easier to just type ./elodie.py update --location="Las Vegas, NV" and select and drag the files from OS X Finder into the terminal.

./elodie.py update --location="Las Vegas, NV" /where/i/want/my/photos/to/go/2015-09-Sep/Unknown\ Location/2015-09-27_01-41-38-_dsc8705.dng /where/i/want/my/photos/to/go/2015-09-Sep/Unknown\ Location/2015-09-27_01-41-38-_dsc8705.nef

You should see this after running that command.

└── 2015-09-Sep
│   ├── Las Vegas
    │   ├── 2015-09-27_01-41-38-_dsc8705.dng
    │   └── 2015-09-27_01-41-38-_dsc8705.nef

Tell me when you took your photos

Run the command below if I got the date wrong when organizing your photos. Similarly to the above command you can drag files from Finder into your terminal.

./elodie.py update --time="2015-04-15" /where/i/want/my/photos/to/go/2015-09-Sep/Unknown\ Location/2015-09-27_01-41-38-_dsc8705.dng /where/i/want/my/photos/to/go/2015-09-Sep/Unknown\ Location/2015-09-27_01-41-38-_dsc8705.nef

That will change the date folder like so.

└── 2015-04-Apr
│   ├── Las Vegas
    │   ├── 2015-09-27_01-41-38-_dsc8705.dng
    │   └── 2015-09-27_01-41-38-_dsc8705.nef

You can, of course, ask me to change the location and time. I'll happily update the photos and move them around accordingly.

./elodie.py update --location="Las Vegas, NV" --time="2015-04-15" /where/i/want/my/photos/to/go/2015-09-Sep/Unknown\ Location/2015-09-27_01-41-38-_dsc8705.dng /where/i/want/my/photos/to/go/2015-09-Sep/Unknown\ Location/2015-09-27_01-41-38-_dsc8705.nef

What about photos I take in the future?

Organizing your existing photos is great. But I'd be lying if I said I was the only one who could help you with that. Unlike other programs I put the same effort into keeping your library organized into the future as I have in getting it organized in the first place.

Letting me know when you've got more photos to organize

In order to sort new photos that I haven't already organized I need someone to tell me about them. There's no single way to do this. You could use inotify, cron, Automator or my favorite app - Hazel; it doesn't matter.

If you'd like to let me know of a specific photo or group of photos to add to your library you would run one of the following command. Use fully qualified paths for everything since you won't be running this manually.

# I can import a single file into your library.
./elodie.py import --destination="/where/i/want/my/photo/to/go" /full/path/to/file.jpg

# I can also import all the photos from a directory into your library.
./elodie.py import --destination="/where/i/want/my/photo/to/go" /where/my/photos/are

Why not use a database?

Look, it's not that I think databases are evil. One of my friends is a database. It's just that I've been doing this for a long time and I've always used a database for it. In the end they're more trouble than they're worth. I should have listened to my mother when she told me to not date a database.

It's a lot more work to organize photos without a database. No wonder everyone else uses them. But your happiness is my happiness. If a little elbow grease on my part makes you happy then I'm glad to do it.

A bit on how I do all this without a database

Every photo is essentially a database. So it's more accurate to say I use the thousands of tiny databases you already have and use them to organize your photos.

I'm simple. I put a photo into its proper location. I can update a photo to have the right date or location. The latter triggers the first; creating a nice tidy loop of organizational goodness.

I don't do anything else so don't bother asking.

Install everything you need

You'll need to clone this repository and install a few dependencies. Let's start by cloning.

git clone https://github.com/jmathai/elodie.git

The commands on this page assume you're running them from the root of this repository. I don't have any submodules but you'll need to install the following packages.

pip install -r requirements.txt

You'll need to install exiftool pyexiv2 using homebrew on OSX. If you're running another operating system you're sort of on your own but my pal Google should be able to help. Some folks may be able to simply run these commands. Installing boost is a drag and can take up to 30 minutes. Don't say I didn't warn you.

brew update
brew install exiftool
brew install boost --build-from-source
brew install pyexiv2

On Debian and Ubuntu you can install dependencies using apt-get.

apt-get install libimage-exiftool-perl
apt-get install python-pyexiv2

On Fedora / Redhat you can install dependencies using dnf (fedora) or yum (redhat)

dnf install perl-Image-ExifTool
dnf install pyexiv2

On Windows you can download and install pre-built binaries:

If you have problems you can run the following commands which the fine folks at StackOverflow suggested to me once.

Using OpenStreetMap data from MapQuest

I use MapQuest to help me organize your photos by location. You'll need to sign up for a free developer account and get an API key. They give you 15,000 calls per month so I can't do any more than that unless you shell out some big bucks to them. Once I hit my limit the best I'll be able to do is Unknown Location until the following month.

Once you sign up you'll have to get an API key and copy it into a file named ~/.elodie/config.ini. I've included a config.ini-sample file which you can copy to config.ini.