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.
403 lines
10 KiB
403 lines
10 KiB
package region |
|
|
|
import ( |
|
"strconv" |
|
"time" |
|
|
|
"go-common/app/interface/main/app-show/model" |
|
"go-common/app/interface/main/app-show/model/activity" |
|
"go-common/app/interface/main/app-show/model/banner" |
|
"go-common/app/interface/main/app-show/model/recommend" |
|
"go-common/app/interface/main/app-show/model/tag" |
|
accv1 "go-common/app/service/main/account/api" |
|
"go-common/app/service/main/archive/api" |
|
seasongrpc "go-common/app/service/openplatform/pgc-season/api/grpc/season/v1" |
|
xtime "go-common/library/time" |
|
) |
|
|
|
const ( |
|
_activityForm = "2006-01-02 15:04:05" |
|
) |
|
|
|
type Region struct { |
|
ID int64 `json:"-"` |
|
Rid int `json:"tid"` |
|
Reid int `json:"reid"` |
|
Name string `json:"name"` |
|
Logo string `json:"logo"` |
|
Goto string `json:"goto"` |
|
Param string `json:"param"` |
|
Rank string `json:"-"` |
|
Plat int8 `json:"-"` |
|
Build int `json:"-"` |
|
Condition string `json:"-"` |
|
Area string `json:"-"` |
|
Language string `json:"-"` |
|
URI string `json:"uri,omitempty"` |
|
Islogo int8 `json:"-"` |
|
Rtype int8 `json:"type"` |
|
Entrance int8 `json:"-"` |
|
IsBangumi int8 `json:"is_bangumi,omitempty"` |
|
Children []*Region `json:"children,omitempty"` |
|
Config []*Config `json:"config,omitempty"` |
|
} |
|
|
|
type Limit struct { |
|
ID int64 `json:"-"` |
|
Rid int64 `json:"-"` |
|
Build int `json:"-"` |
|
Condition string `json:"-"` |
|
} |
|
|
|
type Config struct { |
|
ID int64 `json:"-"` |
|
Rid int64 `json:"-"` |
|
ScenesID int `json:"-"` |
|
ScenesName string `json:"scenes_name,omitempty"` |
|
ScenesType string `json:"scenes_type,omitempty"` |
|
} |
|
|
|
type Show struct { |
|
Banner map[string][]*banner.Banner `json:"banner,omitempty"` |
|
Card []*Head `json:"card,omitempty"` |
|
Tag *tag.Tag `json:"tag,omitempty"` |
|
TopTag []*SimilarTag `json:"top_tag,omitempty"` |
|
NewTag *NewTag `json:"new_tag,omitempty"` |
|
Cbottom xtime.Time `json:"cbottom,omitempty"` |
|
Ctop xtime.Time `json:"ctop,omitempty"` |
|
Recommend []*ShowItem `json:"recommend,omitempty"` |
|
New []*ShowItem `json:"new"` |
|
Dynamic []*ShowItem `json:"dynamic,omitempty"` |
|
} |
|
|
|
type Head struct { |
|
CardID int `json:"card_id,omitempty"` |
|
Title string `json:"title,omitempty"` |
|
Cover string `json:"cover,omitempty"` |
|
Type string `json:"type,omitempty"` |
|
Date int64 `json:"date,omitempty"` |
|
Plat int8 `json:"-"` |
|
Build int `json:"-"` |
|
Condition string `json:"-"` |
|
URI string `json:"uri,omitempty"` |
|
Goto string `json:"goto,omitempty"` |
|
Param string `json:"param,omitempty"` |
|
Body []*ShowItem `json:"body,omitempty"` |
|
} |
|
|
|
type ShowItem struct { |
|
Title string `json:"title"` |
|
Cover string `json:"cover"` |
|
URI string `json:"uri"` |
|
NewURI string `json:"-"` |
|
Param string `json:"param"` |
|
FirstCid int64 `json:"cid,omitempty"` |
|
Goto string `json:"goto"` |
|
// up |
|
Mid int64 `json:"mid,omitempty"` |
|
Name string `json:"name,omitempty"` |
|
Face string `json:"face,omitempty"` |
|
Follower int `json:"follower,omitempty"` |
|
Attribute int `json:"attribute,omitempty"` |
|
OfficialVerify *OfficialVerify `json:"official_verify,omitempty"` |
|
// stat |
|
Play int `json:"play,omitempty"` |
|
Danmaku int `json:"danmaku,omitempty"` |
|
Reply int `json:"reply,omitempty"` |
|
Fav int `json:"favourite,omitempty"` |
|
// movie and bangumi badge |
|
Status int8 `json:"status,omitempty"` |
|
CoverMark string `json:"cover_mark,omitempty"` |
|
// ranking |
|
Pts int64 `json:"pts,omitempty"` |
|
Children []*ShowItem `json:"children,omitempty"` |
|
// av |
|
PubDate xtime.Time `json:"pubdate"` |
|
// av stat |
|
Duration int64 `json:"duration,omitempty"` |
|
// region |
|
Rid int `json:"rid,omitempty"` |
|
Rname string `json:"rname,omitempty"` |
|
Reid int `json:"reid,omitempty"` |
|
//new manager |
|
Desc string `json:"desc,omitempty"` |
|
Stime string `json:"stime,omitempty"` |
|
Etime string `json:"etime,omitempty"` |
|
Like int `json:"like,omitempty"` |
|
RedirectURL string `json:"-"` |
|
UGCPay int32 `json:"ugc_pay,omitempty"` |
|
Cooperation string `json:"cooperation,omitempty"` |
|
} |
|
|
|
type OfficialVerify struct { |
|
Type int `json:"type"` |
|
Desc string `json:"desc"` |
|
} |
|
|
|
type SimilarTag struct { |
|
TagId int `json:"tid"` |
|
TagName string `json:"tname"` |
|
Rid int `json:"rid,omitempty"` |
|
Rname string `json:"rname,omitempty"` |
|
Reid int `json:"reid,omitempty"` |
|
Rename string `json:"rename,omitempty"` |
|
} |
|
|
|
type NewTag struct { |
|
Position int `json:"pos"` |
|
Tag []*SimilarTag `json:"tag"` |
|
} |
|
|
|
func (c *Config) ConfigChange() { |
|
switch c.ScenesID { |
|
case 0: |
|
c.ScenesName = "region" |
|
c.ScenesType = "bottom" |
|
case 1: |
|
c.ScenesName = "region" |
|
c.ScenesType = "top" |
|
case 2: |
|
c.ScenesName = "rank" |
|
case 3: |
|
c.ScenesName = "search" |
|
case 4: |
|
c.ScenesName = "tag" |
|
case 5: |
|
c.ScenesName = "attention" |
|
} |
|
} |
|
|
|
// FromArc from recommend arc. |
|
func (i *ShowItem) FromArc(a *recommend.Arc) { |
|
i.fromArc(a) |
|
for _, as := range a.Others { |
|
child := &ShowItem{} |
|
child.fromArc(as) |
|
i.Children = append(i.Children, child) |
|
} |
|
} |
|
|
|
// FromArcBangumi from recommend arc bangumi. |
|
func (i *ShowItem) FromArcBangumi(a *recommend.Arc, sids map[int64]int64) { |
|
aidInt := fromAid(a.Aid) |
|
if sid, ok := sids[aidInt]; ok && sid != 0 { |
|
i.fromArcBangumi(a, sid) |
|
} else { |
|
i.fromArc(a) |
|
} |
|
for _, as := range a.Others { |
|
child := &ShowItem{} |
|
aidInt = fromAid(as.Aid) |
|
if sid, ok := sids[aidInt]; ok && sid != 0 { |
|
child.fromArcBangumi(as, sid) |
|
} else { |
|
child.fromArc(as) |
|
} |
|
i.Children = append(i.Children, child) |
|
} |
|
} |
|
|
|
// fromAid |
|
func fromAid(aidInter interface{}) (aid int64) { |
|
switch aidType := aidInter.(type) { |
|
case string: |
|
if aidtmp, err := strconv.ParseInt(aidType, 10, 64); err == nil && aidtmp != 0 { |
|
aid = aidtmp |
|
} |
|
case float64: |
|
aid = int64(aidType) |
|
} |
|
return |
|
} |
|
|
|
func (i *ShowItem) fromArc(a *recommend.Arc) { |
|
i.Title = a.Title |
|
i.Cover = a.Pic |
|
switch aid := a.Aid.(type) { |
|
case string: |
|
i.Param = aid |
|
case float64: |
|
i.Param = strconv.FormatInt(int64(aid), 10) |
|
} |
|
i.URI = model.FillURI(model.GotoAv, i.Param, nil) |
|
i.Goto = model.GotoAv |
|
v, ok := a.Views.(float64) |
|
if ok { |
|
i.Play = int(v) |
|
} |
|
i.Danmaku = a.Danmaku |
|
i.Name = a.Author |
|
i.Reply = int(a.Comments) |
|
i.Fav = int(a.Favorites) |
|
i.Pts = a.Pts |
|
} |
|
|
|
func (i *ShowItem) fromArcBangumi(a *recommend.Arc, sid int64) { |
|
i.Title = a.Title |
|
i.Cover = a.Pic |
|
i.Param = strconv.FormatInt(sid, 10) |
|
i.URI = model.FillURI(model.GotoBangumi, i.Param, nil) |
|
i.Goto = model.GotoBangumi |
|
v, ok := a.Views.(float64) |
|
if ok { |
|
i.Play = int(v) |
|
} |
|
i.Danmaku = a.Danmaku |
|
i.Name = a.Author |
|
i.Reply = int(a.Comments) |
|
i.Fav = int(a.Favorites) |
|
i.Pts = a.Pts |
|
} |
|
|
|
// FromArchivePB from archive archive. |
|
func (i *ShowItem) FromArchivePB(a *api.Arc) { |
|
i.Title = a.Title |
|
i.Cover = a.Pic |
|
i.Param = strconv.FormatInt(a.Aid, 10) |
|
i.URI = model.FillURI(model.GotoAv, i.Param, model.AvHandler(a)) |
|
i.Goto = model.GotoAv |
|
i.Play = int(a.Stat.View) |
|
i.Danmaku = int(a.Stat.Danmaku) |
|
i.Name = a.Author.Name |
|
i.Face = a.Author.Face |
|
i.Reply = int(a.Stat.Reply) |
|
i.Fav = int(a.Stat.Fav) |
|
i.PubDate = a.PubDate |
|
i.Rid = int(a.TypeID) |
|
i.Rname = a.TypeName |
|
i.Duration = a.Duration |
|
i.Like = int(a.Stat.Like) |
|
if a.Access > 0 { |
|
i.Play = 0 |
|
} |
|
i.UGCPay = a.Rights.UGCPay |
|
} |
|
|
|
// FromBangumi from archive archive. |
|
func (i *ShowItem) FromBangumiArchivePB(a *api.Arc, season *seasongrpc.CardInfoProto, bangumiType int) { |
|
var ( |
|
_bangumiSeasonID = 1 |
|
_bangumiEpisodeID = 2 |
|
) |
|
if season == nil { |
|
return |
|
} |
|
i.Title = a.Title |
|
i.Cover = a.Pic |
|
i.Param = strconv.Itoa(int(season.SeasonId)) |
|
switch bangumiType { |
|
case _bangumiSeasonID: |
|
i.URI = model.FillURI(model.GotoBangumi, i.Param, nil) |
|
case _bangumiEpisodeID: |
|
if season.NewEp != nil && season.NewEp.Id > 0 { |
|
epid := strconv.Itoa(int(season.NewEp.Id)) |
|
i.URI = model.FillURIBangumi(model.GotoBangumi, i.Param, epid, int(season.SeasonType)) |
|
} else { |
|
i.URI = model.FillURI(model.GotoBangumi, i.Param, nil) |
|
} |
|
} |
|
i.Goto = model.GotoBangumi |
|
i.Play = int(a.Stat.View) |
|
i.Danmaku = int(a.Stat.Danmaku) |
|
i.Name = a.Author.Name |
|
i.Reply = int(a.Stat.Reply) |
|
i.Fav = int(a.Stat.Fav) |
|
i.PubDate = a.PubDate |
|
i.Rid = int(a.TypeID) |
|
i.Rname = a.TypeName |
|
i.Duration = a.Duration |
|
i.Like = int(a.Stat.Like) |
|
if a.Access > 0 { |
|
i.Play = 0 |
|
} |
|
} |
|
|
|
// FromArchivePBRank from archive archive. |
|
func (i *ShowItem) FromArchivePBRank(a *api.Arc, scores map[int64]int64) { |
|
i.Title = a.Title |
|
i.Cover = a.Pic |
|
i.Param = strconv.FormatInt(a.Aid, 10) |
|
i.URI = model.FillURI(model.GotoAv, i.Param, nil) |
|
i.RedirectURL = a.RedirectURL |
|
i.Goto = model.GotoAv |
|
i.Play = int(a.Stat.View) |
|
i.Danmaku = int(a.Stat.Danmaku) |
|
i.Mid = a.Author.Mid |
|
i.Name = a.Author.Name |
|
i.Face = a.Author.Face |
|
i.Reply = int(a.Stat.Reply) |
|
i.Fav = int(a.Stat.Fav) |
|
i.PubDate = a.PubDate |
|
i.Rid = int(a.TypeID) |
|
i.Rname = a.TypeName |
|
i.Duration = a.Duration |
|
i.Like = int(a.Stat.Like) |
|
i.FirstCid = a.FirstCid |
|
if score, ok := scores[a.Aid]; ok { |
|
i.Pts = score |
|
} |
|
if a.Access > 0 { |
|
i.Play = 0 |
|
} |
|
if a.Rights.IsCooperation > 0 { |
|
i.Cooperation = "等联合创作" |
|
} |
|
} |
|
|
|
// FromTopic |
|
func (i *ShowItem) FromTopic(a *activity.Activity) { |
|
i.Title = a.Name |
|
i.Cover = a.H5Cover |
|
i.Goto = model.GotoWeb |
|
i.Param = a.H5URL |
|
i.URI = model.FillURI(model.GotoWeb, i.Param, nil) |
|
i.Desc = a.Desc |
|
} |
|
|
|
// FromActivity |
|
func (i *ShowItem) FromActivity(a *activity.Activity, now time.Time) { |
|
stime, err := time.ParseInLocation(_activityForm, a.Stime, time.Local) |
|
if err != nil { |
|
return |
|
} |
|
etime, err := time.ParseInLocation(_activityForm, a.Etime, time.Local) |
|
if err != nil { |
|
return |
|
} |
|
if now.After(etime) { |
|
i.Status = 1 |
|
} else if now.Before(stime) { |
|
i.Status = 2 |
|
} |
|
i.Title = a.Name |
|
i.Cover = a.H5Cover |
|
i.Goto = model.GotoWeb |
|
i.Param = a.H5URL |
|
i.URI = model.FillURI(model.GotoWeb, i.Param, nil) |
|
i.Desc = a.Desc |
|
i.Stime = a.Stime |
|
i.Etime = a.Etime |
|
} |
|
|
|
// FromOfficialVerify from official |
|
func (i *OfficialVerify) FromOfficialVerify(a accv1.OfficialInfo) { |
|
if a.Role == 0 { |
|
i.Type = -1 |
|
} else { |
|
if a.Role <= 2 { |
|
i.Type = 0 |
|
} else { |
|
i.Type = 1 |
|
} |
|
i.Desc = a.Title |
|
} |
|
} |
|
|
|
func (h *Head) FillBuildURI(plat int8, build int) { |
|
switch h.Goto { |
|
case model.GotoDaily: |
|
if (plat == model.PlatIPhone && build > 6670) || (plat == model.PlatAndroid && build > 5250000) { |
|
h.URI = "bilibili://pegasus/list/daily/" + h.Param |
|
} |
|
} |
|
}
|
|
|