# Write EXIF metadata to text file for pelican.photos plugin. # The original version of this was 100% hard coded script, this version takes arguments to allow you to do more with it as a single install. # The original is here - https://gist.github.com/Jeffmackinnon/92c747b30a873129a28cddacfc61fbe1 import argparse # The library that will parse the arguments. import os from os import listdir from os.path import isdir,isfile, join #import PIL from PIL import Image from PIL.ExifTags import GPSTAGS from PIL.ExifTags import TAGS from fractions import Fraction # Parser parser = argparse.ArgumentParser( prog='exif2txt', usage='%(prog)s [options] path', allow_abbrev=False, description='Write EXIF metadata to text file.', epilog='it\'s my first public CLI python script, please be kind.', ) parser.add_argument('Path', metavar='path', type=str, help='top level path for with the images' ) # # Need to add the parser for what information we want to add for each # # Execute parse_args() args = parser.parse_args() input_path = args.Path # Test to make sure that the Path given is valid. if not os.path.isdir(input_path): print('The path specified does not exist') sys.exit() # The first two functions are borrowed from github user @jpstroop # https://gist.github.com/jpstroop/58a21d02370c8ba34dc8f0fdd4206d70 def _map_key(k): try: return TAGS[k] except KeyError: return GPSTAGS.get(k, k) # Creates a dictionary of image EXIF meta data from an image, borrowed from a github gist def get_exif(image_path): metadata = {} with Image.open(image_path) as i: info = i._getexif() try: [ metadata.__setitem__(_map_key(k), v) for k, v in info.items() ] return metadata except AttributeError: return None # This is from J0el - https://gist.github.com/Jeffmackinnon/92c747b30a873129a28cddacfc61fbe1?permalink_comment_id=4185193#gistcomment-4185193 # A couple of minor tweaks to make it work def exposure(ExposureTime): try: time = float(ExposureTime) if time > 1: return(ExposureTime) else: return( str(Fraction(time).limit_denominator())) except: return(ExposureTime) #Creates a text file with some exif meta data. def write_exif_file(directory): # Open the exif.txt file, create if it doesn't exist, in the current folder. txt = open(directory +'/exif.txt', 'w') for file in os.listdir(directory): # check the files which are end with specific extension # Everything that I want to have EXIF information for is a jpg, but you can add others too. if file.endswith(".jpg"): # Need to iterate through the files in the list and pass each to the image = get_exif(directory +'/'+os.path.join(file)) txt.write( os.path.join(file) + ': ' + str( image.get('Model')) + ' with a ' + str(image.get('LensModel')) + ' - ' + str(exposure(image.get('ExposureTime'))) + 's, ' + # I want to change this to fractions, but it works for now. 'f/' + str(image.get('FNumber')) + ' at ISO-' + str(image.get('ISOSpeedRatings')) + '\n' ) # Close the text file now that we are done with it. txt.close() return None # This walks through the directories and for each it calls the write exif file function for root, subdirectories, files in os.walk(input_path): for subdirectory in subdirectories: print(os.path.join(root, subdirectory)) write_exif_file(os.path.join(root, subdirectory))