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))
|
statuses := make([]CameraStatus, 0, len(s.appConfig.Cameras))
|
||||||
for _, cam := range s.appConfig.Cameras {
|
for _, cam := range s.appConfig.Cameras {
|
||||||
online := false
|
online := false
|
||||||
// Check if latest.jpg was recently updated.
|
|
||||||
camDir := cam.Name
|
camDir := cam.Name
|
||||||
if camDir == "" {
|
if camDir == "" {
|
||||||
camDir = cam.ID
|
camDir = cam.ID
|
||||||
}
|
}
|
||||||
|
// Check snapshot file (updated every 1s by snapshot engine).
|
||||||
snapFile := filepath.Join(s.appConfig.Storage.RecordingsPath, camDir, "latest.jpg")
|
snapFile := filepath.Join(s.appConfig.Storage.RecordingsPath, camDir, "latest.jpg")
|
||||||
if info, err := os.Stat(snapFile); err == nil {
|
if info, err := os.Stat(snapFile); err == nil {
|
||||||
online = time.Since(info.ModTime()) < 10*time.Second
|
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{
|
statuses = append(statuses, CameraStatus{
|
||||||
CameraConfig: cam,
|
CameraConfig: cam,
|
||||||
Online: online,
|
Online: online,
|
||||||
|
|
@ -74,6 +90,19 @@ func (s *Server) handleCameraByID(w http.ResponseWriter, r *http.Request) {
|
||||||
if info, err := os.Stat(snapFile); err == nil {
|
if info, err := os.Stat(snapFile); err == nil {
|
||||||
online = time.Since(info.ModTime()) < 10*time.Second
|
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{
|
status := CameraStatus{
|
||||||
CameraConfig: *cam,
|
CameraConfig: *cam,
|
||||||
Online: online,
|
Online: online,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue