Move createthumbnails.py to scripts folder.
authorphilipp <philipp@7aebc617-e5e2-0310-91dc-80fb5f6d2477>
Tue, 17 Dec 2019 20:22:35 +0000 (20:22 +0000)
committerphilipp <philipp@7aebc617-e5e2-0310-91dc-80fb5f6d2477>
Tue, 17 Dec 2019 20:22:35 +0000 (20:22 +0000)
git-svn-id: http://www.winterrodeln.org/svn/wrpylib/trunk@2868 7aebc617-e5e2-0310-91dc-80fb5f6d2477

scripts/createthumbnails.py [new file with mode: 0755]

diff --git a/scripts/createthumbnails.py b/scripts/createthumbnails.py
new file mode 100755 (executable)
index 0000000..c126980
--- /dev/null
@@ -0,0 +1,145 @@
+#!/usr/bin/python2.7
+# -*- coding: iso-8859-15 -*-
+"""Creates the image thumbnails or icons for sledruns to be used in the sledmap application.
+Can be used in a python session or at the command line.
+
+usage: createthumbnails.py [-h] {thumbnail,icon} inifile [inifile ...]
+
+Creates the image thumbnails or icons for sledruns to be used in the sledmap
+application.
+
+positional arguments:
+  {thumbnail,icon}  thumbnails or icons?
+  inifile           inifile.ini (See:
+                    http://www.winterrodeln.org/trac/wiki/ConfigIni)
+
+optional arguments:
+  -h, --help        show this help message and exit
+
+
+Command line usage:
+$ export LANG=de_AT.utf8
+$ export LC_CTYPE=de_AT.utf8
+$ python createthumbnails.py thumbnail inifile1.ini ...
+$ # or:
+$ python createthumbnails.py icon inifile1.ini ...
+
+One or more .ini configuration files can be given.
+At the end, the following entries have to be present:
+
+    [mysql]
+    host=localhost
+    dbname=philipp_winterrodeln_wiki
+    user_name=philipp_www
+    user_pass=YYYYYY
+
+    [mediawiki]
+    imagedir=/home/philipp/www/winterrodeln.org/mediawiki/images
+
+    [sledmap]
+    sledrunimagedir=/home/philipp/www/winterrodeln.org/karte/mediawiki_images
+    sledrunicondir=/home/philipp/www/winterrodeln.org/karte/mediawiki_icons
+
+"""
+from __future__ import division
+import argparse
+import sys
+import os
+import ConfigParser
+import hashlib
+import MySQLdb
+from PIL import Image, ImageFilter
+
+
+def image_to_icon(im, width, height):
+    """The icon will have a size of width times height and contains a centered sub-part of the image."""
+    if im.size[0]/float(width) > im.size[1]/float(height):
+        # scale image to height
+        im.thumbnail((int(round(im.size[0]*im.size[1]/height)), height), Image.ANTIALIAS)
+        # crop image (left, upper, right (excl), lower (excl))
+        left = (im.size[0]-width)//2
+        im = im.crop((left, 0, left+width, height))
+    else:
+        # scale image to width
+        im.thumbnail((width, int(round(im.size[1]*im.size[0]/width))), Image.ANTIALIAS)
+        # crop image (left, upper, right (excl), lower (excl))
+        upper = (im.size[1]-height)//2
+        im = im.crop((0, upper, width, upper+height))
+    # sharpen
+    im = im.filter(ImageFilter.SHARPEN)
+    return im
+
+
+def image_to_thumbnail(im, width, height):
+    """The thumbnail will have a equal or smaller width and height as given. The aspect ratio stays the same."""
+    im.thumbnail((width, height), Image.ANTIALIAS)
+    im = im.filter(ImageFilter.SHARPEN)
+    return im
+
+
+def update_image_dir(mcon, mediawiki_image_dir, dest_dir, image_function, ignore_existing=True):
+    """Takes all image names from the mysql database (mcon), reads it from mediawiki_image_dir, 
+    processed it as given in the image_function and stores it in the dest_dir with the original filename.
+    It does not delete the images that might be present in dest_dir, but overwrites the images with the 
+    same filenames.
+
+    :param mcon: mysql connection
+    :param mediawiki_image_dir: directory of the mediawiki image directory
+    :param dest_dir: output directory
+    :param image_function: python function that takes a PIL Image as parameter and returns a modified PIL Image.
+    :param ignore_existing: True (default) if already existing image file names in the dest dir should be ignored.
+    """
+    cu = mcon.cursor()
+    sql = "select image from wrsledruncache where image is not null order by image"
+    cu.execute(sql)
+    for image, in cu:
+        image = image.replace(u' ', u'_')
+        # Create md5sum out of the image filename
+        md5 = hashlib.md5()
+        md5.update(image.encode('UTF8'))
+        hd = md5.hexdigest()
+        # Build source and destination path names
+        source_file = os.path.join(mediawiki_image_dir, hd[0], hd[0:2], image)
+        dest_file = os.path.join(dest_dir, image)
+        if ignore_existing and os.path.exists(dest_file): continue
+        print(u'{0}...'.format(image))
+        im = Image.open(source_file)
+        im = image_function(im)
+        im.save(dest_file, "JPEG")
+
+
+def update_image_dir_by_inifile(inifile, mode):
+    """ Same as update_image_dir but reads the arguments from an .ini file.
+
+    :param inifile: filename of an .ini file or a list of .ini files.
+    :param mode: 'thumbnail' or 'icon'
+    """
+    config = ConfigParser.SafeConfigParser()
+    config.read(inifile)
+
+    host = config.get('mysql', 'host')
+    dbname = config.get('mysql', 'dbname')
+    user = config.get('mysql', 'user_name')
+    passwd = config.get('mysql', 'user_pass')
+    mcon = MySQLdb.connect(host=host, db=dbname, user=user, passwd=passwd, charset='utf8')
+
+    mediawiki_image_dir = config.get('mediawiki', 'imagedir')
+    if mode == 'thumbnail':
+        dest_dir = config.get('sledmap', 'sledrunimagedir')
+        image_function = lambda img: image_to_thumbnail(img, 200, 200)
+    elif mode == 'icon':
+        dest_dir = config.get('sledmap', 'sledrunicondir')
+        image_function = lambda img: image_to_icon(img, 80, 80)
+    update_image_dir(mcon, mediawiki_image_dir, dest_dir, image_function)
+
+    mcon.close()
+
+
+if __name__=='__main__':
+    parser = argparse.ArgumentParser(description='Creates the image thumbnails or icons for sledruns to be used in the sledmap application.')
+    parser.add_argument('type', choices=['thumbnail', 'icon'], help='thumbnails or icons?')
+    parser.add_argument('inifile', nargs='+', help='inifile.ini (See: http://www.winterrodeln.org/trac/wiki/ConfigIni)')
+    args = parser.parse_args()
+
+    update_image_dir_by_inifile(args.inifile, args.type)
+