diff --git a/Sense/server/app/sense/adapters/onvif/parser.go b/Sense/server/app/sense/adapters/onvif/parser.go index 56b2665..f3b1283 100644 --- a/Sense/server/app/sense/adapters/onvif/parser.go +++ b/Sense/server/app/sense/adapters/onvif/parser.go @@ -54,3 +54,33 @@ func ParseStreamURI(data []byte) (string, error) { } } } + +func ParseMediaServiceAddress(data []byte) (string, error) { + decoder := xml.NewDecoder(strings.NewReader(string(data))) + mediaDepth := 0 + for { + token, err := decoder.Token() + if err != nil { + return "", fmt.Errorf("media_service_not_found") + } + switch value := token.(type) { + case xml.StartElement: + if value.Name.Local == "Media" { + mediaDepth++ + continue + } + if mediaDepth > 0 && value.Name.Local == "XAddr" { + var address string + if err := decoder.DecodeElement(&address, &value); err != nil { + return "", err + } + return strings.TrimSpace(address), nil + } + case xml.EndElement: + if value.Name.Local == "Media" && mediaDepth > 0 { + mediaDepth-- + } + } + } +} +