player.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. package http
  2. import (
  3. "encoding/xml"
  4. "net/http"
  5. "strconv"
  6. "strings"
  7. "time"
  8. "go-common/app/interface/main/player/model"
  9. "go-common/library/ecode"
  10. "go-common/library/log"
  11. bm "go-common/library/net/http/blademaster"
  12. "go-common/library/net/metadata"
  13. )
  14. type playerInfoc struct {
  15. ip string
  16. ctime string
  17. api string
  18. buvid string
  19. mid string
  20. client string
  21. itemID string
  22. displayID string
  23. errCode string
  24. from string
  25. build string
  26. trackID string
  27. }
  28. const (
  29. _api = "player"
  30. _client = "web"
  31. )
  32. var (
  33. emptyByte = []byte{}
  34. _headerBuvid = "Buvid"
  35. _buvid = "buvid3"
  36. )
  37. func player(c *bm.Context) {
  38. var (
  39. aid, cid, mid int64
  40. sid model.Sid
  41. sidCookie *http.Cookie
  42. err error
  43. ip = metadata.String(c, metadata.RemoteIP)
  44. )
  45. request := c.Request
  46. params := request.Form
  47. idStr := params.Get("id")
  48. aidStr := params.Get("aid")
  49. cidStr := params.Get("cid")
  50. refer := request.Referer()
  51. // response header
  52. c.Writer.Header().Set("Cache-Control", "no-cache")
  53. c.Writer.Header().Set("X-Remote-IP", ip)
  54. // get mid
  55. if midInter, ok := c.Get("mid"); ok {
  56. mid = midInter.(int64)
  57. }
  58. if strings.Index(idStr, "cid:") == 0 {
  59. cidStr = idStr[4:]
  60. }
  61. if cid, err = strconv.ParseInt(cidStr, 10, 64); err != nil || cid <= 0 {
  62. c.AbortWithStatus(http.StatusBadRequest)
  63. return
  64. }
  65. // get aid
  66. if aid, err = strconv.ParseInt(aidStr, 10, 64); err != nil || aid <= 0 {
  67. c.AbortWithStatus(http.StatusBadRequest)
  68. return
  69. }
  70. sidCookie, err = request.Cookie("sid")
  71. if err != nil || sidCookie.Value == "" {
  72. http.SetCookie(c.Writer, &http.Cookie{Name: "sid", Value: string(sid.Create()), Path: "/", Domain: ".bilibili.com"})
  73. }
  74. if sidCookie != nil {
  75. if sidCookie.Value != "" {
  76. sidStr := sidCookie.Value
  77. if !model.Sid(sidStr).Valid() {
  78. http.SetCookie(c.Writer, &http.Cookie{Name: "sid", Value: string(sid.Create()), Path: "/", Domain: ".bilibili.com"})
  79. }
  80. }
  81. }
  82. var (
  83. ips = strings.Split(c.Request.Header.Get("X-Forwarded-For"), ",")
  84. cdnIP string
  85. playByte []byte
  86. )
  87. if len(ips) >= 2 {
  88. cdnIP = ips[1]
  89. }
  90. buvid := request.Header.Get(_headerBuvid)
  91. if buvid == "" {
  92. cookie, _ := request.Cookie(_buvid)
  93. if cookie != nil {
  94. buvid = cookie.Value
  95. }
  96. }
  97. now := time.Now()
  98. if playInfoc != nil {
  99. showInfoc(ip, now, buvid, aid, mid)
  100. }
  101. if playByte, err = playSvr.Player(c, mid, aid, cid, cdnIP, refer, now); err != nil {
  102. c.AbortWithStatus(http.StatusNotFound)
  103. return
  104. }
  105. c.Bytes(http.StatusOK, "text/plain; charset=utf-8", playByte)
  106. }
  107. func carousel(c *bm.Context) {
  108. // response header
  109. c.Writer.Header().Set("Cache-Control", "no-cache")
  110. c.Writer.Header().Set("Connection", "keep-alive")
  111. type msg struct {
  112. Items []*model.Item `xml:"item"`
  113. }
  114. var (
  115. items []*model.Item
  116. err error
  117. )
  118. if items, err = playSvr.Carousel(c); err != nil {
  119. c.Bytes(http.StatusOK, "text/xml; charset=utf-8", emptyByte)
  120. return
  121. }
  122. result := msg{Items: items}
  123. output, err := xml.MarshalIndent(result, " ", " ")
  124. if err != nil {
  125. output = emptyByte
  126. }
  127. c.Bytes(http.StatusOK, "text/xml; charset=utf-8", output)
  128. }
  129. func policy(c *bm.Context) {
  130. var (
  131. id int64
  132. mid int64
  133. err error
  134. )
  135. if midInter, ok := c.Get("mid"); ok {
  136. mid = midInter.(int64)
  137. }
  138. params := c.Request.Form
  139. idStr := params.Get("id")
  140. if id, err = strconv.ParseInt(idStr, 10, 64); err != nil || id < 0 {
  141. c.JSON(nil, ecode.RequestErr)
  142. return
  143. }
  144. c.JSON(playSvr.Policy(c, id, mid))
  145. }
  146. func view(c *bm.Context) {
  147. var (
  148. aid int64
  149. err error
  150. )
  151. aidStr := c.Request.Form.Get("aid")
  152. if aid, err = strconv.ParseInt(aidStr, 10, 64); err != nil || aid < 0 {
  153. c.JSON(nil, ecode.RequestErr)
  154. return
  155. }
  156. c.JSON(playSvr.View(c, aid))
  157. }
  158. func matPage(c *bm.Context) {
  159. c.JSON(playSvr.Matsuri(c, time.Now()), nil)
  160. }
  161. func showInfoc(ip string, now time.Time, buvid string, aid, mid int64) {
  162. if playInfoc == nil {
  163. return
  164. }
  165. info := &playerInfoc{
  166. ip: ip,
  167. ctime: strconv.FormatInt(now.Unix(), 10),
  168. api: _api,
  169. buvid: buvid,
  170. mid: strconv.FormatInt(mid, 10),
  171. client: _client,
  172. itemID: strconv.FormatInt(aid, 10),
  173. displayID: "",
  174. errCode: "",
  175. from: "",
  176. build: "",
  177. trackID: "",
  178. }
  179. err := playInfoc.Info(info.ip, info.ctime, info.api, info.buvid, info.mid, info.client, info.itemID, info.displayID, info.errCode, info.from, info.build, info.trackID)
  180. log.Info("playInfoc.Info(%s,%s,%s,%s,%s) error(%v)", info.ip, info.ctime, info.buvid, info.mid, info.itemID, err)
  181. }