Save full frame always

This commit is contained in:
Nicolas Mowen 2024-04-19 07:57:48 -06:00
parent 27cd5a07e2
commit 5eedccdacc
3 changed files with 30 additions and 36 deletions

View File

@ -611,9 +611,8 @@ def export_recording(camera_name: str, start_time, end_time):
json: dict[str, any] = request.get_json(silent=True) or {} json: dict[str, any] = request.get_json(silent=True) or {}
playback_factor = json.get("playback", "realtime") playback_factor = json.get("playback", "realtime")
name: Optional[str] = json.get("name") name: Optional[str] = json.get("name")
existing_thumb: Optional[str] = json.get("thumb")
if len(name) > 256 or len(existing_thumb) > 256: if len(name or "") > 256:
return make_response( return make_response(
jsonify({"success": False, "message": "File name is too long."}), jsonify({"success": False, "message": "File name is too long."}),
401, 401,
@ -642,7 +641,6 @@ def export_recording(camera_name: str, start_time, end_time):
current_app.frigate_config, current_app.frigate_config,
camera_name, camera_name,
secure_filename(name.replace(" ", "_")) if name else None, secure_filename(name.replace(" ", "_")) if name else None,
secure_filename(existing_thumb),
int(start_time), int(start_time),
int(end_time), int(end_time),
( (

View File

@ -48,7 +48,6 @@ class RecordingExporter(threading.Thread):
config: FrigateConfig, config: FrigateConfig,
camera: str, camera: str,
name: str, name: str,
existing_thumb: str,
start_time: int, start_time: int,
end_time: int, end_time: int,
playback_factor: PlaybackFactorEnum, playback_factor: PlaybackFactorEnum,
@ -57,7 +56,6 @@ class RecordingExporter(threading.Thread):
self.config = config self.config = config
self.camera = camera self.camera = camera
self.user_provided_name = name self.user_provided_name = name
self.existing_thumb = existing_thumb
self.start_time = start_time self.start_time = start_time
self.end_time = end_time self.end_time = end_time
self.playback_factor = playback_factor self.playback_factor = playback_factor
@ -72,33 +70,31 @@ class RecordingExporter(threading.Thread):
def save_thumbnail(self, id: str) -> str: def save_thumbnail(self, id: str) -> str:
thumb_path = os.path.join(CLIPS_DIR, f"export/{id}.webp") thumb_path = os.path.join(CLIPS_DIR, f"export/{id}.webp")
if self.existing_thumb and os.path.isfile(self.existing_thumb):
shutil.copyfile(self.existing_thumb, thumb_path) if datetime.datetime.fromtimestamp(
else: self.start_time
if datetime.datetime.fromtimestamp( ) < datetime.datetime.now().replace(minute=0, second=0):
self.start_time # has preview mp4
) < datetime.datetime.now().replace(minute=0, second=0): preview: Previews = (
# has preview mp4 Previews.select(
preview: Previews = ( Previews.camera,
Previews.select( Previews.path,
Previews.camera, Previews.duration,
Previews.path, Previews.start_time,
Previews.duration, Previews.end_time,
Previews.start_time,
Previews.end_time,
)
.where(
Previews.start_time.between(self.start_time, self.end_time)
| Previews.end_time.between(self.start_time, self.end_time)
| (
(self.start_time > Previews.start_time)
& (self.end_time < Previews.end_time)
)
)
.where(Previews.camera == self.camera)
.limit(1)
.get()
) )
.where(
Previews.start_time.between(self.start_time, self.end_time)
| Previews.end_time.between(self.start_time, self.end_time)
| (
(self.start_time > Previews.start_time)
& (self.end_time < Previews.end_time)
)
)
.where(Previews.camera == self.camera)
.limit(1)
.get()
)
if not preview: if not preview:
return "" return ""
@ -125,9 +121,9 @@ class RecordingExporter(threading.Thread):
capture_output=True, capture_output=True,
) )
if process.returncode != 0: if process.returncode != 0:
logger.error(process.stderr) logger.error(process.stderr)
return "" return ""
else: else:
# need to generate from existing images # need to generate from existing images
@ -235,7 +231,7 @@ class RecordingExporter(threading.Thread):
logger.debug(f"Updating finalized export {file_path}") logger.debug(f"Updating finalized export {file_path}")
os.rename(file_path, final_file_path) os.rename(file_path, final_file_path)
export_id = "".join(random.choices(string.ascii_lowercase + string.digits, k=6)) export_id = f"{self.camera}_{''.join(random.choices(string.ascii_lowercase + string.digits, k=6))}"
thumb_path = self.save_thumbnail(export_id) thumb_path = self.save_thumbnail(export_id)

View File

@ -66,7 +66,7 @@ class PendingReviewSegment:
self.frame = np.zeros((THUMB_HEIGHT * 3 // 2, THUMB_WIDTH), np.uint8) self.frame = np.zeros((THUMB_HEIGHT * 3 // 2, THUMB_WIDTH), np.uint8)
self.frame_active_count = 0 self.frame_active_count = 0
self.frame_path = os.path.join( self.frame_path = os.path.join(
CLIPS_DIR, f"review/thumb-{self.camera}-{self.id}.jpg" CLIPS_DIR, f"review/thumb-{self.camera}-{self.id}.webp"
) )
def update_frame( def update_frame(