forked from DIWHY/photovoter_backend
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.5 KiB
87 lines
2.5 KiB
# Third-party
|
|
from wand.image import Image
|
|
import filetype
|
|
|
|
# Built-in
|
|
from os import path, walk
|
|
from sys import argv, stderr
|
|
from shutil import move
|
|
|
|
# update database residing here
|
|
DB_LOCATION = "photovoter.dblite"
|
|
# place compressed images here (needs to exist)
|
|
DEST_STRUNK = "image/"
|
|
# move originals here (needs to exist)
|
|
DEST_ORIGINAL = "original/"
|
|
|
|
|
|
def usage():
|
|
"""Brief usage explanation"""
|
|
print("USAGE: ./{name} /path/to/images".format(name=argv[0]), file=stderr)
|
|
|
|
|
|
def process_pictures():
|
|
"""Process images from the base directory in the first command line argument.
|
|
Place the resized copies to DEST_STRUNK and
|
|
move the originals to DEST_ORIGINAL.
|
|
Return a dict for each image processed for database collection.
|
|
"""
|
|
# walk every pic
|
|
# We only care about files in the root of the path
|
|
# Ignore any nested directories
|
|
(root, _, filenames) = next(walk(argv[1], topdown=True), (None, None, []))
|
|
for filename in filenames:
|
|
# FIXME:what if picture with the same name already exists?
|
|
# skip any non-image files
|
|
if not filetype.image_match(path.join(root, filename)):
|
|
continue
|
|
|
|
# process pictures with wand lib, imagemagick wrapper
|
|
exif = {}
|
|
with Image(filename=path.join(root, filename)) as image:
|
|
exif.update(
|
|
(k[5:], v) for k, v in image.metadata.items() if k.startswith("exif:")
|
|
)
|
|
with image.clone() as cloned:
|
|
cloned.strip() # Q: may damage icc, do we allow that or use smh else?
|
|
cloned.transform(resize="50%") # Q: what do we want here?
|
|
# move them to the processed folder
|
|
cloned.save(filename=path.join(DEST_STRUNK, filename))
|
|
|
|
# move the originals out of the working directory
|
|
# Q: do we strip exif from originals?
|
|
move(path.join(root, filename), DEST_ORIGINAL)
|
|
|
|
# update the database
|
|
pass
|
|
|
|
|
|
def update_database():
|
|
"""Append new image information to the existing database
|
|
or create a new one, if it does not exist yet
|
|
"""
|
|
# make sure the database exists
|
|
# insert new pictures to the image table
|
|
pass
|
|
|
|
|
|
def check_database():
|
|
"""Check if there is a database at DB_LOCATION.
|
|
Just return if there is. If not, create a new one.
|
|
"""
|
|
# db exists?
|
|
# make one
|
|
pass
|
|
|
|
|
|
def main():
|
|
if len(argv) != 2:
|
|
usage()
|
|
exit(1)
|
|
|
|
# process each pic and add it to the database
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|