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
This commit is contained in:
skybldev 2021-11-28 12:04:09 -05:00
parent 19b1ec1496
commit f9af3afdf8
4 changed files with 49 additions and 0 deletions

View file

@ -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

View file

@ -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

View file

@ -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")

View file

@ -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")