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 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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Reference in a new issue