package onvif import ( "context" "fmt" "net/url" "time" ) type Router struct { camera Adapter credentials CredentialProvider } func NewRouter(camera Adapter, credentials CredentialProvider) *Router { return &Router{camera: camera, credentials: credentials} } func (r *Router) Probe(ctx context.Context, target Target) (ProbeResult, error) { endpoint, err := url.Parse(target.EndpointRef) if err != nil || endpoint.Host == "" || endpoint.User != nil { return ProbeResult{}, &Error{Code: ErrorInvalidReply, Err: fmt.Errorf("endpoint reference is invalid")} } switch endpoint.Scheme { case "http", "https": return r.camera.Probe(ctx, target) case "rtsp", "rtsps": if target.CredentialRef != "" { credentials, resolveErr := r.credentials.Resolve(target.CredentialRef) if resolveErr != nil { return ProbeResult{}, &Error{Code: ErrorAuthentication, Err: resolveErr} } endpoint.User = url.UserPassword(credentials.RTSPUsername, credentials.RTSPPassword) } return ProbeResult{ Profiles: []Profile{{Token: "direct", Name: "direct", VideoEncoder: true}}, StreamURI: endpoint.String(), }, nil default: return ProbeResult{}, &Error{Code: ErrorInvalidReply, Err: fmt.Errorf("unsupported endpoint scheme")} } } func (r *Router) SetSystemDateAndTime(ctx context.Context, target Target, value time.Time) error { endpoint, err := url.Parse(target.EndpointRef) if err != nil || (endpoint.Scheme != "http" && endpoint.Scheme != "https") { return &Error{Code: ErrorInvalidReply, Err: fmt.Errorf("clock sync requires an ONVIF endpoint")} } return r.camera.SetSystemDateAndTime(ctx, target, value) }