From 04b7e0cb9b939d062d951926350ea8cfed60ebfc Mon Sep 17 00:00:00 2001 From: Gyrfalcon Date: Fri, 13 May 2016 18:02:45 -0500 Subject: [PATCH] Add thumbnail generation support --- src/dcow/app.py | 4 +++- src/dcow/templates/gallery.html.j2 | 2 +- src/dcow/thumbnails.py | 34 ++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 src/dcow/thumbnails.py diff --git a/src/dcow/app.py b/src/dcow/app.py index b277443..24f4fbe 100644 --- a/src/dcow/app.py +++ b/src/dcow/app.py @@ -1,11 +1,12 @@ from milla.dispatch import routing -from . import gallery +from . import gallery, thumbnails import os import milla.util DEFAULT_CONFIG = { 'gallery.screenshot_dir': 'screenshots', + 'gallery.thumbnail_dir': 'thumbnails', } @@ -28,3 +29,4 @@ class Application(milla.Application): self.dispatcher = r = routing.Router() r.add_route('/', gallery.GalleryController()) + r.add_route('/thumbnails/{image}', thumbnails.ThumbnailController()) diff --git a/src/dcow/templates/gallery.html.j2 b/src/dcow/templates/gallery.html.j2 index 76c7329..eb4f78a 100644 --- a/src/dcow/templates/gallery.html.j2 +++ b/src/dcow/templates/gallery.html.j2 @@ -18,7 +18,7 @@ {% for image in images %}
-{{ image.rsplit('.', 1)[0] }}
diff --git a/src/dcow/thumbnails.py b/src/dcow/thumbnails.py new file mode 100644 index 0000000..a09c395 --- /dev/null +++ b/src/dcow/thumbnails.py @@ -0,0 +1,34 @@ +from PIL import Image, ImageOps +from milla import controllers +import milla +import os +import webob.static + + +class ThumbnailController(milla.controllers.HTTPVerbController): + + CROP_SIZE = (1920, 1080) + THUMB_SIZE = (262, 148) + + def GET(self, request, image): + thumb_dir = request.config['gallery.thumbnail_dir'] + image_dir = request.config['gallery.screenshot_dir'] + screenshot = os.path.join(image_dir, image) + thumbnail = os.path.join(thumb_dir, image) + try: + s_st = os.stat(screenshot) + except OSError: + raise milla.HTTPNotFound + try: + t_st = os.stat(thumbnail) + except OSError: + t_st = None + if not t_st or t_st.st_mtime < s_st.st_mtime: + self.generate_thumbnail(screenshot, thumbnail) + return webob.static.FileApp(thumbnail) + + def generate_thumbnail(self, screenshot, thumbnail): + image = Image.open(screenshot) + thumb = ImageOps.fit(image, self.CROP_SIZE) + thumb.thumbnail(self.THUMB_SIZE) + thumb.save(thumbnail)