improve rendering of various types

This commit is contained in:
Yuxin Wu
2025-01-29 01:47:42 -08:00
parent 837a9ef2f7
commit c782325cfa
7 changed files with 85 additions and 27 deletions
+13 -4
View File
@@ -1,7 +1,7 @@
# -*- coding: UTF-8 -*-
import sqlite3
from collections import defaultdict
from collections import defaultdict, Counter
import itertools
from datetime import datetime
import logging
@@ -61,6 +61,7 @@ SELECT username,conRemark,nickname FROM rcontact
"""
SELECT {} FROM message
""".format(','.join(WeChatDBParser.FIELDS)))
unknown_type_cnt = Counter()
for row in db_msgs:
values = self._parse_msg_row(row)
if not values:
@@ -69,6 +70,9 @@ SELECT {} FROM message
# TODO keep system message?
if not WeChatMsg.filter_type(msg.type):
self.msgs_by_chat[msg.chat].append(msg)
if not msg.known_type:
unknown_type_cnt[msg.type] += 1
logger.warning("[Parser] Unhandled messages (type->cnt): {}".format(unknown_type_cnt))
for k, v in self.msgs_by_chat.items():
self.msgs_by_chat[k] = sorted(v, key=lambda x: x.createTime)
@@ -79,9 +83,14 @@ SELECT {} FROM message
userinfo_q = self.cc.execute(""" SELECT id, value FROM userinfo """)
userinfo = dict(userinfo_q)
self.username = userinfo.get(2, None)
if self.username is None:
nickname = userinfo.get(4, None)
if nickname is not None:
self.username = self.contacts_rev.get(nickname, [None])[0]
if self.username is None:
logger.error("Cannot find username in userinfo table!")
self.username = input("Please enter your username:")
assert isinstance(self.username, str), self.username
logger.info("Your username is: {}".format(self.username))
def _parse_imginfo(self):
@@ -120,8 +129,8 @@ SELECT {} FROM message
def _parse(self):
self._parse_userinfo()
self._parse_contact()
self._parse_userinfo() # depend on self.contacts
self._parse_msg()
self._parse_imginfo()
self._parse_emoji()
@@ -140,16 +149,16 @@ SELECT {} FROM message
def _parse_msg_row(self, row):
""" parse a record of message into my format"""
values = dict(zip(WeChatDBParser.FIELDS, row))
values['createTime'] = datetime.fromtimestamp(values['createTime']/ 1000)
try:
values['content'].decode()
except:
logger.warning(f"Invalid byte sequence in message content (type={values['type']})")
logger.warning(f"Invalid byte sequence in message content (type={values['type']}, createTime={values['createTime']})")
values['content'] = 'FAILED TO DECODE'
if values['content']:
values['content'] = ensure_unicode(values['content'])
else:
values['content'] = ''
values['createTime'] = datetime.fromtimestamp(values['createTime']/ 1000)
values['talker'] = values['talker'].decode()
if values['imgPath']: