From 1bcf7e73adea79753ad6d9bfb775efae4336a392 Mon Sep 17 00:00:00 2001 From: skybldev Date: Sun, 28 Nov 2021 23:18:43 -0500 Subject: [PATCH] server: added date taken detection for videos - [server] added date taken detection for videos in `func/metadata.py` using subprocess and ffmpeg --- server/szurubooru/func/metadata.py | 30 +++++++++++++++++++++++++++++- server/szurubooru/func/posts.py | 6 ++++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/server/szurubooru/func/metadata.py b/server/szurubooru/func/metadata.py index 7e7b9485..00dea853 100644 --- a/server/szurubooru/func/metadata.py +++ b/server/szurubooru/func/metadata.py @@ -1,12 +1,40 @@ +import json from datetime import datetime +from subprocess import PIPE, Popen from typing import Optional from exif import Image -def resolve_date_taken(content: bytes) -> Optional[datetime]: +def resolve_image_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 + + +def resolve_video_date_taken(content: bytes) -> Optional[datetime]: + proc = Popen( + [ + "ffprobe", + "-loglevel", + "8", + "-print_format", + "json", + "-show_format", + "-", + ], + stdin=PIPE, + stdout=PIPE, + stderr=PIPE, + ) + + output = proc.communicate(input=content)[0] + json_output = json.loads(output) + + try: + creation_time = json_output["format"]["tags"]["creation_time"] + return datetime.fromisoformat(creation_time.rstrip("Z")) + except Exception: + return None diff --git a/server/szurubooru/func/posts.py b/server/szurubooru/func/posts.py index d557fe5c..950e7b84 100644 --- a/server/szurubooru/func/posts.py +++ b/server/szurubooru/func/posts.py @@ -674,8 +674,10 @@ 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) + if post.type == model.Post.TYPE_IMAGE: + post.date_taken = metadata.resolve_image_date_taken(content) + elif post.type == model.Post.TYPE_VIDEO: + post.date_taken = metadata.resolve_video_date_taken(content) else: post.date_taken = None