diff --git a/cmd/hass/hass.go b/cmd/hass/hass.go index 9ad70783..de66bc9b 100644 --- a/cmd/hass/hass.go +++ b/cmd/hass/hass.go @@ -1,11 +1,16 @@ package hass import ( + "encoding/base64" "encoding/json" "fmt" + "github.com/AlexxIT/go2rtc/cmd/api" "github.com/AlexxIT/go2rtc/cmd/app" "github.com/AlexxIT/go2rtc/cmd/streams" + "github.com/AlexxIT/go2rtc/cmd/webrtc" "github.com/AlexxIT/go2rtc/pkg/streamer" + "github.com/rs/zerolog" + "net/http" "os" "path" ) @@ -47,6 +52,57 @@ func Init() { } return nil, fmt.Errorf("can't get url: %s", url) }) + + // support https://www.home-assistant.io/integrations/rtsp_to_webrtc/ + api.HandleFunc("/static", func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + }) + api.HandleFunc("/stream", handler) + + log = app.GetLogger("api") +} + +var log zerolog.Logger + +func handler(w http.ResponseWriter, r *http.Request) { + if err := r.ParseForm(); err != nil { + log.Error().Err(err).Msg("[api.hass] parse form") + return + } + + url := r.FormValue("url") + str := r.FormValue("sdp64") + + offer, err := base64.StdEncoding.DecodeString(str) + if err != nil { + log.Error().Err(err).Msg("[api.hass] sdp64 decode") + return + } + + stream := streams.NewStream(url) + str, err = webrtc.ExchangeSDP(stream, string(offer), r.UserAgent()) + if err != nil { + log.Error().Err(err).Msg("[api.hass] exchange SDP") + return + } + + resp := struct { + Answer string `json:"sdp64"` + }{ + Answer: base64.StdEncoding.EncodeToString([]byte(str)), + } + + data, err := json.Marshal(resp) + if err != nil { + log.Error().Err(err).Msg("[api.hass] marshal JSON") + return + } + + w.Header().Set("Content-Type", "application/json") + if _, err = w.Write(data); err != nil { + log.Error().Err(err).Msg("[api.hass] write") + return + } } type entries struct {