From f9af3afdf8f42ffd1e70c6683770a3e92cc23aae Mon Sep 17 00:00:00 2001 From: skybldev Date: Sun, 28 Nov 2021 12:04:09 -0500 Subject: [PATCH] server: added basic date taken functionality - [server] created basic utility for resolving date taken @ `func/metadata.py` - [server] utilize `func/metadata.py` in `func/posts.py` - [server] created Alembic migration that adds `date_taken` column to `post` - [server] updated `model/post.py:Post` to have new column --- server/szurubooru/func/metadata.py | 12 ++++++++++ server/szurubooru/func/posts.py | 10 ++++++++ .../versions/57aafb3bf9f0_add_date_taken.py | 24 +++++++++++++++++++ server/szurubooru/model/post.py | 3 +++ 4 files changed, 49 insertions(+) create mode 100644 server/szurubooru/func/metadata.py create mode 100644 server/szurubooru/migrations/versions/57aafb3bf9f0_add_date_taken.py diff --git a/server/szurubooru/func/metadata.py b/server/szurubooru/func/metadata.py new file mode 100644 index 00000000..7e7b9485 --- /dev/null +++ b/server/szurubooru/func/metadata.py @@ -0,0 +1,12 @@ +from datetime import datetime +from typing import Optional + +from exif import Image + + +def resolve_date_taken(content: bytes) -> Optional[datetime]: + img = Image(content) + + if img.has_exif and "datetime" in img.list_all(): + return datetime.strptime(img.datetime, "%Y:%m:%d %H:%M:%S") + return None diff --git a/server/szurubooru/func/posts.py b/server/szurubooru/func/posts.py index be2259cf..d557fe5c 100644 --- a/server/szurubooru/func/posts.py +++ b/server/szurubooru/func/posts.py @@ -11,6 +11,7 @@ from szurubooru.func import ( files, image_hash, images, + metadata, mime, pools, scores, @@ -199,6 +200,7 @@ class PostSerializer(serialization.BaseSerializer): "notes": self.serialize_notes, "comments": self.serialize_comments, "pools": self.serialize_pools, + "dateTaken": self.serialize_date_taken, } def serialize_id(self) -> Any: @@ -344,6 +346,9 @@ class PostSerializer(serialization.BaseSerializer): ) ] + def serialize_date_taken(self) -> Any: + return self.post.date_taken + def serialize_post( post: Optional[model.Post], auth_user: model.User, options: List[str] = [] @@ -669,6 +674,11 @@ def update_post_content(post: model.Post, content: Optional[bytes]) -> None: post.canvas_height = None setattr(post, "__content", content) + if post.type in [model.Post.TYPE_IMAGE, model.Post.TYPE_VIDEO]: + post.date_taken = metadata.resolve_date_taken(content) + else: + post.date_taken = None + def update_post_thumbnail( post: model.Post, content: Optional[bytes] = None diff --git a/server/szurubooru/migrations/versions/57aafb3bf9f0_add_date_taken.py b/server/szurubooru/migrations/versions/57aafb3bf9f0_add_date_taken.py new file mode 100644 index 00000000..7e09afdd --- /dev/null +++ b/server/szurubooru/migrations/versions/57aafb3bf9f0_add_date_taken.py @@ -0,0 +1,24 @@ +""" +add_date_taken + +Revision ID: 57aafb3bf9f0 +Created at: 2021-11-26 21:00:19.698012 +""" + +import sqlalchemy as sa +from alembic import op + +revision = "57aafb3bf9f0" +down_revision = "adcd63ff76a2" +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column( + "post", sa.Column("date_taken", sa.DateTime(), nullable=True) + ) + + +def downgrade(): + op.drop_column("post", "date_taken") diff --git a/server/szurubooru/model/post.py b/server/szurubooru/model/post.py index 49e748dc..27b1d772 100644 --- a/server/szurubooru/model/post.py +++ b/server/szurubooru/model/post.py @@ -223,6 +223,9 @@ class Post(Base): canvas_height = sa.Column("image_height", sa.Integer) mime_type = sa.Column("mime-type", sa.Unicode(32), nullable=False) + # EXIF things + date_taken = sa.Column("date_taken", sa.DateTime, nullable=True) + # foreign tables user = sa.orm.relationship("User") tags = sa.orm.relationship("Tag", backref="posts", secondary="post_tag")