From 1a655c37e7da1fe8ae0cfdc191416cafe33415d5 Mon Sep 17 00:00:00 2001 From: ppwwyyxx Date: Wed, 7 Jan 2015 23:46:08 +0800 Subject: [PATCH] fix 1048625 --- decrypt_db.sh | 2 +- lib/msg.py | 5 +++-- lib/parser.py | 4 +++- lib/render.py | 30 ++++++++++++++++++------------ lib/res.py | 9 ++++----- lib/static/TP_IMG.html | 2 +- 6 files changed, 30 insertions(+), 22 deletions(-) diff --git a/decrypt_db.sh b/decrypt_db.sh index 3b2977e..91f721f 100755 --- a/decrypt_db.sh +++ b/decrypt_db.sh @@ -1,6 +1,6 @@ #!/bin/bash -e # File: decrypt_db.sh -# Date: Wed Jan 07 22:08:56 2015 +0800 +# Date: Wed Jan 07 22:34:45 2015 +0800 # Author: Yuxin Wu MSGDB=$1 diff --git a/lib/msg.py b/lib/msg.py index d634c36..439ca85 100644 --- a/lib/msg.py +++ b/lib/msg.py @@ -1,7 +1,7 @@ #!/usr/bin/env python2 # -*- coding: UTF-8 -*- # File: msg.py -# Date: Wed Jan 07 22:00:37 2015 +0800 +# Date: Wed Jan 07 23:30:41 2015 +0800 # Author: Yuxin Wu import re @@ -21,13 +21,14 @@ TYPE_LINK = 49 # link share OR file from web TYPE_VOIP = 50 TYPE_WX_VIDEO = 62 # video took by wechat TYPE_SYSTEM = 10000 +TYPE_CUSTOM_EMOJI = 1048625 class WeChatMsg(object): FIELDS = ["msgSvrId","type","isSend","createTime","talker","content","imgPath"] @staticmethod def filter_type(tp): - if tp in [TYPE_SYSTEM] or tp > 10000 or tp < 0: + if tp in [TYPE_SYSTEM]: return True return False diff --git a/lib/parser.py b/lib/parser.py index 7af5ac2..a32bd69 100644 --- a/lib/parser.py +++ b/lib/parser.py @@ -1,7 +1,7 @@ #!/usr/bin/env python2 # -*- coding: UTF-8 -*- # File: parser.py -# Date: Fri Jan 02 23:02:25 2015 +0800 +# Date: Wed Jan 07 23:29:50 2015 +0800 # Author: Yuxin Wu import sqlite3 @@ -58,6 +58,8 @@ SELECT {} FROM message msg = WeChatMsg(row) if not WeChatMsg.filter_type(msg.type): self.msgs_by_talker[msg.talker].append(msg) + #if msg.type > 10000 or msg.type < 0: + #print repr(msg).split('|')[0] self.msgs_by_talker = {self.contacts[k]: sorted(v, key=lambda x: x.createTime) for k, v in self.msgs_by_talker.iteritems()} for k, v in self.msgs_by_talker.iteritems(): diff --git a/lib/render.py b/lib/render.py index cac3ff6..e0e428d 100644 --- a/lib/render.py +++ b/lib/render.py @@ -1,13 +1,14 @@ #!/usr/bin/env python2 # -*- coding: UTF-8 -*- # File: render.py -# Date: Wed Jan 07 22:03:53 2015 +0800 +# Date: Wed Jan 07 23:43:59 2015 +0800 # Author: Yuxin Wu import os import base64 import glob import logging +from pyquery import PyQuery logger = logging.getLogger(__name__) LIB_PATH = os.path.dirname(os.path.abspath(__file__)) @@ -30,6 +31,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_LINK: "TP_MSG"} TEMPLATES = {k: ensure_unicode(open(os.path.join(STATIC_PATH, '{}.html'.format(v))).read()) for k, v in TEMPLATES_FILES.iteritems()} @@ -72,6 +74,7 @@ class HTMLRender(object): def render_msg(self, msg): """ render a message, return the html block""" + # TODO for chatroom, add nickname on avatar sender = u'you ' + msg.get_msg_talker_id() if not msg.isSend else 'me' format_dict = {'sender_label': sender, 'time': msg.createTime } @@ -81,10 +84,7 @@ class HTMLRender(object): format_dict['content'] = self.smiley.replace_smileycode(content) return template.format(**format_dict) - if msg.type not in TEMPLATES: - return fallback() - - template = TEMPLATES[msg.type] + template = TEMPLATES.get(msg.type) if msg.type == TYPE_SPEAK: audio_str, duration = self.res.get_voice_mp3(msg.imgPath) format_dict['voice_duration'] = duration @@ -104,21 +104,27 @@ class HTMLRender(object): return fallback() # TODO do not show fancybox when no bigimg found format_dict['small_img'] = smallimg - format_dict['big_img'] = bigimg + format_dict['big_img'] = (bigimg, 'jpeg') return template.format(**format_dict) elif msg.type == TYPE_EMOJI: - imgpath = msg.imgPath - if imgpath in self.parser.internal_emojis: - emoji_img, format = self.res.get_internal_emoji(self.parser.internal_emojis[imgpath]) + md5 = msg.imgPath + if md5 in self.parser.internal_emojis: + emoji_img, format = self.res.get_internal_emoji(self.parser.internal_emojis[md5]) else: - if imgpath in self.parser.emojis: - group, _ = self.parser.emojis[imgpath] + if md5 in self.parser.emojis: + group, _ = self.parser.emojis[md5] else: group = None - emoji_img, format = self.res.get_emoji(imgpath, group) + emoji_img, format = self.res.get_emoji(md5, group) 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['big_img'] = self.res.get_emoji(md5, None) + format_dict['small_img'] = format_dict['big_img'][0] + return template.format(**format_dict) elif msg.type == TYPE_LINK: content = msg.msg_str() # TODO show a short link with long href, if link too long diff --git a/lib/res.py b/lib/res.py index d4cc38b..30bfe99 100644 --- a/lib/res.py +++ b/lib/res.py @@ -1,7 +1,7 @@ #!/usr/bin/env python2 # -*- coding: UTF-8 -*- # File: res.py -# Date: Wed Jan 07 21:21:39 2015 +0800 +# Date: Wed Jan 07 22:30:40 2015 +0800 # Author: Yuxin Wu import glob @@ -34,8 +34,6 @@ class Resource(object): self.res_dir = res_dir self.img_dir = os.path.join(res_dir, IMG_DIRNAME) self.emoji_dir = os.path.join(res_dir, EMOJI_DIRNAME) - assert os.path.isdir(self.img_dir), \ - "No such directory: {}".format(self.img_dir) self.avt_reader = AvatarReader(self.res_dir) self.init() @@ -52,7 +50,7 @@ class Resource(object): full_path = os.path.join(root, f) key = f[4:-4] # msg_xxxxx.amr assert len(key) == 26, \ - "Error interpreting the protocol, this is a bug!" + "Error interpreting the protocol, this is potentially a bug!" self.speak_data[key] = full_path def get_voice_mp3(self, imgpath): @@ -163,9 +161,10 @@ class Resource(object): if len(candidates) > 1: # annimation candidates = [k for k in candidates if not re.match('.*_[0-9]+$', k)] - # only one file is the gif in need, others are frames and cover + # only one file is the gif in need, others are frames or cover if len(candidates) == 0: # TODO stitch frames to gif + logger.warning("Cannot find emoji: {}".format(md5)) return None, None if not candidates: return None, None diff --git a/lib/static/TP_IMG.html b/lib/static/TP_IMG.html index 1373e5c..46ecb0d 100644 --- a/lib/static/TP_IMG.html +++ b/lib/static/TP_IMG.html @@ -6,7 +6,7 @@