371 lines
8.7 KiB
Go
371 lines
8.7 KiB
Go
package history
|
||
|
||
import (
|
||
"context"
|
||
"strconv"
|
||
|
||
"go-common/app/interface/main/app-interface/model"
|
||
"go-common/app/interface/main/app-interface/model/history"
|
||
livemdl "go-common/app/interface/main/app-interface/model/live"
|
||
hismodle "go-common/app/interface/main/history/model"
|
||
artmodle "go-common/app/interface/openplatform/article/model"
|
||
arcmdl "go-common/app/service/main/archive/model/archive"
|
||
"go-common/library/log"
|
||
"go-common/library/sync/errgroup"
|
||
"go-common/library/xstr"
|
||
)
|
||
|
||
const (
|
||
_tpOld = -1
|
||
_tpOffline = 0
|
||
_tpArchive = 3
|
||
_tpPGC = 4
|
||
_tpArticle = 5
|
||
_tpLive = 6
|
||
_tpCorpus = 7
|
||
_androidBroadcast = 5305000
|
||
)
|
||
|
||
var (
|
||
gotoDesc = map[int8]string{
|
||
_tpOld: "av",
|
||
_tpOffline: "av",
|
||
_tpArchive: "av",
|
||
_tpPGC: "pgc",
|
||
_tpArticle: "article",
|
||
_tpLive: "live",
|
||
_tpCorpus: "article",
|
||
}
|
||
badge = map[int8]string{
|
||
1: "番剧",
|
||
2: "电影",
|
||
3: "纪录片",
|
||
4: "国创",
|
||
5: "电视剧",
|
||
7: "综艺",
|
||
}
|
||
busTab = []*history.BusTab{
|
||
{
|
||
Business: "all",
|
||
Name: "全部",
|
||
},
|
||
{
|
||
Business: "archive",
|
||
Name: "视频",
|
||
},
|
||
{
|
||
Business: "live",
|
||
Name: "直播",
|
||
},
|
||
{
|
||
Business: "article",
|
||
Name: "专栏",
|
||
},
|
||
}
|
||
)
|
||
|
||
// List history list
|
||
func (s *Service) List(c context.Context, mid, build int64, pn, ps int, platform string, plat int8) (data []*history.ListRes, err error) {
|
||
res, err := s.historyDao.History(c, mid, pn, ps)
|
||
if len(res) > 50 {
|
||
log.Warn("history lens(%d) mid(%d) pn(%d) ps(%d)", len(res), mid, pn, ps)
|
||
}
|
||
if err != nil {
|
||
log.Error("%+v ", err)
|
||
return
|
||
}
|
||
if len(res) == 0 {
|
||
data = []*history.ListRes{}
|
||
return
|
||
}
|
||
data = s.TogetherHistory(c, res, mid, build, platform, plat)
|
||
return
|
||
}
|
||
|
||
// Live get live for history
|
||
func (s *Service) Live(c context.Context, roomIDs []int64) (res []*livemdl.RoomInfo, err error) {
|
||
live, err := s.liveDao.LiveByRIDs(c, roomIDs)
|
||
if err != nil {
|
||
log.Error("%+v", err)
|
||
return
|
||
}
|
||
if len(live) == 0 {
|
||
res = []*livemdl.RoomInfo{}
|
||
return
|
||
}
|
||
for _, lv := range live {
|
||
item := &livemdl.RoomInfo{
|
||
RoomID: lv.RoomID,
|
||
URI: model.FillURI("live", strconv.FormatInt(lv.RoomID, 10), model.LiveHandler(lv)),
|
||
}
|
||
if lv.Status == 1 {
|
||
item.Status = lv.Status
|
||
}
|
||
res = append(res, item)
|
||
}
|
||
return
|
||
}
|
||
|
||
// LiveList get live list for history
|
||
func (s *Service) LiveList(c context.Context, mid, build int64, pn, ps int, platform string, plat int8) (data []*history.ListRes, err error) {
|
||
res, err := s.historyDao.HistoryByTP(c, mid, pn, ps, _tpLive)
|
||
if err != nil {
|
||
log.Error("%+v ", err)
|
||
return
|
||
}
|
||
if len(res) == 0 {
|
||
data = []*history.ListRes{}
|
||
return
|
||
}
|
||
data = s.TogetherHistory(c, res, mid, build, platform, plat)
|
||
return
|
||
}
|
||
|
||
// Cursor for history
|
||
func (s *Service) Cursor(c context.Context, mid, build, paramMax int64, ps int, platform string, paramMaxTP, plat int8, businesses []string) (data *history.ListCursor, err error) {
|
||
data = &history.ListCursor{
|
||
List: []*history.ListRes{},
|
||
Tab: busTab,
|
||
}
|
||
// 国际版不出直播
|
||
if plat == model.PlatAndroidI {
|
||
data.Tab = []*history.BusTab{
|
||
{
|
||
Business: "all",
|
||
Name: "全部",
|
||
},
|
||
{
|
||
Business: "archive",
|
||
Name: "视频",
|
||
},
|
||
{
|
||
Business: "article",
|
||
Name: "专栏",
|
||
},
|
||
}
|
||
}
|
||
curPs := 50
|
||
res, err := s.historyDao.Cursor(c, mid, paramMax, curPs, paramMaxTP, businesses)
|
||
if len(res) > curPs {
|
||
log.Warn("history lens(%d) mid(%d) paramMax(%d) paramMaxTP(%d) curPs(%d)", len(res), mid, paramMax, paramMaxTP, curPs)
|
||
}
|
||
if err != nil {
|
||
log.Error("%+v ", err)
|
||
return
|
||
}
|
||
if len(res) == 0 {
|
||
return
|
||
}
|
||
data.List = s.TogetherHistory(c, res, mid, build, platform, plat)
|
||
if len(data.List) >= ps {
|
||
data.List = data.List[:ps]
|
||
}
|
||
if len(data.List) > 0 {
|
||
data.Cursor = &history.Cursor{
|
||
Max: data.List[len(data.List)-1].ViewAt,
|
||
MaxTP: data.List[len(data.List)-1].History.Tp,
|
||
Ps: ps,
|
||
}
|
||
}
|
||
return
|
||
}
|
||
|
||
// TogetherHistory always return 0~50
|
||
func (s *Service) TogetherHistory(c context.Context, res []*hismodle.Resource, mid, build int64, platform string, plat int8) (data []*history.ListRes) {
|
||
var (
|
||
aids []int64
|
||
epids []int64
|
||
articleIDs []int64
|
||
roomIDs []int64
|
||
archive map[int64]*arcmdl.View3
|
||
pgcInfo map[int64]*history.PGCRes
|
||
article map[int64]*artmodle.Meta
|
||
live map[int64]*livemdl.RoomInfo
|
||
)
|
||
i := 0
|
||
for _, his := range res {
|
||
i++
|
||
//由于出现过history吐出数量无限制,限制请求archive的数量逻辑保留
|
||
if i > 80 {
|
||
break
|
||
}
|
||
switch his.TP {
|
||
case _tpOld, _tpOffline, _tpArchive:
|
||
aids = append(aids, his.Oid)
|
||
case _tpPGC:
|
||
aids = append(aids, his.Oid) //用cid拿时长duration
|
||
epids = append(epids, his.Epid)
|
||
case _tpArticle:
|
||
articleIDs = append(articleIDs, his.Oid)
|
||
case _tpLive:
|
||
roomIDs = append(roomIDs, his.Oid)
|
||
case _tpCorpus:
|
||
articleIDs = append(articleIDs, his.Cid)
|
||
default:
|
||
log.Warn("unknow history type(%d) msg(%+v)", his.TP, his)
|
||
}
|
||
}
|
||
eg, ctx := errgroup.WithContext(c)
|
||
if len(aids) > 0 {
|
||
eg.Go(func() (err error) {
|
||
archive, err = s.historyDao.Archive(ctx, aids)
|
||
if err != nil {
|
||
log.Error("%+v", err)
|
||
err = nil
|
||
}
|
||
return
|
||
})
|
||
}
|
||
if len(epids) > 0 {
|
||
eg.Go(func() (err error) {
|
||
pgcInfo, err = s.historyDao.PGC(ctx, xstr.JoinInts(epids), platform, build, mid)
|
||
if err != nil {
|
||
log.Error("%+v", err)
|
||
err = nil
|
||
}
|
||
return
|
||
})
|
||
}
|
||
if len(articleIDs) > 0 {
|
||
eg.Go(func() (err error) {
|
||
article, err = s.historyDao.Article(ctx, articleIDs)
|
||
if err != nil {
|
||
log.Error("%+v", err)
|
||
err = nil
|
||
}
|
||
return
|
||
})
|
||
}
|
||
if len(roomIDs) > 0 {
|
||
eg.Go(func() (err error) {
|
||
live, err = s.liveDao.LiveByRIDs(ctx, roomIDs)
|
||
if err != nil {
|
||
log.Error("%+v", err)
|
||
err = nil
|
||
}
|
||
return
|
||
})
|
||
}
|
||
eg.Wait()
|
||
for _, his := range res {
|
||
// 国际版不出直播
|
||
if plat == model.PlatAndroidI && his.TP == _tpLive {
|
||
continue
|
||
}
|
||
tmpInfo := &history.ListRes{
|
||
Goto: gotoDesc[his.TP],
|
||
ViewAt: his.Unix,
|
||
}
|
||
tmpInfo.History.Oid = his.Oid
|
||
tmpInfo.History.Tp = his.TP
|
||
tmpInfo.History.Business = his.Business
|
||
switch his.TP {
|
||
case _tpOld, _tpOffline, _tpArchive:
|
||
arc, ok := archive[his.Oid]
|
||
if !ok {
|
||
continue
|
||
}
|
||
tmpInfo.Title = arc.Title
|
||
tmpInfo.Cover = arc.Pic
|
||
tmpInfo.Mid = arc.Author.Mid
|
||
tmpInfo.Name = arc.Author.Name
|
||
tmpInfo.Progress = his.Pro
|
||
tmpInfo.Videos = arc.Videos
|
||
for _, p := range arc.Pages {
|
||
if p.Cid == his.Cid {
|
||
tmpInfo.Duration = p.Duration
|
||
tmpInfo.History.Cid = p.Cid
|
||
tmpInfo.History.Page = p.Page
|
||
tmpInfo.History.Part = p.Part
|
||
break
|
||
}
|
||
}
|
||
tmpInfo.URI = model.FillURI(tmpInfo.Goto, strconv.FormatInt(his.Oid, 10), model.AvHandler(arc.Archive3))
|
||
case _tpPGC:
|
||
pgc, okPGC := pgcInfo[his.Epid]
|
||
arc, okArc := archive[his.Oid]
|
||
if !okPGC || !okArc {
|
||
continue
|
||
}
|
||
tmpInfo.Title = pgc.Title
|
||
tmpInfo.ShowTitle = pgc.ShowTitle
|
||
tmpInfo.Cover = pgc.Cover
|
||
tmpInfo.Badge = badge[his.STP]
|
||
tmpInfo.Progress = his.Pro
|
||
tmpInfo.URI = model.FillURI(tmpInfo.Goto, strconv.FormatInt(his.Sid, 10), nil)
|
||
for _, p := range arc.Pages {
|
||
if p.Cid == his.Cid {
|
||
tmpInfo.Duration = p.Duration
|
||
break
|
||
}
|
||
}
|
||
case _tpArticle:
|
||
art, ok := article[his.Oid]
|
||
if !ok {
|
||
continue
|
||
}
|
||
tmpInfo.Title = art.Title
|
||
tmpInfo.Covers = art.ImageURLs
|
||
tmpInfo.Mid = art.Author.Mid
|
||
tmpInfo.Name = art.Author.Name
|
||
tmpInfo.Badge = "专栏"
|
||
tmpInfo.URI = model.FillURI(tmpInfo.Goto, strconv.FormatInt(his.Oid, 10), nil)
|
||
case _tpLive:
|
||
lv, ok := live[his.Oid]
|
||
if !ok {
|
||
continue
|
||
}
|
||
tmpInfo.Title = lv.Title
|
||
tmpInfo.Cover = lv.UserCover
|
||
if lv.UserCover == "" {
|
||
tmpInfo.Cover = lv.Cover
|
||
}
|
||
tmpInfo.Mid = lv.Mid
|
||
tmpInfo.Name = lv.Name
|
||
tmpInfo.TagName = lv.TagName
|
||
if lv.Status == 1 { //1是直播中,0、2是未开播
|
||
tmpInfo.LiveStatus = 1
|
||
}
|
||
if model.IsAndroid(plat) && build < _androidBroadcast {
|
||
lv = nil
|
||
}
|
||
tmpInfo.URI = model.FillURI(tmpInfo.Goto, strconv.FormatInt(his.Oid, 10), model.LiveHandler(lv))
|
||
case _tpCorpus:
|
||
art, ok := article[his.Cid]
|
||
if !ok {
|
||
continue
|
||
}
|
||
tmpInfo.Title = art.Title
|
||
tmpInfo.Covers = art.ImageURLs
|
||
tmpInfo.Mid = art.Author.Mid
|
||
tmpInfo.Name = art.Author.Name
|
||
tmpInfo.Badge = "专栏"
|
||
tmpInfo.URI = model.FillURI("article", strconv.FormatInt(his.Cid, 10), nil)
|
||
default:
|
||
continue
|
||
}
|
||
data = append(data, tmpInfo)
|
||
}
|
||
return
|
||
}
|
||
|
||
// Del for history
|
||
func (s *Service) Del(c context.Context, mid int64, hisRes []*hismodle.Resource) (err error) {
|
||
err = s.historyDao.Del(c, mid, hisRes)
|
||
if err != nil {
|
||
log.Error("%+v ", err)
|
||
return
|
||
}
|
||
return
|
||
}
|
||
|
||
// Clear for history
|
||
func (s *Service) Clear(c context.Context, mid int64, businesses []string) (err error) {
|
||
err = s.historyDao.Clear(c, mid, businesses)
|
||
if err != nil {
|
||
log.Error("%+v ", err)
|
||
return
|
||
}
|
||
return
|
||
}
|