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,
|
files,
|
||||||
image_hash,
|
image_hash,
|
||||||
images,
|
images,
|
||||||
|
metadata,
|
||||||
mime,
|
mime,
|
||||||
pools,
|
pools,
|
||||||
scores,
|
scores,
|
||||||
|
@ -199,6 +200,7 @@ class PostSerializer(serialization.BaseSerializer):
|
||||||
"notes": self.serialize_notes,
|
"notes": self.serialize_notes,
|
||||||
"comments": self.serialize_comments,
|
"comments": self.serialize_comments,
|
||||||
"pools": self.serialize_pools,
|
"pools": self.serialize_pools,
|
||||||
|
"dateTaken": self.serialize_date_taken,
|
||||||
}
|
}
|
||||||
|
|
||||||
def serialize_id(self) -> Any:
|
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(
|
def serialize_post(
|
||||||
post: Optional[model.Post], auth_user: model.User, options: List[str] = []
|
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
|
post.canvas_height = None
|
||||||
setattr(post, "__content", content)
|
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(
|
def update_post_thumbnail(
|
||||||
post: model.Post, content: Optional[bytes] = None
|
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)
|
canvas_height = sa.Column("image_height", sa.Integer)
|
||||||
mime_type = sa.Column("mime-type", sa.Unicode(32), nullable=False)
|
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
|
# foreign tables
|
||||||
user = sa.orm.relationship("User")
|
user = sa.orm.relationship("User")
|
||||||
tags = sa.orm.relationship("Tag", backref="posts", secondary="post_tag")
|
tags = sa.orm.relationship("Tag", backref="posts", secondary="post_tag")
|
||||||
|
|
Reference in a new issue