fix: online check also looks for active recorder .part files
This commit is contained in:
parent
953360d251
commit
9760bdec33
1 changed files with 30 additions and 1 deletions
31
api.go
31
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,
|
||||
|
|
|
|||
Loading…
Reference in a new issue