feat(sync): add metadata

This commit is contained in:
arkohut 2024-10-14 00:36:39 +08:00
parent 1fbd21183e
commit de7cbc878a
2 changed files with 60 additions and 32 deletions

View File

@ -22,7 +22,7 @@ from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from concurrent.futures import ThreadPoolExecutor
from memos.read_metadata import read_metadata
from memos.utils import get_image_metadata
from memos.schemas import MetadataSource
from memos.logging_config import LOGGING_CONFIG
import logging.config
@ -220,7 +220,7 @@ async def loop_files(library_id, folder, folder_path, force, plugins):
is_thumbnail = False
if file_type_group == "image":
metadata = read_metadata(absolute_file_path)
metadata = get_image_metadata(absolute_file_path)
if metadata:
if (
"active_window" in metadata
@ -800,22 +800,58 @@ def sync(
params={"filepath": str(file_path)},
)
file_stat = file_path.stat()
file_type, file_type_group = get_file_type(file_path)
new_entity = {
"filename": file_path.name,
"filepath": str(file_path),
"size": file_stat.st_size,
"file_created_at": format_timestamp(file_stat.st_ctime),
"file_last_modified_at": format_timestamp(file_stat.st_mtime),
"file_type": file_type,
"file_type_group": file_type_group,
}
# Handle metadata
is_thumbnail = False
if file_type_group == "image":
metadata = get_image_metadata(file_path)
if metadata:
if "active_window" in metadata and "active_app" not in metadata:
metadata["active_app"] = metadata["active_window"].split(" - ")[0]
new_entity["metadata_entries"] = [
{
"key": key,
"value": str(value),
"source": MetadataSource.SYSTEM_GENERATED.value,
"data_type": "number" if isinstance(value, (int, float)) else "text",
}
for key, value in metadata.items()
if key != IS_THUMBNAIL
]
if "active_app" in metadata:
new_entity.setdefault("tags", []).append(metadata["active_app"])
is_thumbnail = metadata.get(IS_THUMBNAIL, False)
if response.status_code == 200:
# File exists, update it
existing_entity = response.json()
file_stat = file_path.stat()
file_type, file_type_group = get_file_type(file_path)
new_entity["folder_id"] = existing_entity["folder_id"]
new_entity = {
"filename": file_path.name,
"filepath": str(file_path),
"size": file_stat.st_size,
"file_created_at": format_timestamp(file_stat.st_ctime),
"file_last_modified_at": format_timestamp(file_stat.st_mtime),
"file_type": file_type,
"file_type_group": file_type_group,
"folder_id": existing_entity["folder_id"],
}
if is_thumbnail:
new_entity["file_created_at"] = existing_entity["file_created_at"]
new_entity["file_last_modified_at"] = existing_entity["file_last_modified_at"]
new_entity["file_type"] = existing_entity["file_type"]
new_entity["file_type_group"] = existing_entity["file_type_group"]
new_entity["size"] = existing_entity["size"]
# Merge existing metadata with new metadata
if new_entity.get("metadata_entries"):
new_metadata_keys = {entry["key"] for entry in new_entity["metadata_entries"]}
for existing_entry in existing_entity["metadata_entries"]:
if existing_entry["key"] not in new_metadata_keys:
new_entity["metadata_entries"].append(existing_entry)
if force or (
existing_entity["file_last_modified_at"]
@ -850,19 +886,7 @@ def sync(
if folder:
# Create new entity
file_stat = file_path.stat()
file_type, file_type_group = get_file_type(file_path)
new_entity = {
"filename": file_path.name,
"filepath": str(file_path),
"size": file_stat.st_size,
"file_created_at": format_timestamp(file_stat.st_ctime),
"file_last_modified_at": format_timestamp(file_stat.st_mtime),
"file_type": file_type,
"file_type_group": file_type_group,
"folder_id": folder["id"],
}
new_entity["folder_id"] = folder["id"]
create_response = httpx.post(
f"{BASE_URL}/libraries/{library_id}/entities",

View File

@ -134,9 +134,6 @@ def take_screenshot_macos(
with Image.open(temp_filename) as img:
img = img.convert("RGB")
webp_filename = os.path.join(
base_dir, date, f"screenshot-{timestamp}-of-{screen_name}.webp"
)
current_hash = str(imagehash.phash(img))
if (
@ -163,8 +160,15 @@ def take_screenshot_macos(
"sequence": screen_sequences[screen_name],
}
img.save(webp_filename, format="WebP", quality=85)
write_image_metadata(webp_filename, metadata)
# Write metadata to the temporary PNG file
write_image_metadata(temp_filename, metadata)
# Save as WebP with metadata included
webp_filename = os.path.join(
base_dir, date, f"screenshot-{timestamp}-of-{screen_name}.webp"
)
img.save(webp_filename, format="WebP", quality=85, exif=img.info.get("exif"))
save_screen_sequences(base_dir, screen_sequences, date)
os.remove(temp_filename)