From 56b9e7484d5f788b22afccabc0952b2ab717327d Mon Sep 17 00:00:00 2001 From: Jaisen Mathai Date: Thu, 10 Dec 2015 23:07:01 -0800 Subject: [PATCH] gh-28 Refactor Photo module to support unit tests --- elodie/media/photo.py | 53 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/elodie/media/photo.py b/elodie/media/photo.py index f826dbb..02646e8 100644 --- a/elodie/media/photo.py +++ b/elodie/media/photo.py @@ -7,7 +7,9 @@ Photo package that handles all photo operations from datetime import datetime from sys import argv +import imghdr import mimetypes +import LatLon import os import pyexiv2 import re @@ -22,6 +24,7 @@ Photo class for general photo operations """ class Photo(Media): __name__ = 'Photo' + extensions = ('jpg', 'jpeg', 'nef', 'dng', 'gif') """ @param, source, string, The fully qualified path to the photo file @@ -50,6 +53,54 @@ class Photo(Media): return re.search('(\d{2}:\d{2}.\d{2})', key).group(1).replace('.', ':') return None + """ + Get latitude or longitude of photo from EXIF + + @returns, float or None if not present in EXIF or a non-photo file + """ + def get_coordinate(self, type='latitude'): + if(not self.is_valid()): + return None + + key = self.exif_map['longitude'] if type == 'longitude' else self.exif_map['latitude'] + exif = self.get_exif() + + if(key not in exif): + return None + + try: + # this is a hack to get the proper direction by negating the values for S and W + latdir = 1 + if(key == self.exif_map['latitude'] and str(exif[self.exif_map['latitude_ref']].value) == 'S'): + latdir = -1 + londir = 1 + if(key == self.exif_map['longitude'] and str(exif[self.exif_map['longitude_ref']].value) == 'W'): + londir = -1 + + coords = exif[key].value + if(key == 'latitude'): + return float(str(LatLon.Latitude(degree=coords[0], minute=coords[1], second=coords[2]))) * latdir + else: + return float(str(LatLon.Longitude(degree=coords[0], minute=coords[1], second=coords[2]))) * londir + except KeyError: + return None + + """ + Check the file extension against valid file extensions as returned by get_valid_extensions() + + @returns, boolean + """ + def is_valid(self): + source = self.source + + # gh-4 This checks if the source file is an image. + # It doesn't validate against the list of supported types. + if(imghdr.what(source) is None): + return False; + + # we can't use self.__get_extension else we'll endlessly recurse + return os.path.splitext(source)[1][1:].lower() in self.extensions + """ Set the date/time a photo was taken @@ -96,7 +147,7 @@ class Photo(Media): return True """ - Set lat/lon for a photo + Set title for a photo @param, latitude, float, Latitude of the file @param, longitude, float, Longitude of the file