diff --git a/frigate/api/media.py b/frigate/api/media.py index 8bc686529..42d556c12 100644 --- a/frigate/api/media.py +++ b/frigate/api/media.py @@ -645,7 +645,12 @@ def recording_clip( @router.get("/vod/{camera_name}/start/{start_ts}/end/{end_ts}") def vod_ts(camera_name: str, start_ts: float, end_ts: float): recordings = ( - Recordings.select(Recordings.path, Recordings.duration, Recordings.end_time) + Recordings.select( + Recordings.path, + Recordings.duration, + Recordings.end_time, + Recordings.start_time, + ) .where( Recordings.start_time.between(start_ts, end_ts) | Recordings.end_time.between(start_ts, end_ts) @@ -665,17 +670,25 @@ def vod_ts(camera_name: str, start_ts: float, end_ts: float): clip = {"type": "source", "path": recording.path} duration = int(recording.duration * 1000) - # Determine if we need to end the last clip early + # adjust start offset if start_ts is after recording.start_time + clip_from = 0 + if start_ts > recording.start_time: + clip_from = int((start_ts - recording.start_time) * 1000) + # adjust duration to account for the trimmed start + duration -= clip_from + + # adjust end if recording.end_time is after end_ts if recording.end_time > end_ts: duration -= int((recording.end_time - end_ts) * 1000) - if duration == 0: - # this means the segment starts right at the end of the requested time range - # and it does not need to be included - continue + if duration <= 0: + # skip if the clip has no valid duration + continue if 0 < duration < max_duration_ms: clip["keyFrameDurations"] = [duration] + if clip_from > 0: + clip["clipFrom"] = clip_from clips.append(clip) durations.append(duration) else: