ppwwyyxx 11 gadi atpakaļ
vecāks
revīzija
a3f3cedf7a
5 mainītis faili ar 49 papildinājumiem un 23 dzēšanām
  1. 2 2
      android-interact.sh
  2. 22 4
      lib/msg.py
  3. 21 10
      lib/render.py
  4. 2 1
      lib/res.py
  5. 2 6
      lib/static/avatar.css.tpl

+ 2 - 2
android-interact.sh

@@ -1,6 +1,6 @@
 #!/bin/bash -e
 # File: android-interact.sh
-# Date: Wed Dec 31 23:42:08 2014 +0800
+# Date: Wed Jan 07 21:57:59 2015 +0800
 # Author: Yuxin Wu <[email protected]>
 PROG_NAME=`readlink -f "$0"`
 PROG_DIR=`dirname "$PROG_NAME"`
@@ -45,7 +45,7 @@ elif [[ $1 == "db" || $1 == "res" ]]; then
 	if [[ $1 == "res" ]]; then
 		echo "Pulling resources... this might take a long time..."
 		mkdir -p resource; cd resource
-		for d in image2 voice2 emoji avatar; do
+		for d in image2 voice2 emoji avatar video; do
 			mkdir -p $d; cd $d
 			adb pull $RES_DIR/$chooseUser/$d
 			cd ..

+ 22 - 4
lib/msg.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python2
 # -*- coding: UTF-8 -*-
 # File: msg.py
-# Date: Thu Dec 25 09:56:24 2014 +0800
+# Date: Wed Jan 07 22:00:37 2015 +0800
 # Author: Yuxin Wu <[email protected]>
 
 import re
@@ -14,11 +14,12 @@ TYPE_MSG = 1
 TYPE_IMG = 3
 TYPE_SPEAK = 34
 TYPE_NAMECARD = 42
-TYPE_VIDEO = 43
+TYPE_VIDEO_FILE = 43
 TYPE_EMOJI = 47
 TYPE_LOCATION = 48
 TYPE_LINK = 49  # link share OR file from web
 TYPE_VOIP = 50
+TYPE_WX_VIDEO = 62  # video took by wechat
 TYPE_SYSTEM = 10000
 
 class WeChatMsg(object):
@@ -65,8 +66,10 @@ class WeChatMsg(object):
                         u"No title or url found in TYPE_LINK: {}".format(self.content)
                 return u"FILE:{}".format(title)
             return u"URL:{}".format(url)
-        elif self.type == TYPE_VIDEO:
+        elif self.type == TYPE_VIDEO_FILE:
             return "VIDEO FILE"
+        elif self.type == TYPE_WX_VIDEO:
+            return "WeChat VIDEO"
         elif self.type == TYPE_NAMECARD:
             try:
                 pq = PyQuery(self.content)
@@ -85,9 +88,15 @@ class WeChatMsg(object):
             return u"NAMECARD: {}".format(name)
         elif self.type == TYPE_EMOJI:
             # TODO add emoji name
-            return self.content
+            return self.content_no_first_line
         else:
+            return self.content_no_first_line
+
+    @property
+    def content_no_first_line(self):
+        if not self.is_chatroom():
             return self.content
+        return self.content[self.content.find('\n')+1:]
 
     def __repr__(self):
         ret = u"{}|{}:{}:{}".format(
@@ -105,6 +114,14 @@ class WeChatMsg(object):
     def __lt__(self, r):
         return self.createTime < r.createTime
 
+    def is_chatroom(self):
+        return self.talker.endswith('@chatroom')
+
+    def get_msg_talker_id(self):
+        if not self.is_chatroom():
+            return self.talker
+        return self.content[:self.content.find(':')]
+
     def get_emoji_product_id(self):
         assert self.type == TYPE_EMOJI, "Wrong call to get_emoji_product_id()!"
         pq = PyQuery(self.content)
@@ -112,3 +129,4 @@ class WeChatMsg(object):
         if not emoji:
             return None
         return emoji.attrs['productid']
+

+ 21 - 10
lib/render.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python2
 # -*- coding: UTF-8 -*-
 # File: render.py
-# Date: Fri Jan 02 23:29:32 2015 +0800
+# Date: Wed Jan 07 22:01:33 2015 +0800
 # Author: Yuxin Wu <[email protected]>
 
 import os
@@ -72,7 +72,7 @@ class HTMLRender(object):
 
     def render_msg(self, msg):
         """ render a message, return the html block"""
-        sender = 'you' if not msg.isSend else 'me'
+        sender = u'you ' + msg.get_msg_talker_id() if not msg.isSend else 'me'
         format_dict = {'sender_label': sender,
                        'time': msg.createTime }
         def fallback():
@@ -121,6 +121,7 @@ class HTMLRender(object):
             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
             if content.startswith(u'URL:'):
                 url = content[4:]
                 content = u'URL:<a target="_blank" href="{0}">{0}</a>'.format(url)
@@ -151,19 +152,29 @@ class HTMLRender(object):
                                 messages=u''.join(blocks)
                                )
 
-    def prepare_avatar_css(self, talker_name):
-        avatars = (self.res.get_avatar(self.parser.username),
-                   self.res.get_avatar(talker_name))
-        avatar_css = open(FRIEND_AVATAR_CSS_FILE).read().format(avatars=avatars)
-        self.css_string.append(avatar_css)
+    def prepare_avatar_css(self, talkers):
+        avatar_tpl= ensure_unicode(open(FRIEND_AVATAR_CSS_FILE).read())
+        my_avatar = self.res.get_avatar(self.parser.username)
+        css = avatar_tpl.format(name='me', avatar=my_avatar)
+
+        for talker in talkers:
+            avatar = self.res.get_avatar(talker)
+            css += avatar_tpl.format(name=talker, avatar=avatar)
+        self.css_string.append(css)
 
     def render_msgs(self, msgs):
         """ render msgs of one friend, return a list of html"""
-        talker_name = msgs[0].talker
-        self.prepare_avatar_css(talker_name)
+        talker_id = msgs[0].talker
+        if msgs[0].is_chatroom():
+            talkers = set()
+            for msg in msgs:
+                talkers.add(msg.get_msg_talker_id())
+        else:
+            talkers = set([talker_id])
+        self.prepare_avatar_css(talkers)
 
         logger.info(u"Rendering {} messages of {}({})".format(
-            len(msgs), self.parser.contacts[talker_name], talker_name))
+            len(msgs), self.parser.contacts[talker_id], talker_id))
 
         self.prgs = ProgressReporter("Render", total=len(msgs))
         slice_by_size = MessageSlicerBySize().slice(msgs)

+ 2 - 1
lib/res.py

@@ -1,12 +1,13 @@
 #!/usr/bin/env python2
 # -*- coding: UTF-8 -*-
 # File: res.py
-# Date: Sat Dec 27 00:06:26 2014 +0800
+# Date: Wed Jan 07 21:21:39 2015 +0800
 # Author: Yuxin Wu <[email protected]>
 
 import glob
 import os
 import re
+# TODO: perhaps we don't need to introduce PIL and numpy. libjpeg might be enough
 import Image
 import cStringIO
 import base64

+ 2 - 6
lib/static/avatar.css.tpl

@@ -1,8 +1,4 @@
-.me .avatar {{
+.{name} .avatar {{
 	background-size: 100%;
-	background-image: url("data:image/jpeg;base64,{avatars[0]}");
-}}
-.you .avatar {{
-	background-size: 100%;
-	background-image: url("data:image/jpeg;base64,{avatars[1]}");
+	background-image: url("data:image/jpeg;base64,{avatar}");
 }}