]> git.ipfire.org Git - ipfire.org.git/commitdiff
wiki: Cache thumbnail images in memcache
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 19 Nov 2018 16:57:29 +0000 (16:57 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 19 Nov 2018 16:57:29 +0000 (16:57 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/backend/util.py
src/backend/wiki.py

index ff8248eaed4f1974308a48a3c79deaeef31efe90..89e7f0f52401d9c68948ebbfc894a333b6fb6b89 100644 (file)
@@ -3,6 +3,7 @@
 import random
 import re
 import string
+import unicodedata
 
 def parse_search_query(query):
        q = []
@@ -57,3 +58,15 @@ def random_string(length=8):
        r = (random.choice(input_chars) for i in range(length))
 
        return "".join(r)
+
+def normalize(s):
+       # Remove any non-ASCII characters
+       try:
+               s = unicodedata.normalize("NFKD", s)
+       except TypeError:
+               pass
+
+       # Remove excessive whitespace
+       s = re.sub(r"[^\w]+", " ", s)
+
+       return "-".join(s.split())
index 0689fe499cb8457718fe2062cfe6d65160b0e86a..33ed40405d4004bfae53435bbadde72dd7353aae 100644 (file)
@@ -348,6 +348,22 @@ class File(misc.Object):
                        return bytes(res.data)
 
        def get_thumbnail(self, size):
+               cache_key = "-".join((self.path, util.normalize(self.filename), self.created_at.isoformat(), "%spx" % size))
+
+               # Try to fetch the data from the cache
+               thumbnail = self.memcache.get(cache_key)
+               if thumbnail:
+                       return thumbnail
+
+               # Generate the thumbnail
+               thumbnail = self._generate_thumbnail(size)
+
+               # Put it into the cache for forever
+               self.memcache.set(cache_key, thumbnail)
+
+               return thumbnail
+
+       def _generate_thumbnail(self, size):
                image = PIL.Image.open(io.BytesIO(self.blob))
 
                # Resize the image to the desired resolution