livechannel.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. package oss
  2. import (
  3. "bytes"
  4. "encoding/xml"
  5. "fmt"
  6. "net/http"
  7. "strconv"
  8. "time"
  9. )
  10. //
  11. // CreateLiveChannel 创建推流直播频道
  12. //
  13. // channelName 直播流频道名称
  14. // config 直播流频的配置信息
  15. //
  16. // CreateLiveChannelResult 创建直播流频请求的返回结果
  17. // error 操作无错误时返回nil,非nil为错误信息
  18. //
  19. func (bucket Bucket) CreateLiveChannel(channelName string, config LiveChannelConfiguration) (CreateLiveChannelResult, error) {
  20. var out CreateLiveChannelResult
  21. bs, err := xml.Marshal(config)
  22. if err != nil {
  23. return out, err
  24. }
  25. buffer := new(bytes.Buffer)
  26. buffer.Write(bs)
  27. params := map[string]interface{}{}
  28. params["live"] = nil
  29. resp, err := bucket.do("PUT", channelName, params, nil, buffer, nil)
  30. if err != nil {
  31. return out, err
  32. }
  33. defer resp.Body.Close()
  34. err = xmlUnmarshal(resp.Body, &out)
  35. return out, err
  36. }
  37. //
  38. // PutLiveChannelStatus 设置直播频道的状态,有两种状态可选:enabled和disabled
  39. //
  40. // channelName 直播流频道的名称
  41. // status 状态,有两种状态可选:enabled和disabled
  42. //
  43. // error 操作无错误时返回nil, 非nil为错误信息
  44. //
  45. func (bucket Bucket) PutLiveChannelStatus(channelName, status string) error {
  46. params := map[string]interface{}{}
  47. params["live"] = nil
  48. params["status"] = status
  49. resp, err := bucket.do("PUT", channelName, params, nil, nil, nil)
  50. if err != nil {
  51. return err
  52. }
  53. defer resp.Body.Close()
  54. return checkRespCode(resp.StatusCode, []int{http.StatusOK})
  55. }
  56. // PostVodPlaylist 根据指定的playlist name以及startTime和endTime生成一个点播的播放列表
  57. //
  58. // channelName 直播流频道的名称
  59. // playlistName 指定生成的点播列表的名称,必须以”.m3u8“结尾
  60. // startTime 指定查询ts文件的起始时间
  61. // endTime 指定查询ts文件的终止时间
  62. //
  63. // error 操作无错误是返回nil, 非nil为错误信息
  64. //
  65. func (bucket Bucket) PostVodPlaylist(channelName, playlistName string, startTime, endTime time.Time) error {
  66. params := map[string]interface{}{}
  67. params["vod"] = nil
  68. params["startTime"] = strconv.FormatInt(startTime.Unix(), 10)
  69. params["endTime"] = strconv.FormatInt(endTime.Unix(), 10)
  70. key := fmt.Sprintf("%s/%s", channelName, playlistName)
  71. resp, err := bucket.do("POST", key, params, nil, nil, nil)
  72. if err != nil {
  73. return err
  74. }
  75. defer resp.Body.Close()
  76. return checkRespCode(resp.StatusCode, []int{http.StatusOK})
  77. }
  78. //
  79. // GetLiveChannelStat 获取指定直播流频道当前推流的状态
  80. //
  81. // channelName 直播流频道的名称
  82. //
  83. // LiveChannelStat 直播流频道当前推流状态信息
  84. // error 操作无错误是返回nil, 非nil为错误信息
  85. //
  86. func (bucket Bucket) GetLiveChannelStat(channelName string) (LiveChannelStat, error) {
  87. var out LiveChannelStat
  88. params := map[string]interface{}{}
  89. params["live"] = nil
  90. params["comp"] = "stat"
  91. resp, err := bucket.do("GET", channelName, params, nil, nil, nil)
  92. if err != nil {
  93. return out, err
  94. }
  95. defer resp.Body.Close()
  96. err = xmlUnmarshal(resp.Body, &out)
  97. return out, err
  98. }
  99. //
  100. // GetLiveChannelInfo 获取直播流频道的配置信息
  101. //
  102. // channelName 直播流频道的名称
  103. //
  104. // LiveChannelConfiguration 直播流频道的配置信息
  105. // error 操作无错误返回nil, 非nil为错误信息
  106. //
  107. func (bucket Bucket) GetLiveChannelInfo(channelName string) (LiveChannelConfiguration, error) {
  108. var out LiveChannelConfiguration
  109. params := map[string]interface{}{}
  110. params["live"] = nil
  111. resp, err := bucket.do("GET", channelName, params, nil, nil, nil)
  112. if err != nil {
  113. return out, err
  114. }
  115. defer resp.Body.Close()
  116. err = xmlUnmarshal(resp.Body, &out)
  117. return out, err
  118. }
  119. //
  120. // GetLiveChannelHistory 获取直播流频道的历史推流记录
  121. //
  122. // channelName 直播流频道名称
  123. //
  124. // LiveChannelHistory 返回的直播流历史推流记录
  125. // error 操作无错误返回nil, 非nil为错误信息
  126. //
  127. func (bucket Bucket) GetLiveChannelHistory(channelName string) (LiveChannelHistory, error) {
  128. var out LiveChannelHistory
  129. params := map[string]interface{}{}
  130. params["live"] = nil
  131. params["comp"] = "history"
  132. resp, err := bucket.do("GET", channelName, params, nil, nil, nil)
  133. if err != nil {
  134. return out, err
  135. }
  136. defer resp.Body.Close()
  137. err = xmlUnmarshal(resp.Body, &out)
  138. return out, err
  139. }
  140. //
  141. // ListLiveChannel 获取直播流频道的信息列表
  142. //
  143. // options 筛选选项:Prefix指定的前缀、MaxKeys为返回的最大数目、Marker代表从哪个livechannel作为游标开始列表
  144. //
  145. // ListLiveChannelResult 返回的livechannel列表结果
  146. // error 操作无结果返回nil, 非nil为错误信息
  147. //
  148. func (bucket Bucket) ListLiveChannel(options ...Option) (ListLiveChannelResult, error) {
  149. var out ListLiveChannelResult
  150. //options = append(options, EncodingType("url"))
  151. params, err := getRawParams(options)
  152. if err != nil {
  153. return out, err
  154. }
  155. params["live"] = nil
  156. resp, err := bucket.do("GET", "", params, nil, nil, nil)
  157. if err != nil {
  158. return out, err
  159. }
  160. defer resp.Body.Close()
  161. err = xmlUnmarshal(resp.Body, &out)
  162. return out, err
  163. }
  164. //
  165. // DeleteLiveChannel 删除指定的livechannel,当有客户端正在想livechannel推流时,删除请求回失败,本接口志辉删除livechannel本身,不会删除推流生成的文件
  166. //
  167. // channelName 直播流的频道名称
  168. //
  169. // error 操作无错误返回nil, 非nil为错误信息
  170. //
  171. func (bucket Bucket) DeleteLiveChannel(channelName string) error {
  172. params := map[string]interface{}{}
  173. params["live"] = nil
  174. if channelName == "" {
  175. return fmt.Errorf("invalid argument: channel name is empty")
  176. }
  177. resp, err := bucket.do("DELETE", channelName, params, nil, nil, nil)
  178. if err != nil {
  179. return err
  180. }
  181. defer resp.Body.Close()
  182. return checkRespCode(resp.StatusCode, []int{http.StatusNoContent})
  183. }
  184. //
  185. // SignRtmpURL 生成RTMP推流签名的URL, 常见的用法是生成加签的URL以供授信用户向OSS推RTMP流。
  186. //
  187. // channelName 直播流的频道名称
  188. // playlistName 播放列表名称,其值会覆盖LiveChannel中的配置,必须以“.m3u8”结尾
  189. // expires 过期时间(单位:秒),链接在当前时间再过expires秒后过期
  190. //
  191. // string 返回的加签的rtmp推流地址
  192. // error 操作无错误返回nil, 非nil为错误信息
  193. //
  194. func (bucket Bucket) SignRtmpURL(channelName, playlistName string, expires int64) (string, error) {
  195. if expires < 0 {
  196. return "", fmt.Errorf("invalid argument: %d, expires must greater than 0", expires)
  197. }
  198. expiration := time.Now().Unix() + expires
  199. return bucket.Client.Conn.signRtmpURL(bucket.BucketName, channelName, playlistName, expiration), nil
  200. }