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}} {{.Zoneid}} {{.ZoneIP}} {{.Country}} {{.Login}} {{.Name}} {{.User}} {{.UserHash}} {{.Money}} {{.Face}} {{.IsAdmin}} {{.Upermission}} {{.Level}} {{.LevelInfo}} {{.Vip}} {{.OfficialVerify}} {{.BlockTime}} {{.LastPlayTime}} {{.LastCid}} {{.Aid}} {{.Typeid}} {{.Vtype}} {{.Oriurl}} {{.SuggestComment}} chat.bilibili.com {{.Maxlimit}} {{.Click}} {{.FwClick}} {{.Chatid}} {{.Pid}} {{.Duration}} {{.Arctype}} {{.AllowBp}} {{.Bottom}} false 1 {{.Acceptguest}} {{.Acceptaccel}} {{.Cache}} {{.BrTCP}} {{.BrWs}} {{.BrWss}} {{.DefaultDm}} 0://comment.bilibili.com,1://comment.bilibili.com/rc {{.Role}} {{.HasNext}} {{.OnlineCount}} {{.MaskNew}} {{.Subtitle}} {{.PlayerIcon}} {{.ViewPoints}} ` // TpWithNoUinfo tpl without user info. TpWithNoUinfo = `{{.IP}} {{.ZoneIP}} {{.Zoneid}} {{.Country}} {{.Login}} 0 0 {{.Aid}} {{.Typeid}} {{.Vtype}} {{.Oriurl}} {{.SuggestComment}} chat.bilibili.com {{.Maxlimit}} {{.Click}} {{.FwClick}} {{.Chatid}} {{.Pid}} {{.Duration}} {{.Arctype}} {{.AllowBp}} {{.Bottom}} false 1 {{.Acceptguest}} {{.Acceptaccel}} {{.Cache}} {{.BrTCP}} {{.BrWs}} {{.BrWss}} {{.DefaultDm}} 0://comment.bilibili.com,1://comment.bilibili.com/rc 0 {{.HasNext}} {{.OnlineCount}} {{.MaskNew}} {{.Subtitle}} {{.PlayerIcon}} {{.ViewPoints}} ` ) // View . type View struct { *arcmdl.Arc Pages []*arcmdl.Page `json:"pages"` }