2023-09-14 20:57:53 +08:00
|
|
|
from .. import KnowledgeStore
|
2023-09-11 02:05:24 +08:00
|
|
|
from .rich_text_object import RichTextObject, RichTextObjectBuilder
|
|
|
|
|
from ..object import ObjectID, ObjectType, KnowledgeObject
|
2023-09-11 20:32:52 +08:00
|
|
|
from .document_object import DocumentObjectBuilder
|
|
|
|
|
from .image_object import ImageObjectBuilder
|
|
|
|
|
from .video_object import VideoObjectBuilder
|
|
|
|
|
import os
|
|
|
|
|
import json
|
|
|
|
|
import logging
|
2023-09-11 02:05:24 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class EmailObject(KnowledgeObject):
|
|
|
|
|
def __init__(self, meta: dict, tags: dict, rich_text: RichTextObject):
|
|
|
|
|
desc = dict()
|
|
|
|
|
body = dict()
|
|
|
|
|
desc["meta"] = meta
|
|
|
|
|
desc["tags"] = tags
|
|
|
|
|
|
|
|
|
|
# FIXME rich text content store in desc or body? which one is better?
|
|
|
|
|
body["content"] = rich_text
|
|
|
|
|
|
|
|
|
|
super().__init__(ObjectType.Email, desc, body)
|
|
|
|
|
|
|
|
|
|
def get_meta(self):
|
|
|
|
|
return self.desc["meta"]
|
|
|
|
|
|
|
|
|
|
def get_tags(self):
|
|
|
|
|
return self.desc["tags"]
|
|
|
|
|
|
|
|
|
|
def get_rich_text(self):
|
2023-09-13 17:55:27 +08:00
|
|
|
return self.body["content"]
|
2023-09-11 02:05:24 +08:00
|
|
|
|
|
|
|
|
|
2023-09-11 20:32:52 +08:00
|
|
|
"""
|
|
|
|
|
EmailObject folder structure:
|
|
|
|
|
.
|
|
|
|
|
├── email.txt
|
|
|
|
|
└── meta.json
|
|
|
|
|
├── image
|
|
|
|
|
│ ├── image1.jpg
|
|
|
|
|
│ ├── image2.jpg
|
|
|
|
|
│ └── ...
|
|
|
|
|
├── video
|
|
|
|
|
│ ├── video1.mp4
|
|
|
|
|
│ ├── video2.mv
|
|
|
|
|
│ └── ...
|
|
|
|
|
└── audio
|
|
|
|
|
├── audio1.m4a
|
|
|
|
|
├── audio2.flac
|
|
|
|
|
└── ...
|
|
|
|
|
EmailObjectBuilder will read the target folder and build the EmailObject
|
|
|
|
|
Store meta.json to meta in EmailObject
|
|
|
|
|
Store email.txt to DocumentObject and RichTextObject in EmailObject
|
|
|
|
|
Store very image file in image folder to ImageObject and RichTextObject in EmailObject, etc
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
2023-09-11 02:05:24 +08:00
|
|
|
class EmailObjectBuilder:
|
2023-09-11 20:32:52 +08:00
|
|
|
def __init__(self, tags: dict, folder: str):
|
2023-09-11 02:05:24 +08:00
|
|
|
self.tags = tags
|
|
|
|
|
self.folder = folder
|
|
|
|
|
|
|
|
|
|
def set_tags(self, tags: dict):
|
|
|
|
|
self.tags = tags
|
|
|
|
|
return self
|
|
|
|
|
|
|
|
|
|
def set_folder(self, folder: str):
|
|
|
|
|
self.folder = folder
|
|
|
|
|
return self
|
|
|
|
|
|
|
|
|
|
def build(self) -> EmailObject:
|
2023-09-14 20:57:53 +08:00
|
|
|
|
|
|
|
|
# Just get the object store and relation store from global KnowledgeStore
|
|
|
|
|
store = KnowledgeStore().get_object_store()
|
|
|
|
|
relation = KnowledgeStore().get_relation_store()
|
|
|
|
|
|
2023-09-11 20:32:52 +08:00
|
|
|
# Read meta.json
|
|
|
|
|
meta = {}
|
|
|
|
|
meta_file = os.path.join(self.folder, "meta.json")
|
|
|
|
|
if os.path.exists(meta_file):
|
|
|
|
|
logging.info(f"Will read meta.json {meta_file}")
|
|
|
|
|
with open(meta_file, "r", encoding="utf-8") as f:
|
|
|
|
|
meta = json.load(f)
|
|
|
|
|
else:
|
|
|
|
|
logging.info(f"Meta file missing! {meta_file}")
|
|
|
|
|
|
|
|
|
|
# Read email.txt
|
|
|
|
|
documents = {}
|
|
|
|
|
content_file = os.path.join(self.folder, "email.txt")
|
|
|
|
|
if os.path.exists(content_file):
|
|
|
|
|
logging.info(f"Will read email.txt {content_file}")
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
with open(content_file, "r", encoding="utf-8") as f:
|
|
|
|
|
text = f.read()
|
|
|
|
|
|
2023-09-14 20:57:53 +08:00
|
|
|
document = DocumentObjectBuilder({}, {}, text).build(relation_store=relation)
|
|
|
|
|
document_id = document.calculate_id()
|
|
|
|
|
store.put_object(document_id, document.encode())
|
|
|
|
|
documents = {"email.txt": document_id}
|
2023-09-11 20:32:52 +08:00
|
|
|
except Exception as e:
|
|
|
|
|
logging.error(f"Failed to read email.txt {content_file} {e}")
|
|
|
|
|
else:
|
|
|
|
|
logging.info(f"Content file missing! {content_file}")
|
|
|
|
|
|
|
|
|
|
# Process image files
|
|
|
|
|
images = {}
|
|
|
|
|
image_dir = os.path.join(self.folder, "image")
|
|
|
|
|
if os.path.exists(image_dir):
|
|
|
|
|
for image_file in os.listdir(image_dir):
|
|
|
|
|
image_path = os.path.join(image_dir, image_file)
|
|
|
|
|
logging.info(f"Will read image file {image_path}")
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
image = ImageObjectBuilder({}, {}, image_path).build()
|
2023-09-14 20:57:53 +08:00
|
|
|
image_id = image.calculate_id()
|
|
|
|
|
store.put_object(image_id, image.encode())
|
|
|
|
|
images[image_file] = image_id
|
2023-09-11 20:32:52 +08:00
|
|
|
except Exception as e:
|
|
|
|
|
logging.error(f"Failed to read image file {image_path} {e}")
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
# Process video files
|
|
|
|
|
videos = {}
|
|
|
|
|
video_dir = os.path.join(self.folder, "video")
|
|
|
|
|
if os.path.exists(video_dir):
|
|
|
|
|
for video_file in os.listdir(video_dir):
|
|
|
|
|
video_path = os.path.join(video_dir, video_file)
|
|
|
|
|
logging.info(f"Will read video file {video_path}")
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
video = VideoObjectBuilder({}, {}, video_path).build()
|
2023-09-14 20:57:53 +08:00
|
|
|
video_id = video.calculate_id()
|
|
|
|
|
store.put_object(video_id, video.encode())
|
|
|
|
|
videos[video_file] = video_id
|
2023-09-11 20:32:52 +08:00
|
|
|
except Exception as e:
|
|
|
|
|
logging.error(f"Failed to read video file {video_path} {e}")
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
# Create RichTextObject
|
|
|
|
|
rich_text = RichTextObject(images, videos, documents)
|
2023-09-14 20:57:53 +08:00
|
|
|
rich_text_id = rich_text.calculate_id()
|
|
|
|
|
|
|
|
|
|
# build relations with rich_text
|
|
|
|
|
for image_id in images.values():
|
|
|
|
|
relation.add_relation(image_id, rich_text_id)
|
|
|
|
|
for video_id in videos.values():
|
|
|
|
|
relation.add_relation(video_id, rich_text_id)
|
|
|
|
|
for document_id in documents.values():
|
|
|
|
|
relation.add_relation(document_id, rich_text_id)
|
|
|
|
|
|
2023-09-11 20:32:52 +08:00
|
|
|
# Create EmailObject
|
2023-09-14 20:57:53 +08:00
|
|
|
email_object = EmailObject(meta, {}, rich_text)
|
|
|
|
|
email_object_id = email_object.calculate_id()
|
|
|
|
|
store.put_object(email_object_id, email_object.encode())
|
|
|
|
|
|
|
|
|
|
# build relations with email_object
|
|
|
|
|
relation.add_relation(rich_text_id, email_object_id)
|
|
|
|
|
|
|
|
|
|
return email_object
|