138 lines
3.8 KiB
Go
138 lines
3.8 KiB
Go
package api
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
|
|
"github.com/gorilla/mux"
|
|
"github.com/ossrs/srs-sip/pkg/service"
|
|
)
|
|
|
|
func (h *HttpApiServer) RegisterRoutes(router *mux.Router) {
|
|
|
|
apiV1Router := router.PathPrefix("/srs-sip/v1").Subrouter()
|
|
|
|
// Add Auth middleware
|
|
//apiV1Router.Use(authMiddleware)
|
|
|
|
apiV1Router.HandleFunc("/devices", h.ApiListDevices).Methods(http.MethodGet)
|
|
apiV1Router.HandleFunc("/devices/{id}/channels", h.ApiGetChannelByDeviceId).Methods(http.MethodGet)
|
|
apiV1Router.HandleFunc("/channels", h.ApiGetAllChannels).Methods(http.MethodGet)
|
|
|
|
apiV1Router.HandleFunc("/invite", h.ApiInvite).Methods(http.MethodPost)
|
|
apiV1Router.HandleFunc("/bye", h.ApiBye).Methods(http.MethodPost)
|
|
apiV1Router.HandleFunc("/ptz", h.ApiPTZControl).Methods(http.MethodPost)
|
|
|
|
apiV1Router.HandleFunc("", h.GetAPIRoutes(apiV1Router)).Methods(http.MethodGet)
|
|
|
|
router.HandleFunc("/srs-sip", h.ApiGetAPIVersion).Methods(http.MethodGet)
|
|
}
|
|
|
|
func (h *HttpApiServer) RespondWithJSON(w http.ResponseWriter, code int, data interface{}) {
|
|
w.Header().Set("Content-Type", "application/json")
|
|
wrapper := map[string]interface{}{
|
|
"code": code,
|
|
"data": data,
|
|
}
|
|
json.NewEncoder(w).Encode(wrapper)
|
|
}
|
|
|
|
func (h *HttpApiServer) RespondWithJSONSimple(w http.ResponseWriter, jsonStr string) {
|
|
w.Header().Set("Content-Type", "application/json")
|
|
w.Write([]byte(jsonStr))
|
|
}
|
|
|
|
func (h *HttpApiServer) GetAPIRoutes(router *mux.Router) http.HandlerFunc {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
var routes []map[string]string
|
|
|
|
router.Walk(func(route *mux.Route, router *mux.Router, ancestors []*mux.Route) error {
|
|
path, err := route.GetPathTemplate()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
methods, err := route.GetMethods()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for _, method := range methods {
|
|
routes = append(routes, map[string]string{
|
|
"method": method,
|
|
"path": path,
|
|
})
|
|
}
|
|
return nil
|
|
})
|
|
|
|
h.RespondWithJSON(w, 0, routes)
|
|
}
|
|
}
|
|
|
|
func (h *HttpApiServer) ApiGetAPIVersion(w http.ResponseWriter, r *http.Request) {
|
|
h.RespondWithJSONSimple(w, `{"version": "v1"}`)
|
|
}
|
|
|
|
func (h *HttpApiServer) ApiListDevices(w http.ResponseWriter, r *http.Request) {
|
|
list := service.DM.GetDevices()
|
|
h.RespondWithJSON(w, 0, list)
|
|
}
|
|
|
|
func (h *HttpApiServer) ApiGetChannelByDeviceId(w http.ResponseWriter, r *http.Request) {
|
|
vars := mux.Vars(r)
|
|
id := vars["id"]
|
|
channels := service.DM.ApiGetChannelByDeviceId(id)
|
|
h.RespondWithJSON(w, 0, channels)
|
|
}
|
|
|
|
func (h *HttpApiServer) ApiGetAllChannels(w http.ResponseWriter, r *http.Request) {
|
|
channels := service.DM.GetAllVideoChannels()
|
|
h.RespondWithJSON(w, 0, channels)
|
|
}
|
|
|
|
// request: {"device_id": "1", "channel_id": "1", "sub_stream": 0}
|
|
// response: {"code": 0, "data": {"channel_id": "1", "url": "webrtc://"}}
|
|
func (h *HttpApiServer) ApiInvite(w http.ResponseWriter, r *http.Request) {
|
|
// Parse request
|
|
var req map[string]string
|
|
err := json.NewDecoder(r.Body).Decode(&req)
|
|
if err != nil {
|
|
w.WriteHeader(http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
// Get device and channel
|
|
deviceID := req["device_id"]
|
|
channelID := req["channel_id"]
|
|
//subStream := req["sub_stream"]
|
|
|
|
code := 0
|
|
url := ""
|
|
|
|
defer func() {
|
|
data := map[string]string{
|
|
"channel_id": channelID,
|
|
"url": url,
|
|
}
|
|
h.RespondWithJSON(w, code, data)
|
|
}()
|
|
|
|
if err := h.sipSvr.Uas.Invite(deviceID, channelID); err != nil {
|
|
code = http.StatusInternalServerError
|
|
return
|
|
}
|
|
c, ok := h.sipSvr.Uas.GetVideoChannelStatue(channelID)
|
|
if !ok {
|
|
code = http.StatusInternalServerError
|
|
return
|
|
}
|
|
url = "webrtc://" + h.conf.MediaAddr + "/live/" + c.Ssrc
|
|
}
|
|
|
|
func (h *HttpApiServer) ApiBye(w http.ResponseWriter, r *http.Request) {
|
|
h.RespondWithJSONSimple(w, `{"msg":"Not implemented"}`)
|
|
}
|
|
|
|
func (h *HttpApiServer) ApiPTZControl(w http.ResponseWriter, r *http.Request) {
|
|
h.RespondWithJSONSimple(w, `{"msg":"Not implemented"}`)
|
|
}
|