123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308 |
- 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 = "更多热门话题"
- }
|