From bf7697afafa9f7f96ab87e4bacff9ff1a43451bd Mon Sep 17 00:00:00 2001 From: ppwwyyxx Date: Fri, 12 Dec 2014 23:15:59 +0800 Subject: [PATCH] add logger --- lib/__init__.py | 6 ++++ lib/avatar.py | 5 +-- lib/parser.py | 15 +++++---- lib/render.py | 23 ++++++------- lib/res.py | 85 +++++++++++++++++++++++++++++++++---------------- 5 files changed, 85 insertions(+), 49 deletions(-) diff --git a/lib/__init__.py b/lib/__init__.py index e69de29..c7a7888 100644 --- a/lib/__init__.py +++ b/lib/__init__.py @@ -0,0 +1,6 @@ + +import logging +logging.basicConfig( + format='\033[1;32m[%(asctime)s %(lineno)d@%(filename)s:%(name)s]\033[0m' + ' %(message)s', + datefmt='%H:%M:%S', level=logging.INFO) diff --git a/lib/avatar.py b/lib/avatar.py index 7c09c2c..6f8d779 100644 --- a/lib/avatar.py +++ b/lib/avatar.py @@ -1,7 +1,7 @@ #!/usr/bin/env python2 # -*- coding: UTF-8 -*- # File: avatar.py -# Date: Sun Nov 23 16:28:00 2014 +0800 +# Date: Fri Dec 12 22:39:37 2014 +0800 # Author: Yuxin Wu import os @@ -13,7 +13,8 @@ from .utils import ensure_bin_str class AvatarReader(object): def __init__(self, res_dir): self.avt_dir = os.path.join(res_dir, 'avatar') - assert os.path.isdir(self.avt_dir), "No such directory {}".format(self.avt_dir) + assert os.path.isdir(self.avt_dir), \ + "No such directory {}".format(self.avt_dir) @staticmethod def get_filename(username): diff --git a/lib/parser.py b/lib/parser.py index 39b8f9d..3c883ce 100644 --- a/lib/parser.py +++ b/lib/parser.py @@ -1,12 +1,14 @@ #!/usr/bin/env python2 # -*- coding: UTF-8 -*- # File: parser.py -# Date: Sun Nov 23 20:44:02 2014 +0800 +# Date: Fri Dec 12 22:35:56 2014 +0800 # Author: Yuxin Wu import sqlite3 from collections import defaultdict import itertools +import logging +logger = logging.getLogger(__name__) from .msg import WeChatMsg from .utils import ensure_unicode @@ -41,7 +43,7 @@ SELECT username,conRemark,nickname FROM rcontact else: self.contacts[username] = ensure_unicode(nickname) - print "Got {} contacts.".format(len(self.contacts)) + logger.info("Got {} contacts.".format(len(self.contacts))) def _parse_msg(self): msgs_tot_cnt = 0 @@ -60,18 +62,19 @@ SELECT {} FROM message for msg in v: msg.talker_name = ensure_unicode(k) msgs_tot_cnt += len(v) - print "Got {} messages in total.".format(msgs_tot_cnt) + logger.info("Got {} messages in total.".format(msgs_tot_cnt)) def _parse_userinfo(self): userinfo_q = self.cc.execute(""" SELECT id, value FROM userinfo """) userinfo = dict(userinfo_q) self.username = userinfo[2] - print "Your username is: {}".format(self.username) + logger.info("Your username is: {}".format(self.username)) def _parse_imginfo(self): imginfo_q = self.cc.execute("""SELECT msgSvrId, bigImgPath FROM ImgInfo2""") - self.imginfo = dict([(k, v) for (k, v) in imginfo_q if not v.startswith('SERVERID://')]) - print "Got {} big images.".format(len(self.imginfo)) + self.imginfo = dict([(k, v) for (k, v) in imginfo_q + if not v.startswith('SERVERID://')]) + logger.info("Got {} big images.".format(len(self.imginfo))) def _find_msg_by_type(self, msgs=None): ret = [] diff --git a/lib/render.py b/lib/render.py index 3a2aa78..99b5808 100755 --- a/lib/render.py +++ b/lib/render.py @@ -1,12 +1,14 @@ #!/usr/bin/env python2 # -*- coding: UTF-8 -*- # File: render.py -# Date: Sun Nov 23 22:57:13 2014 +0800 +# Date: Fri Dec 12 23:15:31 2014 +0800 # Author: Yuxin Wu import os import base64 import eyed3 +import logging +logger = logging.getLogger(__name__) LIB_PATH = os.path.dirname(os.path.abspath(__file__)) CSS_FILE = os.path.join(LIB_PATH, 'static/wx.css') HTML_FILE = os.path.join(LIB_PATH, 'static/template.html') @@ -50,7 +52,7 @@ class HTMLRender(object): # TODO is there a library to use? ret = os.system('sox {} {}'.format(amr_fpath, mp3_file)) if ret != 0: - print "Sox Failed!" + logger.warn("Sox Failed!") return "" mp3_string = open(mp3_file, 'rb').read() duration = eyed3.load(mp3_file).info.time_secs @@ -68,18 +70,13 @@ class HTMLRender(object): voice_duration=duration, voice_str=audio_str) elif msg.type == TYPE_IMG: - img = "" - svrid = msg.msgSvrId - imgpath = msg.imgPath - #bigimg = self.parser.imginfo.get(svrid) - #if bigimg: - #img = self.res.get_img(bigimg, smart=False) - if len(img) == 0: - #print "Big Image Failed: {}".format(bigimg) - img = imgpath.split('_')[-1] - img = self.res.get_img(img) + # imgPath was original THUMBNAIL_DIRPATH://th_xxxxxxxxx + imgpath = msg.imgPath.split('_')[-1] + bigimgpath = self.parser.imginfo.get(msg.msgSvrId) + + bigimg, smallimg = self.res.get_img([imgpath, bigimgpath]) return template.format(sender_label='you' if not msg.isSend else 'me', - img_data=img) + img_data=smallimg) else: raise except: diff --git a/lib/res.py b/lib/res.py index b973cdd..f2efe57 100644 --- a/lib/res.py +++ b/lib/res.py @@ -1,7 +1,7 @@ #!/usr/bin/env python2 # -*- coding: UTF-8 -*- # File: res.py -# Date: Sun Nov 23 21:08:44 2014 +0800 +# Date: Fri Dec 12 23:12:06 2014 +0800 # Author: Yuxin Wu import glob @@ -9,6 +9,8 @@ import os import Image import cStringIO import base64 +import logging +logger = logging.getLogger(__name__) from lib.avatar import AvatarReader @@ -21,6 +23,8 @@ class Resource(object): assert os.path.isdir(res_dir), "No such directory: {}".format(res_dir) self.res_dir = res_dir self.img_dir = os.path.join(res_dir, 'image2') + assert os.path.isdir(self.img_dir), \ + "No such directory: {}".format(self.img_dir) self.avt_reader = AvatarReader(self.res_dir) self.init() @@ -56,38 +60,63 @@ class Resource(object): jpeg_str = buf.getvalue() return base64.b64encode(jpeg_str) - def get_img_file(self, fname, smart): - """ return base64 string""" - dir1, dir2 = fname[:2], fname[2:4] - if not smart: - filename = os.path.join(self.img_dir, dir1, dir2, fname) - if os.path.isfile(filename): - return filename - else: + def get_img_file(self, fnames): + """ fnames: a list of filename to search for + return (filename, filename) of (big, small) image. + could be empty string. + """ + cands = [] + for fname in fnames: + dir1, dir2 = fname[:2], fname[2:4] dirname = os.path.join(self.img_dir, dir1, dir2) if not os.path.isdir(dirname): - print "Directory not found: {}".format(dirname) - return "" - maxf, maxsize = "", 0 + logger.warn("Directory not found: {}".format(dirname)) + continue for f in os.listdir(dirname): if fname in f: full_name = os.path.join(dirname, f) size = os.path.getsize(full_name) - if size > maxsize: - maxsize = size - maxf = full_name - if maxsize == 0: - return "" - else: - return maxf - return "" + if size > 0: + cands.append((full_name, size)) + if not cands: + return ("", "") + cands = sorted(cands, key=lambda x: x[1]) - def get_img(self, fname, smart=True): - img_file = self.get_img_file(fname, smart) - if not img_file.endswith('jpg') or not img_file.startswith('th_'): - im = Image.open(open(img_file, 'rb')) - buf = cStringIO.StringIO() - im.save(buf, 'JPEG', quality=JPEG_QUALITY) - return base64.b64encode(buf.getvalue()) - else: + def name_is_thumbnail(name): + return os.path.basename(name).startswith('th_') \ + and not name.endswith('hd') + if len(cands) == 1: + name = cands[0][0] + if name_is_thumbnail(name): + # thumbnail + return ("", name) + else: + logger.warn("Found big image but not thumbnail: {}".format(fname)) + return (name, "") + big, small = cands[-1], cands[0] + if not name_is_thumbnail(small[0]): + return (big[0], "") + return (big[0], small[0]) + + def get_img(self, fnames): + """ return two base64 jpg string""" + big_file, small_file = self.get_img_file(fnames) + + def get_jpg_b64(img_file): + if not big_file: + return None + if not img_file.endswith('jpg'): + # possibly not jpg + im = Image.open(open(img_file, 'rb')) + buf = cStringIO.StringIO() + im.save(buf, 'JPEG', quality=JPEG_QUALITY) + return base64.b64encode(buf.getvalue()) return Resource.get_file_b64(img_file) + big_file = get_jpg_b64(big_file) + small_file = get_jpg_b64(small_file) + + if big_file and not small_file: + # TODO resize big to a thumbnail + pass + return (big_file, small_file) +