return url
- async def get_avatar(self, size=None):
+ async def get_avatar(self, size=None, format=None):
# Check the PostgreSQL database
photo = self._fetch_avatar()
return photo
# Compose the cache key
- key = "accounts:%s:avatar:%s:%s" % (self.uid, self.avatar_hash, size)
+ key = "accounts:%s:avatar:%s:%s:%s" \
+ % (self.uid, self.avatar_hash, format or "N/A", size)
# Try to retrieve something from the cache
avatar = await self.backend.cache.get(key)
return avatar
# Generate a new thumbnail
- avatar = util.generate_thumbnail(photo, size, square=True)
+ avatar = util.generate_thumbnail(photo, size, square=True, format=format)
# Save to cache for 24h
await self.backend.cache.set(key, avatar, 86400)
self.render("error.html", status_code=status_code, message=message, **kwargs)
+ def browser_accepts(self, t):
+ """
+ Checks if type is in Accept: header
+ """
+ accepts = []
+
+ for elem in self.request.headers.get("Accept", "").split(","):
+ # Remove q=N
+ type, delim, q = elem.partition(";")
+
+ accepts.append(type)
+
+ # Check if the filetype is in the list of accepted ones
+ return t in accepts
+
@property
def hostname(self):
# Return hostname in production
class AvatarHandler(base.BaseHandler):
async def get(self, uid):
+ if self.browser_accepts("image/webp"):
+ format = "WEBP"
+ else:
+ format = "JPEG"
+
# Get the desired size of the avatar file
size = self.get_argument("size", None)
self.set_expires(31536000)
# Resize avatar
- avatar = await account.get_avatar(size)
+ avatar = await account.get_avatar(size, format=format)
# If there is no avatar, we serve a default image
if not avatar:
logging.debug("No avatar uploaded for %s" % account)
# Generate a random avatar with only one letter
- avatar = await self._get_avatar(account, size=size)
+ avatar = await self._get_avatar(account, size=size, format=format)
m = magic.Magic(mime=True, uncompress=True)
# Deliver payload
self.finish(avatar)
- async def _get_avatar(self, account, size=None, **args):
+ async def _get_avatar(self, account, size=None, format=None, **args):
letters = account.initials
if size is None:
if size >= 2048:
size = 2048
- print("LETTERS", letters)
-
# Cache key
- key = "avatar:letter:%s:%s" % ("".join(letters), size)
+ key = "avatar:letter:%s:%s:%s" % ("".join(letters), format or "N/A", size)
# Fetch avatar from the cache
- #avatar = await self.backend.cache.get(key)
- avatar = None
+ avatar = await self.backend.cache.get(key)
if not avatar:
avatar = self._make_avatar(letters, size=size, **args)
draw.text((width // 2, height // 2), "".join(letters),
font=font, anchor="mm", fill=COLOUR_DARK)
- return util.generate_thumbnail(image, size, square=True)
+ return util.generate_thumbnail(image, size, square=True, format=format)
class EditHandler(base.BaseHandler):