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