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:
parent
6be74d6cbd
commit
1bcf7e73ad
2 changed files with 33 additions and 3 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Reference in a new issue