Source code for imessagedb.attachments
from imessagedb.attachment import Attachment
from alive_progress import alive_bar
[docs]class Attachments:
""" All attachments """
def __init__(self, database, copy=None, copy_directory=None) -> None:
"""
Parameters
----------
database : imessagedb.DB
An instance of a connected database
copy : bool
Whether or not to copy attachments, default is to use the configuration parameter
copy_directory : str
The directory to copy attachments into
"""
self._database = database
if copy is None:
self._copy = self._database.control.getboolean('copy', fallback=False)
else:
self._copy = copy
if copy_directory is None:
self._copy_directory = self._database.control.get('attachment directory', fallback="/tmp/attachments")
else:
self._copy_directory = copy_directory
self._attachment_list = {}
self._message_join = {}
# Get the list of all the attachments, unless we are skipping them
if self._database.control.getboolean('skip attachments', fallback=False):
return
self._database.connection.execute('select count(rowid)from attachment')
(row_count_total) = self._database.connection.fetchone()
row_count_total = row_count_total[0]
self._database.connection.execute('select rowid, filename, mime_type from attachment')
i = self._database.connection.fetchone()
with alive_bar(row_count_total, title="Getting Attachments", stats="({rate}, eta: {eta})") as bar:
while i:
rowid = i[0]
filename = i[1]
mime_type = i[2]
if filename is not None:
self.attachment_list[rowid] = Attachment(self._database, rowid, filename, mime_type,
copy=self._copy,
copy_directory=self._copy_directory)
bar()
i = self._database.connection.fetchone()
# Get the join of attachments and messages
self._database.connection.execute('select message_id, attachment_id from message_attachment_join')
i = self._database.connection.fetchone()
while i:
message_id = i[0]
attachment_id = i[1]
if message_id in self.message_join:
self.message_join[message_id].append(attachment_id)
else:
self.message_join[message_id] = [attachment_id]
i = self._database.connection.fetchone()
return
@property
def attachment_list(self) -> dict:
""" Return the dictionary of all attachments """
return self._attachment_list
@property
def message_join(self) -> dict:
""" Return the mapping of messages to attachments """
return self._message_join
[docs] def __iter__(self):
return self.attachment_list.__iter__()
[docs] def __len__(self) -> int:
return len(self.attachment_list.keys())