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.
308 lines
9.5 KiB
308 lines
9.5 KiB
package feed |
|
|
|
import ( |
|
"encoding/json" |
|
"strconv" |
|
|
|
clive "go-common/app/interface/main/app-card/model/card/live" |
|
"go-common/app/interface/main/app-show/model" |
|
"go-common/app/interface/main/app-show/model/card" |
|
"go-common/app/interface/main/app-show/model/dislike" |
|
"go-common/app/interface/main/app-show/model/tag" |
|
"go-common/app/service/main/archive/api" |
|
xtime "go-common/library/time" |
|
) |
|
|
|
type Item struct { |
|
Title string `json:"title,omitempty"` |
|
Subtitle string `json:"subtitle,omitempty"` |
|
Cover string `json:"cover,omitempty"` |
|
URI string `json:"uri,omitempty"` |
|
Redirect string `json:"redirect,omitempty"` |
|
RedirectURI string `json:"redirect_uri,omitempty"` |
|
Param string `json:"param,omitempty"` |
|
Goto string `json:"goto,omitempty"` |
|
ViewType string `json:"view_type,omitempty"` |
|
Kind string `json:"kind,omitempty"` |
|
Desc string `json:"desc,omitempty"` |
|
Play int `json:"play,omitempty"` |
|
Danmaku int `json:"danmaku,omitempty"` |
|
Reply int `json:"reply,omitempty"` |
|
Fav int `json:"favorite,omitempty"` |
|
Coin int `json:"coin,omitempty"` |
|
Share int `json:"share,omitempty"` |
|
Like int `json:"like,omitempty"` |
|
Count int `json:"count,omitempty"` |
|
Status int8 `json:"status,omitempty"` |
|
Type int8 `json:"type,omitempty"` |
|
Badge string `json:"badge,omitempty"` |
|
StatType int8 `json:"stat_type,omitempty"` |
|
RcmdReason *RcmdReason `json:"rcmd_reason,omitempty"` |
|
Item []*Item `json:"item,omitempty"` |
|
CornerMark int8 `json:"-"` |
|
CardStyle int8 `json:"-"` |
|
RcmdContent string `json:"-"` |
|
// sortedset index |
|
Idx int64 `json:"idx,omitempty"` |
|
// av info |
|
Cid int64 `json:"cid,omitempty"` |
|
Rid int16 `json:"tid,omitempty"` |
|
TName string `json:"tname,omitempty"` |
|
Tag *Tag `json:"tag,omitempty"` |
|
DisklikeReasons []*dislike.DisklikeReason `json:"dislike_reasons,omitempty"` |
|
PTime xtime.Time `json:"ctime,omitempty"` |
|
Autoplay int32 `json:"autoplay,omitempty"` |
|
// av stat |
|
Duration int64 `json:"duration,omitempty"` |
|
// upper |
|
Mid int64 `json:"mid,omitempty"` |
|
Name string `json:"name,omitempty"` |
|
Face string `json:"face,omitempty"` |
|
IsAtten int8 `json:"is_atten,omitempty"` |
|
Fans int64 `json:"fans,omitempty"` |
|
RecCnt int `json:"recent_count,omitempty"` |
|
Recent []*Item `json:"recent,omitempty"` |
|
Official *OfficialInfo `json:"official,omitempty"` |
|
// live |
|
Online int `json:"online,omitempty"` |
|
Area string `json:"area,omitempty"` |
|
AreaID int `json:"area_id,omitempty"` |
|
Area2 *Area2 `json:"area2,omitempty"` |
|
// bangumi |
|
Index string `json:"index,omitempty"` |
|
IndexTitle string `json:"index_title,omitempty"` |
|
CoverMark string `json:"cover_mark,omitempty"` |
|
Finish bool `json:"finish,omitempty"` |
|
LatestIndex string `json:"last_index,omitempty"` |
|
// bangumi recommend |
|
Updates int `json:"updates,omitempty"` |
|
// live or bangumi |
|
From int8 `json:"from,omitempty"` |
|
// adviertisement |
|
RequestID string `json:"request_id,omitempty"` |
|
CreativeID int64 `json:"creative_id,omitempty"` |
|
SrcID int `json:"src_id,omitempty"` |
|
IsAd bool `json:"is_ad,omitempty"` |
|
IsAdLoc bool `json:"is_ad_loc,omitempty"` |
|
AdCb string `json:"ad_cb,omitempty"` |
|
ShowURL string `json:"show_url,omitempty"` |
|
ClickURL string `json:"click_url,omitempty"` |
|
ClientIP string `json:"client_ip,omitempty"` |
|
CmMark int64 `json:"cm_mark,omitempty"` |
|
AdIndex int `json:"ad_index,omitempty"` |
|
Extra json.RawMessage `json:"extra,omitempty"` |
|
CardIndex int `json:"card_index,omitempty"` |
|
// activity |
|
STime string `json:"stime,omitempty"` |
|
ETime string `json:"etime,omitempty"` |
|
// tag |
|
Tags []*tag.Tag `json:"tags,omitempty"` |
|
// rank |
|
Cover1 string `json:"cover1,omitempty"` |
|
Cover2 string `json:"cover2,omitempty"` |
|
Cover3 string `json:"cover3,omitempty"` |
|
// banner` |
|
Hash string `json:"hash,omitempty"` |
|
// upper article |
|
Covers []string `json:"covers,omitempty"` |
|
Temple int `json:"temple,omitempty"` |
|
Category *Category `json:"category,omitempty"` |
|
BannerURL string `json:"banner_url,omitempty"` |
|
// game download |
|
GameDownloadButton *GameDownloadButton `json:"button,omitempty"` |
|
Download int `json:"download,omitempty"` |
|
BigCover string `json:"big_cover,omitempty"` |
|
// special |
|
HideBadge bool `json:"hide_badge,omitempty"` |
|
Ratio float64 `json:"ratio,omitempty"` |
|
// shopping |
|
City string `json:"city,omitempty"` |
|
PType string `json:"ptype,omitempty"` |
|
Price string `json:"price,omitempty"` |
|
// news |
|
Content string `json:"content,omitempty"` |
|
// bigdata source |
|
Source string `json:"-"` |
|
AvFeature json.RawMessage `json:"-"` |
|
// common |
|
GotoOrg string `json:"-"` |
|
FromType string `json:"from_type,omitempty"` |
|
Pos int `json:"-"` |
|
Score string `json:"score,omitempty"` |
|
} |
|
|
|
type Tag struct { |
|
TagID int64 `json:"tag_id,omitempty"` |
|
TagName string `json:"tag_name,omitempty"` |
|
IsAtten int8 `json:"is_atten,omitempty"` |
|
Count *TagCount `json:"count,omitempty"` |
|
Name string `json:"name,omitempty"` |
|
URI string `json:"uri,omitempty"` |
|
//channel |
|
ID int64 `json:"id,omitempty"` |
|
Face string `json:"face,omitempty"` |
|
Fans int64 `json:"fans,omitempty"` |
|
} |
|
|
|
type RcmdReason struct { |
|
ID int `json:"id,omitempty"` |
|
Content string `json:"content,omitempty"` |
|
BgColor string `json:"bg_color,omitempty"` |
|
IconLocation string `json:"icon_location,omitempty"` |
|
Message string `json:"message,omitempty"` |
|
} |
|
|
|
type TagCount struct { |
|
Atten int `json:"atten,omitempty"` |
|
} |
|
|
|
type Category struct { |
|
ID int64 `json:"id,omitempty"` |
|
Name string `json:"name,omitempty"` |
|
Children *Category `json:"children,omitempty"` |
|
} |
|
|
|
type GameDownloadButton struct { |
|
Name string `json:"name,omitempty"` |
|
URI string `json:"uri,omitempty"` |
|
RedirectURI string `json:"redirect_uri,omitempty"` |
|
} |
|
|
|
type Area2 struct { |
|
ID int64 `json:"id,omitempty"` |
|
Name string `json:"name,omitempty"` |
|
Children *Area2 `json:"children,omitempty"` |
|
} |
|
|
|
type OfficialInfo struct { |
|
Role int8 `json:"role,omitempty"` |
|
Title string `json:"title,omitempty"` |
|
Desc string `json:"desc,omitempty"` |
|
} |
|
|
|
func (i *Item) fillArcStat(a *api.Arc) { |
|
if a.Access == 0 { |
|
i.Play = int(a.Stat.View) |
|
} |
|
i.Danmaku = int(a.Stat.Danmaku) |
|
i.Reply = int(a.Stat.Reply) |
|
i.Fav = int(a.Stat.Fav) |
|
i.Coin = int(a.Stat.Coin) |
|
i.Share = int(a.Stat.Share) |
|
i.Like = int(a.Stat.Like) |
|
} |
|
|
|
func (i *Item) FromPlayerAv(a *api.Arc, uri string) { |
|
if i.Title == "" { |
|
i.Title = a.Title |
|
} |
|
if i.Cover == "" { |
|
i.Cover = model.CoverURLHTTPS(a.Pic) |
|
} else { |
|
i.Cover = model.CoverURLHTTPS(i.Cover) |
|
} |
|
i.Param = strconv.FormatInt(a.Aid, 10) |
|
i.Goto = model.GotoAv |
|
i.URI = uri |
|
if i.URI == "" { |
|
i.URI = model.FillURI(i.Goto, i.Param, model.AvHandler(a)) |
|
} |
|
i.Rid = int16(a.TypeID) |
|
i.TName = a.TypeName |
|
// i.Desc = a.Desc |
|
i.fillArcStat(a) |
|
i.Duration = a.Duration |
|
i.Mid = a.Author.Mid |
|
i.Name = a.Author.Name |
|
i.Face = a.Author.Face |
|
i.PTime = a.PubDate |
|
i.Autoplay = a.Rights.Autoplay |
|
i.Cid = a.FirstCid |
|
// TODO |
|
// if a.Stat.Like > 0 && a.Stat.DisLike > 0 { |
|
// percent := int(a.Stat.Like / (a.Stat.Like + a.Stat.DisLike) * 100) |
|
// if percent != 0 { |
|
// i.Desc = strconv.Itoa(percent) + "%的人推荐" |
|
// } |
|
// } |
|
} |
|
|
|
func (i *Item) FromRcmdReason(c *card.PopularCard) { |
|
var content string |
|
switch c.ReasonType { |
|
case 0: |
|
content = "" |
|
case 1: |
|
content = "编辑精选" |
|
case 2: |
|
content = "热门推荐" |
|
case 3: |
|
content = c.Reason |
|
} |
|
if content != "" { |
|
i.RcmdReason = &RcmdReason{ID: 1, Content: content, BgColor: "yellow", IconLocation: "left_top"} |
|
i.RcmdContent = content |
|
} |
|
} |
|
|
|
func (i *Item) FromRank(aids []int64, score map[int64]int64, am map[int64]*api.Arc) { |
|
var _rankCount = 3 |
|
if len(aids) < _rankCount { |
|
return |
|
} |
|
items := []*Item{} |
|
for _, aid := range aids { |
|
if a, ok := am[aid]; ok { |
|
it := &Item{ |
|
Title: a.Title, |
|
Cover: a.Pic, |
|
Goto: model.GotoAv, |
|
Param: strconv.FormatInt(a.Aid, 10), |
|
} |
|
it.fillArcStat(a) |
|
it.Duration = a.Duration |
|
it.URI = model.FillURI(it.Goto, it.Param, model.AvHandler(a)) |
|
if s, ok := score[aid]; ok { |
|
if s < 10000 { |
|
it.Score = model.Rounding(s, 0) |
|
} else if s >= 10000 && s < 100000000 { |
|
it.Score = model.Rounding(s, 10000) + "万" |
|
} else if s >= 100000000 { |
|
it.Score = model.Rounding(s, 100000000) + "亿" |
|
} |
|
} |
|
if it.Score != "" { |
|
it.Score = "综合评分:" + it.Score |
|
} else { |
|
it.Score = "综合评分:-" |
|
} |
|
items = append(items, it) |
|
if len(items) >= _rankCount { |
|
break |
|
} |
|
} |
|
} |
|
i.Title = "全站排行榜" |
|
i.Goto = model.GotoRank |
|
i.Item = items |
|
i.Param = "0" |
|
i.URI = "bilibili://rank?order_type=1&tid=0" |
|
} |
|
|
|
func (i *Item) FromHotTopic(hotTopics []*clive.TopicHot) { |
|
is := []*Item{} |
|
for _, t := range hotTopics { |
|
it := &Item{} |
|
it.Name = t.TName |
|
it.Param = strconv.Itoa(t.TID) |
|
it.Cover = t.ImageURL |
|
it.URI = model.FillURIHotTopic(it.Param, it.Name) |
|
is = append(is, it) |
|
} |
|
i.Item = is |
|
i.Title = "热门话题" |
|
i.Param = "0" |
|
i.Goto = model.GotoHotTopic |
|
i.URI = "activity://following/hot_topic_list" |
|
i.Desc = "更多热门话题" |
|
}
|
|
|