Skip to content

Instantly share code, notes, and snippets.

@ow
Created Aug 5, 2016
Embed
What would you like to do?
#!/usr/bin/env python
# install imagesize: pip install imagesize
import yaml, imagesize
from os import listdir, rename
from os.path import isfile, join, splitext, basename
# configuration
output_file = "prague.yml"
input_file = output_file
image_path = "prague"
extensions= ['jpg', 'png'] # only small caps!
# merge with global image gallery locat
path = join("./src/photos/", image_path)
# extract image files
print('Collecting files...')
files = [f for f in listdir(path) if isfile(join(path, f))]
files = [f for f in files if f[f.rfind('.')+1:].lower() in extensions ]
# rename image files
print('Renaming files...')
new_files = []
for f in files:
if f[f.rfind('-')+1:f.rfind('.')] != 'thumbnail':
# Something breaks in this step
newf = f[:f.rfind('-')] + "-%sx%s" % imagesize.get(join(path, f)) + f[f.rfind('.'):]
rename(join(path, f),join(path, newf))
else:
newf = f
new_files.append(newf)
files = new_files
# helper objects to store gallery data
new_gallery = {}
thumbs = {}
# group gallery data
print('Grouping files...')
for f in files:
filename = f[:f.rfind('-')]
if f[f.rfind('-')+1:f.rfind('.')] == "thumbnail":
thumbs[filename] = f
else:
if filename in new_gallery:
new_gallery[filename].append(f)
else:
new_gallery[filename] = [f]
# find largest image -> set as original
print('Searching for originals and missing thumbnails...')
originals = {}
for image_set in new_gallery:
max_width, max_height = imagesize.get(join(path, new_gallery[image_set][0]))
min_width, min_height = imagesize.get(join(path, new_gallery[image_set][0]))
original = new_gallery[image_set][0]
thumbnail = new_gallery[image_set][0]
for image in new_gallery[image_set]:
width, height = imagesize.get(join(path, image))
if (width*height) > (max_width*max_height):
original = image
if (width*height) < (min_width*min_height):
thumbnail = image
# delete original from list to avoid double entries
del new_gallery[image_set][new_gallery[image_set].index(original)]
originals[image_set] = original
# add thumbnial if not yet in dict (not removed since might still be useful)
if image_set not in thumbs:
thumbs[image_set] = thumbnail
# try to load YAML data
print('Checking existing YAML data...')
if isfile(input_file):
input_gallery = yaml.load(open(input_file, 'r'))
else:
# create empty dummy file
input_gallery = {"pictures": []}
old_gallery = input_gallery['pictures']
# merge two data sets into one
print('Merging YAML data...')
for pic in new_gallery:
found = False
# try to find matching filename
for i in old_gallery:
if pic == i["filename"]:
i["sizes"] = new_gallery[pic]
# include thumbnail if present
if pic in thumbs:
i["thumbnail"] = thumbs[pic]
found = True
if not found:
# create new entry
old_gallery.append({"filename": pic, "sizes": new_gallery[pic], "thumbnail": thumbs[pic], "original": originals[pic]})
# check if path existing
if "picture_path" not in input_gallery:
input_gallery["picture_path"] = image_path
# write to output file
print('Writing YAML data to file...')
with open(output_file, 'w') as f:
f.write( yaml.dump(input_gallery, default_flow_style=False) )
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment