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:
parent
19b1ec1496
commit
f9af3afdf8
4 changed files with 49 additions and 0 deletions
12
server/szurubooru/func/metadata.py
Normal file
12
server/szurubooru/func/metadata.py
Normal 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
|
|
@ -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
|
||||
|
|
|
@ -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")
|
|
@ -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")
|
||||
|
|
Reference in a new issue