From a49a911e03255ba143f96003dfd8fe956e1d7632 Mon Sep 17 00:00:00 2001
From: KnugiHK <24708955+KnugiHK@users.noreply.github.com>
Date: Thu, 15 Jun 2023 16:19:35 +0800
Subject: [PATCH] Replace image rendered in the HTML to thumbnail if possible
---
Whatsapp_Chat_Exporter/data_model.py | 1 +
Whatsapp_Chat_Exporter/extract.py | 21 +++++++++++++++++++--
Whatsapp_Chat_Exporter/whatsapp.html | 4 ++--
3 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/Whatsapp_Chat_Exporter/data_model.py b/Whatsapp_Chat_Exporter/data_model.py
index 51463f1..5859dc5 100644
--- a/Whatsapp_Chat_Exporter/data_model.py
+++ b/Whatsapp_Chat_Exporter/data_model.py
@@ -61,6 +61,7 @@ class Message():
self.reply = None
self.quoted_data = None
self.caption = None
+ self.thumb = None # Android specific
def to_json(self):
return {
diff --git a/Whatsapp_Chat_Exporter/extract.py b/Whatsapp_Chat_Exporter/extract.py
index ed67227..8d1ea58 100644
--- a/Whatsapp_Chat_Exporter/extract.py
+++ b/Whatsapp_Chat_Exporter/extract.py
@@ -11,6 +11,7 @@ import hmac
from pathlib import Path
from mimetypes import MimeTypes
from hashlib import sha256
+from base64 import b64decode
from Whatsapp_Chat_Exporter.data_model import ChatStore, Message
from Whatsapp_Chat_Exporter.utility import MAX_SIZE, ROW_SIZE, Device, rendering, sanitize_except, determine_day, Crypt
from Whatsapp_Chat_Exporter.utility import brute_force_offset, CRYPT14_OFFSETS
@@ -412,10 +413,14 @@ def media(db, data, media_folder):
file_path,
message_url,
mime_type,
- media_key
+ media_key,
+ file_hash,
+ thumbnail
FROM message_media
INNER JOIN messages
ON message_media.message_row_id = messages._id
+ LEFT JOIN media_hash_thumbnail
+ ON message_media.file_hash = media_hash_thumbnail.media_hash
ORDER BY messages.key_remote_jid ASC"""
)
except sqlite3.OperationalError:
@@ -424,7 +429,9 @@ def media(db, data, media_folder):
file_path,
message_url,
mime_type,
- media_key
+ media_key,
+ file_hash,
+ thumbnail
FROM message_media
INNER JOIN message
ON message_media.message_row_id = message._id
@@ -432,10 +439,14 @@ def media(db, data, media_folder):
ON chat._id = message.chat_row_id
INNER JOIN jid
ON jid._id = chat.jid_row_id
+ LEFT JOIN media_hash_thumbnail
+ ON message_media.file_hash = media_hash_thumbnail.media_hash
ORDER BY jid.raw_string ASC"""
)
content = c.fetchone()
mime = MimeTypes()
+ if not os.path.isdir(f"{media_folder}/thumbnails"):
+ os.mkdir(f"{media_folder}/thumbnails")
while content is not None:
file_path = f"{media_folder}/{content['file_path']}"
message = data[content["key_remote_jid"]].messages[content["message_row_id"]]
@@ -465,6 +476,12 @@ def media(db, data, media_folder):
message.data = "The media is missing"
message.mime = "media"
message.meta = True
+ if content["thumbnail"] is not None:
+ thumb_path = f"{media_folder}/thumbnails/{b64decode(content['file_hash']).hex()}.png"
+ if not os.path.isfile(thumb_path):
+ with open(thumb_path, "wb") as f:
+ f.write(content["thumbnail"])
+ message.thumb = thumb_path
i += 1
if i % 100 == 0:
print(f"Processing media...({i}/{total_row_number})", end="\r")
diff --git a/Whatsapp_Chat_Exporter/whatsapp.html b/Whatsapp_Chat_Exporter/whatsapp.html
index fc960c6..7ddf58c 100644
--- a/Whatsapp_Chat_Exporter/whatsapp.html
+++ b/Whatsapp_Chat_Exporter/whatsapp.html
@@ -128,7 +128,7 @@
{{ msg.data | sanitize_except() }}
{% else %}
{% if "image/" in msg.mime %}
-
+
{% elif "audio/" in msg.mime %}