package oss import ( "bytes" "encoding/xml" "fmt" "io" "net/http" "strconv" "time" ) // // CreateLiveChannel create a live-channel // // channelName the name of the channel // config configuration of the channel // // CreateLiveChannelResult the result of create live-channel // error nil if success, otherwise error // func (bucket Bucket) CreateLiveChannel(channelName string, config LiveChannelConfiguration) (CreateLiveChannelResult, error) { var out CreateLiveChannelResult bs, err := xml.Marshal(config) if err != nil { return out, err } buffer := new(bytes.Buffer) buffer.Write(bs) params := map[string]interface{}{} params["live"] = nil resp, err := bucket.do("PUT", channelName, params, nil, buffer, nil) if err != nil { return out, err } defer resp.Body.Close() err = xmlUnmarshal(resp.Body, &out) return out, err } // // PutLiveChannelStatus Set the status of the live-channel: enabled/disabled // // channelName the name of the channel // status enabled/disabled // // error nil if success, otherwise error // func (bucket Bucket) PutLiveChannelStatus(channelName, status string) error { params := map[string]interface{}{} params["live"] = nil params["status"] = status resp, err := bucket.do("PUT", channelName, params, nil, nil, nil) if err != nil { return err } defer resp.Body.Close() return CheckRespCode(resp.StatusCode, []int{http.StatusOK}) } // PostVodPlaylist create an playlist based on the specified playlist name, startTime and endTime // // channelName the name of the channel // playlistName the name of the playlist, must end with ".m3u8" // startTime the start time of the playlist // endTime the endtime of the playlist // // error nil if success, otherwise error // func (bucket Bucket) PostVodPlaylist(channelName, playlistName string, startTime, endTime time.Time) error { params := map[string]interface{}{} params["vod"] = nil params["startTime"] = strconv.FormatInt(startTime.Unix(), 10) params["endTime"] = strconv.FormatInt(endTime.Unix(), 10) key := fmt.Sprintf("%s/%s", channelName, playlistName) resp, err := bucket.do("POST", key, params, nil, nil, nil) if err != nil { return err } defer resp.Body.Close() return CheckRespCode(resp.StatusCode, []int{http.StatusOK}) } // GetVodPlaylist get the playlist based on the specified channelName, startTime and endTime // // channelName the name of the channel // startTime the start time of the playlist // endTime the endtime of the playlist // // io.ReadCloser reader instance for reading data from response. It must be called close() after the usage and only valid when error is nil. // error nil if success, otherwise error // func (bucket Bucket) GetVodPlaylist(channelName string, startTime, endTime time.Time) (io.ReadCloser, error) { params := map[string]interface{}{} params["vod"] = nil params["startTime"] = strconv.FormatInt(startTime.Unix(), 10) params["endTime"] = strconv.FormatInt(endTime.Unix(), 10) resp, err := bucket.do("GET", channelName, params, nil, nil, nil) if err != nil { return nil, err } return resp.Body, nil } // // GetLiveChannelStat Get the state of the live-channel // // channelName the name of the channel // // LiveChannelStat the state of the live-channel // error nil if success, otherwise error // func (bucket Bucket) GetLiveChannelStat(channelName string) (LiveChannelStat, error) { var out LiveChannelStat params := map[string]interface{}{} params["live"] = nil params["comp"] = "stat" resp, err := bucket.do("GET", channelName, params, nil, nil, nil) if err != nil { return out, err } defer resp.Body.Close() err = xmlUnmarshal(resp.Body, &out) return out, err } // // GetLiveChannelInfo Get the configuration info of the live-channel // // channelName the name of the channel // // LiveChannelConfiguration the configuration info of the live-channel // error nil if success, otherwise error // func (bucket Bucket) GetLiveChannelInfo(channelName string) (LiveChannelConfiguration, error) { var out LiveChannelConfiguration params := map[string]interface{}{} params["live"] = nil resp, err := bucket.do("GET", channelName, params, nil, nil, nil) if err != nil { return out, err } defer resp.Body.Close() err = xmlUnmarshal(resp.Body, &out) return out, err } // // GetLiveChannelHistory Get push records of live-channel // // channelName the name of the channel // // LiveChannelHistory push records // error nil if success, otherwise error // func (bucket Bucket) GetLiveChannelHistory(channelName string) (LiveChannelHistory, error) { var out LiveChannelHistory params := map[string]interface{}{} params["live"] = nil params["comp"] = "history" resp, err := bucket.do("GET", channelName, params, nil, nil, nil) if err != nil { return out, err } defer resp.Body.Close() err = xmlUnmarshal(resp.Body, &out) return out, err } // // ListLiveChannel list the live-channels // // options Prefix: filter by the name start with the value of "Prefix" // MaxKeys: the maximum count returned // Marker: cursor from which starting list // // ListLiveChannelResult live-channel list // error nil if success, otherwise error // func (bucket Bucket) ListLiveChannel(options ...Option) (ListLiveChannelResult, error) { var out ListLiveChannelResult params, err := GetRawParams(options) if err != nil { return out, err } params["live"] = nil resp, err := bucket.doInner("GET", "", params, nil, nil, nil) if err != nil { return out, err } defer resp.Body.Close() err = xmlUnmarshal(resp.Body, &out) return out, err } // // DeleteLiveChannel Delete the live-channel. When a client trying to stream the live-channel, the operation will fail. it will only delete the live-channel itself and the object generated by the live-channel will not be deleted. // // channelName the name of the channel // // error nil if success, otherwise error // func (bucket Bucket) DeleteLiveChannel(channelName string) error { params := map[string]interface{}{} params["live"] = nil if channelName == "" { return fmt.Errorf("invalid argument: channel name is empty") } resp, err := bucket.do("DELETE", channelName, params, nil, nil, nil) if err != nil { return err } defer resp.Body.Close() return CheckRespCode(resp.StatusCode, []int{http.StatusNoContent}) } // // SignRtmpURL Generate a RTMP push-stream signature URL for the trusted user to push the RTMP stream to the live-channel. // // channelName the name of the channel // playlistName the name of the playlist, must end with ".m3u8" // expires expiration (in seconds) // // string singed rtmp push stream url // error nil if success, otherwise error // func (bucket Bucket) SignRtmpURL(channelName, playlistName string, expires int64) (string, error) { if expires <= 0 { return "", fmt.Errorf("invalid argument: %d, expires must greater than 0", expires) } expiration := time.Now().Unix() + expires return bucket.Client.Conn.signRtmpURL(bucket.BucketName, channelName, playlistName, expiration), nil }