51 lines
1.6 KiB
Go
51 lines
1.6 KiB
Go
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)
|
|
}
|