server: added date taken detection for videos

- [server] added date taken detection for videos in `func/metadata.py`
  using subprocess and ffmpeg
This commit is contained in:
skybldev 2021-11-28 23:18:43 -05:00
parent 6be74d6cbd
commit 1bcf7e73ad
2 changed files with 33 additions and 3 deletions

View file

@ -1,12 +1,40 @@
import json
from datetime import datetime from datetime import datetime
from subprocess import PIPE, Popen
from typing import Optional from typing import Optional
from exif import Image from exif import Image
def resolve_date_taken(content: bytes) -> Optional[datetime]: def resolve_image_date_taken(content: bytes) -> Optional[datetime]:
img = Image(content) img = Image(content)
if img.has_exif and "datetime" in img.list_all(): if img.has_exif and "datetime" in img.list_all():
return datetime.strptime(img.datetime, "%Y:%m:%d %H:%M:%S") return datetime.strptime(img.datetime, "%Y:%m:%d %H:%M:%S")
return None 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

View file

@ -674,8 +674,10 @@ 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]: if post.type == model.Post.TYPE_IMAGE:
post.date_taken = metadata.resolve_date_taken(content) 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: else:
post.date_taken = None post.date_taken = None