Create preview gif

This commit is contained in:
Nicolas Mowen 2024-02-10 11:48:05 -07:00
parent 95be693b8a
commit a83f07d8c8

View File

@ -596,7 +596,7 @@ def event_thumbnail(id, max_cache_age=2592000):
@bp.route("/events/<id>/preview.gif") @bp.route("/events/<id>/preview.gif")
def event_preview(id: str, max_cache_age=2592000): def event_preview(id: str, max_cache_age=2592000):
try: try:
event = Event.get(Event.id == id) event: Event = Event.get(Event.id == id)
if event.end_time is not None: if event.end_time is not None:
event_complete = True event_complete = True
except DoesNotExist: except DoesNotExist:
@ -604,13 +604,14 @@ def event_preview(id: str, max_cache_age=2592000):
jsonify({"success": False, "message": "Event not found"}), 404 jsonify({"success": False, "message": "Event not found"}), 404
) )
start_ts = event.start_time
end_ts = event.start_time + 10
if datetime.fromtimestamp(event.start_time) < datetime.now().replace( if datetime.fromtimestamp(event.start_time) < datetime.now().replace(
minute=0, second=0 minute=0, second=0
): ):
# has preview mp4 # has preview mp4
start_ts = event.start_time preview: Previews = (
end_ts = event.start_time + 10
preview = (
Previews.select( Previews.select(
Previews.camera, Previews.camera,
Previews.path, Previews.path,
@ -625,7 +626,6 @@ def event_preview(id: str, max_cache_age=2592000):
) )
.where(Previews.camera == event.camera) .where(Previews.camera == event.camera)
.limit(1) .limit(1)
.dicts()
.get() .get()
) )
@ -648,7 +648,7 @@ def event_preview(id: str, max_cache_age=2592000):
"20", "20",
"-i", "-i",
preview.path, preview.path,
"r", "-r",
"8", "8",
"-vf", "-vf",
"setpts=0.12*PTS", "setpts=0.12*PTS",
@ -657,9 +657,10 @@ def event_preview(id: str, max_cache_age=2592000):
"-c:v", "-c:v",
"gif", "gif",
"-f", "-f",
"image2pipe", "gif",
"-", "-",
] ]
logger.info(f"running previous gif creation {' '.join(ffmpeg_cmd)}")
process = sp.run( process = sp.run(
ffmpeg_cmd, ffmpeg_cmd,
@ -670,15 +671,60 @@ def event_preview(id: str, max_cache_age=2592000):
# need to generate from existing images # need to generate from existing images
preview_dir = os.path.join(CACHE_DIR, "preview_frames") preview_dir = os.path.join(CACHE_DIR, "preview_frames")
file_start = f"preview_{event.camera}" file_start = f"preview_{event.camera}"
file_check = f"{file_start}-{event.start_time}.jpg" start_file = f"{file_start}-{start_ts}.jpg"
selected_preview = None end_file = f"{file_start}-{end_ts}.jpg"
selected_previews = []
for file in os.listdir(preview_dir): for file in sorted(os.listdir(preview_dir)):
if file.startswith(file_start): if not file.startswith(file_start):
if file < file_check: continue
selected_preview = file
if file < start_file:
continue
if file > end_file:
break break
selected_previews.append(f"file '{file}'")
selected_previews.append("duration 0.12")
last_file = selected_previews[-2]
selected_previews.append(last_file)
ffmpeg_cmd = [
"ffmpeg",
"-hide_banner",
"-loglevel",
"warning",
"-f",
"concat",
"-y",
"-protocol_whitelist",
"pipe,file",
"-safe",
"0",
"-i",
"/dev/stdin",
"-loop",
"0",
"-c:v",
"gif",
"-f",
"gif",
"-",
]
logger.info(
f"running current gif creation {' '.join(ffmpeg_cmd)} with files {' '.join(selected_previews)}"
)
process = sp.run(
ffmpeg_cmd,
input="\n".join(selected_previews),
encoding="ascii",
capture_output=True,
)
gif_bytes = process.stdout
response = make_response(gif_bytes) response = make_response(gif_bytes)
response.headers["Content-Type"] = "image/gif" response.headers["Content-Type"] = "image/gif"
if event_complete: if event_complete: