v0.7.0 — Timelapse v2, H.265 muxing, dual-lens Xiaomi, release hardening
What's New
🎬 Timelapse v2 Pipeline
Complete rewrite of the timelapse system with dual-mode keyframe extraction and pure Go H.264/H.265 NAL→MP4 muxers — no FFmpeg required for timelapse generation.
- Pure Go H.264/H.265 muxers — self-contained keyframe files without FFmpeg dependency
- Rolling merge pipeline — H.264 and H.265 keyframes merged into timelapse videos automatically
- Flexible merge durations — 8h / 12h / 24h / natural-day / 7d / 30d options
- Unified recordings UI — timelapse recordings appear alongside regular recordings
- Per-camera timelapse config — configurable interval, frame source, merge mode
- Retry-merge API — manually trigger timelapse merge from the UI
- Frontend — config editor, playback merge, gallery page
📹 Dual-Lens Xiaomi Camera Support
- Select specific lens/channel on dual-camera Xiaomi devices (CW500, outdoor cam 4, etc.)
- RTSP URL credential handling fix in test-connection
🔄 Transcoding
- FFmpeg auto-download and job queue
- Hardware transcoding (V4L2M2M / VAAPI / NVENC) with software fallback
- NEW: VAAPI device verification — prevents runtime failures in Docker/VM without GPU passthrough
- Batch backfill API for transcoding existing recordings
- Transcoding history page with task status and retry
🧹 Dashboard UX Overhaul
- Removed AI module (browser-side detection was incomplete; will return as dedicated feature)
- Camera manager refactored — removed
Enabledfield, simplified UX - WebSocket decoder backpressure fix for stable multi-stream viewing
Bug Fixes
- fix(transcoding): verify VAAPI device availability — hardware probe now checks
/dev/dri/renderD*before selecting VAAPI encoder, falling back to libx264/libx265 when GPU is unavailable - fix(transcoding): FFmpeg status test isolation — tests no longer fail on machines with system FFmpeg installed (CI unblocked)
- fix(web): WebSocket decoder backpressure — wired through Worker to ConnectionManager for stable streaming
- fix(timelapse): rolling merge works for all recorder types — H.264, H.265, MJPEG
- fix(timelapse): SPS/PPS cached in keyframe extractor — self-contained frame files
- fix(camera): H.265 encoding detection — runtime recorder type used for keyframe extractor
- fix(api): recording frames listing — includes H.264/H.265 timelapse frames
- fix(i18n): missing translation keys — timelapse protocol, transcoding history action
Issues Resolved
- #14 — Multi-lens device support + video quality (dual-lens via channel selection, transcoding for quality)
- #15 — Docker test report (Docker path fix, Settings UI, FFmpeg transcoding, HLS recovery)
- #18 — Xiaomi camera reconnect loop (PONG fix, backoff improvements, CS2 buffer drop)
- #20 — H.265 HLS error/panic (muxer auto-recovery, StreamHub refactor)
Full Changelog: v0.6.0...v0.7.0
What's Changed
- feat(timelapse): v2 timelapse pipeline + web improvements + transcoding by @mickeyzzc in #21
- refactor(camera): remove Enabled field, improve UX, and clean up dead code by @mickeyzzc in #22
- fix(api): RTSP credentials + feat(xiaomi): dual-lens channel support by @mickeyzzc in #23
- fix(web): wire decoder backpressure through Worker to ConnectionManager by @mickeyzzc in #26
- fix: v0.7.0 release fixes — VAAPI fallback, test isolation, README cleanup by @mickeyzzc in #27
Full Changelog: v0.6.0...v0.7.0