From 4ebf0b9eda4aaef8d5204362af1c87644e24d800 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Wed, 20 Apr 2022 18:16:11 +0200 Subject: [PATCH] add custom thumbnail backend to store .webp variants --- panikweb/settings.py | 1 + panikweb/utils.py | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/panikweb/settings.py b/panikweb/settings.py index de64a1c..6e0b641 100644 --- a/panikweb/settings.py +++ b/panikweb/settings.py @@ -264,6 +264,7 @@ PROGRAM_PREFIX = 'programme/' EMISSIONS_PREFIX = 'emissions/' NEWSITEMS_PREFIX = 'actus/' +THUMBNAIL_BACKEND = 'panikweb.utils.ThumbnailBackend' COMBO_INITIAL_LOGIN_PAGE_PATH = '/' COMBO_WELCOME_PAGE_PATH = None diff --git a/panikweb/utils.py b/panikweb/utils.py index b36714f..2fef937 100644 --- a/panikweb/utils.py +++ b/panikweb/utils.py @@ -1,5 +1,10 @@ from datetime import datetime, timedelta +import sorl.thumbnail.base +from sorl.thumbnail import default +from sorl.thumbnail.images import ImageFile +from sorl.thumbnail.parsers import parse_geometry + def tofirstdayinisoweek(year, week): # from http://stackoverflow.com/questions/5882405/get-date-from-iso-week-number-in-python @@ -7,3 +12,19 @@ def tofirstdayinisoweek(year, week): if datetime(year, 1, 4).isoweekday() > 4: ret -= timedelta(days=7) return ret + + +class ThumbnailBackend(sorl.thumbnail.base.ThumbnailBackend): + def _create_alternative_resolutions(self, source_image, geometry_string, options, name): + super()._create_alternative_resolutions(source_image, geometry_string, options, name) + # create .webp alternative, to be served to appropriate browsers + ratio = default.engine.get_image_ratio(source_image, options) + geometry = parse_geometry(geometry_string, ratio) + options = options.copy() + options['format'] = 'WEBP' + image = default.engine.create(source_image, geometry, options) + thumbnail_name = '%(file_name)s.webp' % {'file_name': name} + thumbnail = ImageFile(thumbnail_name, default.storage) + default.engine.write(image, options, thumbnail) + size = default.engine.get_image_size(image) + thumbnail.set_size(size) -- 2.39.2