Add date filter for iOS #82

This commit is contained in:
KnugiHK
2024-02-12 18:00:26 +08:00
parent 2466e2542a
commit 2b49ac2e41
2 changed files with 38 additions and 14 deletions

View File

@@ -10,7 +10,7 @@ import glob
from Whatsapp_Chat_Exporter import extract_exported, extract_iphone from Whatsapp_Chat_Exporter import extract_exported, extract_iphone
from Whatsapp_Chat_Exporter import extract, extract_iphone_media from Whatsapp_Chat_Exporter import extract, extract_iphone_media
from Whatsapp_Chat_Exporter.data_model import ChatStore from Whatsapp_Chat_Exporter.data_model import ChatStore
from Whatsapp_Chat_Exporter.utility import Crypt, DbType, check_update, import_from_json from Whatsapp_Chat_Exporter.utility import APPLE_TIME, Crypt, DbType, check_update, import_from_json
from argparse import ArgumentParser, SUPPRESS from argparse import ArgumentParser, SUPPRESS
from datetime import datetime from datetime import datetime
from sys import exit from sys import exit
@@ -250,13 +250,31 @@ def main():
start, end = args.filter_date.split(" - ") start, end = args.filter_date.split(" - ")
start = int(datetime.strptime(start, args.filter_date_format).timestamp()) start = int(datetime.strptime(start, args.filter_date_format).timestamp())
end = int(datetime.strptime(end, args.filter_date_format).timestamp()) end = int(datetime.strptime(end, args.filter_date_format).timestamp())
args.filter_date = f"BETWEEN {start}000 AND {end}000" if start < 1009843200 or end < 1009843200:
print("WhatsApp was developed in 2009...")
exit(1)
if start > end:
print("The start date cannot be a moment after the end date.")
exit(1)
if args.android:
args.filter_date = f"BETWEEN {start}000 AND {end}000"
elif args.iphone:
args.filter_date = f"BETWEEN {start - APPLE_TIME} AND {end - APPLE_TIME}"
else: else:
_timestamp = int(datetime.strptime(args.filter_date[2:], args.filter_date_format).timestamp()) _timestamp = int(datetime.strptime(args.filter_date[2:], args.filter_date_format).timestamp())
if _timestamp < 1009843200:
print("WhatsApp was developed in 2009...")
exit(1)
if args.filter_date[:2] == "> ": if args.filter_date[:2] == "> ":
args.filter_date = f">= {_timestamp}000" if args.android:
args.filter_date = f">= {_timestamp}000"
elif args.iphone:
args.filter_date = f">= {_timestamp - APPLE_TIME}"
elif args.filter_date[:2] == "< ": elif args.filter_date[:2] == "< ":
args.filter_date = f"<= {_timestamp}000" if args.android:
args.filter_date = f"<= {_timestamp}000"
elif args.iphone:
args.filter_date = f"<= {_timestamp - APPLE_TIME}"
else: else:
print("Unsupported date format. See https://wts.knugi.dev/filter.html") print("Unsupported date format. See https://wts.knugi.dev/filter.html")
exit(1) exit(1)

View File

@@ -24,7 +24,7 @@ def contacts(db, data):
content = c.fetchone() content = c.fetchone()
def messages(db, data, media_folder, timezone_offset): def messages(db, data, media_folder, timezone_offset, range):
c = db.cursor() c = db.cursor()
# Get contacts # Get contacts
c.execute("""SELECT count() FROM ZWACHATSESSION""") c.execute("""SELECT count() FROM ZWACHATSESSION""")
@@ -65,11 +65,10 @@ def messages(db, data, media_folder, timezone_offset):
content = c.fetchone() content = c.fetchone()
# Get message history # Get message history
c.execute("""SELECT count() FROM ZWAMESSAGE""") c.execute(f"""SELECT count() FROM ZWAMESSAGE {f'WHERE ZMESSAGEDATE {range}' if range is not None else ''}""")
total_row_number = c.fetchone()[0] total_row_number = c.fetchone()[0]
print(f"Processing messages...(0/{total_row_number})", end="\r") print(f"Processing messages...(0/{total_row_number})", end="\r")
c.execute(f"""SELECT ZCONTACTJID,
c.execute("""SELECT ZCONTACTJID,
ZWAMESSAGE.Z_PK, ZWAMESSAGE.Z_PK,
ZISFROMME, ZISFROMME,
ZMESSAGEDATE, ZMESSAGEDATE,
@@ -86,6 +85,7 @@ def messages(db, data, media_folder, timezone_offset):
ON ZWAMESSAGE.Z_PK = ZWAMEDIAITEM.ZMESSAGE ON ZWAMESSAGE.Z_PK = ZWAMEDIAITEM.ZMESSAGE
INNER JOIN ZWACHATSESSION INNER JOIN ZWACHATSESSION
ON ZWAMESSAGE.ZCHATSESSION = ZWACHATSESSION.Z_PK ON ZWAMESSAGE.ZCHATSESSION = ZWACHATSESSION.Z_PK
{f'WHERE ZMESSAGEDATE {range}' if range is not None else ''}
ORDER BY ZMESSAGEDATE ASC;""") ORDER BY ZMESSAGEDATE ASC;""")
i = 0 i = 0
content = c.fetchone() content = c.fetchone()
@@ -188,14 +188,18 @@ def messages(db, data, media_folder, timezone_offset):
f"Processing messages...({total_row_number}/{total_row_number})", end="\r") f"Processing messages...({total_row_number}/{total_row_number})", end="\r")
def media(db, data, media_folder): def media(db, data, media_folder, range):
c = db.cursor() c = db.cursor()
# Get media # Get media
c.execute("""SELECT count() FROM ZWAMEDIAITEM""") c.execute(f"""SELECT count()
FROM ZWAMEDIAITEM
INNER JOIN ZWAMESSAGE
ON ZWAMEDIAITEM.ZMESSAGE = ZWAMESSAGE.Z_PK
{f'WHERE ZMESSAGEDATE {range}' if range is not None else ''}""")
total_row_number = c.fetchone()[0] total_row_number = c.fetchone()[0]
print(f"\nProcessing media...(0/{total_row_number})", end="\r") print(f"\nProcessing media...(0/{total_row_number})", end="\r")
i = 0 i = 0
c.execute("""SELECT ZCONTACTJID, c.execute(f"""SELECT ZCONTACTJID,
ZMESSAGE, ZMESSAGE,
ZMEDIALOCALPATH, ZMEDIALOCALPATH,
ZMEDIAURL, ZMEDIAURL,
@@ -208,6 +212,7 @@ def media(db, data, media_folder):
INNER JOIN ZWACHATSESSION INNER JOIN ZWACHATSESSION
ON ZWAMESSAGE.ZCHATSESSION = ZWACHATSESSION.Z_PK ON ZWAMESSAGE.ZCHATSESSION = ZWACHATSESSION.Z_PK
WHERE ZMEDIALOCALPATH IS NOT NULL WHERE ZMEDIALOCALPATH IS NOT NULL
{f'AND ZWAMESSAGE.ZMESSAGEDATE {range}' if range is not None else ''}
ORDER BY ZCONTACTJID ASC""") ORDER BY ZCONTACTJID ASC""")
content = c.fetchone() content = c.fetchone()
mime = MimeTypes() mime = MimeTypes()
@@ -251,9 +256,9 @@ def media(db, data, media_folder):
f"Processing media...({total_row_number}/{total_row_number})", end="\r") f"Processing media...({total_row_number}/{total_row_number})", end="\r")
def vcard(db, data, media_folder): def vcard(db, data, media_folder, range):
c = db.cursor() c = db.cursor()
c.execute("""SELECT DISTINCT ZWAVCARDMENTION.ZMEDIAITEM, c.execute(f"""SELECT DISTINCT ZWAVCARDMENTION.ZMEDIAITEM,
ZWAMEDIAITEM.ZMESSAGE, ZWAMEDIAITEM.ZMESSAGE,
ZCONTACTJID, ZCONTACTJID,
ZVCARDNAME, ZVCARDNAME,
@@ -264,7 +269,8 @@ def vcard(db, data, media_folder):
INNER JOIN ZWAMESSAGE INNER JOIN ZWAMESSAGE
ON ZWAMEDIAITEM.ZMESSAGE = ZWAMESSAGE.Z_PK ON ZWAMEDIAITEM.ZMESSAGE = ZWAMESSAGE.Z_PK
INNER JOIN ZWACHATSESSION INNER JOIN ZWACHATSESSION
ON ZWAMESSAGE.ZCHATSESSION = ZWACHATSESSION.Z_PK;""") ON ZWAMESSAGE.ZCHATSESSION = ZWACHATSESSION.Z_PK
{f'WHERE ZWAMESSAGE.ZMESSAGEDATE {range}' if range is not None else ''};""")
contents = c.fetchall() contents = c.fetchall()
total_row_number = len(contents) total_row_number = len(contents)
print(f"\nProcessing vCards...(0/{total_row_number})", end="\r") print(f"\nProcessing vCards...(0/{total_row_number})", end="\r")