Grid tiles explicitly set --frigate-mse-object-fit:fill so video stretches
to fill the card without preserving aspect ratio. The MsePlayer default
is contain, so History preview and all other contexts keep correct proportions.
https://claude.ai/code/session_01EwdaKGsrRLZ74smmCQ1MgW
The MSE player default was set to 'fill' which stretches video in all contexts.
Only the draggable grid should use 'cover' (via --frigate-mse-object-fit:cover).
Changing the fallback to 'contain' restores aspect-ratio-preserving behaviour
everywhere else (History preview, etc.) while keeping the grid fill intact.
https://claude.ai/code/session_01EwdaKGsrRLZ74smmCQ1MgW
When cameras are configured with recording paths outside /media/frigate
(e.g. /video1, /video2), preview mp4 files generated there had no
corresponding nginx location block — requests returned 404.
At nginx startup, get_nginx_settings.py now extracts unique recording
roots outside /media/frigate from the Frigate config. The nginx run
script uses a new extra_recordings.gotmpl template to generate
location blocks (e.g. /video1/preview/) with alias directives for
each such root, included via extra_recordings.conf.
The API already returns correct src URLs for these paths (the existing
replace(BASE_DIR, "") leaves non-media paths unchanged), so no API
changes are needed.
https://claude.ai/code/session_016bxjbVpx8DqpjysnGYmXdx
When reduce_storage_consumption deletes old recording segments to free
disk space, it now also deletes preview files that overlap the same
time range. Without this, preview mp4 files on the same disk continued
to consume space, causing the storage maintainer to delete progressively
newer recordings while old previews accumulated — resulting in archives
where older periods had previews but no video.
This is particularly impactful for multi-path setups where each camera's
preview directory shares a disk with its recordings.
https://claude.ai/code/session_016bxjbVpx8DqpjysnGYmXdx
- write_frame_to_cache() now returns bool; callers only append the
timestamp to output_frames when cv2.imwrite() actually succeeded,
preventing dangling timestamps that cause ffmpeg "Impossible to open"
errors when the cache disk is full
- FFMpegConverter removes the partial output mp4 on ffmpeg failure so
stale partial files don't accumulate on the recording disk
https://claude.ai/code/session_016bxjbVpx8DqpjysnGYmXdx
- storage.py: refactor check_storage_needs_cleanup(root) to check a
specific path instead of returning the first needy one; run() now
iterates all configured recording roots per 5-minute cycle so a
stuck path can no longer starve the others
- storage.py: skip stale camera entries in _get_path_bandwidths to
avoid KeyError when a camera is removed from config at runtime
- maintainer.py: delete partial output file when ffmpeg fails
(ENOSPC), preventing orphaned files that consume disk space without
a DB entry and block future conversion attempts
https://claude.ai/code/session_016bxjbVpx8DqpjysnGYmXdx