diff --git a/agent/internal/httpapi/preview.go b/agent/internal/httpapi/preview.go new file mode 100644 index 0000000..adc12c3 --- /dev/null +++ b/agent/internal/httpapi/preview.go @@ -0,0 +1,58 @@ +package httpapi + +import ( + "encoding/json" + "net/http" + "strconv" +) + +type previewChannel struct { + Name string `json:"name"` + HlsURL string `json:"hls_url,omitempty"` +} + +// handlePreviewChannels returns available video preview channels. +// GET /v1/preview/channels +func (s *Server) handlePreviewChannels(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + errorJSON(w, http.StatusMethodNotAllowed, "method not allowed") + return + } + if !s.authorize(r, false) { + errorJSON(w, http.StatusUnauthorized, "unauthorized") + return + } + + channels := s.discoverChannels(r) + if channels == nil { + channels = make([]previewChannel, 0) + } + writeJSON(w, http.StatusOK, map[string]any{"channels": channels}) +} + +func (s *Server) discoverChannels(r *http.Request) []previewChannel { + if s.ms == nil { + return nil + } + _, body, err := s.ms.GetGraphs(r.Context()) + if err != nil { + return nil + } + + var graphs []struct { + Name string `json:"name"` + } + if err := json.Unmarshal(body, &graphs); err != nil { + return nil + } + + baseURL := "http://" + s.hostname + ":" + strconv.Itoa(s.mediaPort) + var channels []previewChannel + for _, g := range graphs { + channels = append(channels, previewChannel{ + Name: g.Name, + HlsURL: baseURL + "/hls/" + g.Name + "/index.m3u8", + }) + } + return channels +} diff --git a/agent/internal/httpapi/server.go b/agent/internal/httpapi/server.go index 6976a2a..410d106 100644 --- a/agent/internal/httpapi/server.go +++ b/agent/internal/httpapi/server.go @@ -134,6 +134,7 @@ func New(agentCfg config.AgentConfig, baseDir string, ms *mediaserver.Client, st mux.HandleFunc("/v1/face-gallery/reload", s.handleFaceGalleryReload) mux.HandleFunc("/v1/alarms/report", s.handleAlarmReport) mux.HandleFunc("/v1/alarms/recent", s.handleAlarmsRecent) + mux.HandleFunc("/v1/preview/channels", s.handlePreviewChannels) mux.HandleFunc("/v1/resources/status", s.handleResourcesStatus) mux.HandleFunc("/v1/resources/", s.handleResourceUpload) mux.HandleFunc("/v1/models", s.handleModelsList) diff --git a/agent/rk3588-agent_linux_arm64 b/agent/rk3588-agent_linux_arm64 index 68a146f..450c140 100755 Binary files a/agent/rk3588-agent_linux_arm64 and b/agent/rk3588-agent_linux_arm64 differ