from FileMetadataExtractor import FileMetadataExtractor import os from RSS import ns import PIL.Image from Tags import Names from time import strptime, strftime class JpegExifExtractor(FileMetadataExtractor): def extract(self, f, item): if not os.path.splitext(f)[1] in (".jpg", ".jpeg"): return i = PIL.Image.open(f) exif = i._getexif() if exif is None: return def setString(exifTag, rdfTag): try: val = exif[exifTag] if val: item[rdfTag] = str(val) except KeyError: pass def setRational(exifTag, rdfTag): try: val = exif[exifTag] if val and len(val) == 2: item[rdfTag] = "%d/%d" % val except KeyError: pass def setDate(exifTag, rdfTag): try: val = exif[exifTag] if val: t = strptime(val, "%Y:%m:%d %H:%M:%S") item[rdfTag] = strftime("%Y-%m-%dT%H:%M:%SZ", t) except KeyError: pass setString (Names['ImageDescription'], (ns.exif, "imageDescription")) setString (Names['ImageDescription'], (ns.rss10, "title")) # TODO: change to desc setString (Names['Artist'], (ns.exif, "artist")) setString (Names['Artist'], (ns.dc, "creator")) setString (Names['DateTime'], (ns.exif, "dateTime")) setDate (Names['DateTime'], (ns.dc, "date")) setString (Names['Copyright'], (ns.dc, "rights")) setRational (Names['ExposureTime'], (ns.exif, "exposureTime")) setRational (Names['FNumber'], (ns.exif, "fNumber")) setString (Names['ISOSpeedRatings'], (ns.exif, "isoSpeedRatings")) setRational (Names['FocalLength'], (ns.exif, "focalLength"))