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.
397 lines
11 KiB
397 lines
11 KiB
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"` |
|
}
|
|
|