Add thumbnail generation support
parent
8e99f4baff
commit
04b7e0cb9b
|
@ -1,11 +1,12 @@
|
||||||
from milla.dispatch import routing
|
from milla.dispatch import routing
|
||||||
from . import gallery
|
from . import gallery, thumbnails
|
||||||
import os
|
import os
|
||||||
import milla.util
|
import milla.util
|
||||||
|
|
||||||
|
|
||||||
DEFAULT_CONFIG = {
|
DEFAULT_CONFIG = {
|
||||||
'gallery.screenshot_dir': 'screenshots',
|
'gallery.screenshot_dir': 'screenshots',
|
||||||
|
'gallery.thumbnail_dir': 'thumbnails',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -28,3 +29,4 @@ class Application(milla.Application):
|
||||||
self.dispatcher = r = routing.Router()
|
self.dispatcher = r = routing.Router()
|
||||||
|
|
||||||
r.add_route('/', gallery.GalleryController())
|
r.add_route('/', gallery.GalleryController())
|
||||||
|
r.add_route('/thumbnails/{image}', thumbnails.ThumbnailController())
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
{% for image in images %}
|
{% for image in images %}
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<a href="{{ static('screenshots/' + image) }}">
|
<a href="{{ static('screenshots/' + image) }}">
|
||||||
<img src="{{ static('screenshots/' + image) }}"
|
<img class="thumbnail" src="{{ url('/thumbnails/' + image) }}"
|
||||||
alt="{{ image.rsplit('.', 1)[0] }}" />
|
alt="{{ image.rsplit('.', 1)[0] }}" />
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -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)
|
Loading…
Reference in New Issue