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

View file

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