diff --git a/cocoa/inter/app_pe.py b/cocoa/inter/app_pe.py index fe74bc85..18ea41e4 100644 --- a/cocoa/inter/app_pe.py +++ b/cocoa/inter/app_pe.py @@ -6,7 +6,6 @@ # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license -import os.path as op import plistlib import logging import re @@ -48,6 +47,16 @@ class Photo(PhotoBase): raise IOError('The picture %s could not be read' % str(self.path)) return blocks + def _get_exif_timestamp(self): + exifdata = proxy.readExifData_(str(self.path)) + if exifdata: + try: + return exifdata['{Exif}']['DateTimeOriginal'] + except KeyError: + return '' + else: + return '' + class IPhoto(Photo): def __init__(self, path, db_id): diff --git a/cocoalib/cocoa/CocoaProxy.h b/cocoalib/cocoa/CocoaProxy.h index 773c56fa..58614550 100644 --- a/cocoalib/cocoa/CocoaProxy.h +++ b/cocoalib/cocoa/CocoaProxy.h @@ -30,4 +30,5 @@ - (void)destroyPool; - (void)reportCrash:(NSString *)crashReport; - (void)log:(NSString *)s; +- (NSDictionary *)readExifData:(NSString *)imagePath; @end \ No newline at end of file diff --git a/cocoalib/cocoa/CocoaProxy.m b/cocoalib/cocoa/CocoaProxy.m index f6a6a204..31702dba 100644 --- a/cocoalib/cocoa/CocoaProxy.m +++ b/cocoalib/cocoa/CocoaProxy.m @@ -157,4 +157,20 @@ { NSLog(@"%@", s); } + +- (NSDictionary *)readExifData:(NSString *)imagePath +{ + NSDictionary *result = nil; + NSURL* url = [NSURL fileURLWithPath:imagePath]; + CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)url, nil); + if (source != nil) { + CFDictionaryRef metadataRef = CGImageSourceCopyPropertiesAtIndex (source, 0, nil); + if (metadataRef != nil) { + result = [NSDictionary dictionaryWithDictionary:(NSDictionary *)metadataRef]; + CFRelease(metadataRef); + } + CFRelease(source); + } + return result; +} @end \ No newline at end of file diff --git a/core_pe/photo.py b/core_pe/photo.py index f7352011..277ad535 100644 --- a/core_pe/photo.py +++ b/core_pe/photo.py @@ -49,6 +49,15 @@ class Photo(fs.File): self._cached_orientation = 0 return self._cached_orientation + def _get_exif_timestamp(self): + try: + with self.path.open('rb') as fp: + exifdata = exif.get_fields(fp) + return exifdata['DateTimeOriginal'] + except Exception: + logging.info("Couldn't read EXIF of picture: %s", self.path) + return '' + @classmethod def can_handle(cls, path): return fs.File.can_handle(path) and get_file_ext(path[-1]) in cls.HANDLED_EXTS @@ -89,12 +98,7 @@ class Photo(fs.File): if self._get_orientation() in {5, 6, 7, 8}: self.dimensions = (self.dimensions[1], self.dimensions[0]) elif field == 'exif_timestamp': - try: - with self.path.open('rb') as fp: - exifdata = exif.get_fields(fp) - self.exif_timestamp = exifdata['DateTimeOriginal'] - except Exception: - logging.info("Couldn't read EXIF of picture: %s", self.path) + self.exif_timestamp = self._get_exif_timestamp() def get_blocks(self, block_count_per_side): return self._plat_get_blocks(block_count_per_side, self._get_orientation())