use emoji cover for failures

This commit is contained in:
Yuxin Wu
2017-11-29 03:55:09 -08:00
parent 5026cbde84
commit a1fd932a77
4 changed files with 53 additions and 31 deletions
+2 -2
View File
@@ -1,7 +1,7 @@
#!/usr/bin/env python2
# -*- coding: UTF-8 -*-
# File: avatar.py
# Date: Wed Nov 29 03:26:10 2017 -0800
# Date: Wed Nov 29 03:27:16 2017 -0800
# Author: Yuxin Wu <[email protected]>
from PIL import Image
@@ -32,7 +32,7 @@ class AvatarReader(object):
self.avt_use_db = True
else:
logger.warn(
"Avatar database {} not found. Will not use avatar!".format(avt_db))
"Cannot find avatar files. Will not use avatar!")
self._use_avt = False
def get_avatar(self, username):
+11 -5
View File
@@ -1,7 +1,7 @@
#!/usr/bin/env python2
# -*- coding: UTF-8 -*-
# File: libchathelper.py
# Date: Thu Jun 18 00:02:35 2015 +0800
# Date: Wed Nov 29 03:44:54 2017 -0800
# Author: Yuxin Wu <[email protected]>
import base64
@@ -46,13 +46,19 @@ class LibChatHelper(object):
return img, 'jpeg'
elif msg.type == TYPE_EMOJI:
md5 = msg.imgPath
emoji_img, format = self.res.get_emoji_by_md5(md5)
return emoji_img, format
if md5:
emoji_img, format = self.res.get_emoji_by_md5(md5)
return emoji_img, format
else:
return '', ''
elif msg.type == TYPE_CUSTOM_EMOJI:
pq = PyQuery(msg.content)
md5 = pq('emoticonmd5').text()
img, format = self.res.get_emoji(md5, None)
return img, format
if md5:
img, format = self.res.get_emoji(md5, None)
return img, format
else:
return '', ''
else:
return '', ''
+17 -12
View File
@@ -1,7 +1,7 @@
#!/usr/bin/env python2
# -*- coding: UTF-8 -*-
# File: render.py
# Date: Thu Jun 18 00:03:10 2015 +0800
# Date: Wed Nov 29 03:53:55 2017 -0800
# Author: Yuxin Wu <[email protected]>
import os
@@ -33,7 +33,7 @@ TEMPLATES_FILES = {TYPE_MSG: "TP_MSG",
TYPE_IMG: "TP_IMG",
TYPE_SPEAK: "TP_SPEAK",
TYPE_EMOJI: "TP_EMOJI",
TYPE_CUSTOM_EMOJI: "TP_IMG",
TYPE_CUSTOM_EMOJI: "TP_EMOJI",
TYPE_LINK: "TP_MSG"}
TEMPLATES = {k: ensure_unicode(open(os.path.join(STATIC_PATH, '{}.html'.format(v))).read())
for k, v in TEMPLATES_FILES.iteritems()}
@@ -126,16 +126,21 @@ class HTMLRender(object):
# TODO do not show fancybox when no bigimg found
format_dict['img'] = (img, 'jpeg')
return template.format(**format_dict)
elif msg.type == TYPE_EMOJI:
md5 = msg.imgPath
emoji_img, format = self.res.get_emoji_by_md5(md5)
format_dict['emoji_format'] = format
format_dict['emoji_img'] = emoji_img
return template.format(**format_dict)
elif msg.type == TYPE_CUSTOM_EMOJI:
pq = PyQuery(msg.content)
md5 = pq('emoticonmd5').text()
format_dict['img'] = self.res.get_emoji_by_md5(md5)
elif msg.type == TYPE_EMOJI or msg.type == TYPE_CUSTOM_EMOJI:
if 'emoticonmd5' in msg.content:
pq = PyQuery(msg.content)
md5 = pq('emoticonmd5').text()
else:
md5 = msg.imgPath
# TODO md5 could exist in both.
# first is emoji md5, second is image2/ md5
# can use fallback here.
if md5:
emoji_img, format = self.res.get_emoji_by_md5(md5)
format_dict['emoji_format'] = format
format_dict['emoji_img'] = emoji_img
else:
import IPython as IP; IP.embed()
return template.format(**format_dict)
elif msg.type == TYPE_LINK:
content = msg.msg_str()
+23 -12
View File
@@ -1,7 +1,7 @@
#!/usr/bin/env python2
# -*- coding: UTF-8 -*-
# File: res.py
# Date: Wed Nov 29 03:24:17 2017 -0800
# Date: Wed Nov 29 03:43:50 2017 -0800
# Author: Yuxin Wu <[email protected]>
import glob
@@ -196,10 +196,12 @@ class Resource(object):
return big_file
return get_jpg_b64(small_file)
def _get_res_emoji(self, md5, pack_id):
path = self.emoji_dir
if pack_id:
path = os.path.join(path, pack_id)
def _get_res_emoji(self, md5, pack_id, allow_cover=False):
"""
pack_id: can be None
allow_cover: Cover is non-animated. Can be used as a fallback.
"""
path = os.path.join(self.emoji_dir, pack_id or '')
candidates = glob.glob(os.path.join(path, '{}*'.format(md5)))
candidates = [k for k in candidates if not k.endswith('_thumb') \
and not re.match('.*_[0-9]+$', k)]
@@ -210,14 +212,11 @@ class Resource(object):
return None
return f[0]
f = try_use([k for k in candidates if not k.endswith('_cover')])
if f:
return get_file_b64(f), imghdr.what(f)
candidates = [k for k in candidates if (allow_cover or not k.endswith('_cover'))]
# don't try do use cover anymore. cover is not animated
#f = try_use([k for k in candidates if k.endswith('_cover')])
#if f:
#return get_file_b64(f), imghdr.what(f)
for cand in candidates:
if imghdr.what(cand):
return get_file_b64(cand), imghdr.what(cand)
return None, None
def _get_internal_emoji(self, fname):
@@ -226,24 +225,36 @@ class Resource(object):
def get_emoji_by_md5(self, md5):
""" :returns: (b64 img, format)"""
assert md5, md5
if md5 in self.parser.internal_emojis:
# TODO this seems broken
emoji_img, format = self._get_internal_emoji(self.parser.internal_emojis[md5])
logger.warn("Cannot get emoji {}".format(md5))
return None, None
else:
# check cache
img, format = self.emoji_cache.query(md5)
if format:
return img, format
# check resource/emoji/ dir
group = self.parser.emoji_groups.get(md5, None)
emoji_img, format = self._get_res_emoji(md5, group)
if format:
return emoji_img, format
# check url
url = self.parser.emoji_url.get(md5, None)
if url:
emoji_img, format = self.emoji_cache.fetch(md5, url)
if format:
return emoji_img, format
# check resource/emoji dir again, for cover
emoji_img, format = self._get_res_emoji(md5, group, allow_cover=True)
if format:
return emoji_img, format
# first 1k in emoji is encrypted
logger.warn("Cannot get emoji {} in {}".format(md5, group))
return None, None