From 1fc99dd2cea3f5d3d9aba650919fe8a6b3644d76 Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Tue, 11 Mar 2025 22:56:40 -0400 Subject: [PATCH] fix exif parsing, this is basically 1.0 --- src/rendering/helpers.py | 22 ++++++++++++++++++---- src/rendering/markdown.py | 6 +++--- src/rendering/renderer.py | 3 ++- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/rendering/helpers.py b/src/rendering/helpers.py index 0707473..aa8f5e7 100644 --- a/src/rendering/helpers.py +++ b/src/rendering/helpers.py @@ -8,7 +8,7 @@ from src.rendering.markdown import ( ) from enum import Enum -from PIL import Image +from PIL import Image, ExifTags from datetime import datetime import frontmatter @@ -95,15 +95,22 @@ class TemplateHelpers: if k == "image": img = Image.open(file_path) exif = img._getexif() + # Conver exif to dict orientation = exif.get(274, 1) if exif else 1 width, height = img.width, img.height if orientation in [5, 6, 7, 8]: width, height = height, width + + exif = { + ExifTags.TAGS[k]: v + for k, v in img._getexif().items() + if k in ExifTags.TAGS + } return ImageMetadata( width=width, height=height, alt=file_path.name, - exif=img.info, + exif=exif, ) elif k == "document": ret = None @@ -111,8 +118,9 @@ class TemplateHelpers: ret = FileMetadata(None) if file_path.suffix[1:].lower() == "md": ret.typeMeta = MarkdownMetadata({}, "", "") - ret.typeMeta.frontmatter = frontmatter.load(file_path) - ret.typeMeta.content = render_markdown(file_path) + content, c_frontmatter, obj = render_markdown(file_path) + ret.typeMeta.frontmatter = c_frontmatter + ret.typeMeta.content = content ret.typeMeta.rawContent = read_raw_markdown(file_path) ret.typeMeta.rawText = rendered_markdown_to_plain_text( ret.typeMeta.content @@ -165,6 +173,12 @@ class TemplateHelpers: if f.suffix[1:].lower() in v: t.categories.append(k) t.metadata = self._build_metadata_for_file(f, t.categories) + if "image" in t.categories: + # Adjust date_modified and date_created to be the date the image was taken from exif if available + if t.metadata.exif and "DateTimeOriginal" in t.metadata.exif: + t.date_modified = t.metadata.exif["DateTimeOriginal"] + t.date_created = t.metadata.exif["DateTimeOriginal"] + ret.append(t) ret = self._filter_hidden_files(ret) return ret diff --git a/src/rendering/markdown.py b/src/rendering/markdown.py index 4f6eb50..2edf71b 100644 --- a/src/rendering/markdown.py +++ b/src/rendering/markdown.py @@ -10,11 +10,11 @@ mistune_render = mistune.create_markdown( ) -def render_markdown(path: Path) -> str: +def render_markdown(path: Path): with open(path, "r", encoding="utf-8") as f: obj = frontmatter.load(f) - res = mistune_render(obj.content) - return res + content = mistune_render(obj.content) + return content, obj.metadata, obj def read_raw_markdown(path: Path) -> str: diff --git a/src/rendering/renderer.py b/src/rendering/renderer.py index 3382637..6dd19ad 100644 --- a/src/rendering/renderer.py +++ b/src/rendering/renderer.py @@ -204,7 +204,7 @@ def render_page( content = "" if "document" in category and type == "file": - content = render_markdown(target_file) + content, c_frontmatter, obj = render_markdown(target_file) if not (template_path / "base.html").exists(): raise Exception("Base template not found") @@ -218,6 +218,7 @@ def render_page( content=content, styles=styles, currentPath=str(relative_path), + metadata=c_frontmatter if "document" in category and type == "file" else None, ) return content