From 9760bdec3361f589c5c313e54f3a53455e461f66 Mon Sep 17 00:00:00 2001 From: cclohmar Date: Mon, 10 Aug 2026 07:23:24 +0100 Subject: [PATCH] fix: online check also looks for active recorder .part files --- api.go | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/api.go b/api.go index 8b96def..19ce04f 100644 --- a/api.go +++ b/api.go @@ -29,15 +29,31 @@ func (s *Server) handleCameras(w http.ResponseWriter, r *http.Request) { statuses := make([]CameraStatus, 0, len(s.appConfig.Cameras)) for _, cam := range s.appConfig.Cameras { online := false - // Check if latest.jpg was recently updated. camDir := cam.Name if camDir == "" { camDir = cam.ID } + // Check snapshot file (updated every 1s by snapshot engine). snapFile := filepath.Join(s.appConfig.Storage.RecordingsPath, camDir, "latest.jpg") if info, err := os.Stat(snapFile); err == nil { online = time.Since(info.ModTime()) < 10*time.Second } + // Also check recorder activity (rec_*.part.mp4 exists and is recent). + if !online { + recDir := filepath.Join(s.appConfig.Storage.RecordingsPath, camDir) + if entries, err := os.ReadDir(recDir); err == nil { + for _, e := range entries { + if strings.HasPrefix(e.Name(), "rec_") && strings.HasSuffix(e.Name(), ".part.mp4") { + if info, err := e.Info(); err == nil { + if time.Since(info.ModTime()) < 15*time.Second { + online = true + break + } + } + } + } + } + } statuses = append(statuses, CameraStatus{ CameraConfig: cam, Online: online, @@ -74,6 +90,19 @@ func (s *Server) handleCameraByID(w http.ResponseWriter, r *http.Request) { if info, err := os.Stat(snapFile); err == nil { online = time.Since(info.ModTime()) < 10*time.Second } + if !online { + recDir := filepath.Join(s.appConfig.Storage.RecordingsPath, camDir) + if entries, err := os.ReadDir(recDir); err == nil { + for _, e := range entries { + if strings.HasPrefix(e.Name(), "rec_") && strings.HasSuffix(e.Name(), ".part.mp4") { + if info, err := e.Info(); err == nil && time.Since(info.ModTime()) < 15*time.Second { + online = true + break + } + } + } + } + } status := CameraStatus{ CameraConfig: *cam, Online: online,