You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
192 lines
4.4 KiB
192 lines
4.4 KiB
package http |
|
|
|
import ( |
|
"encoding/xml" |
|
"net/http" |
|
"strconv" |
|
"strings" |
|
"time" |
|
|
|
"go-common/app/interface/main/player/model" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
bm "go-common/library/net/http/blademaster" |
|
"go-common/library/net/metadata" |
|
) |
|
|
|
type playerInfoc struct { |
|
ip string |
|
ctime string |
|
api string |
|
buvid string |
|
mid string |
|
client string |
|
itemID string |
|
displayID string |
|
errCode string |
|
from string |
|
build string |
|
trackID string |
|
} |
|
|
|
const ( |
|
_api = "player" |
|
_client = "web" |
|
) |
|
|
|
var ( |
|
emptyByte = []byte{} |
|
_headerBuvid = "Buvid" |
|
_buvid = "buvid3" |
|
) |
|
|
|
func player(c *bm.Context) { |
|
var ( |
|
aid, cid, mid int64 |
|
sid model.Sid |
|
sidCookie *http.Cookie |
|
err error |
|
ip = metadata.String(c, metadata.RemoteIP) |
|
) |
|
request := c.Request |
|
params := request.Form |
|
idStr := params.Get("id") |
|
aidStr := params.Get("aid") |
|
cidStr := params.Get("cid") |
|
refer := request.Referer() |
|
// response header |
|
c.Writer.Header().Set("Cache-Control", "no-cache") |
|
c.Writer.Header().Set("X-Remote-IP", ip) |
|
// get mid |
|
if midInter, ok := c.Get("mid"); ok { |
|
mid = midInter.(int64) |
|
} |
|
if strings.Index(idStr, "cid:") == 0 { |
|
cidStr = idStr[4:] |
|
} |
|
if cid, err = strconv.ParseInt(cidStr, 10, 64); err != nil || cid <= 0 { |
|
c.AbortWithStatus(http.StatusBadRequest) |
|
return |
|
} |
|
// get aid |
|
if aid, err = strconv.ParseInt(aidStr, 10, 64); err != nil || aid <= 0 { |
|
c.AbortWithStatus(http.StatusBadRequest) |
|
return |
|
} |
|
sidCookie, err = request.Cookie("sid") |
|
if err != nil || sidCookie.Value == "" { |
|
http.SetCookie(c.Writer, &http.Cookie{Name: "sid", Value: string(sid.Create()), Path: "/", Domain: ".bilibili.com"}) |
|
} |
|
if sidCookie != nil { |
|
if sidCookie.Value != "" { |
|
sidStr := sidCookie.Value |
|
if !model.Sid(sidStr).Valid() { |
|
http.SetCookie(c.Writer, &http.Cookie{Name: "sid", Value: string(sid.Create()), Path: "/", Domain: ".bilibili.com"}) |
|
} |
|
} |
|
} |
|
var ( |
|
ips = strings.Split(c.Request.Header.Get("X-Forwarded-For"), ",") |
|
cdnIP string |
|
playByte []byte |
|
) |
|
if len(ips) >= 2 { |
|
cdnIP = ips[1] |
|
} |
|
buvid := request.Header.Get(_headerBuvid) |
|
if buvid == "" { |
|
cookie, _ := request.Cookie(_buvid) |
|
if cookie != nil { |
|
buvid = cookie.Value |
|
} |
|
} |
|
now := time.Now() |
|
if playInfoc != nil { |
|
showInfoc(ip, now, buvid, aid, mid) |
|
} |
|
if playByte, err = playSvr.Player(c, mid, aid, cid, cdnIP, refer, now); err != nil { |
|
c.AbortWithStatus(http.StatusNotFound) |
|
return |
|
} |
|
c.Bytes(http.StatusOK, "text/plain; charset=utf-8", playByte) |
|
} |
|
|
|
func carousel(c *bm.Context) { |
|
// response header |
|
c.Writer.Header().Set("Cache-Control", "no-cache") |
|
c.Writer.Header().Set("Connection", "keep-alive") |
|
type msg struct { |
|
Items []*model.Item `xml:"item"` |
|
} |
|
var ( |
|
items []*model.Item |
|
err error |
|
) |
|
if items, err = playSvr.Carousel(c); err != nil { |
|
c.Bytes(http.StatusOK, "text/xml; charset=utf-8", emptyByte) |
|
return |
|
} |
|
result := msg{Items: items} |
|
output, err := xml.MarshalIndent(result, " ", " ") |
|
if err != nil { |
|
output = emptyByte |
|
} |
|
c.Bytes(http.StatusOK, "text/xml; charset=utf-8", output) |
|
} |
|
|
|
func policy(c *bm.Context) { |
|
var ( |
|
id int64 |
|
mid int64 |
|
err error |
|
) |
|
if midInter, ok := c.Get("mid"); ok { |
|
mid = midInter.(int64) |
|
} |
|
params := c.Request.Form |
|
idStr := params.Get("id") |
|
if id, err = strconv.ParseInt(idStr, 10, 64); err != nil || id < 0 { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
c.JSON(playSvr.Policy(c, id, mid)) |
|
} |
|
|
|
func view(c *bm.Context) { |
|
var ( |
|
aid int64 |
|
err error |
|
) |
|
aidStr := c.Request.Form.Get("aid") |
|
if aid, err = strconv.ParseInt(aidStr, 10, 64); err != nil || aid < 0 { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
c.JSON(playSvr.View(c, aid)) |
|
} |
|
|
|
func matPage(c *bm.Context) { |
|
c.JSON(playSvr.Matsuri(c, time.Now()), nil) |
|
} |
|
|
|
func showInfoc(ip string, now time.Time, buvid string, aid, mid int64) { |
|
if playInfoc == nil { |
|
return |
|
} |
|
info := &playerInfoc{ |
|
ip: ip, |
|
ctime: strconv.FormatInt(now.Unix(), 10), |
|
api: _api, |
|
buvid: buvid, |
|
mid: strconv.FormatInt(mid, 10), |
|
client: _client, |
|
itemID: strconv.FormatInt(aid, 10), |
|
displayID: "", |
|
errCode: "", |
|
from: "", |
|
build: "", |
|
trackID: "", |
|
} |
|
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) |
|
log.Info("playInfoc.Info(%s,%s,%s,%s,%s) error(%v)", info.ip, info.ctime, info.buvid, info.mid, info.itemID, err) |
|
}
|
|
|