oven-exporter/api/response_push.go

107 lines
3.9 KiB
Go

package api
import (
"fmt"
"net/http"
)
// API URLS for Push
const (
URLRequestPushStatus = "/v1/vhosts/%s/apps/%s:pushes"
URLRequestPushStart = "/v1/vhosts/%s/apps/%s:startPush"
URLRequestPushStop = "/v1/vhosts/%s/apps/%s:stopPush"
)
// ResponsePushStatus JSON Message with Push status data
type ResponsePushStatus struct {
Message string `json:"message"`
StatusCode int `json:"statusCode"`
Data []*ResponsePushData `json:"response,omitempty"`
}
// ResponsePushData one push configuration
type ResponsePushData struct {
VHost string `json:"vhost" example:"default"`
App string `json:"app" example:"live"`
ID string `json:"id" example:"youtube"`
Stream *ResponsePushDataStream `json:"stream"`
State string `json:"state" example:"ready"`
Protocol string `json:"protocol" example:"rtmp"`
URL string `json:"url" example:"rtmp://a.rtmp.youtube.com/live2"`
StreamKey string `json:"streamKey" example:"SUPERSECRET"`
// - timestamp - time.TIme has problem with nanosecond in JSON
CreatedTime string `json:"createdTime" example:"2021-07-19T23:13:12.162+0200"`
FinishedTime string `json:"finishedTime" example:"2021-07-19T23:23:27.274+0200"`
StartTime string `json:"startTime" example:"2021-07-19T23:23:27.077+0200"`
// - coonnections
Sequence int `json:"sequence" example:"1"`
// - traffic
SentBytes uint64 `json:"sentBytes" example:"0"`
SentTime uint64 `json:"sentTime" example:"0"`
TotalSentBytes uint64 `json:"totalsentBytes" example:"356233652"`
TotalSentTime uint64 `json:"totalsentTime" example:"933808"`
}
// ResponsePushStart one push configuration
type ResponsePushStart struct {
ID string `json:"id" example:"youtube"`
Stream *ResponsePushDataStream `json:"stream"`
Protocol string `json:"protocol" example:"rtmp"`
URL string `json:"url" example:"rtmp://a.rtmp.youtube.com/live2"`
StreamKey string `json:"streamKey" example:"SUPERSECRET"`
}
// ResponsePushDataStream of data of stream
type ResponsePushDataStream struct {
Name string `json:"name" example:"..."`
Tracks []int `json:"tracks" example:"[]"`
}
// RequestPushStatus to get list of pushes and his configuration
func (c *Client) RequestPushStatus(vhost, app string) (*ResponsePushStatus, error) {
req := ResponsePushStatus{}
url := fmt.Sprintf(URLRequestPushStatus, vhost, app)
if err := c.Request(http.MethodGet, url, nil, &req); err != nil {
return nil, err
}
return &req, nil
}
// RequestPushStatusDefault to get list of pushes and his configuration for default vhost and app
func (c *Client) RequestPushStatusDefault() (*ResponsePushStatus, error) {
return c.RequestPushStatus(c.DefaultVHost, c.DefaultApp)
}
// StartPush to delete an push
func (c *Client) StartPush(vhost, app string, data *ResponsePushStart) (*ResponsePushStatus, error) {
req := ResponsePushStatus{}
url := fmt.Sprintf(URLRequestPushStart, vhost, app)
if err := c.Request(http.MethodPost, url, &data, &req); err != nil {
return &req, err
}
return &req, nil
}
// StartPushDefault to delete an push and on default vhost and app
func (c *Client) StartPushDefault(data *ResponsePushStart) (*ResponsePushStatus, error) {
return c.StartPush(c.DefaultVHost, c.DefaultApp, data)
}
// DeletePush to delete an push
func (c *Client) DeletePush(vhost, app, id string) error {
type idJSON struct {
ID string `json:"id"`
}
url := fmt.Sprintf(URLRequestPushStop, vhost, app)
data := idJSON{ID: id}
if err := c.Request(http.MethodPost, url, &data, nil); err != nil {
return err
}
return nil
}
// DeletePushDefault to delete an push and on default vhost and app
func (c *Client) DeletePushDefault(id string) error {
return c.DeletePush(c.DefaultVHost, c.DefaultApp, id)
}