whatsapp.android: expose all entities extracted from the db
This commit is contained in:
parent
3ec362fce9
commit
1b187b2c1b
1 changed files with 18 additions and 4 deletions
|
@ -7,7 +7,7 @@ from dataclasses import dataclass
|
||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import sqlite3
|
import sqlite3
|
||||||
from typing import Sequence, Iterator, Optional
|
from typing import Union, Sequence, Iterator, Optional
|
||||||
|
|
||||||
from my.core import get_files, Paths, datetime_aware, Res, make_logger, make_config
|
from my.core import get_files, Paths, datetime_aware, Res, make_logger, make_config
|
||||||
from my.core.common import unique_everseen
|
from my.core.common import unique_everseen
|
||||||
|
@ -56,7 +56,10 @@ class Message:
|
||||||
text: Optional[str]
|
text: Optional[str]
|
||||||
|
|
||||||
|
|
||||||
def _process_db(db: sqlite3.Connection):
|
Entity = Union[Chat, Sender, Message]
|
||||||
|
|
||||||
|
|
||||||
|
def _process_db(db: sqlite3.Connection) -> Iterator[Entity]:
|
||||||
# TODO later, split out Chat/Sender objects separately to safe on object creation, similar to other android data sources
|
# TODO later, split out Chat/Sender objects separately to safe on object creation, similar to other android data sources
|
||||||
|
|
||||||
chats = {}
|
chats = {}
|
||||||
|
@ -73,6 +76,7 @@ def _process_db(db: sqlite3.Connection):
|
||||||
id=chat_id,
|
id=chat_id,
|
||||||
name=subject,
|
name=subject,
|
||||||
)
|
)
|
||||||
|
yield chat
|
||||||
chats[chat.id] = chat
|
chats[chat.id] = chat
|
||||||
|
|
||||||
senders = {}
|
senders = {}
|
||||||
|
@ -88,6 +92,7 @@ def _process_db(db: sqlite3.Connection):
|
||||||
id=r['raw_string'],
|
id=r['raw_string'],
|
||||||
name=None,
|
name=None,
|
||||||
)
|
)
|
||||||
|
yield s
|
||||||
senders[r['_id']] = s
|
senders[r['_id']] = s
|
||||||
|
|
||||||
# NOTE: hmm, seems that message_view or available_message_view use lots of NULL as ...
|
# NOTE: hmm, seems that message_view or available_message_view use lots of NULL as ...
|
||||||
|
@ -187,7 +192,7 @@ def _process_db(db: sqlite3.Connection):
|
||||||
yield m
|
yield m
|
||||||
|
|
||||||
|
|
||||||
def _messages() -> Iterator[Res[Message]]:
|
def _entities() -> Iterator[Res[Entity]]:
|
||||||
paths = inputs()
|
paths = inputs()
|
||||||
total = len(paths)
|
total = len(paths)
|
||||||
width = len(str(total))
|
width = len(str(total))
|
||||||
|
@ -200,5 +205,14 @@ def _messages() -> Iterator[Res[Message]]:
|
||||||
yield echain(RuntimeError(f'While processing {path}'), cause=e)
|
yield echain(RuntimeError(f'While processing {path}'), cause=e)
|
||||||
|
|
||||||
|
|
||||||
|
def entities() -> Iterator[Res[Entity]]:
|
||||||
|
return unique_everseen(_entities)
|
||||||
|
|
||||||
|
|
||||||
def messages() -> Iterator[Res[Message]]:
|
def messages() -> Iterator[Res[Message]]:
|
||||||
yield from unique_everseen(_messages)
|
# TODO hmm, specify key=lambda m: m.id?
|
||||||
|
# not sure since might be useful to keep track of sender changes etc
|
||||||
|
# probably best not to, or maybe query messages/senders separately and merge later?
|
||||||
|
for e in entities():
|
||||||
|
if isinstance(e, (Exception, Message)):
|
||||||
|
yield e
|
||||||
|
|
Loading…
Add table
Reference in a new issue