go-common/app/interface/main/player/model/player.go

398 lines
11 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
package model
import (
"html/template"
"strconv"
"time"
arcmdl "go-common/app/service/main/archive/api"
"go-common/app/service/main/archive/model/archive"
)
var encodeTbl = []int64{
0xf3a97cb, 0x8aed379, 0xedf369a, 0x5c82647, 0xcaf6987, 0xad28536, 0xe5f2a7b, 0x72e85df,
0xac3d972, 0xca97fe5, 0xbcf5473, 0x85ad732, 0xcd6b324, 0xd549a72, 0xe72ab89, 0xfa6dc53,
0xa8e752b, 0xa73d25f, 0xcad8296, 0xb35f689, 0x7ce594b, 0x59ca743, 0xc4ab2d7, 0x9c8adf6,
0x93746c2, 0x6cea579, 0xcd36b75, 0x64a973e, 0xfa49c56, 0xb45f2d9, 0x72a56f8, 0x43d6fa9,
0x354cf2a, 0x26bf5d8, 0x39f64ad, 0xa4fd326, 0x39247d6, 0xec67f95, 0xed8c9b4, 0x29637db,
0xefabc54, 0xa9ed87c, 0xc2864ea, 0xf32d475, 0x53b6897, 0xe7f94b8, 0x7a4cfd2, 0x9a82e65,
0x369b7a4, 0x2cae6d4, 0xc7fba36, 0xd3e7846, 0xd324ba5, 0x7c56f24, 0x598c3af, 0x39fd4ae,
0x3b6472c, 0x2f9a8be, 0x9fcab42, 0x8f34aeb, 0x9e8b372, 0x8c42b9e, 0xf9b574c, 0x7c693fa,
0x245fc67, 0x823f4ce, 0x957f84d, 0xe529a87, 0xb625ead, 0xbd4f6a9, 0x863ca52, 0xd762cef,
0x8d6c479, 0xbc4f579, 0xa486fdc, 0xcd6f289, 0xda3b629, 0x4fce523, 0x2e8db97, 0xc3bf769,
0x9c64d7f, 0x52db6f7, 0x95cdf8e, 0xc872fe9, 0x964de53, 0x2bef897, 0xb7a962c, 0x38d72be,
0x26fa89c, 0x58b742e, 0xa3bd967, 0x3cae942, 0x4d3fb9c, 0xaf59ed3, 0x6f8379d, 0x2bf46d7,
0xcdbe243, 0x3754bf9, 0x82f9dc5, 0x8a46ef5, 0x5d48ac9, 0x9e6ca3d, 0xfec5a3b, 0x57dafe3,
0x82ed7a9, 0xbc3d687, 0x89ecbf7, 0x738549a, 0x928746c, 0x9cb7e83, 0xc85f9a7, 0x2947c8e,
0xba689fd, 0xebc4893, 0xa62cf7e, 0xa8e3cb5, 0xe47589d, 0x792edaf, 0x4635c2d, 0xa2c6bfe,
0xc456daf, 0x2d65f47, 0xf9ce625, 0x74a8b62, 0x9d728f5, 0x3e4a29d, 0x62a589c, 0x83cb629,
0xce5b6d3, 0x2fda9ce, 0x87af3bc, 0x837a695, 0xf935da4, 0x48b6ea2, 0x52dc4e9, 0x82a537b,
0xe23456f, 0x6cbdafe, 0x97bf34d, 0x4c72ad8, 0xa5c4982, 0x8afb76e, 0x895fca6, 0x85abd24,
0xae2475d, 0xf3c5eb8, 0xb4d2ef5, 0xbda463e, 0xf392a5e, 0x7a9fd58, 0xead48f6, 0x8a62537,
0x6c35ba2, 0x7589e24, 0xd24ec93, 0x6bc42a5, 0x34d9f87, 0xed3578f, 0x87452fa, 0x5439fca,
0x29b37c8, 0x8fe4c3b, 0x4c5368d, 0x58acf9b, 0x69c3ad2, 0xaf3827b, 0x328e46b, 0xbef7ca9,
0xda592c4, 0x45f7db2, 0xcb65a3d, 0x4578ec3, 0xc6deab9, 0xb689edc, 0x4aed59f, 0x25b9af7,
0x9b6d48f, 0x6de79bf, 0x249fa5e, 0x269a7ef, 0xd9e62a7, 0xb9a86d2, 0x539b72c, 0x8fa9ebc,
0xec397f5, 0xdbac4e2, 0x938e6fd, 0xe8a734f, 0xe4b8d7f, 0x84cd9b3, 0x75c6ef4, 0x956378c,
0x43f2d78, 0x74e9253, 0x25dbef4, 0xb7e26f9, 0x93b2c6d, 0x2faeb76, 0x3b278de, 0x6b5948f,
0x4967358, 0x49f3a7e, 0x7596ec4, 0x98cabf5, 0x95c638e, 0x6d258b7, 0x97e8b3f, 0x5ab7823,
0x53b6a89, 0xa3bc579, 0xac45d36, 0xcea9b28, 0x98f2356, 0xd694a2e, 0xf732e8a, 0xe7463d5,
0xf5ec9a8, 0x6dba984, 0xc798e5a, 0x6e9382b, 0xeac3249, 0x5238b9a, 0xd632eaf, 0xa92b685,
0xbcae435, 0x9726fd8, 0x3fcbea4, 0x5e9da23, 0xb93a4f7, 0x327d84c, 0x5db932f, 0x86274de,
0xa54bd72, 0x63f2ed5, 0x6d37285, 0xb4fe7c9, 0x549a6b3, 0x3b592ec, 0x73d456b, 0x49253b7,
0x2da9b8c, 0xb85642d, 0x37489ca, 0x726fe3b, 0x4ce6ad2, 0x376becd, 0x6f43bec, 0xf96dba4,
0xebc8d72, 0xf59b4ca, 0x263547f, 0xabcd87e, 0x3fd25ae, 0xc6f4b38, 0x36cd978, 0x6e94a37,
}
// Catalog catalog map
var Catalog = map[int8]string{
1: "system",
2: "bangumi",
3: "news",
}
// Sid sid string.
type Sid string
// Valid valid sid.
func (sid Sid) Valid() (b bool) {
var (
interval int64
msec int64
_xorKey int64
hKey int64
_dec int64
_ts int64
offset int
ms int64
err error
)
if len(sid) != 8 {
return false
}
if interval, err = strconv.ParseInt(string(sid)[0:6], 36, 64); err != nil {
return false
}
if msec, err = strconv.ParseInt(string(sid)[6:8], 36, 64); err != nil {
return false
}
_xorKey = encodeTbl[msec%256]
hKey = 1 << uint(28+msec%3)
_dec = (interval ^ _xorKey)
if (_dec & 0x70000000) != hKey {
return false
}
_ts = (_dec^hKey)*1000 + msec
_, offset = time.Now().Zone()
ms = (time.Now().UnixNano() / int64(time.Millisecond)) + (int64(offset)/60)*60000 // GMT Timestamp
return _ts <= (ms - 1388534400000 + 300000)
}
// Create create sid.
func (sid Sid) Create() (re Sid) {
var (
offset int
ms int64
_interval int64
msec int64
msesStr string
_xorKey int64
hKey int64
tsEncode string
)
_, offset = time.Now().Zone()
ms = (time.Now().UnixNano() / int64(time.Millisecond)) - (int64(offset)/60)*60000 // GMT Timestamp
_interval = ms/1000 - 1388534400
msec = ms % 1000
_xorKey = encodeTbl[msec%256]
hKey = 1 << uint(28+msec%3)
tsEncode = strconv.FormatInt(((hKey | _interval) ^ _xorKey), 36)
for len(tsEncode) < 6 {
tsEncode = "0" + tsEncode
}
msesStr = strconv.FormatInt(msec, 36)
if len(msesStr) < 2 {
msesStr = "0" + msesStr
}
sid = Sid(tsEncode + msesStr)
return sid
}
// Item item struct.
type Item struct {
Content string `xml:",cdata"`
Tooltip string `xml:"tooltip,attr"`
Bgcolor string `xml:"bgcolor,attr"`
Catalog string `xml:"catalog,attr"`
ResourceID string `xml:"resourceid,attr"`
SrcID string `xml:"srcid,attr"`
ID string `xml:"id,attr"`
}
// Carousel carousel struct.
type Carousel struct {
Backcolor string
Fontcolor string
Hint string
Link string
Content string
Category string
}
// Player player struct.
type Player struct {
IP string
Zoneid int64
Country string
Isp string // 运营商暂时不需要
Login bool
Time int64
ZoneIP string
// user info
Name string
User int64
UserHash string
Money string
Face string
IsAdmin bool
Upermission string
Level string
LevelInfo template.HTML
Vip template.HTML
OfficialVerify template.HTML
BlockTime int64
// archive info
Aid int64
Typeid int32
Maxlimit int
Click int
FwClick int32
Duration string
Arctype string
APermission bool
SuggestComment bool
Chatid int64
Vtype string
Oriurl string
Pid int64
AllowBp bool
Bottom int8
Acceptguest bool
Acceptaccel bool
Cache bool
CacheDispatch bool
BrTCP string
BrWs string
BrWss string
DefaultDm int8
//progress
LastPlayTime int64
LastCid int64
Role string
// has next page
HasNext int8
OnlineCount int64
// dm mask
MaskNew template.HTML
// subtitle
Subtitle template.HTML
// player icon
PlayerIcon template.HTML
// view points
ViewPoints template.HTML
}
// Progress progress struct.
type Progress struct {
Cid int64 `json:"cid"`
Pro int64 `json:"pro"`
}
// Policy policy struct.
type Policy struct {
ID int64 `json:"id"`
Des string `json:"description"`
Type string `json:"type"`
Start string `json:"start"`
End string `json:"end"`
Mtime string `json:"mtime"`
StartTime time.Time
EndTime time.Time
MtimeTime time.Time
Items []*Pitem `json:"items"`
}
// Pitem pitem struct
type Pitem struct {
ID int64 `json:"item_id"`
Data string `json:"data"`
Comment string `json:"comment"`
ExtData string `json:"ext_data"`
Ver int64 `json:"ver"`
}
// Param param struct.
type Param struct {
Name string
Value string
}
// BlockTime block time struct
type BlockTime struct {
BlockStatus int `json:"block_status"`
BlockedForever bool `json:"blocked_forever"`
BlockedEnd int64 `json:"blocked_end"`
}
// Videoshot player video shot struct
type Videoshot struct {
*archive.Videoshot
Index []uint16 `json:"index,omitempty"`
}
// PlayURLToken playurl token.
type PlayURLToken struct {
From string `json:"from"`
Ts int64 `json:"ts"`
Aid int64 `json:"aid"`
Cid int64 `json:"cid"`
Mid int64 `json:"mid"`
VIP int `json:"vip"`
SVIP int `json:"svip"`
Owner int `json:"owner"`
Fcs string `json:"fcs"`
Token string `json:"token"`
}
// VIPInfo vip info.
type VIPInfo struct {
Type int32 `json:"vipType"`
DueDate int64 `json:"vipDueDate"`
DueRemark string `json:"dueRemark"`
AccessStatus int32 `json:"accessStatus"`
VipStatus int32 `json:"vipStatus"`
VipStatusWarn string `json:"vipStatusWarn"`
}
// Official official.
type Official struct {
Type int8 `json:"type"`
Desc string `json:"desc"`
}
// Points is
type Points struct {
Type int `json:"type"`
From int64 `json:"from"`
To int64 `json:"to"`
Content string `json:"content"`
}
const (
// TpWithUinfo tpl with user info.
TpWithUinfo = `<ip>{{.IP}}</ip>
<zoneid>{{.Zoneid}}</zoneid>
<zoneip>{{.ZoneIP}}</zoneip>
<country>{{.Country}}</country>
<login>{{.Login}}</login>
<time>{{.Time}}</time>
<name>{{.Name}}</name>
<user>{{.User}}</user>
<user_hash>{{.UserHash}}</user_hash>
<money>{{.Money}}</money>
<face>{{.Face}}</face>
<isadmin>{{.IsAdmin}}</isadmin>
<permission>{{.Upermission}}</permission>
<level>{{.Level}}</level>
<level_info>{{.LevelInfo}}</level_info>
<vip>{{.Vip}}</vip>
<official_verify>{{.OfficialVerify}}</official_verify>
<block_time>{{.BlockTime}}</block_time>
<lastplaytime>{{.LastPlayTime}}</lastplaytime>
<lastcid>{{.LastCid}}</lastcid>
<aid>{{.Aid}}</aid>
<typeid>{{.Typeid}}</typeid>
<vtype>{{.Vtype}}</vtype>
<oriurl>{{.Oriurl}}</oriurl>
<suggest_comment>{{.SuggestComment}}</suggest_comment>
<server>chat.bilibili.com</server>
<maxlimit>{{.Maxlimit}}</maxlimit>
<click>{{.Click}}</click>
<fw_click>{{.FwClick}}</fw_click>
<chatid>{{.Chatid}}</chatid>
<pid>{{.Pid}}</pid>
<duration>{{.Duration}}</duration>
<arctype>{{.Arctype}}</arctype>
<allow_bp>{{.AllowBp}}</allow_bp>
<bottom>{{.Bottom}}</bottom>
<shot>false</shot>
<sinapi>1</sinapi>
<acceptguest>{{.Acceptguest}}</acceptguest>
<acceptaccel>{{.Acceptaccel}}</acceptaccel>
<cache>{{.Cache}}</cache>
<broadcast_tcp>{{.BrTCP}}</broadcast_tcp>
<broadcast_ws>{{.BrWs}}</broadcast_ws>
<broadcast_wss>{{.BrWss}}</broadcast_wss>
<default_dm>{{.DefaultDm}}</default_dm>
<dm_host>0://comment.bilibili.com,1://comment.bilibili.com/rc</dm_host>
<role>{{.Role}}</role>
<has_next>{{.HasNext}}</has_next>
<online_count>{{.OnlineCount}}</online_count>
<dm_mask></dm_mask>
<mask_new>{{.MaskNew}}</mask_new>
<subtitle>{{.Subtitle}}</subtitle>
<player_icon>{{.PlayerIcon}}</player_icon>
<view_points>{{.ViewPoints}}</view_points>
`
// TpWithNoUinfo tpl without user info.
TpWithNoUinfo = `<ip>{{.IP}}</ip>
<zoneip>{{.ZoneIP}}</zoneip>
<zoneid>{{.Zoneid}}</zoneid>
<country>{{.Country}}</country>
<login>{{.Login}}</login>
<time>{{.Time}}</time>
<lastplaytime>0</lastplaytime>
<lastcid>0</lastcid>
<aid>{{.Aid}}</aid>
<typeid>{{.Typeid}}</typeid>
<vtype>{{.Vtype}}</vtype>
<oriurl>{{.Oriurl}}</oriurl>
<suggest_comment>{{.SuggestComment}}</suggest_comment>
<server>chat.bilibili.com</server>
<maxlimit>{{.Maxlimit}}</maxlimit>
<click>{{.Click}}</click>
<fw_click>{{.FwClick}}</fw_click>
<chatid>{{.Chatid}}</chatid>
<pid>{{.Pid}}</pid>
<duration>{{.Duration}}</duration>
<arctype>{{.Arctype}}</arctype>
<allow_bp>{{.AllowBp}}</allow_bp>
<bottom>{{.Bottom}}</bottom>
<shot>false</shot>
<sinapi>1</sinapi>
<acceptguest>{{.Acceptguest}}</acceptguest>
<acceptaccel>{{.Acceptaccel}}</acceptaccel>
<cache>{{.Cache}}</cache>
<broadcast_tcp>{{.BrTCP}}</broadcast_tcp>
<broadcast_ws>{{.BrWs}}</broadcast_ws>
<broadcast_wss>{{.BrWss}}</broadcast_wss>
<default_dm>{{.DefaultDm}}</default_dm>
<dm_host>0://comment.bilibili.com,1://comment.bilibili.com/rc</dm_host>
<role>0</role>
<has_next>{{.HasNext}}</has_next>
<online_count>{{.OnlineCount}}</online_count>
<dm_mask></dm_mask>
<mask_new>{{.MaskNew}}</mask_new>
<subtitle>{{.Subtitle}}</subtitle>
<player_icon>{{.PlayerIcon}}</player_icon>
<view_points>{{.ViewPoints}}</view_points>
`
)
// View .
type View struct {
*arcmdl.Arc
Pages []*arcmdl.Page `json:"pages"`
}