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
|
|||
|
}
|