fix: online check also looks for active recorder .part files

This commit is contained in:
Claus Lohmar 2026-08-10 07:23:24 +01:00
parent 953360d251
commit 9760bdec33

31
api.go
View file

@ -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,