mirror of
https://github.com/KnugiHK/WhatsApp-Chat-Exporter.git
synced 2026-04-23 06:21:37 +00:00
Add date filter for iOS #82
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
Reference in New Issue
Block a user